mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-19 21:03:48 -07:00
CHG: Added PR #220 from PM3 Master. ref: https://github.com/Proxmark/proxmark3/pull/220
This commit is contained in:
parent
c24364a8a4
commit
a9eeb57698
13 changed files with 91 additions and 22 deletions
|
@ -3,6 +3,11 @@ 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)
|
||||||
|
|
|
@ -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, &);
|
sscanf(Cmd, "%i %i %i %i %c", &clk, &invert, &maxErr, &maxLen, &);
|
||||||
|
@ -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"},
|
||||||
|
|
|
@ -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,6 +547,7 @@ 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);
|
||||||
|
@ -552,6 +556,11 @@ int CmdHF14AMfDump(const char *Cmd) {
|
||||||
received = WaitForResponseTimeout(CMD_ACK,&resp,1500);
|
received = WaitForResponseTimeout(CMD_ACK,&resp,1500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (received) {
|
||||||
|
isOK = resp.arg[0] & 0xff;
|
||||||
|
if (isOK) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (received) {
|
if (received) {
|
||||||
isOK = resp.arg[0] & 0xff;
|
isOK = resp.arg[0] & 0xff;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 ) {
|
||||||
|
|
|
@ -136,6 +136,7 @@ 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] ) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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)",
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
@ -216,9 +217,11 @@ int Em410xDecode(uint8_t *BitStream, size_t *size, size_t *startIdx, uint32_t *h
|
||||||
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;
|
|
||||||
|
|
||||||
fmtlen = (*size == 110) ? 22 : 10;
|
//XL and normal size.
|
||||||
|
if (*size != 64 && *size != 128) return -3;
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue