Some more nasty bugs fixed in the lf t55xx manchester_decode method.

ADD: a little function to see if GraphBuffer is not used.
This commit is contained in:
iceman1001 2014-10-26 23:16:25 +01:00
commit c6be64da09
7 changed files with 54 additions and 34 deletions

View file

@ -22,6 +22,7 @@
#include "util.h" #include "util.h"
#include "data.h" #include "data.h"
#define LF_TRACE_BUFF_SIZE 12000 #define LF_TRACE_BUFF_SIZE 12000
#define LF_BITSSTREAM_LEN 1000
char *global_em410xId; char *global_em410xId;
@ -530,9 +531,9 @@ int CmdReadWord(const char *Cmd)
} }
GraphTraceLen = LF_TRACE_BUFF_SIZE; GraphTraceLen = LF_TRACE_BUFF_SIZE;
uint8_t bits[1000] = {0x00}; uint8_t bits[LF_BITSSTREAM_LEN] = {0x00};
uint8_t * bitstream = bits; uint8_t * bitstream = bits;
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream); manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream,LF_BITSSTREAM_LEN);
RepaintGraphWindow(); RepaintGraphWindow();
return 0; return 0;
} }
@ -570,10 +571,9 @@ int CmdReadWordPWD(const char *Cmd)
} }
GraphTraceLen = LF_TRACE_BUFF_SIZE; GraphTraceLen = LF_TRACE_BUFF_SIZE;
uint8_t bits[1000] = {0x00}; uint8_t bits[LF_BITSSTREAM_LEN] = {0x00};
uint8_t * bitstream = bits; uint8_t * bitstream = bits;
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream, LF_BITSSTREAM_LEN);
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream);
RepaintGraphWindow(); RepaintGraphWindow();
return 0; return 0;
} }

View file

@ -23,15 +23,16 @@
#define LF_TRACE_BUFF_SIZE 12000 // 32 x 32 x 10 (32 bit times numofblock (7), times clock skip..) #define LF_TRACE_BUFF_SIZE 12000 // 32 x 32 x 10 (32 bit times numofblock (7), times clock skip..)
#define LF_BITSSTREAM_LEN 1000 // more then 1000 bits shouldn't happend.. 8block * 4 bytes * 8bits =
static int CmdHelp(const char *Cmd); static int CmdHelp(const char *Cmd);
int CmdReadBlk(const char *Cmd) int CmdReadBlk(const char *Cmd)
{ {
int Block = -1; int block = -1;
sscanf(Cmd, "%d", &Block); sscanf(Cmd, "%d", &block);
if ((Block > 7) | (Block < 0)) { if ((block > 7) | (block < 0)) {
PrintAndLog("Block must be between 0 and 7"); PrintAndLog("Block must be between 0 and 7");
return 1; return 1;
} }
@ -55,7 +56,7 @@ int CmdReadBlk(const char *Cmd)
// } // }
// GraphTraceLen = LF_TRACE_BUFF_SIZE; // GraphTraceLen = LF_TRACE_BUFF_SIZE;
CmdSamples("12000"); CmdSamples("12000");
ManchesterDemod(Block); ManchesterDemod(block);
// RepaintGraphWindow(); // RepaintGraphWindow();
return 0; return 0;
} }
@ -175,10 +176,10 @@ int CmdReadTrace(const char *Cmd)
GraphTraceLen = LF_TRACE_BUFF_SIZE; GraphTraceLen = LF_TRACE_BUFF_SIZE;
} }
uint8_t bits[1000] = {0x00}; uint8_t bits[LF_BITSSTREAM_LEN] = {0x00};
uint8_t * bitstream = bits; uint8_t * bitstream = bits;
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream); manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream, LF_BITSSTREAM_LEN);
RepaintGraphWindow(); RepaintGraphWindow();
uint8_t si = 5; uint8_t si = 5;
@ -253,10 +254,10 @@ int CmdInfo(const char *Cmd){
CmdReadBlk("0"); CmdReadBlk("0");
} }
uint8_t bits[1000] = {0x00}; uint8_t bits[LF_BITSSTREAM_LEN] = {0x00};
uint8_t * bitstream = bits; uint8_t * bitstream = bits;
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream); manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream, LF_BITSSTREAM_LEN);
uint8_t si = 5; uint8_t si = 5;
uint32_t bl0 = PackBits(si, 32, bitstream); uint32_t bl0 = PackBits(si, 32, bitstream);
@ -324,7 +325,7 @@ int CmdDump(const char *Cmd){
for ( int i = 0; i <8; ++i){ for ( int i = 0; i <8; ++i){
memset(s,0,sizeof(s)); memset(s,0,sizeof(s));
if ( hasPwd ) { if ( hasPwd ) {
sprintf(s,"%d %s", i, sprint_hex(pwd,4)); sprintf(s,"%d %02x%02x%02x%02x", i, pwd[0],pwd[1],pwd[2],pwd[3]);
CmdReadBlkPWD(s); CmdReadBlkPWD(s);
} else { } else {
sprintf(s,"%d", i); sprintf(s,"%d", i);
@ -335,6 +336,9 @@ int CmdDump(const char *Cmd){
} }
int CmdIceFsk(const char *Cmd){ int CmdIceFsk(const char *Cmd){
if (!HasGraphData()) return 0;
iceFsk3(GraphBuffer, LF_TRACE_BUFF_SIZE); iceFsk3(GraphBuffer, LF_TRACE_BUFF_SIZE);
RepaintGraphWindow(); RepaintGraphWindow();
return 0; return 0;
@ -343,16 +347,17 @@ int CmdIceManchester(const char *Cmd){
ManchesterDemod( -1); ManchesterDemod( -1);
return 0; return 0;
} }
int ManchesterDemod(int block){ int ManchesterDemod(int blockNum){
if (!HasGraphData()) return 0;
int blockNum = -1;
uint8_t sizebyte = 32; uint8_t sizebyte = 32;
uint8_t offset = 5; uint8_t offset = 5;
uint32_t blockData; uint32_t blockData;
uint8_t bits[1000] = {0x00}; uint8_t bits[LF_BITSSTREAM_LEN] = {0x00};
uint8_t * bitstream = bits; uint8_t * bitstream = bits;
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream); manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream, LF_BITSSTREAM_LEN);
blockData = PackBits(offset, sizebyte, bitstream); blockData = PackBits(offset, sizebyte, bitstream);
if ( blockNum < 0) if ( blockNum < 0)

View file

@ -51,9 +51,9 @@ static command_t CommandTable[] =
{ {
{"help", CmdHelp, 1, "This help. Use '<command> help' for details of a particular command."}, {"help", CmdHelp, 1, "This help. Use '<command> help' for details of a particular command."},
{"data", CmdData, 1, "{ Plot window / data buffer manipulation... }"}, {"data", CmdData, 1, "{ Plot window / data buffer manipulation... }"},
{"hf", CmdHF, 1, "{ HF commands... }"}, {"hf", CmdHF, 1, "{ High Frequency commands... }"},
{"hw", CmdHW, 1, "{ Hardware commands... }"}, {"hw", CmdHW, 1, "{ Hardware commands... }"},
{"lf", CmdLF, 1, "{ LF commands... }"}, {"lf", CmdLF, 1, "{ Low Frequency commands... }"},
{"script", CmdScript, 1,"{ Scripting commands }"}, {"script", CmdScript, 1,"{ Scripting commands }"},
{"quit", CmdQuit, 1, "Exit program"}, {"quit", CmdQuit, 1, "Exit program"},
{"exit", CmdQuit, 1, "Exit program"}, {"exit", CmdQuit, 1, "Exit program"},

View file

@ -9,6 +9,7 @@
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#include <stdio.h> #include <stdio.h>
#include <stdbool.h>
#include <string.h> #include <string.h>
#include "ui.h" #include "ui.h"
#include "graph.h" #include "graph.h"
@ -93,3 +94,15 @@ int GetClock(const char *str, int peak, int verbose)
return clock; return clock;
} }
/* A simple test to see if there is any data inside Graphbuffer.
*/
bool HasGraphData(){
if ( GraphTraceLen <= 0) {
PrintAndLog("No data available, try reading something first");
return false;
}
return true;
}

View file

@ -15,9 +15,9 @@ void AppendGraph(int redraw, int clock, int bit);
int ClearGraph(int redraw); int ClearGraph(int redraw);
int DetectClock(int peak); int DetectClock(int peak);
int GetClock(const char *str, int peak, int verbose); int GetClock(const char *str, int peak, int verbose);
bool HasGraphData();
#define MAX_GRAPH_TRACE_LEN (1024*128) #define MAX_GRAPH_TRACE_LEN (1024*128)
extern int GraphBuffer[MAX_GRAPH_TRACE_LEN]; extern int GraphBuffer[MAX_GRAPH_TRACE_LEN];
extern int GraphTraceLen; extern int GraphTraceLen;
#endif #endif

View file

@ -95,14 +95,14 @@ void SetLogFilename(char *fn)
logfilename = fn; logfilename = fn;
} }
int manchester_decode( int * data, const size_t len, uint8_t * dataout){ int manchester_decode( int * data, const size_t len, uint8_t * dataout, size_t dataoutlen){
int bitlength = 0; int bitlength = 0;
int i, clock, high, low, startindex; int i, clock, high, low, startindex;
low = startindex = 0; low = startindex = 0;
high = 1; high = 1;
uint8_t * bitStream = (uint8_t* ) malloc(sizeof(uint8_t) * len); uint8_t * bitStream = (uint8_t* ) malloc(sizeof(uint8_t) * dataoutlen);
memset(bitStream, 0x00, len); memset(bitStream, 0x00, dataoutlen);
/* Detect high and lows */ /* Detect high and lows */
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
@ -116,12 +116,12 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){
clock = GetT55x7Clock( data, len, high ); clock = GetT55x7Clock( data, len, high );
startindex = DetectFirstTransition(data, len, high); startindex = DetectFirstTransition(data, len, high);
PrintAndLog(" Clock : %d", clock); //PrintAndLog(" Clock : %d", clock);
if (high != 1) if (high != 1)
bitlength = ManchesterConvertFrom255(data, len, bitStream, high, low, clock, startindex); bitlength = ManchesterConvertFrom255(data, len, bitStream, dataoutlen, high, low, clock, startindex);
else else
bitlength= ManchesterConvertFrom1(data, len, bitStream, clock, startindex); bitlength= ManchesterConvertFrom1(data, len, bitStream, dataoutlen, clock, startindex);
memcpy(dataout, bitStream, bitlength); memcpy(dataout, bitStream, bitlength);
free(bitStream); free(bitStream);
@ -192,7 +192,7 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){
return i; return i;
} }
int ManchesterConvertFrom255(const int * data, const size_t len, uint8_t * dataout, int high, int low, int clock, int startIndex){ int ManchesterConvertFrom255(const int * data, const size_t len, uint8_t * dataout, int dataoutlen, int high, int low, int clock, int startIndex){
int i, j, z, hithigh, hitlow, bitIndex, startType; int i, j, z, hithigh, hitlow, bitIndex, startType;
i = 0; i = 0;
@ -261,11 +261,13 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){
if ( firstST == 4) if ( firstST == 4)
break; break;
if ( bitIndex >= dataoutlen-1 )
break;
} }
return bitIndex; return bitIndex;
} }
int ManchesterConvertFrom1(const int * data, const size_t len, uint8_t * dataout, int clock, int startIndex){ int ManchesterConvertFrom1(const int * data, const size_t len, uint8_t * dataout,int dataoutlen, int clock, int startIndex){
PrintAndLog(" Path B"); PrintAndLog(" Path B");

View file

@ -27,13 +27,13 @@ extern int PlotGridX, PlotGridY, PlotGridXdefault, PlotGridYdefault;
extern int offline; extern int offline;
extern int flushAfterWrite; //buzzy extern int flushAfterWrite; //buzzy
int manchester_decode( int * data, const size_t len, uint8_t * dataout); int manchester_decode( int * data, const size_t len, uint8_t * dataout, size_t dataoutlen);
int GetT55x7Clock( const int * data, const size_t len, int high ); int GetT55x7Clock( const int * data, const size_t len, int high );
int DetectFirstTransition(const int * data, const size_t len, int low); int DetectFirstTransition(const int * data, const size_t len, int low);
void PrintPaddedManchester( uint8_t * bitStream, size_t len, size_t blocksize); void PrintPaddedManchester( uint8_t * bitStream, size_t len, size_t blocksize);
void ManchesterDiffDecodedString( const uint8_t *bitStream, size_t len, uint8_t invert ); void ManchesterDiffDecodedString( const uint8_t *bitStream, size_t len, uint8_t invert );
int ManchesterConvertFrom255(const int * data, const size_t len, uint8_t * dataout, int high, int low, int clock, int startIndex); int ManchesterConvertFrom255(const int * data, const size_t len, uint8_t * dataout,int dataoutlen, int high, int low, int clock, int startIndex);
int ManchesterConvertFrom1(const int * data, const size_t len, uint8_t * dataout, int clock, int startIndex); int ManchesterConvertFrom1(const int * data, const size_t len, uint8_t * dataout, int dataoutlen, int clock, int startIndex);
void iceFsk2(int * data, const size_t len); void iceFsk2(int * data, const size_t len);
void iceFsk3(int * data, const size_t len); void iceFsk3(int * data, const size_t len);
#endif #endif