示例#1
0
        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;
            }
            }
        }
示例#2
0
        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;
            }
        }