public ChassisFruWriteRequest(ushort offset, ushort length, byte[] dataToWrite) { byte lowOffset, highOffset, lowLength, highLength; IpmiSharedFunc.SplitWord(offset, out lowOffset, out highOffset); IpmiSharedFunc.SplitWord(length, out lowLength, out highLength); this.lowOffset = lowOffset; this.highOffset = highOffset; this.lowLength = lowLength; this.highLength = highLength; this.dataToWrite = dataToWrite; }
/// <summary> /// Returns a byte array with all bytes from a specific area of the fru: Chassis, Baseboard, Product /// </summary> private byte[] ReadFruAreaBytes(DeviceType deviceType, byte deviceId, ushort offset, bool maxLenght, out byte completionCode) { byte countToRead = 0x10; byte loOffset; byte hiOffset; List <byte> areaBytes = new List <byte>(); IpmiSharedFunc.SplitWord(offset, out loOffset, out hiOffset); ushort totalDataRead = countToRead; ChassisFruReadRequest fruRequest = new ChassisFruReadRequest(loOffset, hiOffset, countToRead); ChassisFruReadResponse fruResponse = SendReceive <ChassisFruReadResponse>(deviceType, deviceId, (fruRequest)); completionCode = fruResponse.CompletionCode; if (completionCode == (byte)CompletionCode.Success) { ushort dataSize = FruArea.AreaLength(fruResponse.DataReturned); totalDataRead = Math.Min(countToRead, dataSize); IpmiSharedFunc.AppendArrayToList(fruResponse.DataReturned, areaBytes, totalDataRead); offset += totalDataRead; int pass = 0; const int readLimit = 12; while (dataSize > totalDataRead && pass <= readLimit) { IpmiSharedFunc.SplitWord(offset, out loOffset, out hiOffset); if (!maxLenght) { countToRead = (byte)Math.Min(countToRead, dataSize - totalDataRead); } else { countToRead = (byte)Math.Min(byte.MaxValue, dataSize - totalDataRead); } fruRequest = new ChassisFruReadRequest(loOffset, hiOffset, countToRead); // send request for more data fruResponse = SendReceive <ChassisFruReadResponse>(deviceType, deviceId, (fruRequest)); totalDataRead += countToRead; offset += countToRead; completionCode = fruResponse.CompletionCode; if (completionCode == 0x00) { IpmiSharedFunc.AppendArrayToList(fruResponse.DataReturned, areaBytes, countToRead); } else { break; } pass++; } if (pass > 12) { completionCode = (byte)CompletionCode.InvalidIterationCount; } } return(areaBytes.ToArray()); }