+ PrintAndLog("recorded activity (TraceLen = %d bytes):");
+ PrintAndLog(" ETU :nbits: who bytes");
+ PrintAndLog("---------+-----+----+-----------");
+
+ int i = 0;
+ int prev = -1;
+ int len = strlen(Cmd);
+
+ char filename[FILE_PATH_SIZE] = { 0x00 };
+ FILE* pf = NULL;
+
+ if (len > FILE_PATH_SIZE) len = FILE_PATH_SIZE;
+ memcpy(filename, Cmd, len);
+
+ if (strlen(filename) > 0) {
+ if ((pf = fopen(filename,"wb")) == NULL) {
+ PrintAndLog("Error: Could not open file [%s]",filename);
+ return 1;
+ }
+ }
+
+ for (;;) {
+
+ if(i >= traceLen) { break; }
+
+ bool isResponse;
+ int timestamp = *((uint32_t *)(got+i));
+ if (timestamp & 0x80000000) {
+ timestamp &= 0x7fffffff;
+ isResponse = 1;
+ } else {
+ isResponse = 0;
+ }
+
+ int parityBits = *((uint32_t *)(got+i+4));
+ // 4 bytes of additional information...
+ // maximum of 32 additional parity bit information
+ //
+ // TODO:
+ // at each quarter bit period we can send power level (16 levels)
+ // or each half bit period in 256 levels.
+
+ int bits = got[i+8];
+ int len = nbytes(got[i+8]);
+
+ if (len > 100) {
+ break;
+ }
+ if (i + len > traceLen) { break;}
+
+ uint8_t *frame = (got+i+9);
+
+ // Break and stick with current result if buffer was not completely full
+ if (frame[0] == 0x44 && frame[1] == 0x44 && frame[3] == 0x44) { break; }
+
+ char line[1000] = "";
+ int j;
+ for (j = 0; j < len; j++) {
+ int oddparity = 0x01;
+ int k;
+
+ for (k=0;k<8;k++) {
+ oddparity ^= (((frame[j] & 0xFF) >> k) & 0x01);
+ }
+
+ //if((parityBits >> (len - j - 1)) & 0x01) {
+ if (isResponse && (oddparity != ((parityBits >> (len - j - 1)) & 0x01))) {
+ sprintf(line+(j*4), "%02x! ", frame[j]);
+ }
+ else {
+ sprintf(line+(j*4), "%02x ", frame[j]);
+ }
+ }
+
+ PrintAndLog(" +%7d: %3d: %s %s",
+ (prev < 0 ? 0 : (timestamp - prev)),
+ bits,
+ (isResponse ? "TAG" : " "),
+ line);
+
+ if (pf) {
+ fprintf(pf," +%7d: %3d: %s %s\n",
+ (prev < 0 ? 0 : (timestamp - prev)),
+ bits,
+ (isResponse ? "TAG" : " "),
+ line);
+ }
+
+ prev = timestamp;
+ i += (len + 9);
+ }