|
1 | 1 |
|
2 | 2 | #include "sam_api.h"
|
3 | 3 | #include <toolbox/path.h>
|
| 4 | +#include <bit_lib/bit_lib.h> |
4 | 5 |
|
5 | 6 | #define TAG "SAMAPI"
|
6 | 7 |
|
@@ -749,23 +750,64 @@ void seader_mfc_transmit(
|
749 | 750 | BitBuffer* rx_buffer = bit_buffer_alloc(SEADER_POLLER_MAX_BUFFER_SIZE);
|
750 | 751 |
|
751 | 752 | do {
|
752 |
| - bit_buffer_append_bytes(tx_buffer, buffer, len); |
753 | 753 | if(format[0] == 0x00 && format[1] == 0xC0 && format[2] == 0x00) {
|
754 |
| - // MfClassicError error = mf_classic_poller_send_standard_frame(mfc_poller,tx_buffer, rx_buffer, MF_CLASSIC_FWT_FC); |
| 754 | + bit_buffer_append_bytes(tx_buffer, buffer, len); |
755 | 755 | MfClassicError error =
|
756 | 756 | mf_classic_poller_send_frame(mfc_poller, tx_buffer, rx_buffer, MF_CLASSIC_FWT_FC);
|
757 | 757 | if(error != MfClassicErrorNone) {
|
758 |
| - FURI_LOG_W(TAG, "mf_classic_poller_send_standard_frame error %d", error); |
| 758 | + FURI_LOG_W(TAG, "mf_classic_poller_send_frame error %d", error); |
759 | 759 | seader_worker->stage = SeaderPollerEventTypeFail;
|
760 | 760 | break;
|
761 | 761 | }
|
762 | 762 | } else if(
|
763 | 763 | (format[0] == 0x00 && format[1] == 0x00 && format[2] == 0x40) ||
|
764 | 764 | (format[0] == 0x00 && format[1] == 0x00 && format[2] == 0x24) ||
|
765 | 765 | (format[0] == 0x00 && format[1] == 0x00 && format[2] == 0x44)) {
|
766 |
| - FURI_LOG_W(TAG, "TODO"); |
| 766 | + //bit_buffer_copy_bytes_with_parity(tx_buffer, buffer, len * 8); |
| 767 | + |
| 768 | + uint8_t tx_parity = 0; |
| 769 | + |
| 770 | + // Don't forget to swap the bits of buffer[8] |
| 771 | + for(size_t i = 0; i < 8 + 1; i++) { |
| 772 | + bit_lib_reverse_bits(buffer + i, 0, 8); |
| 773 | + } |
| 774 | + |
| 775 | + // Pull out parity bits |
| 776 | + for(size_t i = 0; i < 8; i++) { |
| 777 | + bool val = bit_lib_get_bit(buffer + i + 1, i); |
| 778 | + bit_lib_set_bit(&tx_parity, i, val); |
| 779 | + } |
| 780 | + |
| 781 | + for(size_t i = 0; i < 8; i++) { |
| 782 | + buffer[i] = (buffer[i] << i) | (buffer[i + 1] >> (8 - i)); |
| 783 | + } |
| 784 | + bit_buffer_append_bytes(tx_buffer, buffer, 8); |
| 785 | + |
| 786 | + for(size_t i = 0; i < 8; i++) { |
| 787 | + bit_lib_reverse_bits(buffer + i, 0, 8); |
| 788 | + bit_buffer_set_byte_with_parity( |
| 789 | + tx_buffer, i, buffer[i], bit_lib_get_bit(&tx_parity, i)); |
| 790 | + } |
| 791 | + |
| 792 | + MfClassicError error = mf_classic_poller_send_custom_parity_frame( |
| 793 | + mfc_poller, tx_buffer, rx_buffer, MF_CLASSIC_FWT_FC); |
| 794 | + if(error != MfClassicErrorNone) { |
| 795 | + FURI_LOG_W(TAG, "mf_classic_poller_send_encrypted_frame error %d", error); |
| 796 | + seader_worker->stage = SeaderPollerEventTypeFail; |
| 797 | + break; |
| 798 | + } |
| 799 | + |
| 800 | + /* |
| 801 | + uint8_t b[SEADER_POLLER_MAX_BUFFER_SIZE]; |
| 802 | + memset(b, 0, SEADER_POLLER_MAX_BUFFER_SIZE); |
| 803 | + size_t bits_written = 0; |
| 804 | + bit_buffer_write_bytes_with_parity(rx_buffer, b, SEADER_POLLER_MAX_BUFFER_SIZE, &bits_written); |
| 805 | +
|
| 806 | + seader_send_nfc_rx(seader_uart, b, bits_written/8); |
| 807 | + */ |
| 808 | + } else { |
| 809 | + FURI_LOG_W(TAG, "UNHANDLED FORMAT"); |
767 | 810 | }
|
768 |
| - FURI_LOG_W(TAG, "mf_classic_poller_send_standard_frame success"); |
769 | 811 |
|
770 | 812 | seader_send_nfc_rx(
|
771 | 813 | seader_uart,
|
|
0 commit comments