public void OnNext(string value) { var parsedLine = DolphinMbpWriteLine.ParseString(value); if (parsedLine?.WriteSize == 8) { uint flagNum = parsedLine.MemoryAddr - FLAGS_BASE_ADDRESS; // If the memory address is less than the flags base address, flagNum will overflow // so we only need to check flagNum < FLAGS_SIZE if (flagNum >= FLAGS_SIZE) { return; } byte oldFlag = cachedFlags[flagNum]; cachedFlags[flagNum] = (byte)parsedLine.Value; if (oldFlag != parsedLine.Value) { var eventArgs = new SoALFlagChangedEventArgs { FlagNumber = (int)flagNum, OldValue = oldFlag, NewValue = parsedLine.Value }; OnChange?.Invoke(this, eventArgs); } } }
public void OnNext(string value) { var parsedLine = DolphinMbpWriteLine.ParseString(value); if (parsedLine?.WriteSize == 32) { uint chunkOffset = (parsedLine.MemoryAddr - BITS_BASE_ADDRESS) / 4; // If the memory address is less than the flags base address, flagNum will overflow // so we only need to check flagNum < FLAGS_SIZE if (chunkOffset >= BITS_CHUNKS_COUNT) { return; } uint oldChunk = cachedBitChunks[chunkOffset]; uint newChunk = parsedLine.Value; cachedBitChunks[chunkOffset] = newChunk; List <int> changedBits = BitUtils.GetListOfBits((int)(oldChunk ^ newChunk)); var eventArgs = new SoALBitChangedEventArgs { ChunkNumber = (int)chunkOffset }; foreach (int b in changedBits) { eventArgs.ChunkBit = b; eventArgs.IsBeingSet = (newChunk & (1 << b)) != 0; OnChange?.Invoke(this, eventArgs); } } }