This commit is contained in:
iceman1001 2017-03-01 20:14:46 +01:00
commit a9eeb57698
13 changed files with 91 additions and 22 deletions

View file

@ -2,7 +2,12 @@
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log...
## [unreleased][unreleased] ## [unreleased][unreleased]
- hf mf dump - added retry loops to try each read attempt up to 3 times. makes getting a complete dump easier with many antennas. (marshmellow)
- Added markers in the graph around found Sequence Terminator after askmandemod. (marshmellow)
- Added data mtrim <start> <stop> command to trim out samples between start and stop. (marshmellow)
- Added data setgraphmarkers <orange> <blue> command to set two extra markers on the graph (marshmellow)
- added json support in lua (vitorio) - added json support in lua (vitorio)
- added a buspirate settings file for at91sam7s512 (adamlaurie) - added a buspirate settings file for at91sam7s512 (adamlaurie)
- `lf read` timeouts is now depended on what threshold level you set in `lf config` (marshmellow) - `lf read` timeouts is now depended on what threshold level you set in `lf config` (marshmellow)

View file

@ -531,6 +531,7 @@ int ASKDemod_ext(const char *Cmd, bool verbose, bool emSearch, uint8_t askType,
int clk = 0; int clk = 0;
int maxErr = 100; int maxErr = 100;
int maxLen = 0; int maxLen = 0;
uint8_t askamp = 0;
char amp = param_getchar(Cmd, 0); char amp = param_getchar(Cmd, 0);
uint8_t BitStream[MAX_GRAPH_TRACE_LEN] = {0}; uint8_t BitStream[MAX_GRAPH_TRACE_LEN] = {0};
sscanf(Cmd, "%i %i %i %i %c", &clk, &invert, &maxErr, &maxLen, &amp); sscanf(Cmd, "%i %i %i %i %c", &clk, &invert, &maxErr, &maxLen, &amp);
@ -553,14 +554,16 @@ int ASKDemod_ext(const char *Cmd, bool verbose, bool emSearch, uint8_t askType,
askAmp(BitStream, BitLen); askAmp(BitStream, BitLen);
bool st = false; bool st = false;
if (*stCheck) st = DetectST(BitStream, &BitLen, &foundclk); size_t ststart = 0, stend = 0;
if (*stCheck) st = DetectST_ext(BitStream, &BitLen, &foundclk, &ststart, &stend);
if (st) { if (st) {
*stCheck = st; *stCheck = st;
clk = (clk == 0) ? foundclk : clk; clk = (clk == 0) ? foundclk : clk;
if (verbose || g_debugMode) PrintAndLog("\nFound Sequence Terminator"); CursorCPos = ststart;
CursorDPos = stend;
if (verbose || g_debugMode) PrintAndLog("\nFound Sequence Terminator - First one is shown by orange and blue graph markers");
} }
int errCnt = askdemod(BitStream, &BitLen, &clk, &invert, maxErr, askamp, askType);
int errCnt = askdemod(BitStream, &BitLen, &clk, &invert, maxErr, 0, askType);
if (errCnt<0 || BitLen<16){ //if fatal error (or -1) if (errCnt<0 || BitLen<16){ //if fatal error (or -1)
if (g_debugMode) PrintAndLog("DEBUG: no data found %d, errors:%d, bitlen:%d, clock:%d",errCnt,invert,BitLen,clk); if (g_debugMode) PrintAndLog("DEBUG: no data found %d, errors:%d, bitlen:%d, clock:%d",errCnt,invert,BitLen,clk);
return 0; return 0;
@ -2100,6 +2103,11 @@ void setGrid_Clock(uint8_t clock){
RepaintGraphWindow(); RepaintGraphWindow();
} }
int CmdSetGraphMarkers(const char *Cmd) {
sscanf(Cmd, "%i %i", &CursorCPos, &CursorDPos);
RepaintGraphWindow();
return 0;
}
int CmdHexsamples(const char *Cmd) int CmdHexsamples(const char *Cmd)
{ {
@ -2361,6 +2369,22 @@ int CmdRtrim(const char *Cmd)
return 0; return 0;
} }
// trim graph (middle) piece
int CmdMtrim(const char *Cmd) {
int start = 0, stop = 0;
sscanf(Cmd, "%i %i", &start, &stop);
if (start > GraphTraceLen || stop > GraphTraceLen || start > stop) return 0;
start++; //leave start position sample
GraphTraceLen -= stop - start;
for (int i = 0; i < GraphTraceLen; i++) {
GraphBuffer[start+i] = GraphBuffer[stop+i];
}
return 0;
}
int CmdNorm(const char *Cmd) int CmdNorm(const char *Cmd)
{ {
int i; int i;
@ -2593,6 +2617,7 @@ static command_t CommandTable[] =
{"load", CmdLoad, 1, "<filename> -- Load trace (to graph window"}, {"load", CmdLoad, 1, "<filename> -- Load trace (to graph window"},
{"ltrim", CmdLtrim, 1, "<samples> -- Trim samples from left of trace"}, {"ltrim", CmdLtrim, 1, "<samples> -- Trim samples from left of trace"},
{"rtrim", CmdRtrim, 1, "<location to end trace> -- Trim samples from right of trace"}, {"rtrim", CmdRtrim, 1, "<location to end trace> -- Trim samples from right of trace"},
{"mtrim", CmdMtrim, 1, "<start> <stop> -- Trim out samples from the specified start to the specified stop"},
{"manrawdecode", Cmdmandecoderaw, 1, "[invert] [maxErr] -- Manchester decode binary stream in DemodBuffer"}, {"manrawdecode", Cmdmandecoderaw, 1, "[invert] [maxErr] -- Manchester decode binary stream in DemodBuffer"},
{"norm", CmdNorm, 1, "Normalize max/min to +/-128"}, {"norm", CmdNorm, 1, "Normalize max/min to +/-128"},
{"plot", CmdPlot, 1, "Show graph window (hit 'h' in window for keystroke help)"}, {"plot", CmdPlot, 1, "Show graph window (hit 'h' in window for keystroke help)"},
@ -2602,6 +2627,7 @@ static command_t CommandTable[] =
{"rawdemod", CmdRawDemod, 1, "[modulation] ... <options> -see help (h option) -- Demodulate the data in the GraphBuffer and output binary"}, {"rawdemod", CmdRawDemod, 1, "[modulation] ... <options> -see help (h option) -- Demodulate the data in the GraphBuffer and output binary"},
{"samples", CmdSamples, 0, "[512 - 40000] -- Get raw samples for graph window (GraphBuffer)"}, {"samples", CmdSamples, 0, "[512 - 40000] -- Get raw samples for graph window (GraphBuffer)"},
{"save", CmdSave, 1, "<filename> -- Save trace (from graph window)"}, {"save", CmdSave, 1, "<filename> -- Save trace (from graph window)"},
{"setgraphmarkers", CmdSetGraphMarkers, 1, "[orange_marker] [blue_marker] (in graph window)"},
{"scale", CmdScale, 1, "<int> -- Set cursor display scale"}, {"scale", CmdScale, 1, "<int> -- Set cursor display scale"},
{"setdebugmode", CmdSetDebugMode, 1, "<0|1|2> -- Turn on or off Debugging Level for lf demods"}, {"setdebugmode", CmdSetDebugMode, 1, "<0|1|2> -- Turn on or off Debugging Level for lf demods"},
{"shiftgraphzero", CmdGraphShiftZero, 1, "<shift> -- Shift 0 for Graphed wave + or - shift value"}, {"shiftgraphzero", CmdGraphShiftZero, 1, "<shift> -- Shift 0 for Graphed wave + or - shift value"},

View file

@ -492,8 +492,9 @@ int CmdHF14AMfDump(const char *Cmd) {
PrintAndLog("|-----------------------------------------|"); PrintAndLog("|-----------------------------------------|");
PrintAndLog("|------ Reading sector access bits...-----|"); PrintAndLog("|------ Reading sector access bits...-----|");
PrintAndLog("|-----------------------------------------|"); PrintAndLog("|-----------------------------------------|");
uint8_t tries = 0;
for (sectorNo = 0; sectorNo < numSectors; sectorNo++) { for (sectorNo = 0; sectorNo < numSectors; sectorNo++) {
for (tries = 0; tries < 3; tries++) {
UsbCommand c = {CMD_MIFARE_READBL, {FirstBlockOfSector(sectorNo) + NumBlocksPerSector(sectorNo) - 1, 0, 0}}; UsbCommand c = {CMD_MIFARE_READBL, {FirstBlockOfSector(sectorNo) + NumBlocksPerSector(sectorNo) - 1, 0, 0}};
memcpy(c.d.asBytes, keyA[sectorNo], 6); memcpy(c.d.asBytes, keyA[sectorNo], 6);
clearCommandBuffer(); clearCommandBuffer();
@ -507,7 +508,8 @@ int CmdHF14AMfDump(const char *Cmd) {
rights[sectorNo][1] = ((data[7] & 0x20)>>3) | ((data[8] & 0x2)<<0) | ((data[8] & 0x20)>>5); // C1C2C3 for data area 1 rights[sectorNo][1] = ((data[7] & 0x20)>>3) | ((data[8] & 0x2)<<0) | ((data[8] & 0x20)>>5); // C1C2C3 for data area 1
rights[sectorNo][2] = ((data[7] & 0x40)>>4) | ((data[8] & 0x4)>>1) | ((data[8] & 0x40)>>6); // C1C2C3 for data area 2 rights[sectorNo][2] = ((data[7] & 0x40)>>4) | ((data[8] & 0x4)>>1) | ((data[8] & 0x40)>>6); // C1C2C3 for data area 2
rights[sectorNo][3] = ((data[7] & 0x80)>>5) | ((data[8] & 0x8)>>2) | ((data[8] & 0x80)>>7); // C1C2C3 for sector trailer rights[sectorNo][3] = ((data[7] & 0x80)>>5) | ((data[8] & 0x8)>>2) | ((data[8] & 0x80)>>7); // C1C2C3 for sector trailer
} else { break;
} else if (tries == 2) { // on last try set defaults
PrintAndLog("Could not get access rights for sector %2d. Trying with defaults...", sectorNo); PrintAndLog("Could not get access rights for sector %2d. Trying with defaults...", sectorNo);
rights[sectorNo][0] = rights[sectorNo][1] = rights[sectorNo][2] = 0x00; rights[sectorNo][0] = rights[sectorNo][1] = rights[sectorNo][2] = 0x00;
rights[sectorNo][3] = 0x01; rights[sectorNo][3] = 0x01;
@ -518,6 +520,7 @@ int CmdHF14AMfDump(const char *Cmd) {
rights[sectorNo][3] = 0x01; rights[sectorNo][3] = 0x01;
} }
} }
}
PrintAndLog("|-----------------------------------------|"); PrintAndLog("|-----------------------------------------|");
PrintAndLog("|----- Dumping all blocks to file... -----|"); PrintAndLog("|----- Dumping all blocks to file... -----|");
@ -527,7 +530,7 @@ int CmdHF14AMfDump(const char *Cmd) {
for (sectorNo = 0; isOK && sectorNo < numSectors; sectorNo++) { for (sectorNo = 0; isOK && sectorNo < numSectors; sectorNo++) {
for (blockNo = 0; isOK && blockNo < NumBlocksPerSector(sectorNo); blockNo++) { for (blockNo = 0; isOK && blockNo < NumBlocksPerSector(sectorNo); blockNo++) {
bool received = false; bool received = false;
for (tries = 0; tries < 3; tries++) {
if (blockNo == NumBlocksPerSector(sectorNo) - 1) { // sector trailer. At least the Access Conditions can always be read with key A. if (blockNo == NumBlocksPerSector(sectorNo) - 1) { // sector trailer. At least the Access Conditions can always be read with key A.
UsbCommand c = {CMD_MIFARE_READBL, {FirstBlockOfSector(sectorNo) + blockNo, 0, 0}}; UsbCommand c = {CMD_MIFARE_READBL, {FirstBlockOfSector(sectorNo) + blockNo, 0, 0}};
memcpy(c.d.asBytes, keyA[sectorNo], 6); memcpy(c.d.asBytes, keyA[sectorNo], 6);
@ -544,12 +547,18 @@ int CmdHF14AMfDump(const char *Cmd) {
} else if (rights[sectorNo][data_area] == 0x07) { // no key would work } else if (rights[sectorNo][data_area] == 0x07) { // no key would work
isOK = false; isOK = false;
PrintAndLog("Access rights do not allow reading of sector %2d block %3d", sectorNo, blockNo); PrintAndLog("Access rights do not allow reading of sector %2d block %3d", sectorNo, blockNo);
tries = 2;
} else { // key A would work } else { // key A would work
UsbCommand c = {CMD_MIFARE_READBL, {FirstBlockOfSector(sectorNo) + blockNo, 0, 0}}; UsbCommand c = {CMD_MIFARE_READBL, {FirstBlockOfSector(sectorNo) + blockNo, 0, 0}};
memcpy(c.d.asBytes, keyA[sectorNo], 6); memcpy(c.d.asBytes, keyA[sectorNo], 6);
clearCommandBuffer(); clearCommandBuffer();
SendCommand(&c); SendCommand(&c);
received = WaitForResponseTimeout(CMD_ACK,&resp,1500); received = WaitForResponseTimeout(CMD_ACK,&resp,1500);
}
}
if (received) {
isOK = resp.arg[0] & 0xff;
if (isOK) break;
} }
} }
@ -594,7 +603,6 @@ int CmdHF14AMfDump(const char *Cmd) {
uint16_t numblocks = FirstBlockOfSector(numSectors - 1) + NumBlocksPerSector(numSectors - 1); uint16_t numblocks = FirstBlockOfSector(numSectors - 1) + NumBlocksPerSector(numSectors - 1);
fwrite(carddata, 1, 16*numblocks, fout); fwrite(carddata, 1, 16*numblocks, fout);
fclose(fout); fclose(fout);
fout = NULL;
PrintAndLog("Dumped %d blocks (%d bytes) to file dumpdata.bin", numblocks, 16*numblocks); PrintAndLog("Dumped %d blocks (%d bytes) to file dumpdata.bin", numblocks, 16*numblocks);
} }

View file

@ -149,6 +149,7 @@ int CmdFdxDemod(const char *Cmd) {
} }
setDemodBuf(DemodBuffer, 128, ans); setDemodBuf(DemodBuffer, 128, ans);
setGrid_Clock(32);
// remove marker bits (1's every 9th digit after preamble) (pType = 2) // remove marker bits (1's every 9th digit after preamble) (pType = 2)
size = removeParity(DemodBuffer, 11, 9, 2, 117); size = removeParity(DemodBuffer, 11, 9, 2, 117);
if ( size != 104 ) { if ( size != 104 ) {

View file

@ -136,7 +136,8 @@ int CmdLFNedapDemod(const char *Cmd) {
raw[2] = bytebits_to_byte(DemodBuffer+idx+32,32); raw[2] = bytebits_to_byte(DemodBuffer+idx+32,32);
raw[3] = bytebits_to_byte(DemodBuffer+idx,32); raw[3] = bytebits_to_byte(DemodBuffer+idx,32);
setDemodBuf(DemodBuffer,128,idx); setDemodBuf(DemodBuffer,128,idx);
setGrid_Clock(64);
uint8_t firstParity = GetParity( DemodBuffer, EVEN, 63); uint8_t firstParity = GetParity( DemodBuffer, EVEN, 63);
if ( firstParity != DemodBuffer[63] ) { if ( firstParity != DemodBuffer[63] ) {
PrintAndLog("DEBUG: Error - Nedap 1st 64bit parity check failed: %d|%d ", DemodBuffer[63], firstParity); PrintAndLog("DEBUG: Error - Nedap 1st 64bit parity check failed: %d|%d ", DemodBuffer[63], firstParity);

View file

@ -108,6 +108,7 @@ int CmdNoralsyDemod(const char *Cmd) {
return 0; return 0;
} }
setDemodBuf(DemodBuffer, 96, ans); setDemodBuf(DemodBuffer, 96, ans);
setGrid_Clock(32);
//got a good demod //got a good demod
uint32_t raw1 = bytebits_to_byte(DemodBuffer, 32); uint32_t raw1 = bytebits_to_byte(DemodBuffer, 32);

View file

@ -137,6 +137,7 @@ int CmdPrescoDemod(const char *Cmd) {
return 0; return 0;
} }
setDemodBuf(DemodBuffer, 128, ans); setDemodBuf(DemodBuffer, 128, ans);
setGrid_Clock(32);
//got a good demod //got a good demod
uint32_t raw1 = bytebits_to_byte(DemodBuffer, 32); uint32_t raw1 = bytebits_to_byte(DemodBuffer, 32);

View file

@ -23,7 +23,7 @@ void ExitGraphics(void);
extern int GraphBuffer[MAX_GRAPH_TRACE_LEN]; extern int GraphBuffer[MAX_GRAPH_TRACE_LEN];
extern int GraphTraceLen; extern int GraphTraceLen;
extern double CursorScaleFactor; extern double CursorScaleFactor;
extern int PlotGridX, PlotGridY, PlotGridXdefault, PlotGridYdefault; extern int PlotGridX, PlotGridY, PlotGridXdefault, PlotGridYdefault, CursorCPos, CursorDPos;
extern int CommandFinished; extern int CommandFinished;
extern int offline; extern int offline;

View file

@ -99,7 +99,7 @@ ProxGuiQT::~ProxGuiQT(void)
void ProxWidget::paintEvent(QPaintEvent *event) void ProxWidget::paintEvent(QPaintEvent *event)
{ {
QPainter painter(this); QPainter painter(this);
QPainterPath penPath, whitePath, greyPath, lightgreyPath, cursorAPath, cursorBPath; QPainterPath penPath, whitePath, greyPath, lightgreyPath, cursorAPath, cursorBPath, cursorCPath, cursorDPath;
QRect r; QRect r;
QBrush brush(QColor(100, 255, 100)); QBrush brush(QColor(100, 255, 100));
QPen pen(QColor(100, 255, 100)); QPen pen(QColor(100, 255, 100));
@ -114,6 +114,10 @@ void ProxWidget::paintEvent(QPaintEvent *event)
if(CursorBPos > GraphTraceLen) if(CursorBPos > GraphTraceLen)
CursorBPos= 0; CursorBPos= 0;
if(CursorCPos > GraphTraceLen)
CursorCPos= 0;
if(CursorDPos > GraphTraceLen)
CursorDPos= 0;
r = rect(); r = rect();
@ -238,13 +242,17 @@ void ProxWidget::paintEvent(QPaintEvent *event)
penPath.moveTo(x,y); penPath.moveTo(x,y);
} }
if(i == CursorAPos || i == CursorBPos) { if(i == CursorAPos || i == CursorBPos || i == CursorCPos || i == CursorDPos) {
QPainterPath *cursorPath; QPainterPath *cursorPath;
if(i == CursorAPos) if (i == CursorAPos)
cursorPath = &cursorAPath; cursorPath = &cursorAPath;
else else if (i == CursorBPos)
cursorPath = &cursorBPath; cursorPath = &cursorBPath;
else if (i == CursorCPos)
cursorPath = &cursorCPath;
else
cursorPath = &cursorDPath;
cursorPath->moveTo(x, r.top()); cursorPath->moveTo(x, r.top());
cursorPath->lineTo(x, r.bottom()); cursorPath->lineTo(x, r.bottom());
@ -263,6 +271,10 @@ void ProxWidget::paintEvent(QPaintEvent *event)
painter.drawPath(cursorAPath); painter.drawPath(cursorAPath);
painter.setPen(QColor(255, 0, 255)); painter.setPen(QColor(255, 0, 255));
painter.drawPath(cursorBPath); painter.drawPath(cursorBPath);
painter.setPen(QColor(255, 153, 0)); //orange
painter.drawPath(cursorCPath);
painter.setPen(QColor(0, 0, 205)); //light blue
painter.drawPath(cursorDPath);
char str[200]; char str[200];
sprintf(str, "@%d max=%d min=%d mean=%d n=%d/%d dt=%d [%.3f] zoom=%.3f CursorA=%d [%d] CursorB=%d [%d] GridX=%d GridY=%d (%s)", sprintf(str, "@%d max=%d min=%d mean=%d n=%d/%d dt=%d [%.3f] zoom=%.3f CursorA=%d [%d] CursorB=%d [%d] GridX=%d GridY=%d (%s)",

View file

@ -11,7 +11,7 @@
#include "ui.h" #include "ui.h"
double CursorScaleFactor; double CursorScaleFactor;
int PlotGridX, PlotGridY, PlotGridXdefault= 64, PlotGridYdefault= 64; int PlotGridX, PlotGridY, PlotGridXdefault= 64, PlotGridYdefault= 64, CursorCPos= 0, CursorDPos= 0;
int offline; int offline;
int flushAfterWrite = 0; int flushAfterWrite = 0;
extern pthread_mutex_t print_lock; extern pthread_mutex_t print_lock;

View file

@ -45,7 +45,7 @@ void PrintAndLog(char *fmt, ...);
void SetLogFilename(char *fn); void SetLogFilename(char *fn);
extern double CursorScaleFactor; extern double CursorScaleFactor;
extern int PlotGridX, PlotGridY, PlotGridXdefault, PlotGridYdefault; extern int PlotGridX, PlotGridY, PlotGridXdefault, PlotGridYdefault, CursorCPos, CursorDPos;
extern int offline; extern int offline;
extern int flushAfterWrite; //buzzy extern int flushAfterWrite; //buzzy

View file

@ -206,6 +206,7 @@ size_t findModStart(uint8_t dest[], size_t size, uint8_t threshold_value, uint8_
int Em410xDecode(uint8_t *BitStream, size_t *size, size_t *startIdx, uint32_t *hi, uint64_t *lo) int Em410xDecode(uint8_t *BitStream, size_t *size, size_t *startIdx, uint32_t *hi, uint64_t *lo)
{ {
// sanity check // sanity check
if (*size < 64) return -3;
if (BitStream[1] > 1) return -1; if (BitStream[1] > 1) return -1;
uint8_t fmtlen; uint8_t fmtlen;
@ -214,11 +215,13 @@ int Em410xDecode(uint8_t *BitStream, size_t *size, size_t *startIdx, uint32_t *h
// 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};
if (!preambleSearch(BitStream, preamble, sizeof(preamble), size, startIdx)) if (!preambleSearch(BitStream, preamble, sizeof(preamble), size, startIdx))
return -2; return -2;
if (*size < 64) return -3;
//XL and normal size.
if (*size != 64 && *size != 128) return -3;
fmtlen = (*size == 110) ? 22 : 10; fmtlen = (*size == 128) ? 22 : 10;
//skip last 4bit parity row for simplicity //skip last 4bit parity row for simplicity
*size = removeParity(BitStream, *startIdx + sizeof(preamble), 5, 0, fmtlen * 5); *size = removeParity(BitStream, *startIdx + sizeof(preamble), 5, 0, fmtlen * 5);
@ -1680,9 +1683,14 @@ int pskRawDemod(uint8_t dest[], size_t *size, int *clock, int *invert)
return errCnt; return errCnt;
} }
bool DetectST(uint8_t buffer[], size_t *size, int *foundclock) {
size_t ststart = 0, stend = 0;
return DetectST_ext(buffer, size, foundclock, &ststart, &stend);
}
//by marshmellow //by marshmellow
//attempt to identify a Sequence Terminator in ASK modulated raw wave //attempt to identify a Sequence Terminator in ASK modulated raw wave
bool DetectST(uint8_t buffer[], size_t *size, int *foundclock) { bool DetectST_ext(uint8_t buffer[], size_t *size, int *foundclock, size_t *ststart, size_t *stend) {
size_t bufsize = *size; size_t bufsize = *size;
//need to loop through all samples and identify our clock, look for the ST pattern //need to loop through all samples and identify our clock, look for the ST pattern
uint8_t fndClk[] = {8,16,32,40,50,64,128}; uint8_t fndClk[] = {8,16,32,40,50,64,128};
@ -1837,7 +1845,7 @@ bool DetectST(uint8_t buffer[], size_t *size, int *foundclock) {
size_t newloc = 0; size_t newloc = 0;
i=0; i=0;
if (g_debugMode==2) prnt("DEBUG STT: Starting STT trim - start: %d, datalen: %d ",dataloc, datalen); if (g_debugMode==2) prnt("DEBUG STT: Starting STT trim - start: %d, datalen: %d ",dataloc, datalen);
bool firstrun = true;
// warning - overwriting buffer given with raw wave data with ST removed... // warning - overwriting buffer given with raw wave data with ST removed...
while ( dataloc < bufsize-(clk/2) ) { while ( dataloc < bufsize-(clk/2) ) {
//compensate for long high at end of ST not being high due to signal loss... (and we cut out the start of wave high part) //compensate for long high at end of ST not being high due to signal loss... (and we cut out the start of wave high part)
@ -1850,6 +1858,11 @@ bool DetectST(uint8_t buffer[], size_t *size, int *foundclock) {
buffer[dataloc] = buffer[dataloc+2]; buffer[dataloc] = buffer[dataloc+2];
buffer[dataloc+1] = buffer[dataloc+2]; buffer[dataloc+1] = buffer[dataloc+2];
} }
if (firstrun) {
*stend = dataloc;
*ststart = dataloc-(clk*4);
firstrun=false;
}
for (i=0; i<datalen; ++i) { for (i=0; i<datalen; ++i) {
if (i+newloc < bufsize) { if (i+newloc < bufsize) {
if (i+newloc < dataloc) if (i+newloc < dataloc)

View file

@ -34,6 +34,7 @@ int DetectNRZClock(uint8_t dest[], size_t size, int clock);
int DetectPSKClock(uint8_t dest[], size_t size, int clock); int DetectPSKClock(uint8_t dest[], size_t size, int clock);
int DetectStrongAskClock(uint8_t dest[], size_t size, uint8_t high, uint8_t low); int DetectStrongAskClock(uint8_t dest[], size_t size, uint8_t high, uint8_t low);
bool DetectST(uint8_t buffer[], size_t *size, int *foundclock); bool DetectST(uint8_t buffer[], size_t *size, int *foundclock);
bool DetectST_ext(uint8_t buffer[], size_t *size, int *foundclock, size_t *ststart, size_t *stend);
int fskdemod(uint8_t *dest, size_t size, uint8_t rfLen, uint8_t invert, uint8_t fchigh, uint8_t fclow); int fskdemod(uint8_t *dest, size_t size, uint8_t rfLen, uint8_t invert, uint8_t fchigh, uint8_t fclow);
int getHiLo(uint8_t *BitStream, size_t size, int *high, int *low, uint8_t fuzzHi, uint8_t fuzzLo); int getHiLo(uint8_t *BitStream, size_t size, int *high, int *low, uint8_t fuzzHi, uint8_t fuzzLo);
uint32_t manchesterEncode2Bytes(uint16_t datain); uint32_t manchesterEncode2Bytes(uint16_t datain);