public static ContextMapBuilder For(BlockTypeInfo blockTypeInfo)
 {
     return(blockTypeInfo.Category switch {
         Category.Literal => new Literals(blockTypeInfo.TypeCount),
         Category.Distance => new Distances(blockTypeInfo.TypeCount),
         _ => throw new InvalidOperationException("Context maps can only be created for literals and distances."),
     });
Exemple #2
0
 // 读取数据 //
 public void ReadData(DataTable i_dtData)
 {
     for (int i = 0; i < i_dtData.Rows.Count; i++)
     {
         DataRow       row = i_dtData.Rows[i];
         BlockTypeInfo lc  = new BlockTypeInfo();
         lc.getData(row.ItemArray);
         blockTypeAllData.Add(lc);
     }
 }
Exemple #3
0
    // 根据id 获取关卡的配置数据 //
    public BlockTypeInfo getConfigByScore(int score)
    {
        int           len   = blockTypeAllData.Count;
        BlockTypeInfo preSc = blockTypeAllData[0];

        if (score == 0)
        {
            return(blockTypeAllData[0]);
        }
        for (int i = 0; i < len; i++)
        {
            BlockTypeInfo sc = blockTypeAllData[i];
            if (score >= preSc.score && score < sc.score)
            {
                return(preSc);
            }
            preSc = sc;
        }
        return(blockTypeAllData[len - 1]);
    }
 public Context(BlockTypeInfo info, BlockTypeTracker tracker)
 {
     this.Info    = info;
     this.Tracker = tracker;
 }
Exemple #5
0
        public override void OnReception(ByteDataFragment fragment)
        {
            Interlocked.Exchange(ref _lastReceptionTimeUtcTicks, DateTime.UtcNow.Ticks);

            if (_aborting)
            {
                return;
            }

            byte[] data   = fragment.Buffer;
            int    offset = fragment.Offset;
            int    length = fragment.Length;

            BlockTypeInfo blockInfo;

            if (_recvLen > 0)
            {
                blockInfo = GetBlockTypeInfo(_recvBuff[0], Volatile.Read(ref _mode));
            }
            else
            {
                blockInfo = new BlockTypeInfo();    // update later
            }

            for (int i = 0; i < length; i++)
            {
                byte c = data[offset + i];

                if (_recvLen == 0)
                {
                    if (c == EOT)
                    {
                        Trace("--> EOT");
                        FlushPendingBuffer(true);
                        Trace("<-- ACK");
                        Send(ACK);
                        Completed(false, true, XZModemPlugin.Instance.Strings.GetString("Message.XModem.ReceiveComplete"));
                        return;
                    }

                    if (c != SOH && c != STX)
                    {
                        continue;   // skip
                    }

                    // determine expected block type
                    blockInfo = GetBlockTypeInfo(c, Volatile.Read(ref _mode));
                }

                _recvBuff[_recvLen++] = c;

                if (_recvLen >= blockInfo.BlockSize)
                {
                    goto BlockReceived;
                }
            }

            return;

BlockReceived:
            // a block has been received
            Interlocked.Exchange(ref _lastBlockTimeUtcTicks, DateTime.UtcNow.Ticks);

            Trace("--> {0:X2} {1:X2} ...({2})", _recvBuff[0], _recvBuff[1], _recvLen);

            // check sequence number
            if (_recvBuff[1] != _nextSequenceNumber || _recvBuff[2] != (255 - _nextSequenceNumber))
            {
                Trace("<-- NAK (bad seq)");
                goto Error;
            }

            // check CRC or checksum
            if (blockInfo.HasCRC)
            {
                ushort crc      = Crc16.Update(Crc16.InitialValue, _recvBuff, blockInfo.DataOffset, blockInfo.DataLength);
                int    crcIndex = blockInfo.DataOffset + blockInfo.DataLength;
                if (_recvBuff[crcIndex] != (byte)(crc >> 8) || _recvBuff[crcIndex + 1] != (byte)crc)
                {
                    // CRC error
                    Trace("<-- NAK (CRC error)");
                    goto Error;
                }
            }
            else
            {
                byte checksum = 0;
                int  index    = blockInfo.DataOffset;
                for (int n = 0; n < blockInfo.DataLength; ++n)
                {
                    checksum += _recvBuff[index++];
                }
                if (_recvBuff[index] != checksum)
                {
                    // checksum error
                    Trace("<-- NAK (checksum error)");
                    goto Error;
                }
            }

            // ok
            _nextSequenceNumber++;

            FlushPendingBuffer(false);
            SaveToPendingBuffer(_recvBuff, blockInfo.DataOffset, blockInfo.DataLength);

            _errorCount = 0;
            _recvLen    = 0;
            Send(ACK);
            return;

Error:
            _recvLen = 0;
            _errorCount++;
            if (_errorCount > MAX_ERROR)
            {
                Abort(XZModemPlugin.Instance.Strings.GetString("Message.XModem.CouldNotReceiveCorrectData"), false);
            }
            else
            {
                Send(NAK);
            }
        }
 public Simulating(BlockTypeInfo info, IReadOnlyList <BlockSwitchCommand> queue) : base(info)
 {
     this.queue = queue;
 }
 public Writing(BlockTypeInfo info, IBitWriter writer, IReadOnlyList <BlockSwitchCommand> queue) : base(info)
 {
     this.writer = writer;
     this.queue  = queue;
 }
 public Reading(BlockTypeInfo info, IBitReader reader) : base(info)
 {
     this.reader = reader;
 }
 protected BlockSwitchTracker(BlockTypeInfo info)
 {
     this.context   = info.TypeCount == 1 ? null : new BlockSwitchCommand.Context(info, new BlockTypeTracker(info.TypeCount));
     this.remaining = info.InitialLength;
 }
Exemple #10
0
        public override void OnReception(ByteDataFragment fragment)
        {
            Interlocked.Exchange(ref _lastReceptionTimeUtcTicks, DateTime.UtcNow.Ticks);

            if (_aborting) {
                return;
            }

            byte[] data = fragment.Buffer;
            int offset = fragment.Offset;
            int length = fragment.Length;

            BlockTypeInfo blockInfo;
            if (_recvLen > 0) {
                blockInfo = GetBlockTypeInfo(_recvBuff[0], Volatile.Read(ref _mode));
            }
            else {
                blockInfo = new BlockTypeInfo();    // update later
            }

            for (int i = 0; i < length; i++) {
                byte c = data[offset + i];

                if (_recvLen == 0) {
                    if (c == EOT) {
                        Trace("--> EOT");
                        FlushPendingBuffer(true);
                        Trace("<-- ACK");
                        Send(ACK);
                        Completed(false, true, XZModemPlugin.Instance.Strings.GetString("Message.XModem.ReceiveComplete"));
                        return;
                    }

                    if (c != SOH && c != STX) {
                        continue;   // skip
                    }

                    // determine expected block type
                    blockInfo = GetBlockTypeInfo(c, Volatile.Read(ref _mode));
                }

                _recvBuff[_recvLen++] = c;

                if (_recvLen >= blockInfo.BlockSize) {
                    goto BlockReceived;
                }
            }

            return;

            BlockReceived:
            // a block has been received
            Interlocked.Exchange(ref _lastBlockTimeUtcTicks, DateTime.UtcNow.Ticks);

            Trace("--> {0:X2} {1:X2} ...({2})", _recvBuff[0], _recvBuff[1], _recvLen);

            // check sequence number
            if (_recvBuff[1] != _nextSequenceNumber || _recvBuff[2] != (255 - _nextSequenceNumber)) {
                Trace("<-- NAK (bad seq)");
                goto Error;
            }

            // check CRC or checksum
            if (blockInfo.HasCRC) {
                ushort crc = Crc16.Update(Crc16.InitialValue, _recvBuff, blockInfo.DataOffset, blockInfo.DataLength);
                int crcIndex = blockInfo.DataOffset + blockInfo.DataLength;
                if (_recvBuff[crcIndex] != (byte)(crc >> 8) || _recvBuff[crcIndex + 1] != (byte)crc) {
                    // CRC error
                    Trace("<-- NAK (CRC error)");
                    goto Error;
                }
            }
            else {
                byte checksum = 0;
                int index = blockInfo.DataOffset;
                for (int n = 0; n < blockInfo.DataLength; ++n) {
                    checksum += _recvBuff[index++];
                }
                if (_recvBuff[index] != checksum) {
                    // checksum error
                    Trace("<-- NAK (checksum error)");
                    goto Error;
                }
            }

            // ok
            _nextSequenceNumber++;

            FlushPendingBuffer(false);
            SaveToPendingBuffer(_recvBuff, blockInfo.DataOffset, blockInfo.DataLength);

            _errorCount = 0;
            _recvLen = 0;
            Send(ACK);
            return;

            Error:
            _recvLen = 0;
            _errorCount++;
            if (_errorCount > MAX_ERROR) {
                Abort(XZModemPlugin.Instance.Strings.GetString("Message.XModem.CouldNotReceiveCorrectData"), false);
            }
            else {
                Send(NAK);
            }
        }