From 70548acc54458048decf8d9d4bbaee5040beadc2 Mon Sep 17 00:00:00 2001 From: Eric Betts Date: Mon, 22 Apr 2024 10:17:07 -0700 Subject: [PATCH] reads MFC SE --- sam_api.c | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/sam_api.c b/sam_api.c index bc22b4ca92e..84b669bf8b0 100644 --- a/sam_api.c +++ b/sam_api.c @@ -763,9 +763,15 @@ void seader_mfc_transmit( (format[0] == 0x00 && format[1] == 0x00 && format[2] == 0x40) || (format[0] == 0x00 && format[1] == 0x00 && format[2] == 0x24) || (format[0] == 0x00 && format[1] == 0x00 && format[2] == 0x44)) { - //bit_buffer_copy_bytes_with_parity(tx_buffer, buffer, len * 8); + memset(display, 0, sizeof(display)); + for(uint8_t i = 0; i < len; i++) { + snprintf(display + (i * 2), sizeof(display), "%02x", buffer[i]); + } + FURI_LOG_D(TAG, "NFC Send with parity %d: %s", len, display); + // Only handles message up to 8 data bytes uint8_t tx_parity = 0; + uint8_t len_without_parity = len - 1; // Don't forget to swap the bits of buffer[8] for(size_t i = 0; i < len; i++) { @@ -773,22 +779,34 @@ void seader_mfc_transmit( } // Pull out parity bits - for(size_t i = 0; i < 8; i++) { + for(size_t i = 0; i < len_without_parity; i++) { bool val = bit_lib_get_bit(buffer + i + 1, i); bit_lib_set_bit(&tx_parity, i, val); } - for(size_t i = 0; i < 8; i++) { + for(size_t i = 0; i < len_without_parity; i++) { buffer[i] = (buffer[i] << i) | (buffer[i + 1] >> (8 - i)); } - bit_buffer_append_bytes(tx_buffer, buffer, 8); + bit_buffer_append_bytes(tx_buffer, buffer, len_without_parity); - for(size_t i = 0; i < 8; i++) { + for(size_t i = 0; i < len_without_parity; i++) { bit_lib_reverse_bits(buffer + i, 0, 8); bit_buffer_set_byte_with_parity( tx_buffer, i, buffer[i], bit_lib_get_bit(&tx_parity, i)); } + memset(display, 0, sizeof(display)); + for(uint8_t i = 0; i < bit_buffer_get_size_bytes(tx_buffer); i++) { + snprintf( + display + (i * 2), sizeof(display), "%02x", bit_buffer_get_byte(tx_buffer, i)); + } + FURI_LOG_D( + TAG, + "NFC Send without parity %d: %s [%02x]", + bit_buffer_get_size_bytes(tx_buffer), + display, + tx_parity); + MfClassicError error = mf_classic_poller_send_custom_parity_frame( mfc_poller, tx_buffer, rx_buffer, MF_CLASSIC_FWT_FC); if(error != MfClassicErrorNone) { @@ -805,7 +823,8 @@ void seader_mfc_transmit( snprintf( display + (i * 2), sizeof(display), "%02x", bit_buffer_get_byte(rx_buffer, i)); } - FURI_LOG_D(TAG, "NFC Response %d: %s [%02x]", length, display, rx_parity[0]); + FURI_LOG_D( + TAG, "NFC Response without parity %d: %s [%02x]", length, display, rx_parity[0]); uint8_t with_parity[SEADER_POLLER_MAX_BUFFER_SIZE]; memset(with_parity, 0, sizeof(with_parity)); @@ -848,7 +867,8 @@ void seader_mfc_transmit( snprintf( display + (i * 2), sizeof(display), "%02x", bit_buffer_get_byte(rx_buffer, i)); } - FURI_LOG_D(TAG, "NFC Response %d: %s [%02x]", length, display, rx_parity[0]); + FURI_LOG_D( + TAG, "NFC Response with parity %d: %s [%02x]", length, display, rx_parity[0]); } else { FURI_LOG_W(TAG, "UNHANDLED FORMAT");