private void _bitshift(int num, uint b) { starSamples[num].bitsr <<= 1; starSamples[num].bitsr |= b; switch (starSamples[num].bitstate) { case 0: { if ((starSamples[num].bitsr & 0x001f) == 0x0e) { starSamples[num].bitstate = 1; starSamples[num].bitcount = 32 - 5; } else if ((starSamples[num].bitsr & 0x001f) == 0x11) { starSamples[num].bitsr ^= 0x1f; starSamples[num].bitstate = 1; starSamples[num].bitcount = 32 - 5; starSamples[num].rbit ^= 1; } break; } case 1: { if (--starSamples[num].bitcount == 0) { starSamples[num].bits0 = starSamples[num].bitsr; starSamples[num].bitstate = 2; starSamples[num].bitcount = 32; } break; } case 2: { if (--starSamples[num].bitcount == 0) { starSamples[num].bits1 = starSamples[num].bitsr; starSamples[num].bitstate = 3; starSamples[num].bitcount = 16; } break; } case 3: { if (--starSamples[num].bitcount == 0) { starSamples[num].bits2 = starSamples[num].bitsr; starSamples[num].bits2 <<= 16; starSamples[num].bitstate = 4; if ((starSamples[num].bits0 & 0x07ff0000) == ((~(starSamples[num].bits1)) & 0x07ff0000)) { if (DecoderHelpers.STAR_ComputeCDC(starSamples[num].bits0) == (starSamples[num].bits0 & 0x3f) && ((starSamples[num].bits0 & 0x3f) == (starSamples[num].bits1 & 0x3f))) { lastBits0 = starSamples[num].bits0; ClearAllDecoders(); valid = 1; } } } break; } case 4: { _reset_decoder(num); break; } } }
private void ProcBits(int x) { bool[] lbits = new bool[112]; int lbc = 0; int i, j, k; byte[] data = new byte[14]; ushort ccrc; ushort rcrc; for (i = 0; i < 16; i++) { for (j = 0; j < 7; j++) { k = (j * 16) + i; lbits[lbc] = mdcSamples[x].bits[k]; ++lbc; } } for (i = 0; i < 14; i++) { data[i] = 0; for (j = 0; j < 8; j++) { k = (i * 8) + j; if (lbits[k]) { data[i] |= (byte)(1 << j); } } } ccrc = DecoderHelpers.MDC1200_ComputeCRC(data, 4); rcrc = (ushort)(data[5] << 8 | data[4]); if (ccrc == rcrc) { if (mdcSamples[x].shstate == 2) { extra0 = data[0]; extra1 = data[1]; extra2 = data[2]; extra3 = data[3]; for (k = 0; k < MDC_ND; k++) { mdcSamples[k].shstate = -1; } good = 2; indouble = 0; } else { if (indouble <= 0) { good = 1; op = data[0]; arg = data[1]; unitID = (ushort)((data[2] << 8) | data[3]); crc = (ushort)((data[4] << 8) | data[5]); switch (data[0]) { /* list of opcode that mean 'double packet' */ case 0x35: case 0x55: good = 0; indouble = 1; mdcSamples[x].shstate = 2; mdcSamples[x].shcount = 0; ClearBits(x); break; default: // only in the single-packet case, double keeps rest going for (k = 0; k < MDC_ND; k++) { mdcSamples[k].shstate = -1; } break; } } else { // any subsequent good decoder allowed to attempt second half mdcSamples[x].shstate = 2; mdcSamples[x].shcount = 0; ClearBits(x); } } } else { mdcSamples[x].shstate = -1; } if (good > 0) { ProcessGoodMDC(good, op, arg, unitID, extra0, extra1, extra2, extra3); good = 0; } }