ADD: @marshmello42 's fixes for low frequency demodulation lengths greater the 512bits.

This commit is contained in:
iceman1001 2015-12-09 14:58:16 +01:00
parent 0a886a1d1b
commit bf32dd923f
4 changed files with 45 additions and 24 deletions

View file

@ -34,6 +34,7 @@ of stream transmissions (marshmellow)
- Added option c to 'hf list' (mark CRC bytes) (piwi) - Added option c to 'hf list' (mark CRC bytes) (piwi)
### Changed ### Changed
- Added `[l] <length>` option to data printdemodbuffer
- Adjusted lf awid clone to optionally clone to Q5 tags - Adjusted lf awid clone to optionally clone to Q5 tags
- Adjusted lf t55xx detect to find Q5 tags (t5555) instead of just t55x7 - Adjusted lf t55xx detect to find Q5 tags (t5555) instead of just t55x7
- Adjusted all lf NRZ demods - works more acurately and consistantly (as long as you have strong signal) - Adjusted all lf NRZ demods - works more acurately and consistantly (as long as you have strong signal)

View file

@ -58,11 +58,12 @@ int CmdSetDebugMode(const char *Cmd)
} }
int usage_data_printdemodbuf(){ int usage_data_printdemodbuf(){
PrintAndLog("Usage: data printdemodbuffer x o <offset>"); PrintAndLog("Usage: data printdemodbuffer x o <offset> l <length>");
PrintAndLog("Options:"); PrintAndLog("Options:");
PrintAndLog(" h This help"); PrintAndLog(" h This help");
PrintAndLog(" x output in hex (omit for binary output)"); PrintAndLog(" x output in hex (omit for binary output)");
PrintAndLog(" o <offset> enter offset in # of bits"); PrintAndLog(" o <offset> enter offset in # of bits");
PrintAndLog(" l <length> enter length to print in # of bits or hex characters respectively");
return 0; return 0;
} }
@ -87,7 +88,8 @@ int CmdPrintDemodBuff(const char *Cmd)
char hex[512]={0x00}; char hex[512]={0x00};
bool hexMode = false; bool hexMode = false;
bool errors = false; bool errors = false;
uint8_t offset = 0; uint32_t offset = 0; //could be size_t but no param_get16...
uint32_t length = 512;
char cmdp = 0; char cmdp = 0;
while(param_getchar(Cmd, cmdp) != 0x00) while(param_getchar(Cmd, cmdp) != 0x00)
{ {
@ -103,10 +105,16 @@ int CmdPrintDemodBuff(const char *Cmd)
break; break;
case 'o': case 'o':
case 'O': case 'O':
offset = param_get8(Cmd, cmdp+1); offset = param_get32ex(Cmd, cmdp+1, 0, 10);
if (!offset) errors = true; if (!offset) errors = true;
cmdp += 2; cmdp += 2;
break; break;
case 'l':
case 'L':
length = param_get32ex(Cmd, cmdp+1, 512, 10);
if (!length) errors = true;
cmdp += 2;
break;
default: default:
PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp)); PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
errors = true; errors = true;
@ -116,11 +124,12 @@ int CmdPrintDemodBuff(const char *Cmd)
} }
//Validations //Validations
if(errors) return usage_data_printdemodbuf(); if(errors) return usage_data_printdemodbuf();
length = (length > (DemodBufferLen-offset)) ? DemodBufferLen-offset : length;
int numBits = (DemodBufferLen-offset) & 0x7FC; //make sure we don't exceed our string int numBits = (length) & 0x00FFC; //make sure we don't exceed our string
if (hexMode){ if (hexMode){
char *buf = (char *) (DemodBuffer + offset); char *buf = (char *) (DemodBuffer + offset);
numBits = (numBits > sizeof(hex)) ? sizeof(hex) : numBits;
numBits = binarraytohex(hex, buf, numBits); numBits = binarraytohex(hex, buf, numBits);
if (numBits==0) return 0; if (numBits==0) return 0;
PrintAndLog("DemodBuffer: %s",hex); PrintAndLog("DemodBuffer: %s",hex);
@ -313,7 +322,7 @@ int ASKDemod(const char *Cmd, bool verbose, bool emSearch, uint8_t askType)
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);
if (!maxLen) maxLen = 512*64; if (!maxLen) maxLen = BIGBUF_SIZE;
if (invert != 0 && invert != 1) { if (invert != 0 && invert != 1) {
PrintAndLog("Invalid argument: %s", Cmd); PrintAndLog("Invalid argument: %s", Cmd);
return 0; return 0;
@ -955,21 +964,20 @@ int FSKrawDemod(const char *Cmd, bool verbose)
if (BitLen==0) return 0; if (BitLen==0) return 0;
//get field clock lengths //get field clock lengths
uint16_t fcs=0; uint16_t fcs=0;
if (fchigh==0 || fclow == 0){ if (!fchigh || !fclow) {
fcs = countFC(BitStream, BitLen, 1); fcs = countFC(BitStream, BitLen, 1);
if (fcs==0){ if (!fcs) {
fchigh = 10; fchigh = 10;
fclow = 8; fclow = 8;
} else { } else {
fchigh = (fcs >> 8) & 0xFF; fchigh = (fcs >> 8) & 0x00FF;
fclow = fcs & 0xFF; fclow = fcs & 0x00FF;
} }
} }
//get bit clock length //get bit clock length
if (rfLen == 0){ if (!rfLen){
rfLen = detectFSKClk(BitStream, BitLen, fchigh, fclow); rfLen = detectFSKClk(BitStream, BitLen, fchigh, fclow);
if (rfLen == 0) rfLen = 50; if (!rfLen) rfLen = 50;
} }
int size = fskdemod(BitStream, BitLen, rfLen, invert, fchigh, fclow); int size = fskdemod(BitStream, BitLen, rfLen, invert, fchigh, fclow);
if (size > 0){ if (size > 0){
@ -977,10 +985,11 @@ int FSKrawDemod(const char *Cmd, bool verbose)
// Now output the bitstream to the scrollback by line of 16 bits // Now output the bitstream to the scrollback by line of 16 bits
if (verbose || g_debugMode) { if (verbose || g_debugMode) {
PrintAndLog("\nUsing Clock:%d, invert:%d, fchigh:%d, fclow:%u", rfLen, invert, fchigh, fclow); PrintAndLog("\nUsing Clock:%u, invert:%u, fchigh:%u, fclow:%u", rfLen, invert, fchigh, fclow);
PrintAndLog("%s decoded bitstream:", GetFSKType(fchigh, fclow, invert)); PrintAndLog("%s decoded bitstream:", GetFSKType(fchigh, fclow, invert));
printDemodBuff(); printDemodBuff();
} }
return 1; return 1;
} else { } else {
if (g_debugMode) PrintAndLog("no FSK data found"); if (g_debugMode) PrintAndLog("no FSK data found");
@ -2392,7 +2401,7 @@ static command_t CommandTable[] =
{"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)"},
{"printdemodbuffer",CmdPrintDemodBuff, 1, "[x] [o] <offset> -- print the data in the DemodBuffer - 'x' for hex output"}, {"printdemodbuffer",CmdPrintDemodBuff, 1, "[x] [o] <offset> [l] <length> -- print the data in the DemodBuffer - 'x' for hex output"},
{"pskindalademod", CmdIndalaDecode, 1, "[clock] [invert<0|1>] -- Demodulate an indala tag (PSK1) from GraphBuffer (args optional)"}, {"pskindalademod", CmdIndalaDecode, 1, "[clock] [invert<0|1>] -- Demodulate an indala tag (PSK1) from GraphBuffer (args optional)"},
{"psknexwatchdemod",CmdPSKNexWatch, 1, "Demodulate a NexWatch tag (nexkey, quadrakey) (PSK1) from GraphBuffer"}, {"psknexwatchdemod",CmdPSKNexWatch, 1, "Demodulate a NexWatch tag (nexkey, quadrakey) (PSK1) from GraphBuffer"},
{"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"},

View file

@ -9,6 +9,7 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#include "util.h" #include "util.h"
#define MAX_BIN_BREAK_LENGTH (3072+384+1)
#ifndef _WIN32 #ifndef _WIN32
#include <termios.h> #include <termios.h>
@ -122,17 +123,26 @@ char *sprint_hex(const uint8_t *data, const size_t len) {
} }
char *sprint_bin_break(const uint8_t *data, const size_t len, const uint8_t breaks) { char *sprint_bin_break(const uint8_t *data, const size_t len, const uint8_t breaks) {
// make sure we don't go beyond our char array memory
int maxLen = ( len > 1020) ? 1020 : len; int max_len = ( len+(len/breaks) > MAX_BIN_BREAK_LENGTH ) ? MAX_BIN_BREAK_LENGTH : len+(len/breaks);
static char buf[1024]; static char buf[MAX_BIN_BREAK_LENGTH]; // 3072 + end of line characters if broken at 8 bits
memset(buf, 0x00, 1024); //clear memory
memset(buf, 0x00, sizeof(buf));
char *tmp = buf; char *tmp = buf;
for (size_t i=0; i < maxLen; ++i){ size_t in_index = 0;
sprintf(tmp++, "%u", data[i]); // loop through the out_index to make sure we don't go too far
if (breaks > 0 && !((i+1) % breaks)) for (size_t out_index=0; out_index < max_len; out_index++) {
// set character
sprintf(tmp++, "%u", data[in_index]);
// check if a line break is needed
if ( (breaks > 0) && !((in_index+1) % breaks) && (out_index+1 != max_len) ) {
// increment and print line break
out_index++;
sprintf(tmp++, "%s","\n"); sprintf(tmp++, "%s","\n");
} }
in_index++;
}
return buf; return buf;
} }
@ -171,7 +181,8 @@ void num_to_bytebits(uint64_t n, size_t len, uint8_t *dest) {
// hh,gg,ff,ee,dd,cc,bb,aa, pp,oo,nn,mm,ll,kk,jj,ii // hh,gg,ff,ee,dd,cc,bb,aa, pp,oo,nn,mm,ll,kk,jj,ii
// up to 64 bytes or 512 bits // up to 64 bytes or 512 bits
uint8_t *SwapEndian64(const uint8_t *src, const size_t len, const uint8_t blockSize){ uint8_t *SwapEndian64(const uint8_t *src, const size_t len, const uint8_t blockSize){
static uint8_t buf[64]; //static uint8_t buf[64];
uint8_t buf[64];
memset(buf, 0x00, 64); memset(buf, 0x00, 64);
uint8_t *tmp = buf; uint8_t *tmp = buf;
for (uint8_t block=0; block < (uint8_t)(len/blockSize); block++){ for (uint8_t block=0; block < (uint8_t)(len/blockSize); block++){

View file

@ -300,7 +300,7 @@ int askdemod(uint8_t *BinStream, size_t *size, int *clk, int *invert, int maxErr
uint8_t midBit = 0; uint8_t midBit = 0;
uint8_t tol = 0; //clock tolerance adjust - waves will be accepted as within the clock if they fall + or - this value + clock from last valid wave uint8_t tol = 0; //clock tolerance adjust - waves will be accepted as within the clock if they fall + or - this value + clock from last valid wave
if (*clk <= 32) tol = 1; //clock tolerance may not be needed anymore currently set to + or - 1 but could be increased for poor waves or removed entirely if (*clk <= 32) tol = 1; //clock tolerance may not be needed anymore currently set to + or - 1 but could be increased for poor waves or removed entirely
size_t MaxBits = 1024; size_t MaxBits = 3072;
lastBit = start - *clk; lastBit = start - *clk;
for (i = start; i < *size; ++i) { for (i = start; i < *size; ++i) {