adaptations

This commit is contained in:
iceman1001 2024-04-22 19:58:52 +02:00
commit b4ba36c1ff

View file

@ -241,10 +241,14 @@ size_t removeParity(uint8_t *bits, size_t startIdx, uint8_t pLen, uint8_t pType,
// if parity fails then return 0 // if parity fails then return 0
switch (pType) { switch (pType) {
case 3: case 3:
if (bits[bitCnt] == 1) {return 0;} if (bits[bitCnt] == 1) {
return 0;
}
break; // should be 0 spacer bit break; // should be 0 spacer bit
case 2: case 2:
if (bits[bitCnt] == 0) {return 0;} if (bits[bitCnt] == 0) {
return 0;
}
break; // should be 1 spacer bit break; // should be 1 spacer bit
default: default:
if (parityTest(parityWd, pLen, pType) == 0) { return 0; } if (parityTest(parityWd, pLen, pType) == 0) { return 0; }
@ -257,7 +261,7 @@ size_t removeParity(uint8_t *bits, size_t startIdx, uint8_t pLen, uint8_t pType,
return bitCnt; return bitCnt;
} }
static size_t removeEm410xParity(uint8_t *bits, size_t startIdx, bool isLong, bool *validShort, bool *validShortExtended, bool *validLong) { static size_t removeEm410xParity(uint8_t *bits, size_t startIdx, size_t *size, bool *validShort, bool *validShortExtended, bool *validLong) {
uint32_t parityWd = 0; uint32_t parityWd = 0;
size_t bitCnt = 0; size_t bitCnt = 0;
bool validColParity = false; bool validColParity = false;
@ -266,16 +270,28 @@ static size_t removeEm410xParity(uint8_t *bits, size_t startIdx, bool isLong, bo
*validShort = false; *validShort = false;
*validShortExtended = false; *validShortExtended = false;
*validLong = false; *validLong = false;
uint8_t bLen = isLong ? 110 : 55;
uint16_t parityCol[4] = { 0, 0, 0, 0 };
for (int word = 0; word < bLen; word += 5) { uint8_t blen = 55;
for (int bit = 0; bit < 5; bit++) { switch (*size) {
case 128:
if (word + bit >= bLen) { blen = 110;
break;
case 80:
blen = 70;
break;
default:
blen = 55;
break; break;
} }
uint16_t parityCol[4] = { 0, 0, 0, 0 };
for (int word = 0; word < blen; word += 5) {
for (int bit = 0; bit < 5; bit++) {
if (word + bit >= blen) {
break;
}
parityWd = (parityWd << 1) | bits[startIdx + word + bit]; parityWd = (parityWd << 1) | bits[startIdx + word + bit];
if ((word <= 50) && (bit < 4)) { if ((word <= 50) && (bit < 4)) {
@ -284,10 +300,12 @@ static size_t removeEm410xParity(uint8_t *bits, size_t startIdx, bool isLong, bo
bits[bitCnt++] = (bits[startIdx + word + bit]); bits[bitCnt++] = (bits[startIdx + word + bit]);
} }
if (word + 5 > bLen) break;
if (word + 5 > blen) break;
bitCnt--; // overwrite parity with next data bitCnt--; // overwrite parity with next data
validRowParity &= parityTest(parityWd, 5, 0) != 0; validRowParity &= parityTest(parityWd, 5, 0) != 0;
if (word == 50) { // column parity nibble on short EM and on Electra if (word == 50) { // column parity nibble on short EM and on Electra
validColParity = parityTest(parityCol[0], 11, 0) != 0; validColParity = parityTest(parityCol[0], 11, 0) != 0;
validColParity &= parityTest(parityCol[1], 11, 0) != 0; validColParity &= parityTest(parityCol[1], 11, 0) != 0;
@ -298,15 +316,16 @@ static size_t removeEm410xParity(uint8_t *bits, size_t startIdx, bool isLong, bo
} }
parityWd = 0; parityWd = 0;
} }
if (!isLong && validRowParitySkipColP && validColParity) {
if ((blen != 128) && validRowParitySkipColP && validColParity) {
*validShort = true; *validShort = true;
} }
if (isLong && validRowParity) { if ((blen == 128) && validRowParity) {
*validLong = true; *validLong = true;
} }
if (isLong && validRowParitySkipColP && validColParity) { if ((blen == 128) && validRowParitySkipColP && validColParity) {
*validShortExtended = true; *validShortExtended = true;
} }
@ -411,27 +430,36 @@ bool preambleSearchEx(uint8_t *bits, uint8_t *preamble, size_t pLen, size_t *siz
// find start of modulating data (for fsk and psk) in case of beginning noise or slow chip startup. // find start of modulating data (for fsk and psk) in case of beginning noise or slow chip startup.
static size_t findModStart(const uint8_t *src, size_t size, uint8_t expWaveSize) { static size_t findModStart(const uint8_t *src, size_t size, uint8_t expWaveSize) {
size_t i = 0; size_t i = 0;
size_t waveSizeCnt = 0; size_t waveSizeCnt = 0;
uint8_t thresholdCnt = 0; uint8_t thresholdCnt = 0;
bool isAboveThreshold = src[i++] >= signalprop.mean; //FSK_PSK_THRESHOLD;
// FSK_PSK_THRESHOLD;
bool isAboveThreshold = (src[i++] >= signalprop.mean);
for (; i < size - 20; i++) { for (; i < size - 20; i++) {
if (src[i] < signalprop.mean && isAboveThreshold) { if (src[i] < signalprop.mean && isAboveThreshold) {
thresholdCnt++; thresholdCnt++;
if (thresholdCnt > 2 && waveSizeCnt < expWaveSize + 1) break; if (thresholdCnt > 2 && waveSizeCnt < expWaveSize + 1) {
break;
}
isAboveThreshold = false; isAboveThreshold = false;
waveSizeCnt = 0; waveSizeCnt = 0;
} else if (src[i] >= signalprop.mean && !isAboveThreshold) { } else if (src[i] >= signalprop.mean && !isAboveThreshold) {
thresholdCnt++; thresholdCnt++;
if (thresholdCnt > 2 && waveSizeCnt < expWaveSize + 1) break; if (thresholdCnt > 2 && waveSizeCnt < expWaveSize + 1) {
break;
}
isAboveThreshold = true; isAboveThreshold = true;
waveSizeCnt = 0; waveSizeCnt = 0;
} else { } else {
waveSizeCnt++; waveSizeCnt++;
} }
if (thresholdCnt > 10) break; if (thresholdCnt > 10) break;
} }
if (g_debugMode == 2) prnt("DEBUG: threshold Count reached at index %zu, count: %u", i, thresholdCnt);
return i; return i;
} }
@ -717,7 +745,7 @@ int DetectStrongAskClock(uint8_t *dest, size_t size, int high, int low, int *clo
int DetectASKClock(uint8_t *dest, size_t size, int *clock, int maxErr) { int DetectASKClock(uint8_t *dest, size_t size, int *clock, int maxErr) {
//don't need to loop through entire array. (cotag has clock of 384) //don't need to loop through entire array. (cotag has clock of 384)
uint16_t loopCnt = 2000; uint16_t loopCnt = 1000;
// not enough samples // not enough samples
if (size <= loopCnt + 60) { if (size <= loopCnt + 60) {
@ -1577,7 +1605,9 @@ int BiphaseRawDecode(uint8_t *bits, size_t *size, int *offset, int invert) {
uint16_t manrawdecode(uint8_t *bits, size_t *size, uint8_t invert, uint8_t *alignPos) { uint16_t manrawdecode(uint8_t *bits, size_t *size, uint8_t invert, uint8_t *alignPos) {
// sanity check // sanity check
if (*size < 16) return 0xFFFF; if (*size < 16) {
return 0xFFFF;
}
int errCnt = 0, bestErr = 1000; int errCnt = 0, bestErr = 1000;
uint16_t bitnum = 0, maxBits = MAX_DEMODULATION_BITS, bestRun = 0; uint16_t bitnum = 0, maxBits = MAX_DEMODULATION_BITS, bestRun = 0;
@ -1588,24 +1618,30 @@ uint16_t manrawdecode(uint8_t *bits, size_t *size, uint8_t invert, uint8_t *alig
for (i = k; i < *size - 1; i += 2) { for (i = k; i < *size - 1; i += 2) {
if (bits[i] == bits[i + 1]) if (bits[i] == bits[i + 1]) {
errCnt++; errCnt++;
}
if (errCnt > 50) if (errCnt > 50) {
break; break;
} }
}
if (bestErr > errCnt) { if (bestErr > errCnt) {
bestErr = errCnt; bestErr = errCnt;
bestRun = k; bestRun = k;
if (g_debugMode == 2) prnt("DEBUG manrawdecode: bestErr %d | bestRun %u", bestErr, bestRun); if (g_debugMode == 2) prnt("DEBUG manrawdecode: bestErr %d | bestRun %u", bestErr, bestRun);
} }
errCnt = 0; errCnt = 0;
} }
*alignPos = bestRun; *alignPos = bestRun;
// decode // decode
for (i = bestRun; i < *size; i += 2) { for (i = bestRun; i < *size; i += 2) {
if (bits[i] == 1 && (bits[i + 1] == 0)) { if (bits[i] == 1 && (bits[i + 1] == 0)) {
bits[bitnum++] = invert; bits[bitnum++] = invert;
} else if ((bits[i] == 0) && bits[i + 1] == 1) { } else if ((bits[i] == 0) && bits[i + 1] == 1) {
@ -1613,8 +1649,12 @@ uint16_t manrawdecode(uint8_t *bits, size_t *size, uint8_t invert, uint8_t *alig
} else { } else {
bits[bitnum++] = 7; bits[bitnum++] = 7;
} }
if (bitnum > maxBits) break;
if (bitnum > maxBits) {
break;
} }
}
*size = bitnum; *size = bitnum;
return bestErr; return bestErr;
} }
@ -2189,6 +2229,11 @@ int Em410xDecode(uint8_t *bits, size_t *size, size_t *start_idx, uint32_t *hi, u
*start_idx = 0; *start_idx = 0;
bool adjust = false;
if (*size < 128) {
adjust = true;
}
// preamble 0111111111 // preamble 0111111111
// include 0 in front to help get start pos // include 0 in front to help get start pos
uint8_t preamble[] = {0, 1, 1, 1, 1, 1, 1, 1, 1, 1}; uint8_t preamble[] = {0, 1, 1, 1, 1, 1, 1, 1, 1, 1};
@ -2198,7 +2243,36 @@ int Em410xDecode(uint8_t *bits, size_t *size, size_t *start_idx, uint32_t *hi, u
bool validShort = false; bool validShort = false;
bool validShortExtended = false; bool validShortExtended = false;
bool validLong = false; bool validLong = false;
*size = removeEm410xParity(bits, *start_idx + sizeof(preamble), *size == 128, &validShort, &validShortExtended, &validLong);
// detect sledge of 0x05's
int fix = -1;
uint8_t fives[] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1};
for (size_t x = 0; x < *size - sizeof(fives); x += 1) {
if (memcmp(bits + x, fives, sizeof(fives)) == 0) {
// save first occasion
if (fix == -1) {
fix = x;
break;
}
}
}
size_t sidx = *start_idx + sizeof(preamble);
if (adjust) {
sidx--;
}
// not 128 or 55..
if (fix != -1) {
*size = 80;
}
#ifndef ON_DEVICE
// prnt("fix... %d size... %zu", fix, *size);
#endif
// HACK
*size = removeEm410xParity(bits, sidx, size, &validShort, &validShortExtended, &validLong);
if (validShort) { if (validShort) {
// std em410x format // std em410x format