#include "nfc_protocol.h" uint16_t calculateChecksum(const uint8_t* data, size_t length) { uint16_t checksum = 0; for (size_t i = 0; i < length; i++) { checksum += data[i]; } return checksum; } bool validateMessage(const CommMessage* msg) { if (msg == nullptr) return false; // Calculate checksum excluding the checksum field itself size_t data_size = sizeof(CommMessage) - sizeof(msg->checksum); uint16_t calculated_checksum = calculateChecksum((const uint8_t*)msg, data_size); return calculated_checksum == msg->checksum; } void printNFCData(const NFCData* data) { if (data == nullptr) return; Serial.println("=== NFC Data ==="); Serial.print("UID: "); for (int i = 0; i < data->uid_length; i++) { if (data->uid[i] < 0x10) Serial.print("0"); Serial.print(data->uid[i], HEX); if (i < data->uid_length - 1) Serial.print(" "); } Serial.println(); Serial.print("UID Length: "); Serial.println(data->uid_length); Serial.print("SAK: 0x"); if (data->sak < 0x10) Serial.print("0"); Serial.println(data->sak, HEX); Serial.print("ATQA: 0x"); if (data->atqa[0] < 0x10) Serial.print("0"); Serial.print(data->atqa[0], HEX); Serial.print(" 0x"); if (data->atqa[1] < 0x10) Serial.print("0"); Serial.println(data->atqa[1], HEX); Serial.print("Tag Type: "); Serial.println(data->tag_type); Serial.print("Data Length: "); Serial.println(data->data_length); Serial.print("Timestamp: "); Serial.println(data->timestamp); if (data->data_length > 0) { Serial.print("Raw Data: "); for (int i = 0; i < data->data_length && i < 32; i++) { if (data->raw_data[i] < 0x10) Serial.print("0"); Serial.print(data->raw_data[i], HEX); Serial.print(" "); } if (data->data_length > 32) { Serial.print("... (truncated)"); } Serial.println(); } Serial.println("================"); }