Ich erstelle eine interne Diagnoseanwendung für ein Produkt, das eine Reihe von einzeln adressierbaren Geräten an einem I2C-Bus hat.Wie würden Sie dieses Gerät modellieren?
Die allgemeine Idee ist, dass ich jedes Gerät auf dem Bus abfragen und ein Byte-Array von "Rohdaten" erhalten. Die Länge des Byte-Arrays hängt vom jeweiligen Gerät ab.
Ich habe eine abstrakte Klasse namens 'FormattedData' mit einer einzigen Eigenschaft namens 'RawData' erstellt.
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;
}
}
}
Jedes Gerät am I2C-Bus erhält sein eigenes Modell, indem es von FormattedData erbt.
Ich kann dann eine Reihe von Eigenschaften für das Gerät verfügbar machen, indem Sie Daten aus dem RAWDATA-Byte-Array nach Bedarf bearbeiten. Für meine Zwecke sind die Daten alle schreibgeschützt. Zum Beispiel:
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 { ;}
}
}
Also, auf meine Frage.
Ich erstelle ein Modell für einen SFP-Transceiver basierend auf der SFF-8472 Spezifikation.
Kurz gesagt, ein einzelnes physikalisches SFP-Gerät hat 2 Rohdatentabellen (AO und A2). Jede Datentabelle muss unabhängig abgefragt werden und kann bis zu 256 Byte zurückgeben.
Das Problem ist, dass einige der Eigenschaften aus der A2-Tabelle von Werten aus der A0-Tabelle abhängen (einige Analogwerte aus der A2-Tabelle werden abhängig von einem in der A0-Tabelle gesetzten Flag unterschiedlich skaliert).
Was wäre der beste Weg, ein Gerät wie dieses mit mehr als einem 'Raw Data' Byte-Array zu modellieren, und wo es möglich ist, dass Werte von einem Array von Werten eines anderen abhängen?
Ich würde gerne eine Art von Standard-Schnittstelle für alle Geräte pflegen, wenn möglich.
Es gibt einige Vorteile in der Lage zu sein.? behandeln Jedes Gerät ist gleich - zum Beispiel: varcast = (FormatedData) MyTestDevice; cast.RawData = .... Genauer gesagt, ich hätte gerne eine Liste - wie könnte ich dies tun, wenn eines der Geräte vom Standard 'FormattedData' Muster abweicht? –
user158485