public void RefreshChart(object sender, EventArgs e) { if (filterKey == CMCustomUDPData.DataKey.Max) { return; } filterChart.Invoke((Action) delegate { var chart = filterChart.ChartAreas[0]; filteredSeries.Points.Clear(); rawSeries.Points.Clear(); List <CMCustomUDPData> filteredData; FilterModuleCustom.Instance.GetFilteredHistory(out filteredData); List <CMCustomUDPData> rawData; FilterModuleCustom.Instance.GetRawHistory(out rawData); chart.AxisX.Maximum = filteredData.Count(); for (int i = 0; i < filteredData.Count; ++i) { CMCustomUDPData data = filteredData[i]; filteredSeries.Points.AddXY(i, data.GetValue(filterKey)); } for (int i = 0; i < rawData.Count; ++i) { CMCustomUDPData data = rawData[i]; rawSeries.Points.AddXY(i, data.GetValue(filterKey)); } }); }
public void Filter(CMCustomUDPData dataIn, ref CMCustomUDPData dataOut, int keyMask = int.MaxValue, bool newHistory = true) { if (filters == null) { return; } mutex.WaitOne(); CMCustomUDPData newRawData; CMCustomUDPData newFiltered; if (newHistory == true) { dataOut.Copy(dataIn); //copy to raw history newRawData = new CMCustomUDPData(); newRawData.Copy(dataIn); rawData.Add(newRawData); if (rawData.Count > maxHistorySamples) { rawData.RemoveAt(0); } //add new filtered history newFiltered = new CMCustomUDPData(); newFiltered.Copy(dataIn); filteredData.Add(newFiltered); if (filteredData.Count > maxHistorySamples) { filteredData.RemoveAt(0); } } else { newFiltered = filteredData[filteredData.Count - 1]; newRawData = rawData[rawData.Count - 1]; } //do filter lists for each key if it exists for (int i = 0; i < filters.Length; ++i) { CMCustomUDPData.DataKey key = (CMCustomUDPData.DataKey)i; List <FilterBase> filterList = filters[i]; if (!dataIn.IsValid(key)) { continue; } object value = dataIn.GetValue(key); if (filterList == null || filterList.Count == 0 || !dataIn.IsFloat(key)) { newFiltered.SetValue(key, value); newRawData.SetValue(key, value); continue; } //ignore filter if not in keyMask if (((1 << i) & keyMask) == 0) { continue; } //get float val float floatVal = (float)value; //do filters for key foreach (FilterBase filter in filterList) { floatVal = filter.Filter(floatVal); } //filtered newFiltered.SetValue(key, floatVal); dataOut.SetValue(key, floatVal); } mutex.ReleaseMutex(); }