+               case STATE_TAG_RECEIVING_DATA:
+                       if (DecodeTag->posCount == 1) {
+                               DecodeTag->sum1 = 0;
+                               DecodeTag->sum2 = 0;
+                       }
+                       if (DecodeTag->posCount <= 4) {
+                               DecodeTag->sum1 += amplitude;
+                       } else {
+                               DecodeTag->sum2 += amplitude;
+                       }
+                       if (DecodeTag->posCount == 8) {
+                               int32_t corr_1 = DecodeTag->sum2 - DecodeTag->sum1;
+                               int32_t corr_0 = -corr_1;
+                               int32_t corr_EOF = (DecodeTag->sum1 + DecodeTag->sum2) / 2;
+                               if (corr_EOF > corr_0 && corr_EOF > corr_1) {
+                                       if (DecodeTag->lastBit == LOGIC0) {  // this was already part of EOF
+                                               DecodeTag->state = STATE_TAG_EOF;
+                                       } else {
+                                               DecodeTag->posCount = 0;
+                                               DecodeTag->state = STATE_TAG_SOF_LOW;
+                                               LED_C_OFF();
+                                       }
+                               } else if (corr_1 > corr_0) {
+                                       // logic 1
+                                       if (DecodeTag->lastBit == SOF_PART1) { // still part of SOF
+                                               DecodeTag->lastBit = SOF_PART2;    // SOF completed
+                                       } else {
+                                               DecodeTag->lastBit = LOGIC1;
+                                               DecodeTag->shiftReg >>= 1;
+                                               DecodeTag->shiftReg |= 0x80;
+                                               DecodeTag->bitCount++;
+                                               if (DecodeTag->bitCount == 8) {
+                                                       DecodeTag->output[DecodeTag->len] = DecodeTag->shiftReg;
+                                                       DecodeTag->len++;
+                                                       if (DecodeTag->len > DecodeTag->max_len) {
+                                                               // buffer overflow, give up
+                                                               DecodeTag->posCount = 0;
+                                                               DecodeTag->state = STATE_TAG_SOF_LOW;
+                                                               LED_C_OFF();
+                                                       }
+                                                       DecodeTag->bitCount = 0;
+                                                       DecodeTag->shiftReg = 0;
+                                               }
+                                       }
+                               } else {
+                                       // logic 0
+                                       if (DecodeTag->lastBit == SOF_PART1) { // incomplete SOF
+                                               DecodeTag->posCount = 0;
+                                               DecodeTag->state = STATE_TAG_SOF_LOW;
+                                               LED_C_OFF();
+                                       } else {
+                                               DecodeTag->lastBit = LOGIC0;
+                                               DecodeTag->shiftReg >>= 1;
+                                               DecodeTag->bitCount++;
+                                               if (DecodeTag->bitCount == 8) {
+                                                       DecodeTag->output[DecodeTag->len] = DecodeTag->shiftReg;
+                                                       DecodeTag->len++;
+                                                       if (DecodeTag->len > DecodeTag->max_len) {
+                                                               // buffer overflow, give up
+                                                               DecodeTag->posCount = 0;
+                                                               DecodeTag->state = STATE_TAG_SOF_LOW;
+                                                               LED_C_OFF();
+                                                       }
+                                                       DecodeTag->bitCount = 0;
+                                                       DecodeTag->shiftReg = 0;
+                                               }
+                                       }