2009-08-26 69 views
0

我正在为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收发器创建一个模型。长话短说,单个物理SFP设备有2原始数据表(AO和A2)。每个数据表必须独立查询,并且可以返回最多256个字节。

问题是来自A2表的一些属性取决于来自A0表的值(根据A0表中设置的标志,来自A2表的一些模拟值的缩放比例不同)。

使用多于一个'原始数据'字节数组来模拟这种设备的最佳方式是什么?以及在哪里可能来自一个数组的值可能取决于另一个数组的值?

如果可能,我想为所有设备维护某种标准接口。

回答

0
  • 创建一个具有格式化数据的类作为其成员之一。
  • 它应该看起来就像MyTestDevice。
  • 将该类扩展为具有2个本地设备的formattedData成员。
  • 修改VendorName等函数以使用两个表。
+0

有一些优势,能够?治疗每个设备都相同 - 例如: var cast =(FormattedData)MyTestDevice; cast.RawData = .... 更具体地说,我想要一个List - 当其中一个设备偏离标准的'FormattedData'模式时,我该如何做到这一点? – user158485

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设备 - 具有多页的任何设备(如EEP​​ROM或XFP)或多个原始数据表(即一个SFP)应符合

评论或批评