Files
wheel_rfm69_counter/avr_code/st25dv.c
T
2026-08-31 22:43:51 -04:00

89 lines
2.3 KiB
C

#include "st25dv.h"
identifier_results get_nugget_data() {
NDEF_MSG = rfid_read_first_ndef_entry();
TRIMMED_STRING = remove_spaces(NDEF_MSG.payload, NDEF_MSG.payload_len);
char* delim_ptr = strchr(TRIMMED_STRING.str, ',');
if (delim_ptr != NULL) {
uint8_t index_comma = delim_ptr - TRIMMED_STRING.str;
memcpy(IDENTIFIER.name_str, TRIMMED_STRING.str, index_comma);
memcpy(
IDENTIFIER.diameter_str, TRIMMED_STRING.str + index_comma + 1, TRIMMED_STRING.length);
IDENTIFIER.name_len = index_comma;
IDENTIFIER.diameter_len = TRIMMED_STRING.length - index_comma;
} else {
memcpy(IDENTIFIER.name_str, TRIMMED_STRING.str, TRIMMED_STRING.length);
IDENTIFIER.name_len = TRIMMED_STRING.length;
memcpy(IDENTIFIER.diameter_str, "N/A", 3);
IDENTIFIER.diameter_len = 3;
}
IDENTIFIER.hashed = hash(IDENTIFIER.name_str, 0, 59);
return IDENTIFIER;
}
trimmed_string_struct remove_spaces(char* str, uint8_t len_str) {
uint8_t i = 0, j = 0;
memset(TRIMMED_STRING.str, ' ', 20);
while (str[i]) {
if (str[i] != ' ') {
TRIMMED_STRING.str[j++] = str[i];
}
i++;
if (i >= len_str) {
break;
}
}
TRIMMED_STRING.length = j;
return TRIMMED_STRING;
}
void rfid_set_low_power_down(bool state) {
SET_PIN_OUT(DDRD, DDD5);
if (state) {
SET_PIN_HIGH(PORTD, PD5);
} else {
SET_PIN_LOW(PORTD, PD5);
}
}
ndef_message rfid_read_first_ndef_entry() {
rfid_set_low_power_down(false);
rfid_set_i2c_power(true);
_delay_ms(1);
memset(DATA_BUFFER_65, ' ', 64);
char DATA_BUFFER_INTERNAL[65];
rfid_read_memory(DATA_BUFFER_INTERNAL, 64, 0x0000 + 4);
NDEF_MSG = readNDEFText(DATA_BUFFER_INTERNAL);
rfid_set_low_power_down(true);
rfid_set_i2c_power(false);
return NDEF_MSG;
}
uint8_t rfid_read_system_register() {
return read_one_byte_16bit_addr_no_err_register(I2C_SYSTEM_ADDR, 0x0000);
}
void rfid_set_i2c_power(bool state) {
SET_PIN_OUT(DDRE, DDE0);
if (state) {
SET_PIN_HIGH(PORTE, PE0);
} else {
SET_PIN_LOW(PORTE, PE0);
}
}
uint8_t rfid_read_memory(uint8_t* data, uint8_t num_bytes, uint16_t address) {
return read_n_bytes_16bit_addr(I2C_USER_ADDR, address, data, num_bytes);
}