我正在为一个产品创建一个内部诊断应用程序,该产品在I2C总线上有一堆可单独寻址的设备。
一般的想法是我查询总线上的每个设备并获得“原始数据”的字节数组。字节数组的长度取决于各个设备。
我创建了一个名为'FormattedData'的抽象类,其中包含一个名为'RawData'的属性。
public abstract class FormattedData {
protected byte[] _rawData;
public FormattedData(int rawDataLength) {
_rawData = new byte[rawDataLength];
}
public byte[] RawData {
get { return _rawData; }
set {
if (value.Length != _rawData.Length) {
throw new ArgumentOutOfRangeException("RawData",
"The Raw Data byte array for a " + this.GetType().Name +
" must be " + _rawData.Length.ToString() + "-bytes long." +
Environment.NewLine +
"Length of supplied array: [" + value.Length.ToString() + "]");
}
_rawData = value;
}
}
}
I2C总线上的每个器件都通过继承FormattedData获得自己的模型。
然后,我可以根据需要通过操作RawData字节数组中的数据来为设备公开一堆属性。就我的目的而言,数据都是只读的。例如:
public class MyTestDevice : FormattedData {
public MyTestDevice()
: base(256) {
}
public string VendorName {
get { return (ASCIIEncoding.ASCII.GetString(_rawData, 20, 16)); }
set { ;}
}
public bool LossOfSignal {
get { return ((_rawData[110] & 0x02) == 0x02); }
set { ;}
}
}
所以,问我的问题。
我正在根据SFF-8472规范为
长话短说,单个物理SFP设备有 2个原始数据表(AO和A2)。每个数据表必须独立查询,最多可返回256个字节。
问题是A2表中的一些属性依赖于A0表中的值(A2表中的某些模拟值根据A0表中设置的标志进行了不同的缩放)。
使用多个“原始数据”字节数组对这样的设备进行建模的最佳方法是什么?一个数组中的值可能依赖于另一个数组的值?
如果可能,我想为所有设备维护某种标准接口。
答案 0 :(得分:0)
答案 1 :(得分:0)
我最终修改了FormattedData,以便它可以保存可变数量的RawData字节数组。
构造函数获取KeyValuePairs列表。每个Key表示RawData数组的描述,每个Value表示该数组的长度。
然后,我可以使用其描述索引任何RawData数组。
public abstract class FormattedData {
protected Dictionary<string, byte[]> _rawData = new Dictionary<string, byte[]>();
public FormattedData(IEnumerable<KeyValuePair<string, int>> rawDataConfigs) {
rawDataConfigs.ToList()
.ForEach(kvp => _rawData.Add(kvp.Key, new byte[kvp.Value]));
}
public IEnumerable<string> RawDataNames {
get {
foreach (var kvp in _rawData) {
yield return kvp.Key;
}
}
}
public byte[] this[string rawDataName] {
get {
return _rawData[rawDataName];
}
set {
if (value.Length != _rawData[rawDataName].Length) {
throw new ArgumentOutOfRangeException("RawData",
"The Raw Data byte array for a " + this.GetType().Name +
" must be " + _rawData[rawDataName].Length.ToString() + "-bytes long." +
Environment.NewLine +
"Length of supplied array: [" + value.Length.ToString() + "]");
}
_rawData[rawDataName] = value;
}
}
}
我更新的测试设备看起来像这样(两个RawData数组 - 一个名为'A0',一个名为'A2':
public class MyTestDevice: FormattedData {
const string A0 = "A0";
const string A2 = "A2";
const int _rawDataLength_A0 = 256;
const int _rawDataLength_A2 = 256;
static readonly Dictionary<string, int> _rawDataConfigs =
new Dictionary<string, int> {
{A0, _rawDataLength_A0},
{A2, _rawDataLength_A2}
};
public MyTestDevice()
: base(_rawDataConfigs) {
}
public string VendorName {
get { return (ASCIIEncoding.ASCII.GetString(_rawData[A0], 20, 16)); }
set { ;}
}
public bool LossOfSignal {
get { return ((_rawData[A0][110] & 0x02) == 0x02); }
set { ;}
}
}
我认为我应该能够使用这种方法对几乎任何I2C设备进行建模 - 任何具有多个页面的设备(即EEPROM或XFP)或多个原始数据表(即SFP)都应该适合。
评论或批评?