Some new commands (threshold and fskdemod) that act on the graph window

This commit is contained in:
d18c7db 2009-07-19 11:00:24 +00:00
parent 48f8a3d60d
commit 67853904cc
2 changed files with 227 additions and 89 deletions

View file

@ -214,7 +214,7 @@ void ModThenAcquireRawAdcSamples125k(int delay_off,int period_0,int period_1,BYT
void AcquireTiType(void)
{
int i;
int n = 4000;
int n = sizeof(BigBuf);
// clear buffer
memset(BigBuf,0,sizeof(BigBuf));

View file

@ -795,7 +795,6 @@ static void CmdHisamples(char *str)
RepaintGraphWindow();
}
static int CmdHisamplest(char *str, int nrlow)
{
int cnt = 0;
@ -1406,7 +1405,8 @@ static void CmdTibits(char *str)
{
int cnt = 0;
int i;
for(i = 0; i < 1536; i += 12) {
// for(i = 0; i < 1536; i += 12) {
for(i = 0; i < 4000; i += 12) {
UsbCommand c;
c.cmd = CMD_DOWNLOAD_RAW_BITS_TI_TYPE;
c.ext1 = i;
@ -1428,10 +1428,131 @@ static void CmdTibits(char *str)
}
}
}
GraphTraceLen = 1536*32;
// GraphTraceLen = 1536*32;
GraphTraceLen = 4000*32;
RepaintGraphWindow();
}
static void CmdFSKdemod(char *cmdline)
{
static const int LowTone[] = {
1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, -1, -1, -1, -1, -1
};
static const int HighTone[] = {
1, 1, 1, 1, 1, -1, -1, -1, -1,
1, 1, 1, 1, -1, -1, -1, -1,
1, 1, 1, 1, -1, -1, -1, -1,
1, 1, 1, 1, -1, -1, -1, -1,
1, 1, 1, 1, -1, -1, -1, -1,
1, 1, 1, 1, -1, -1, -1, -1, -1,
};
int convLen = max(arraylen(HighTone), arraylen(LowTone));
DWORD hi = 0, lo = 0;
int i, j;
int minMark=0, maxMark=0;
int lowLen = arraylen(LowTone);
int highLen = arraylen(HighTone);
for(i = 0; i < GraphTraceLen - convLen; i++) {
int lowSum = 0, highSum = 0;
for(j = 0; j < lowLen; j++) {
lowSum += LowTone[j]*GraphBuffer[i+j];
}
for(j = 0; j < highLen; j++) {
highSum += HighTone[j]*GraphBuffer[i+j];
}
lowSum = abs((100*lowSum) / lowLen);
highSum = abs((100*highSum) / highLen);
GraphBuffer[i] = (highSum << 16) | lowSum;
}
for(i = 0; i < GraphTraceLen - convLen - 16; i++) {
int j;
int lowTot = 0, highTot = 0;
// 10 and 8 are f_s divided by f_l and f_h, rounded
for(j = 0; j < 10; j++) {
lowTot += (GraphBuffer[i+j] & 0xffff);
}
for(j = 0; j < 8; j++) {
highTot += (GraphBuffer[i+j] >> 16);
}
GraphBuffer[i] = lowTot - highTot;
if (GraphBuffer[i]>maxMark) maxMark=GraphBuffer[i];
if (GraphBuffer[i]<minMark) minMark=GraphBuffer[i];
}
GraphTraceLen -= (convLen + 16);
RepaintGraphWindow();
// Find bit-sync (3 lo followed by 3 high)
int max = 0, maxPos = 0;
for(i = 0; i < 6000; i++) {
int dec = 0;
for(j = 0; j < 3*arraylen(LowTone); j++) {
dec -= GraphBuffer[i+j];
}
for(; j < 3*(arraylen(LowTone) + arraylen(HighTone) ); j++) {
dec += GraphBuffer[i+j];
}
if(dec > max) {
max = dec;
maxPos = i;
}
}
// place start of bit sync marker in graph
GraphBuffer[maxPos] = maxMark;
GraphBuffer[maxPos+1] = minMark;
maxPos += j;
// place end of bit sync marker in graph
GraphBuffer[maxPos] = maxMark;
GraphBuffer[maxPos+1] = minMark;
PrintToScrollback("actual data bits start at sample %d", maxPos);
PrintToScrollback("length %d/%d", arraylen(HighTone), arraylen(LowTone));
BYTE bits[46];
bits[sizeof(bits)-1] = '\0';
// find bit pairs and manchester decode them
for(i = 0; i < arraylen(bits)-1; i++) {
int dec = 0;
for(j = 0; j < arraylen(LowTone); j++) {
dec -= GraphBuffer[maxPos+j];
}
for(; j < arraylen(LowTone) + arraylen(HighTone); j++) {
dec += GraphBuffer[maxPos+j];
}
maxPos += j;
// place inter bit marker in graph
GraphBuffer[maxPos] = maxMark;
GraphBuffer[maxPos+1] = minMark;
// hi and lo form a 64 bit pair
hi = (hi<<1)|(lo>>31);
lo = (lo<<1);
// store decoded bit as binary (in hi/lo) and text (in bits[])
if(dec<0) {
bits[i] = '1';
lo|=1;
} else {
bits[i] = '0';
}
}
PrintToScrollback("bits: '%s'", bits);
PrintToScrollback("hex: %08x %08x", hi, lo);
}
static void CmdTidemod(char *cmdline)
{
/* MATLAB as follows:
@ -1449,35 +1570,41 @@ l = sign(sin(cumsum(l)));
h = sign(sin(cumsum(h)));
*/
static const int LowTone[] = {
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1,
1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1,
1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1,
-1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1,
-1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1,
-1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1,
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1,
1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1,
1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1,
-1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1,
-1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1,
1, 1, 1, 1, 1, 1, 1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1,
};
static const int HighTone[] = {
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1,
1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1,
-1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
-1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1,
1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1,
1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1,
-1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
-1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1,
1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1,
-1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
-1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1,
1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1,
1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
1, 1, 1, 1, 1, 1, 1,
};
int convLen = max(arraylen(HighTone), arraylen(LowTone));
@ -1550,9 +1677,6 @@ h = sign(sin(cumsum(h)));
PrintToScrollback("length %d/%d", arraylen(HighTone), arraylen(LowTone));
GraphBuffer[maxPos] = 800;
GraphBuffer[maxPos+1] = -800;
BYTE bits[64+16+8+1];
bits[sizeof(bits)-1] = '\0';
@ -1667,6 +1791,20 @@ static void CmdZerocrossings(char *str)
RepaintGraphWindow();
}
static void CmdThreshold(char *str)
{
int i;
int threshold = atoi(str);
for(i = 0; i < GraphTraceLen; i++) {
if(GraphBuffer[i]>= threshold)
GraphBuffer[i]=127;
else
GraphBuffer[i]=-128;
}
RepaintGraphWindow();
}
static void CmdLtrim(char *str)
{
int i;
@ -2423,8 +2561,6 @@ static void Cmdmanchesterdemod(char *str) {
}
}
/*
* Usage ???
*/
@ -2595,6 +2731,7 @@ static struct {
{"exit", CmdQuit,1, " Exit program"},
{"flexdemod", CmdFlexdemod,1, " Demodulate samples for FlexPass"},
{"fpgaoff", CmdFPGAOff,0, " Set FPGA off"}, // ## FPGA Control
{"fskdemod", CmdFSKdemod,1, " Demodulate graph window as a HID FSK"},
{"hexsamples", CmdHexsamples,0, "<blocks> -- Dump big buffer as hex bytes"},
{"hi14alist", CmdHi14alist,0, " List ISO 14443a history"}, // ## New list command
{"hi14areader", CmdHi14areader,0, " Act like an ISO14443 Type A reader"}, // ## New reader command
@ -2640,8 +2777,9 @@ static struct {
{"setlfdivisor", CmdSetDivisor,0, "<19 - 255> -- Drive LF antenna at 12Mhz/(divisor+1)"},
{"sri512read", CmdSri512read,0, "<int> -- Read contents of a SRI512 tag"},
{"tibits", CmdTibits,0, " Get raw bits for TI-type LF tag"},
{"tidemod", CmdTidemod,0, " Demodulate raw bits for TI-type LF tag"},
{"tidemod", CmdTidemod,1, " Demodulate raw bits for TI-type LF tag"},
{"tiread", CmdTiread,0, " Read a TI-type 134 kHz tag"},
{"threshold", CmdThreshold,1, " Maximize/minimize every value in the graph window depending on threshold"},
{"tune", CmdTune,0, " Measure antenna tuning"},
{"vchdemod", CmdVchdemod,0, "['clone'] -- Demodulate samples for VeriChip"},
{"zerocrossings", CmdZerocrossings,1, " Count time between zero-crossings"},