- // greg - If correlation is less than 1 then there's little point in continuing
- if ((max/(arraylen(FrameSOF)/skip)) >= 1) // THIS SHOULD BE 1
- {
-
- i = maxPos + arraylen(FrameSOF)/skip;
-
- uint8_t outBuf[20];
- memset(outBuf, 0, sizeof(outBuf));
- uint8_t mask = 0x01;
- for(;;) {
- int corr0 = 0, corr00 = 0, corr01 = 0, corr1 = 0, corrEOF = 0;
- for(j = 0; j < arraylen(Logic0); j += skip) {
- corr0 += Logic0[j]*dest[i+(j/skip)];
+ if (DEBUG) Dbprintf("timing: sof_time = %d, eof_time = %d", sof_time, *eof_time);
+
+ LogTrace_ISO15693(DecodeTag.output, DecodeTag.len, sof_time*4, *eof_time*4, NULL, false);
+
+ return DecodeTag.len;
+}
+
+
+//=============================================================================
+// An ISO15693 decoder for reader commands.
+//
+// This function is called 4 times per bit (every 2 subcarrier cycles).
+// Subcarrier frequency fs is 848kHz, 1/fs = 1,18us, i.e. function is called every 2,36us
+// LED handling:
+// LED B -> ON once we have received the SOF and are expecting the rest.
+// LED B -> OFF once we have received EOF or are in error state or unsynced
+//
+// Returns: true if we received a EOF
+// false if we are still waiting for some more
+//=============================================================================
+
+typedef struct DecodeReader {
+ enum {
+ STATE_READER_UNSYNCD,
+ STATE_READER_AWAIT_1ST_FALLING_EDGE_OF_SOF,
+ STATE_READER_AWAIT_1ST_RISING_EDGE_OF_SOF,
+ STATE_READER_AWAIT_2ND_FALLING_EDGE_OF_SOF,
+ STATE_READER_AWAIT_2ND_RISING_EDGE_OF_SOF,
+ STATE_READER_AWAIT_END_OF_SOF_1_OUT_OF_4,
+ STATE_READER_RECEIVE_DATA_1_OUT_OF_4,
+ STATE_READER_RECEIVE_DATA_1_OUT_OF_256
+ } state;
+ enum {
+ CODING_1_OUT_OF_4,
+ CODING_1_OUT_OF_256
+ } Coding;
+ uint8_t shiftReg;
+ uint8_t bitCount;
+ int byteCount;
+ int byteCountMax;
+ int posCount;
+ int sum1, sum2;
+ uint8_t *output;
+ uint8_t jam_search_len;
+ uint8_t *jam_search_string;
+} DecodeReader_t;
+
+
+static void DecodeReaderInit(DecodeReader_t* DecodeReader, uint8_t *data, uint16_t max_len, uint8_t jam_search_len, uint8_t *jam_search_string) {
+ DecodeReader->output = data;
+ DecodeReader->byteCountMax = max_len;
+ DecodeReader->state = STATE_READER_UNSYNCD;
+ DecodeReader->byteCount = 0;
+ DecodeReader->bitCount = 0;
+ DecodeReader->posCount = 1;
+ DecodeReader->shiftReg = 0;
+ DecodeReader->jam_search_len = jam_search_len;
+ DecodeReader->jam_search_string = jam_search_string;
+}
+
+
+static void DecodeReaderReset(DecodeReader_t* DecodeReader) {
+ DecodeReader->state = STATE_READER_UNSYNCD;
+}
+
+
+static int inline __attribute__((always_inline)) Handle15693SampleFromReader(bool bit, DecodeReader_t *restrict DecodeReader) {
+ switch (DecodeReader->state) {
+ case STATE_READER_UNSYNCD:
+ // wait for unmodulated carrier
+ if (bit) {
+ DecodeReader->state = STATE_READER_AWAIT_1ST_FALLING_EDGE_OF_SOF;