add first attempt at lf miller decoding

don't have any tags capable to test and not yet hooked up to data
rawdemod...
This commit is contained in:
marshmellow42 2017-03-14 13:16:30 -04:00
parent 549daaf778
commit 127f149075
2 changed files with 35 additions and 12 deletions

View file

@ -29,6 +29,9 @@
uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN]; uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN];
uint8_t g_debugMode=0; uint8_t g_debugMode=0;
size_t DemodBufferLen=0; size_t DemodBufferLen=0;
size_t g_demodStartIdx=0;
uint8_t g_demodClock=0;
static int CmdHelp(const char *Cmd); static int CmdHelp(const char *Cmd);
//set the demod buffer with given array of binary (one bit per byte) //set the demod buffer with given array of binary (one bit per byte)
@ -253,6 +256,7 @@ void printEM410x(uint32_t hi, uint64_t id)
return; return;
} }
//should be moved to cmdlfem4x.c
int AskEm410xDecode(bool verbose, uint32_t *hi, uint64_t *lo ) int AskEm410xDecode(bool verbose, uint32_t *hi, uint64_t *lo )
{ {
size_t idx = 0; size_t idx = 0;
@ -274,7 +278,7 @@ int AskEm410xDecode(bool verbose, uint32_t *hi, uint64_t *lo )
} }
return 0; return 0;
} }
//should be moved to cmdlfem4x.c
int AskEm410xDemod(const char *Cmd, uint32_t *hi, uint64_t *lo, bool verbose) int AskEm410xDemod(const char *Cmd, uint32_t *hi, uint64_t *lo, bool verbose)
{ {
bool st = true; bool st = true;
@ -282,6 +286,7 @@ int AskEm410xDemod(const char *Cmd, uint32_t *hi, uint64_t *lo, bool verbose)
return AskEm410xDecode(verbose, hi, lo); return AskEm410xDecode(verbose, hi, lo);
} }
//should be moved to cmdlfem4x.c
//by marshmellow //by marshmellow
//takes 3 arguments - clock, invert and maxErr as integers //takes 3 arguments - clock, invert and maxErr as integers
//attempts to demodulate ask while decoding manchester //attempts to demodulate ask while decoding manchester
@ -451,7 +456,8 @@ int Cmdmandecoderaw(const char *Cmd)
sscanf(Cmd, "%i %i", &invert, &maxErr); sscanf(Cmd, "%i %i", &invert, &maxErr);
size=i; size=i;
errCnt=manrawdecode(BitStream, &size, invert); uint8_t alignPos = 0;
errCnt=manrawdecode(BitStream, &size, invert, &alignPos);
if (errCnt>=maxErr){ if (errCnt>=maxErr){
PrintAndLog("Too many errors: %d",errCnt); PrintAndLog("Too many errors: %d",errCnt);
return 0; return 0;
@ -590,6 +596,7 @@ int Cmdaskbiphdemod(const char *Cmd)
return ASKbiphaseDemod(Cmd, true); return ASKbiphaseDemod(Cmd, true);
} }
//could be split to a gProxII file
//by marshmellow //by marshmellow
//attempts to demodulate and identify a G_Prox_II verex/chubb card //attempts to demodulate and identify a G_Prox_II verex/chubb card
//WARNING: if it fails during some points it will destroy the DemodBuffer data //WARNING: if it fails during some points it will destroy the DemodBuffer data
@ -655,6 +662,7 @@ int CmdG_Prox_II_Demod(const char *Cmd)
return 1; return 1;
} }
//could be moved to a viking file
//by marshmellow //by marshmellow
//see ASKDemod for what args are accepted //see ASKDemod for what args are accepted
int CmdVikingDemod(const char *Cmd) int CmdVikingDemod(const char *Cmd)
@ -1038,6 +1046,7 @@ int CmdFSKrawdemod(const char *Cmd)
return FSKrawDemod(Cmd, true); return FSKrawDemod(Cmd, true);
} }
//move to cmdlfhid.c
//by marshmellow (based on existing demod + holiman's refactor) //by marshmellow (based on existing demod + holiman's refactor)
//HID Prox demod - FSK RF/50 with preamble of 00011101 (then manchester encoded) //HID Prox demod - FSK RF/50 with preamble of 00011101 (then manchester encoded)
//print full HID Prox ID and some bit format details if found //print full HID Prox ID and some bit format details if found
@ -1124,6 +1133,7 @@ int CmdFSKdemodHID(const char *Cmd)
return 1; return 1;
} }
//by marshmellow //by marshmellow
//Paradox Prox demod - FSK RF/50 with preamble of 00001111 (then manchester encoded) //Paradox Prox demod - FSK RF/50 with preamble of 00001111 (then manchester encoded)
//print full Paradox Prox ID and some bit format details if found //print full Paradox Prox ID and some bit format details if found
@ -2264,13 +2274,13 @@ int CmdDirectionalThreshold(const char *Cmd)
if (GraphBuffer[i] >= upThres && GraphBuffer[i] > lastValue) if (GraphBuffer[i] >= upThres && GraphBuffer[i] > lastValue)
{ {
lastValue = GraphBuffer[i]; // Buffer last value as we overwrite it. lastValue = GraphBuffer[i]; // Buffer last value as we overwrite it.
GraphBuffer[i] = 1; GraphBuffer[i] = 127;
} }
// Apply second threshold to samples heading down // Apply second threshold to samples heading down
else if (GraphBuffer[i] <= downThres && GraphBuffer[i] < lastValue) else if (GraphBuffer[i] <= downThres && GraphBuffer[i] < lastValue)
{ {
lastValue = GraphBuffer[i]; // Buffer last value as we overwrite it. lastValue = GraphBuffer[i]; // Buffer last value as we overwrite it.
GraphBuffer[i] = -1; GraphBuffer[i] = -127;
} }
else else
{ {

View file

@ -1074,17 +1074,18 @@ bool DetectST(uint8_t buffer[], size_t *size, int *foundclock) {
} }
//by marshmellow //by marshmellow
//take 11 10 01 11 00 and make 01100 ... miller decoding //take 11 10 01 11 00 and make 01100 ... miller decoding
//check for phase errors - should never have half a 1 or 0 by itself and should never exceed 1111 or 0000 in a row //check for phase errors - should never have half a 1 or 0 by itself and should never exceed 1111 or 0000 in a row
//decodes miller encoded binary //decodes miller encoded binary
//NOTE askrawdemod will NOT demod miller encoded ask unless the clock is manually set to 1/2 what it is detected as! //NOTE askrawdemod will NOT demod miller encoded ask unless the clock is manually set to 1/2 what it is detected as!
/*int millerRawDecode(uint8_t *BitStream, size_t *size, int invert) { int millerRawDecode(uint8_t *BitStream, size_t *size, int invert) {
if (*size < 16) return -1; if (*size < 16) return -1;
uint16_t MaxBits = 512, errCnt = 0, bestErr = 1000, bestRun = 0; uint16_t MaxBits = 512, errCnt = 0;
size_t i, ii, bitCnt=0; size_t i, bitCnt=0;
uint8_t alignCnt = 0, curBit = BitStream[0]; uint8_t alignCnt = 0, curBit = BitStream[0], alignedIdx = 0;
uint8_t halfClkErr = 0;
//find alignment, needs 4 1s or 0s to properly align //find alignment, needs 4 1s or 0s to properly align
for (i=1; i < *size; i++) { for (i=1; i < *size-1; i++) {
alignCnt = (BitStream[i] == curBit) ? alignCnt+1 : 0; alignCnt = (BitStream[i] == curBit) ? alignCnt+1 : 0;
curBit = BitStream[i]; curBit = BitStream[i];
if (alignCnt == 4) break; if (alignCnt == 4) break;
@ -1094,8 +1095,21 @@ bool DetectST(uint8_t buffer[], size_t *size, int *foundclock) {
if (g_debugMode) prnt("ERROR MillerDecode: alignment not found so either your bitstream is not miller or your data does not have a 101 in it"); if (g_debugMode) prnt("ERROR MillerDecode: alignment not found so either your bitstream is not miller or your data does not have a 101 in it");
return -1; return -1;
} }
alignedIdx = (i-1) % 2;
for (i=alignedIdx; i < *size-3; i+=2) {
halfClkErr = (uint8_t)((halfClkErr << 1 | BitStream[i]) & 0xFF);
if ( (halfClkErr & 0x7) == 5 || (halfClkErr & 0x7) == 2 || (i > 2 && (halfClkErr & 0x7) == 0) || (halfClkErr & 0x1F) == 0x1F) {
errCnt++;
BitStream[bitCnt++] = 7;
continue;
}
BitStream[bitCnt++] = BitStream[i] ^ BitStream[i+1] ^ invert;
}*/ if (bitCnt > MaxBits) break;
}
*size = bitCnt;
return errCnt;
}
//by marshmellow //by marshmellow
//take 01 or 10 = 1 and 11 or 00 = 0 //take 01 or 10 = 1 and 11 or 00 = 0
@ -1876,7 +1890,6 @@ int VikingDemod_AM(uint8_t *dest, size_t *size) {
return (int) startIdx; return (int) startIdx;
} }
// by iceman // by iceman
// find Visa2000 preamble in already demoded data // find Visa2000 preamble in already demoded data
int Visa2kDemod_AM(uint8_t *dest, size_t *size) { int Visa2kDemod_AM(uint8_t *dest, size_t *size) {