bit encoder, works very good with real reader

This commit is contained in:
merlokk 2022-07-03 22:54:58 +03:00
commit 640f6772a5

View file

@ -91,34 +91,66 @@ int HfReadADC(uint32_t samplesCount, bool ledcontrol) {
return 0; return 0;
} }
uint8_t encode_acc = 0;
uint8_t encode_acc_bit_count = 0;
uint32_t encode_indx = 0;
static void EncodeInit(void) {
encode_acc = 0;
encode_acc_bit_count = 0;
encode_indx = 0;
}
static void EncodeAddBit(uint8_t* data, uint8_t bit, uint8_t bit_count) {
for (int i = 0; i < bit_count; i++) {
encode_acc = (encode_acc << 1) | (bit & 0x01);
encode_acc_bit_count++;
if (encode_acc_bit_count > 7) {
data[encode_indx++] = encode_acc;
encode_acc = 0;
encode_acc_bit_count = 0;
}
}
}
static uint32_t EncodeFinish(uint8_t* data) {
if (encode_acc_bit_count > 0) {
encode_acc = encode_acc << (8 - encode_acc_bit_count);
data[encode_indx++] = encode_acc;
}
return encode_indx;
}
static uint32_t HfEncodeTkm(uint8_t *uid, uint8_t modulation, uint8_t *data) { static uint32_t HfEncodeTkm(uint8_t *uid, uint8_t modulation, uint8_t *data) {
uint32_t len = 0; uint32_t len = 0;
if (modulation == 0) { if (modulation == 0) {
// TK-13 // TK-13
// 74ns 1 field cycle, // 74ns 1 field cycle,
// carrier frequency is fc/64 (212kHz), 4.7 mks // carrier frequency is fc/64 (212kHz), 4.7 mks
// 100 field cycle = impulse (13 bytes) // 100 field cycle = impulse 1.6 ( 1 bit from real tag)
// 1000 field cycle = `1` (125 bytes) // 1000 field cycle = `1` 15.6 (17 bit from real tag)
// 500 field cycle = `0` (63 bytes) // 500 field cycle = `0` 7.8 ( 7 bit from real tag)
// `1` - 125, 63
// `0` - 63, 125
int indx = 0; EncodeInit();
for (int i = 0; i < 8; i++) { for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) { for (int j = 0; j < 8; j++) {
if (((uid[i] << j) & 0x80) != 0) { if (((uid[i] << j) & 0x80) != 0) {
// `1` // `1`
data[indx++] = 1; EncodeAddBit(data, 1, 1);
data[indx++] = 0; EncodeAddBit(data, 0, 17);
EncodeAddBit(data, 1, 1);
EncodeAddBit(data, 0, 7);
} else { } else {
// `0` // `0`
data[indx++] = 0; EncodeAddBit(data, 1, 1);
data[indx++] = 1; EncodeAddBit(data, 0, 7);
EncodeAddBit(data, 1, 1);
EncodeAddBit(data, 0, 17);
} }
} }
} }
len = EncodeFinish(data);
len = indx;
} else { } else {
// TK-17 // TK-17
// 74ns 1 field cycle, // 74ns 1 field cycle,
@ -181,20 +213,10 @@ int HfWriteTkm(uint8_t *uid, uint8_t modulation, uint32_t timeout) {
} }
SpinDelay(3); SpinDelay(3);
for (int i = 0; i < elen; i++) { for (int i = 0; i < elen;) {
for (int j = 0; j < 1;) { if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXRDY) {
if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXRDY) { AT91C_BASE_SSC->SSC_THR = data[i];
AT91C_BASE_SSC->SSC_THR = 0x80; i++;
j++;
}
}
if (data[i] > 0) {
for (int j = 0; j < data[i];) {
if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXRDY) {
AT91C_BASE_SSC->SSC_THR = 0x00;
j++;
}
}
} }
} }
} }