#include "cmdmain.h"
#include "cmddata.h"
#include "lfdemod.h"
+#include "usb_cmd.h"
+
uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN];
int DemodBufferLen;
static int CmdHelp(const char *Cmd);
RepaintGraphWindow();
return 0;
}
+/**
+ * Undecimate - I'd call it 'interpolate', but we'll save that
+ * name until someone does an actual interpolation command, not just
+ * blindly repeating samples
+ * @param Cmd
+ * @return
+ */
+int CmdUndec(const char *Cmd)
+{
+ //We have memory, don't we?
+ int swap[MAX_GRAPH_TRACE_LEN] = { 0 };
+ uint32_t i = 0 ,j = 0;
+ while(j+1 < MAX_GRAPH_TRACE_LEN && i < GraphTraceLen)
+ {
+ swap[j] = GraphBuffer[i];
+ swap[j+1] = GraphBuffer[i];
+ i++;
+ j+=2;
+ }
+ memcpy(GraphBuffer,swap, j);
+ GraphTraceLen = j;
+ PrintAndLog("Undecimated by 2");
+ RepaintGraphWindow();
+
+ /*
+ * Something is not right here, need to look into it,
+ * the undec seems to only operate on half the values **/
+ return 0;
+}
/* Print our clock rate */
// uses data from graphbuffer
int CmdSamples(const char *Cmd)
{
- uint8_t got[40000];
+ //If we get all but the last byte in bigbuf,
+ // we don't have to worry about remaining trash
+ // in the last byte in case the bits-per-sample
+ // does not line up on byte boundaries
+ uint8_t got[40000-1];
int n = strtol(Cmd, NULL, 0);
if (n == 0)
- n = 20000;
+ n = sizeof(got);
if (n > sizeof(got))
n = sizeof(got);
PrintAndLog("Data fetched");
UsbCommand response;
WaitForResponse(CMD_ACK, &response);
- uint8_t bits_per_sample = response.arg[0];
- PrintAndLog("Samples packed at %d bits per sample", bits_per_sample);
+ uint8_t bits_per_sample = 8;
+
+ //Old devices without this feature would send 0 at arg[0]
+ if(response.arg[0] > 0)
+ {
+ sample_config *sc = (sample_config *) response.d.asBytes;
+ PrintAndLog("Samples @ %d bits/smpl, decimation 1:%d ", sc->bits_per_sample
+ , sc->decimation);
+ bits_per_sample = sc->bits_per_sample;
+ }
if(bits_per_sample < 8)
{
PrintAndLog("Unpacking...");
BitstreamOut bout = { got, bits_per_sample * n, 0};
int j =0;
- for (j = 0; j * bits_per_sample < n * 8 && j < GraphTraceLen; j++) {
+ for (j = 0; j * bits_per_sample < n * 8 && j < sizeof(GraphBuffer); j++) {
uint8_t sample = getByte(bits_per_sample, &bout);
GraphBuffer[j] = ((int) sample )- 128;
}
GraphBuffer[j] = ((int)got[j]) - 128;
}
GraphTraceLen = n;
-
}
RepaintGraphWindow();
{"threshold", CmdThreshold, 1, "<threshold> -- Maximize/minimize every value in the graph window depending on threshold"},
{"dirthreshold", CmdDirectionalThreshold, 1, "<thres up> <thres down> -- Max rising higher up-thres/ Min falling lower down-thres, keep rest as prev."},
{"tune", CmdTuneSamples, 0, "Get hw tune samples for graph window"},
- {"zerocrossings", CmdZerocrossings, 1, "Count time between zero-crossings"},
+ {"undec", CmdUndec, 1, "Un-decimate samples by 2"},
+ {"zerocrossings", CmdZerocrossings, 1, "Count time between zero-crossings"},
{NULL, NULL, 0, NULL}
};