FIX: data mandemod read the wrong part of BigBuffer (no correct offset)

This commit is contained in:
iceman1001 2014-10-24 15:34:50 +02:00
parent c2d25819d8
commit 081151eabb
5 changed files with 62 additions and 141 deletions

View file

@ -456,22 +456,20 @@ int CmdHpf(const char *Cmd)
int CmdSamples(const char *Cmd)
{
int cnt = 0;
int n;
uint8_t got[40000];
uint8_t got[36440] = {0x00};
n = strtol(Cmd, NULL, 0);
if (n == 0) n = 512;
if (n > sizeof(got)) n = sizeof(got);
int n = strtol(Cmd, NULL, 0);
if (n == 0)
n = 512;
if (n > sizeof(got))
n = sizeof(got);
PrintAndLog("Reading %d samples from device memory\n", n);
GetFromBigBuf(got,n,3560);
WaitForResponse(CMD_ACK,NULL);
for (int j = 0; j < n; j++) {
GraphBuffer[cnt++] = ((int)got[j]) - 128;
for (int j = 0; j < n; ++j) {
GraphBuffer[j] = ((int)got[j]) - 128;
}
PrintAndLog("Done!\n");
GraphTraceLen = n;
RepaintGraphWindow();
return 0;

View file

@ -230,7 +230,7 @@ int CmdLFHitagReader(const char *Cmd) {
return 0;
}
static command_t CommandTableHitag[] =
static command_t CommandTable[] =
{
{"help", CmdHelp, 1, "This help"},
{"list", CmdLFHitagList, 1, "List Hitag trace history"},
@ -242,12 +242,12 @@ static command_t CommandTableHitag[] =
int CmdLFHitag(const char *Cmd)
{
CmdsParse(CommandTableHitag, Cmd);
CmdsParse(CommandTable, Cmd);
return 0;
}
int CmdHelp(const char *Cmd)
{
CmdsHelp(CommandTableHitag);
CmdsHelp(CommandTable);
return 0;
}

View file

@ -29,7 +29,6 @@ static int CmdHelp(const char *Cmd);
int CmdReadBlk(const char *Cmd)
{
int Block = -1;
sscanf(Cmd, "%d", &Block);
if ((Block > 7) | (Block < 0)) {
@ -37,7 +36,6 @@ int CmdReadBlk(const char *Cmd)
return 1;
}
// this command fills up BigBuff
UsbCommand c;
c.cmd = CMD_T55XX_READ_BLOCK;
c.d.asBytes[0] = 0x00;
@ -47,17 +45,18 @@ int CmdReadBlk(const char *Cmd)
SendCommand(&c);
WaitForResponse(CMD_ACK, NULL);
uint8_t data[LF_TRACE_BUFF_SIZE] = {0x00};
// uint8_t data[LF_TRACE_BUFF_SIZE] = {0x00};
GetFromBigBuf(data,LF_TRACE_BUFF_SIZE,3560); //3560 -- should be offset..
WaitForResponseTimeout(CMD_ACK,NULL, 1500);
// GetFromBigBuf(data,LF_TRACE_BUFF_SIZE,3560); //3560 -- should be offset..
// WaitForResponseTimeout(CMD_ACK,NULL, 1500);
for (int j = 0; j < LF_TRACE_BUFF_SIZE; j++) {
GraphBuffer[j] = (int)data[j];
}
GraphTraceLen = LF_TRACE_BUFF_SIZE;
// for (int j = 0; j < LF_TRACE_BUFF_SIZE; j++) {
// GraphBuffer[j] = (int)data[j];
// }
// GraphTraceLen = LF_TRACE_BUFF_SIZE;
CmdSamples("12000");
ManchesterDemod(Block);
RepaintGraphWindow();
// RepaintGraphWindow();
return 0;
}
@ -90,7 +89,7 @@ int CmdReadBlkPWD(const char *Cmd)
WaitForResponseTimeout(CMD_ACK,NULL, 1500);
for (int j = 0; j < LF_TRACE_BUFF_SIZE; j++) {
GraphBuffer[j] = ((int)data[j]) - 128;
GraphBuffer[j] = ((int)data[j]);
}
GraphTraceLen = LF_TRACE_BUFF_SIZE;
ManchesterDemod(Block);
@ -254,7 +253,6 @@ int CmdInfo(const char *Cmd){
CmdReadBlk("0");
}
uint8_t bits[1000] = {0x00};
uint8_t * bitstream = bits;
@ -349,18 +347,20 @@ int CmdIceManchester(const char *Cmd){
int ManchesterDemod(int block){
int blockNum = -1;
uint8_t sizebyte = 32;
uint8_t offset = 5;
uint32_t blockData;
uint8_t bits[1000] = {0x00};
uint8_t * bitstream = bits;
manchester_decode(GraphBuffer, LF_TRACE_BUFF_SIZE, bitstream);
blockData = PackBits(5, 32, bitstream);
blockData = PackBits(offset, sizebyte, bitstream);
if ( blockNum < 0)
PrintAndLog(" Decoded : 0x%08X %s", blockData, sprint_bin(bitstream+offset,sizebyte) );
else
PrintAndLog(" Block %d : 0x%08X %s", blockNum, blockData, sprint_bin(bitstream+offset,sizebyte) );
if ( blockNum > -1){
PrintAndLog(" Block %d : 0x%08X %s", blockNum, blockData, sprint_bin(bitstream+5,32) );
}else{
PrintAndLog(" Decoded : 0x%08X %s", blockData, sprint_bin(bitstream+5,32) );
}
return 0;
}

View file

@ -18,7 +18,8 @@
#include <pthread.h>
#include "loclass/cipherutils.h"
#include "ui.h"
#include "cmdmain.h"
#include "cmddata.h"
//#include <liquid/liquid.h>
#define M_PI 3.14159265358979323846264338327
@ -117,7 +118,7 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){
startindex = DetectFirstTransition(data, len, high);
PrintAndLog(" Clock : %d", clock);
PrintAndLog(" startindex : %d", startindex);
//PrintAndLog(" startindex : %d", startindex);
if (high != 1)
bitlength = ManchesterConvertFrom255(data, len, bitStream, high, low, clock, startindex);
@ -235,8 +236,7 @@ int manchester_decode( int * data, const size_t len, uint8_t * dataout){
// No high value found, are we in a dampening field?
if ( !hithigh ) {
//PrintAndLog(" # Entering damp test at index : %d (%d)", z+j, j);
for (j = 0; j < clock; j++)
{
for (j = 0; j < clock; j++) {
if (
(data[z+j] <= dampHi && data[z+j] >= dampLow)
){
@ -392,83 +392,6 @@ void PrintPaddedManchester( uint8_t* bitStream, size_t len, size_t blocksize){
PrintAndLog(" %s", sprint_bin(bitStream+i, mod) );
}
void iceFsk(int * data, const size_t len){
//34359738 == 125khz (2^32 / 125) =
// parameters
float phase_offset = 0.00f; // carrier phase offset
float frequency_offset = 0.30f; // carrier frequency offset
float wn = 0.01f; // pll bandwidth
float zeta = 0.707f; // pll damping factor
float K = 1000; // pll loop gain
size_t n = len; // number of samples
// generate loop filter parameters (active PI design)
float t1 = K/(wn*wn); // tau_1
float t2 = 2*zeta/wn; // tau_2
// feed-forward coefficients (numerator)
float b0 = (4*K/t1)*(1.+t2/2.0f);
float b1 = (8*K/t1);
float b2 = (4*K/t1)*(1.-t2/2.0f);
// feed-back coefficients (denominator)
// a0 = 1.0 is implied
float a1 = -2.0f;
float a2 = 1.0f;
// filter buffer
float v0=0.0f, v1=0.0f, v2=0.0f;
// initialize states
float phi = phase_offset; // input signal's initial phase
float phi_hat = 0.0f; // PLL's initial phase
unsigned int i;
float complex x,y;
float complex output[n];
for (i=0; i<n; i++) {
// INPUT SIGNAL
x = data[i];
phi += frequency_offset;
// generate complex sinusoid
y = cosf(phi_hat) + _Complex_I*sinf(phi_hat);
output[i] = y;
// compute error estimate
float delta_phi = cargf( x * conjf(y) );
// print results to standard output
printf(" %6u %12.8f %12.8f %12.8f %12.8f %12.8f\n",
i,
crealf(x), cimagf(x),
crealf(y), cimagf(y),
delta_phi);
// push result through loop filter, updating phase estimate
// advance buffer
v2 = v1; // shift center register to upper register
v1 = v0; // shift lower register to center register
// compute new lower register
v0 = delta_phi - v1*a1 - v2*a2;
// compute new output
phi_hat = v0*b0 + v1*b1 + v2*b2;
}
for (i=0; i<len; ++i){
data[i] = (int)crealf(output[i]);
}
}
/* Sliding DFT
Smooths out
*/
@ -503,20 +426,20 @@ void iceFsk3(int * data, const size_t len){
int i,j;
int output[len];
float fc = 0.1125f; // center frequency
size_t adjustedLen = len;
// create very simple low-pass filter to remove images (2nd-order Butterworth)
float complex iir_buf[3] = {0,0,0};
float b[3] = {0.003621681514929, 0.007243363029857, 0.003621681514929};
float a[3] = {1.000000000000000, -1.822694925196308, 0.837181651256023};
// process entire input file one sample at a time
float sample = 0; // input sample read from file
float complex x_prime = 1.0f; // save sample for estimating frequency
float complex x;
for (i=0; i<len; ++i) {
for (i=0; i<adjustedLen; ++i) {
sample = data[i];
sample = data[i]+128;
// remove DC offset and mix to complex baseband
x = (sample - 127.5f) * cexpf( _Complex_I * 2 * M_PI * fc * i );
@ -538,18 +461,19 @@ void iceFsk3(int * data, const size_t len){
}
// show data
for (j=0; j<len; ++j)
for (j=0; j<adjustedLen; ++j)
data[j] = output[j];
CmdLtrim("30");
adjustedLen -= 30;
// zero crossings.
for (j=0; j<len; ++j){
for (j=0; j<adjustedLen; ++j){
if ( data[j] == 10) break;
}
int startOne =j;
for (;j<len; ++j){
for (;j<adjustedLen; ++j){
if ( data[j] == -10 ) break;
}
int stopOne = j-1;
@ -560,13 +484,13 @@ void iceFsk3(int * data, const size_t len){
fieldlen = (fieldlen == 59 || fieldlen == 51)? 50 : fieldlen;
if ( fieldlen != 40 && fieldlen != 50){
printf("Detected field Length: %d \n", fieldlen);
printf("Can only handle len 40 or 50. Aborting...");
printf("Can only handle 40 or 50. Aborting...\n");
return;
}
// FSK sequence start == 000111
int startPos = 0;
for (i =0; i<len; ++i){
for (i =0; i<adjustedLen; ++i){
int dec = 0;
for ( j = 0; j < 6*fieldlen; ++j){
dec += data[i + j];
@ -584,14 +508,14 @@ void iceFsk3(int * data, const size_t len){
int bit =0;
printf("BINARY\n");
printf("R/40 : ");
for (i =startPos ; i < len; i += 40){
for (i =startPos ; i < adjustedLen; i += 40){
bit = data[i]>0 ? 1:0;
printf("%d", bit );
}
printf("\n");
printf("R/50 : ");
for (i =startPos ; i < len; i += 50){
for (i =startPos ; i < adjustedLen; i += 50){
bit = data[i]>0 ? 1:0;
printf("%d", bit ); }
printf("\n");

View file

@ -34,7 +34,6 @@ void PrintPaddedManchester( uint8_t * bitStream, size_t len, size_t blocksize);
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 ManchesterConvertFrom1(const int * data, const size_t len, uint8_t * dataout, int clock, int startIndex);
void iceFsk(int * data, const size_t len);
void iceFsk2(int * data, const size_t len);
void iceFsk3(int * data, const size_t len);
#endif