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."), });
// 读取数据 // 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); } }
// 根据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; }
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; }