2013-06-11 1 views
0

USB를 통해 연결된 임베디드 장치에서 DataPackets을 수집하는 Singleton 클래스 인 DataPacketAggregator가 있습니다. 패킷은 항상 버스트로 수신됩니다. 모든 DataPacket은 센서 식별과 소스 주소 (ZigBee 통신에서 제공)를 포함합니다. 있는 TableView에 제공 한 모든 값이 ObservableCollection에 내부에 이미 있기 때문에 Centralized Data Aggregator 및 WPF Toolkit 라인 시리즈를 사용하기위한 최상의 구현

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; 
    } 
    ... 
} 

이 그래서 UI가 어떤에 대한 통지 :

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

게이터 클래스는이 기본 구현을 제공합니다 : 기본적으로 그것은 DataPacket 클래스가 제공하는 것입니다 DataPacketAggregator에서 계속 변경됩니다. 이미 수집 된 데이터의 표보기를 제공하지만 모든 센서가 표시됩니다. 지금은 DataPacket을 Key SourceAdress가있는 Dictionary에 저장하고 DataPacket에 고유 한 데이터가 들어있는 DataPacket-Value 값을 받았습니다.

이제 사용자 인터페이스의 ComboBox에서 선택된 선택된 SourceAddress와 연결된 각 센서 ID에 대해 한 줄의 시리즈 차트를 만들려고합니다. LineSeries는 독립 축에 타임 스탬프를위한 DataPacket 데이터를 표시하고 종속 축에 값을 표시합니다. 이 ComboBox의 ItemsSource 속성은 데이터를 제공하는 Dictionary의 사용 가능한 키에 바인딩됩니다. 요점은 모든 소스가 동일한 양의 센서를 연결해야하는 것은 아니며 센서 양에 따라 LineSeries Objects를 동적으로 다시 만들고 싶다는 것입니다.

  1. 둥지 특정 센서에 속하는 값에 빠르게 액세스하는 것이 기존의 사전 안에 다른 사전 :

    는 I 가능할 수있는 여러 구현에 대해 생각했다. 문제는 전체 데이터 콜렉션에 액세스하려는 경우 데이터를 "병합"해야한다는 것입니다.
  2. LINQ-Query와 함께 그룹화를 적용하여 특정 센서와 관련된 모든 데이터를 가져옵니다. 나는이 해결책을 선호 하겠지만 여기에는 두 가지 점이있다. 첫 번째 : 주요 성능 손실없이 UI를 업데이트하는 방법 (모든 쿼리를 반복해서 실행) UI에 알리는 방법? 관련 검색어에 변경 사항이있는 경우 일반적으로 UI에 알리고 싶기 때문에 일반적으로이를 감지 할 수는 없습니다. 그래서 모든 DataPacket (심지어 UI 드로잉과 관련 없음)이 추가되는 즉시 UI 전체를 업데이트하고 다시 그려야 할 것입니다.
  3. DataAggreagtor 내에서 현재 관련 SourceAddress로 설정할 수있는 추가 속성 추가하기 (또한 바인딩을 통해). SourceAddress 만있는 ObservableCollection을 반환 할 수 있으며 전체 데이터의 하위 집합에서만 쿼리 할 수 ​​있습니다. 또한 표시 할 SourceAddress를 알 수 있고 다시 쿼리하지 않고 컬렉션을 업데이트 할 수 있기 때문에이 관찰 가능한 컬렉션 만 업데이트 할 수 있습니다. 이것의 주요 단점은 항상 단일 소스에서 데이터를 표시하는 것으로 제한된다는 것입니다.

나는이 문제점에 대한 최선의 해결책이 무엇인지에 대해 확실치 않으며 WPF Toolkit Charting Component에 대해서는 익숙하지 않습니다.

답변

0

Finaly 나는 ComboBox에 바인딩 된 다른 Property에 의해 트리거되는 Collection으로 구현했습니다. 업데이트는 SourceAddress가 현재 표시된 것과 일치 할 때 트리거됩니다. 마침내 이와 같이 작동하지만 주요 제한 사항은 물론 단일 소스 만 볼 수있게하는 것입니다.