Skip to content

Commit

Permalink
Replace st25dv I²C addresses by a config for ndef
Browse files Browse the repository at this point in the history
  • Loading branch information
RJRP44 committed Oct 31, 2023
1 parent 7daae64 commit 66b2df4
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 32 deletions.
12 changes: 8 additions & 4 deletions examples/example_project/main/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
*/

#include <driver/i2c.h>
#include <st25dv.h>
#include <st25dv_registers.h>
#include <st25dv_ndef.h>
#include <string.h>
Expand All @@ -21,6 +20,11 @@ void app_main(void) {
.master.clk_speed = ST25DV_MAX_CLK_SPEED,
};

st25dv_config st25dv_config = {
ST25DV_USER_ADDRESS,
ST25DV_SYSTEM_ADDRESS
};

//Apply, init the configuration to the bus
st25dv_init_i2c(I2C_NUM_1, i2c_config);

Expand Down Expand Up @@ -64,12 +68,12 @@ void app_main(void) {
//Ndef records
char app_package[] = "fr.ouchat.app";
uint16_t address = CCFILE_LENGTH;
st25dv_ndef_write_app_launcher_record(ST25DV_USER_ADDRESS, &address, true, false, app_package);
st25dv_ndef_write_app_launcher_record(st25dv_config, &address, true, false, app_package);

cJSON *monitor = cJSON_CreateObject();
cJSON_AddNumberToObject(monitor, "height", 720);
cJSON_AddNumberToObject(monitor, "width", 1280);
st25dv_ndef_write_json_record(ST25DV_USER_ADDRESS, &address,false,true,monitor);
st25dv_ndef_write_json_record(st25dv_config, &address,false,true,monitor);
cJSON_Delete(monitor);

vTaskDelay(100 / portTICK_PERIOD_MS);
Expand All @@ -88,7 +92,7 @@ void app_main(void) {
uint8_t record_num = 2;
uint8_t record_count = 0;

st25dv_ndef_read(ST25DV_USER_ADDRESS,record_num,read,&record_count);
st25dv_ndef_read(st25dv_config,record_num,read,&record_count);
printf("Record %d type : %s\n", record_num, read->type);

//Delete record after use
Expand Down
5 changes: 5 additions & 0 deletions include/st25dv.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@

#define ACK_CHECK_EN 0x1

typedef struct {
uint8_t user_address;
uint8_t system_address;
} st25dv_config;

esp_err_t st25dv_write_byte(uint8_t st25_address, uint16_t address, uint8_t byte);
esp_err_t st25dv_read_byte(uint8_t st25_address, uint16_t address, uint8_t *byte);

Expand Down
9 changes: 5 additions & 4 deletions include/st25dv_ndef.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <esp_err.h>
#include <stdbool.h>
#include <cJson.h>
#include "st25dv.h"

#define ST25DV_TYPE5_NDEF_MESSAGE 0x03
#define ST25DV_TYPE5_TERMINATOR_TLV 0xFE
Expand Down Expand Up @@ -43,9 +44,9 @@ typedef struct {

esp_err_t st25dv_ndef_write_ccfile(uint64_t ccfile);

static esp_err_t st25dv_ndef_write_content(uint8_t st25_address, uint16_t *address, bool mb, bool me, std25dv_ndef_record record);
esp_err_t st25dv_ndef_write_app_launcher_record(uint8_t st25_address, uint16_t *address, bool mb, bool me, char *app_package);
esp_err_t st25dv_ndef_write_json_record(uint8_t st25_address, uint16_t *address, bool mb, bool me, cJSON *json_data);
static esp_err_t st25dv_ndef_write_content(st25dv_config st25dv, uint16_t *address, bool mb, bool me, std25dv_ndef_record record);
esp_err_t st25dv_ndef_write_app_launcher_record(st25dv_config st25dv, uint16_t *address, bool mb, bool me, char *app_package);
esp_err_t st25dv_ndef_write_json_record(st25dv_config st25dv, uint16_t *address, bool mb, bool me, cJSON *json_data);

esp_err_t st25dv_ndef_read(uint8_t st25_address, uint8_t record_num, std25dv_ndef_record *output_records, uint8_t *record_count);
esp_err_t st25dv_ndef_read(st25dv_config st25dv, uint8_t record_num, std25dv_ndef_record *output_records, uint8_t *record_count);
esp_err_t st25dv_ndef_delete_records(std25dv_ndef_record *record);
47 changes: 23 additions & 24 deletions st25dv_ndef.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,14 @@
#include <memory.h>
#include "st25dv_ndef.h"
#include "st25dv_registers.h"
#include "st25dv.h"

esp_err_t st25dv_ndef_write_ccfile(uint64_t ccfile) {
uint8_t ccbyte[8];
memcpy(ccbyte, &ccfile, sizeof(ccfile));
return st25dv_write(ST25DV_USER_ADDRESS, 0x00, ccbyte, sizeof(ccfile));
}

static esp_err_t st25dv_ndef_write_content(uint8_t st25_address, uint16_t *address, bool mb, bool me, const std25dv_ndef_record record) {
static esp_err_t st25dv_ndef_write_content(st25dv_config st25dv, uint16_t *address, bool mb, bool me, const std25dv_ndef_record record) {
uint8_t type_size = strlen(record.type);
uint16_t payload_size = strlen(record.payload);

Expand Down Expand Up @@ -84,7 +83,7 @@ static esp_err_t st25dv_ndef_write_content(uint8_t st25_address, uint16_t *addre

//Read the possible 3 byte l value
uint8_t *l_value = malloc(0x03);
st25dv_read(st25_address, CCFILE_LENGTH + 1, l_value, 0x03);
st25dv_read(st25dv.user_address, CCFILE_LENGTH + 1, l_value, 0x03);
uint16_t old_length = 0;
uint16_t total_length;

Expand All @@ -99,7 +98,7 @@ static esp_err_t st25dv_ndef_write_content(uint8_t st25_address, uint16_t *addre
*(l_value + 2) = total_length & 0xFF;

//Update the value
st25dv_write(st25_address, CCFILE_LENGTH + 1, l_value, 0x03);
st25dv_write(st25dv.user_address, CCFILE_LENGTH + 1, l_value, 0x03);
} else {
//The l value is 1 byte long
old_length = *l_value;
Expand All @@ -114,28 +113,28 @@ static esp_err_t st25dv_ndef_write_content(uint8_t st25_address, uint16_t *addre

//Copy and move the existing records
uint8_t *st25dv_content = malloc(old_length);
st25dv_read(st25_address, CCFILE_LENGTH + 2, st25dv_content, old_length);
st25dv_write(st25_address, CCFILE_LENGTH + 1, l_value, 0x03);
st25dv_read(st25dv.user_address, CCFILE_LENGTH + 2, st25dv_content, old_length);
st25dv_write(st25dv.user_address, CCFILE_LENGTH + 1, l_value, 0x03);
vTaskDelay(100 / portTICK_PERIOD_MS);
st25dv_write(st25_address, CCFILE_LENGTH + 4, st25dv_content, old_length);
st25dv_write(st25dv.user_address, CCFILE_LENGTH + 4, st25dv_content, old_length);
record_address += 2;
free(st25dv_content);
} else {
//The l value is already 1 byte
*l_value = total_length;

//Update the value
st25dv_write_byte(st25_address, CCFILE_LENGTH + 1, *l_value);
st25dv_write_byte(st25dv.user_address, CCFILE_LENGTH + 1, *l_value);
}
}
free(l_value);
}
vTaskDelay(100 / portTICK_PERIOD_MS);
st25dv_write(st25_address, record_address, record_data, data - record_data);
st25dv_write(st25dv.user_address, record_address, record_data, data - record_data);
vTaskDelay(100 / portTICK_PERIOD_MS);
//Add terminator
if (me) {
st25dv_write_byte(st25_address, record_address + (data - record_data), ST25DV_TYPE5_TERMINATOR_TLV);
st25dv_write_byte(st25dv.user_address, record_address + (data - record_data), ST25DV_TYPE5_TERMINATOR_TLV);
}

*address = record_address + (data - record_data);
Expand All @@ -144,35 +143,35 @@ static esp_err_t st25dv_ndef_write_content(uint8_t st25_address, uint16_t *addre
return ESP_OK;
}

esp_err_t st25dv_ndef_write_app_launcher_record(uint8_t st25_address, uint16_t *address, bool mb, bool me, char *app_package) {
esp_err_t st25dv_ndef_write_app_launcher_record(st25dv_config st25dv, uint16_t *address, bool mb, bool me, char *app_package) {
char record_type[] = NDEF_APP_LAUNCHER_TYPE;
std25dv_ndef_record record = {
NDEF_ST25DV_TNF_EXTERNAL,
record_type,
app_package
};
st25dv_ndef_write_content(st25_address, address, mb, me, record);
st25dv_ndef_write_content(st25dv, address, mb, me, record);
return ESP_OK;
}

esp_err_t st25dv_ndef_write_json_record(uint8_t st25_address, uint16_t *address, bool mb, bool me, cJSON *json_data) {
esp_err_t st25dv_ndef_write_json_record(st25dv_config st25dv, uint16_t *address, bool mb, bool me, cJSON *json_data) {
char record_type[] = NDEF_JSON_TYPE;
char *json = cJSON_PrintUnformatted(json_data);
std25dv_ndef_record record = {
NDEF_ST25DV_TNF_MIME,
record_type,
json
};
st25dv_ndef_write_content(st25_address, address, mb, me, record);
st25dv_ndef_write_content(st25dv, address, mb, me, record);
free(json);
return ESP_OK;
}

esp_err_t st25dv_ndef_read(uint8_t st25_address, uint8_t record_num, std25dv_ndef_record *output_records, uint8_t *record_count) {
esp_err_t st25dv_ndef_read(st25dv_config st25dv, uint8_t record_num, std25dv_ndef_record *output_records, uint8_t *record_count) {
//Get size of the first area
uint8_t enda1 = 0;
*record_count = 0;
st25dv_read_byte(ST25DV_SYSTEM_ADDRESS, REG_ENDA1, &enda1);
st25dv_read_byte(st25dv.system_address, REG_ENDA1, &enda1);

//Convert the block value in bytes
enda1 = enda1 * 32 + 31;
Expand All @@ -181,7 +180,7 @@ esp_err_t st25dv_ndef_read(uint8_t st25_address, uint8_t record_num, std25dv_nde
//Read Type5 Tag TLV-Format
uint8_t *tlv = malloc(4);
uint16_t l_value = 0;
ESP_ERROR_CHECK(st25dv_read(st25_address, address, tlv, 4));
ESP_ERROR_CHECK(st25dv_read(st25dv.user_address, address, tlv, 4));
ST25DV_CHECK(tlv[0] == ST25DV_TYPE5_NDEF_MESSAGE)

if (*(tlv + 1) == 0xFF) {
Expand All @@ -203,7 +202,7 @@ esp_err_t st25dv_ndef_read(uint8_t st25_address, uint8_t record_num, std25dv_nde
bool message_begin, message_end, chunk_flag, short_record, id_length;

//Get header content
ESP_ERROR_CHECK(st25dv_read_byte(st25_address, address, &v_value));
ESP_ERROR_CHECK(st25dv_read_byte(st25dv.user_address, address, &v_value));
address++;
message_begin = NDEF_RECORD_HEADER_BIT(v_value, NDEF_ST25DV_MB);
message_end = NDEF_RECORD_HEADER_BIT(v_value, NDEF_ST25DV_ME);
Expand All @@ -214,21 +213,21 @@ esp_err_t st25dv_ndef_read(uint8_t st25_address, uint8_t record_num, std25dv_nde

//Get type length
uint8_t type_length;
ESP_ERROR_CHECK(st25dv_read_byte(st25_address, address, &type_length));
ESP_ERROR_CHECK(st25dv_read_byte(st25dv.user_address, address, &type_length));
address++;

//Get payload length
uint16_t payload_length = 0;
if (short_record) {
//Payload length is 1 byte
uint8_t data;
ESP_ERROR_CHECK(st25dv_read_byte(st25_address, address, &data));
ESP_ERROR_CHECK(st25dv_read_byte(st25dv.user_address, address, &data));
payload_length = data;
address++;
} else {
//Payload length is 4 byte
uint8_t *data = malloc(4);
ESP_ERROR_CHECK(st25dv_read(st25_address, address, data, 4));
ESP_ERROR_CHECK(st25dv_read(st25dv.user_address, address, data, 4));
payload_length |= *data << 24;
payload_length |= *(data + 1) << 16;
payload_length |= *(data + 2) << 8;
Expand All @@ -250,14 +249,14 @@ esp_err_t st25dv_ndef_read(uint8_t st25_address, uint8_t record_num, std25dv_nde

//Get type and add it to the output
char *type = malloc(type_length + 1);
ESP_ERROR_CHECK(st25dv_read(st25_address, address, (uint8_t *) type, type_length));
ESP_ERROR_CHECK(st25dv_read(st25dv.user_address, address, (uint8_t *) type, type_length));
*(type + type_length) = 0x00;
output_records->type = type;
address += type_length;

//Get payload and add it to the output
char *payload = malloc(payload_length + 1);
ESP_ERROR_CHECK(st25dv_read(st25_address, address, (uint8_t *) payload, payload_length));
ESP_ERROR_CHECK(st25dv_read(st25dv.user_address, address, (uint8_t *) payload, payload_length));
*(payload + payload_length) = 0x00;
output_records->payload = payload;
address += payload_length;
Expand All @@ -267,7 +266,7 @@ esp_err_t st25dv_ndef_read(uint8_t st25_address, uint8_t record_num, std25dv_nde

//Get the end
uint8_t end_char = 0;
ESP_ERROR_CHECK(st25dv_read_byte(st25_address, address, &end_char));
ESP_ERROR_CHECK(st25dv_read_byte(st25dv.user_address, address, &end_char));
if (end_char == ST25DV_TYPE5_TERMINATOR_TLV) {
return ESP_OK;
}
Expand Down

0 comments on commit 66b2df4

Please sign in to comment.