Merge pull request #235 from marshmellow42/lfdemod_refactors

lfdemod refactor
This commit is contained in:
pwpiwi 2017-03-21 15:38:18 +01:00 committed by GitHub
commit 7ac59a82ab
5 changed files with 1196 additions and 1097 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
@ -1751,7 +1761,8 @@ int NRZrawDemod(const char *Cmd, bool verbose)
size_t BitLen = getFromGraphBuf(BitStream); size_t BitLen = getFromGraphBuf(BitStream);
if (BitLen==0) return 0; if (BitLen==0) return 0;
int errCnt=0; int errCnt=0;
errCnt = nrzRawDemod(BitStream, &BitLen, &clk, &invert); int clkStartIdx = 0;
errCnt = nrzRawDemod(BitStream, &BitLen, &clk, &invert, &clkStartIdx);
if (errCnt > maxErr){ if (errCnt > maxErr){
if (g_debugMode) PrintAndLog("Too many errors found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt); if (g_debugMode) PrintAndLog("Too many errors found, clk: %d, invert: %d, numbits: %d, errCnt: %d",clk,invert,BitLen,errCnt);
return 0; return 0;
@ -2264,13 +2275,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

@ -43,7 +43,8 @@ int CmdCOTAGDemod(const char *Cmd) {
size_t bitlen = COTAG_BITS; size_t bitlen = COTAG_BITS;
memcpy(bits, DemodBuffer, COTAG_BITS); memcpy(bits, DemodBuffer, COTAG_BITS);
int err = manrawdecode(bits, &bitlen, 1); uint8_t alignPos = 0;
int err = manrawdecode(bits, &bitlen, 1, &alignPos);
if (err){ if (err){
if (g_debugMode) PrintAndLog("DEBUG: Error - COTAG too many errors: %d", err); if (g_debugMode) PrintAndLog("DEBUG: Error - COTAG too many errors: %d", err);
return -1; return -1;

View file

@ -218,7 +218,8 @@ uint8_t GetNrzClock(const char str[], bool printAns, bool verbose)
PrintAndLog("Failed to copy from graphbuffer"); PrintAndLog("Failed to copy from graphbuffer");
return -1; return -1;
} }
clock = DetectNRZClock(grph, size, 0); size_t clkStartIdx = 0;
clock = DetectNRZClock(grph, size, 0, &clkStartIdx);
// Only print this message if we're not looping something // Only print this message if we're not looping something
if (printAns){ if (printAns){
PrintAndLog("Auto-detected clock rate: %d", clock); PrintAndLog("Auto-detected clock rate: %d", clock);

File diff suppressed because it is too large Load diff

View file

@ -19,6 +19,7 @@
//generic //generic
extern size_t addParity(uint8_t *BitSource, uint8_t *dest, uint8_t sourceLen, uint8_t pLen, uint8_t pType); extern size_t addParity(uint8_t *BitSource, uint8_t *dest, uint8_t sourceLen, uint8_t pLen, uint8_t pType);
extern int askdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert, int maxErr, uint8_t amp, uint8_t askType); extern int askdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert, int maxErr, uint8_t amp, uint8_t askType);
extern int askdemod_ext(uint8_t *BinStream, size_t *size, int *clk, int *invert, int maxErr, uint8_t amp, uint8_t askType, int *startIdx);
extern void askAmp(uint8_t *BitStream, size_t size); extern void askAmp(uint8_t *BitStream, size_t size);
extern int BiphaseRawDecode(uint8_t * BitStream, size_t *size, int offset, int invert); extern int BiphaseRawDecode(uint8_t * BitStream, size_t *size, int offset, int invert);
extern uint32_t bytebits_to_byte(uint8_t* src, size_t numbits); extern uint32_t bytebits_to_byte(uint8_t* src, size_t numbits);
@ -28,23 +29,24 @@ extern int DetectASKClock(uint8_t dest[], size_t size, int *clock, int maxE
extern uint8_t DetectCleanAskWave(uint8_t dest[], size_t size, uint8_t high, uint8_t low); extern uint8_t DetectCleanAskWave(uint8_t dest[], size_t size, uint8_t high, uint8_t low);
extern uint8_t detectFSKClk(uint8_t *BitStream, size_t size, uint8_t fcHigh, uint8_t fcLow); extern uint8_t detectFSKClk(uint8_t *BitStream, size_t size, uint8_t fcHigh, uint8_t fcLow);
extern uint8_t detectFSKClk_ext(uint8_t *BitStream, size_t size, uint8_t fcHigh, uint8_t fcLow, int *firstClockEdge); extern uint8_t detectFSKClk_ext(uint8_t *BitStream, size_t size, uint8_t fcHigh, uint8_t fcLow, int *firstClockEdge);
extern int DetectNRZClock(uint8_t dest[], size_t size, int clock); extern int DetectNRZClock(uint8_t dest[], size_t size, int clock, size_t *clockStartIdx);
extern int DetectNRZClock_ext(uint8_t dest[], size_t size, int clock, size_t *clockStartIdx);
extern int DetectPSKClock(uint8_t dest[], size_t size, int clock); extern int DetectPSKClock(uint8_t dest[], size_t size, int clock);
extern int DetectPSKClock_ext(uint8_t dest[], size_t size, int clock, int *firstPhaseShift); extern int DetectPSKClock_ext(uint8_t dest[], size_t size, int clock, int *firstPhaseShift);
extern int DetectStrongAskClock(uint8_t dest[], size_t size, uint8_t high, uint8_t low, int *clock); extern int DetectStrongAskClock(uint8_t dest[], size_t size, int high, int low, int *clock);
extern bool DetectST(uint8_t buffer[], size_t *size, int *foundclock); extern bool DetectST(uint8_t buffer[], size_t *size, int *foundclock);
extern bool DetectST_ext(uint8_t buffer[], size_t *size, int *foundclock, size_t *ststart, size_t *stend); extern bool DetectST_ext(uint8_t buffer[], size_t *size, int *foundclock, size_t *ststart, size_t *stend);
extern int fskdemod(uint8_t *dest, size_t size, uint8_t rfLen, uint8_t invert, uint8_t fchigh, uint8_t fclow); extern int fskdemod(uint8_t *dest, size_t size, uint8_t rfLen, uint8_t invert, uint8_t fchigh, uint8_t fclow);
extern int fskdemod_ext(uint8_t *dest, size_t size, uint8_t rfLen, uint8_t invert, uint8_t fchigh, uint8_t fclow, int *startIdx);
extern int getHiLo(uint8_t *BitStream, size_t size, int *high, int *low, uint8_t fuzzHi, uint8_t fuzzLo); extern int getHiLo(uint8_t *BitStream, size_t size, int *high, int *low, uint8_t fuzzHi, uint8_t fuzzLo);
extern uint32_t manchesterEncode2Bytes(uint16_t datain); extern uint32_t manchesterEncode2Bytes(uint16_t datain);
extern int ManchesterEncode(uint8_t *BitStream, size_t size); extern int ManchesterEncode(uint8_t *BitStream, size_t size);
extern int manrawdecode(uint8_t *BitStream, size_t *size, uint8_t invert); extern int manrawdecode(uint8_t *BitStream, size_t *size, uint8_t invert, uint8_t *alignPos);
extern int nrzRawDemod(uint8_t *dest, size_t *size, int *clk, int *invert); extern int nrzRawDemod(uint8_t *dest, size_t *size, int *clk, int *invert, int *startIdx);
extern uint8_t parityTest(uint32_t bits, uint8_t bitLen, uint8_t pType); extern uint8_t parityTest(uint32_t bits, uint8_t bitLen, uint8_t pType);
extern uint8_t preambleSearch(uint8_t *BitStream, uint8_t *preamble, size_t pLen, size_t *size, size_t *startIdx); extern uint8_t preambleSearch(uint8_t *BitStream, uint8_t *preamble, size_t pLen, size_t *size, size_t *startIdx);
extern bool preambleSearchEx(uint8_t *BitStream, uint8_t *preamble, size_t pLen, size_t *size, size_t *startIdx, bool findone); extern bool preambleSearchEx(uint8_t *BitStream, uint8_t *preamble, size_t pLen, size_t *size, size_t *startIdx, bool findone);
extern int pskRawDemod(uint8_t dest[], size_t *size, int *clock, int *invert); extern int pskRawDemod(uint8_t dest[], size_t *size, int *clock, int *invert);
extern int pskRawDemod_ext(uint8_t dest[], size_t *size, int *clock, int *invert, int *startIdx);
extern void psk2TOpsk1(uint8_t *BitStream, size_t size); extern void psk2TOpsk1(uint8_t *BitStream, size_t size);
extern void psk1TOpsk2(uint8_t *BitStream, size_t size); extern void psk1TOpsk2(uint8_t *BitStream, size_t size);
extern size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t pType, size_t bLen); extern size_t removeParity(uint8_t *BitStream, size_t startIdx, uint8_t pLen, uint8_t pType, size_t bLen);