0

USB 経由で接続された組み込みデバイスから DataPackets を収集するシングルトン クラス DataPacketAggregator があります。パケットは常にバーストで受信されます。すべての DataPacket には、Sensor Identification と Source Address (ZigBee Communication から来る) が含まれています。基本的に、それは DataPacket クラスが提供するものです:

public class DataPacket
{
    public String SourceAddress {get; set;}
    public Byte SensorID {get; set;}
    public DateTime Timestamp {get; set;}
    public Int16 Value {get; set;}
}

Aggregator クラスは、次の基本的な実装を提供します。

public class DataPacketAggregator: INotifyPropertyChanged
{
    Dictionary<String, ObservableCollection<DataPacket>> _dpkts; //Container

    //Method for getting an observable collection containing only values belonging to
    //SourceAddress
    public ObservableCollection<DataPacket> GetDataBySource(String Source)
    {
        ObservableCollection<DataPacket> dpkts;
        this._dpkts.TryGetValue(Source, out dpkts);
        return dpkts;
    }
    ...
 }

したがって、TableView に提供されるすべての値は既に ObservableCollection 内にあるため、UI は DataPacketAggregator で行われている変更について通知されます。収集されたデータのテーブル ビューを既に提供していますが、そこにはすべてのセンサーが表示されています。現時点では、キー SourceAdress と、受信した DataPacket に固有のデータを含む DataPacket-Object の値を使用して、DataPacket をディクショナリに格納しています。

ここでやりたいことは、ユーザー インターフェースの ComboBox から選択された SourceAddress に関連付けられた各センサー ID に対して 1 行の系列グラフを作成することです。LineSeries は、独立軸にタイムスタンプの DataPacket データを表示し、従属軸に値を表示します。この ComboBox の ItemsSource プロパティは、データを提供するディクショナリで使用可能なキーにバインドされます。ポイントは、すべてのソースに同じ量のセンサーが関連付けられている必要はなく、センサーの量に応じて LineSeries オブジェクトを動的に再作成したいということです。

可能ないくつかの実装について考えました。

  1. 特定のセンサーに属する値にすばやくアクセスできるように、既存のディクショナリ内に別のディクショナリをネストします。問題は、データの完全なコレクションにアクセスしたい場合、データを再度「マージ」する必要があることです。
  2. 特定のセンサーに関連付けられたすべてのデータを取得するには、LINQ クエリを使用してグループ化を適用します。私はこの解決策を好みますが、ここには2つのポイントがあります。最初:パフォーマンスを大幅に低下させずにUIを更新する方法(すべてのクエリを何度も実行する)? UI に通知する方法 通常、関連するクエリに変更があった場合に UI に通知したいだけですが、それを単純に検出することはできません。そのため、DataPacket が追加されるとすぐに UI 全体の更新と再描画を行う必要があります (UI 描画に関係なくても)。
  3. 現在関連する SourceAddress に設定できる DataAggreagtor 内に追加のプロパティを追加します (これもバインディングを介して)。SourceAddress のみを持つ ObservableCollection を返すことができ、データ全体のサブセットに対してのみクエリを実行できます。さらに、この観察可能なコレクションだけを更新することも可能です。これは、どの SourceAddress を表示するかがわかっているため、再クエリを実行せずにコレクションを更新できるからです。これの主な欠点は、常に単一のソースからのデータを表示するように制限されることです。

現時点では、この問題に対する最善の解決策は何か確信が持てず、WPF Toolkit Charting Component についてもあまり詳しくありません。

4

1 に答える 1

0

最後に、ComboBox にバインドされた別のプロパティによってトリガーされるコレクションとして実装しました。Update は、SourceAddress が現在表示されているアドレスに対応するときにトリガーされます。最終的にはこのように機能しますが、主な制限はもちろん、単一のソースしか表示できないことです。

于 2013-06-12T16:33:51.893 に答える