Пример #1
0
        public void MoveFilter(FilterBase filter, CMCustomUDPData.DataKey key, int direction)
        {
            int index = filters[(int)key].IndexOf(filter);

            int newIndex = Math.Min(filters[(int)key].Count - 1, Math.Max(0, index + direction));

            filters[(int)key].RemoveAt(index);
            filters[(int)key].Insert(newIndex, filter);
        }
Пример #2
0
        public CMChannelMap(Type _type, CMCustomUDPData.DataKey _dataKey, string _channel, int _offset, float _scale)
        {
            type           = _type;
            channel        = _channel;
            offset         = _offset;
            scale          = _scale;
            dataKey        = _dataKey;
            getBytesMethod = typeof(BitConverter).GetMethod("GetBytes", new[] { type });

            fieldInfo = typeof(CMCustomUDPData).GetField(channel);
        }
Пример #3
0
        public FilterBase AddFilter(FilterType filterType, CMCustomUDPData.DataKey key, bool updateUI = false)
        {
            List <FilterBase> filterList = filters[(int)key];

            if (filterList == null)
            {
                filterList = filters[(int)key] = new List <FilterBase>();
            }

            FilterBase newFilter = null;

            switch (filterType)
            {
            case FilterType.Smooth:
            {
                NestedSmoothFilter newSmoothFilter = new NestedSmoothFilter();
                newSmoothFilter.SetParameters(1, 3, 0.5f);

                filterList.Add(newSmoothFilter);
                newFilter = newSmoothFilter;

                break;
            }

            case FilterType.Kalman:
            {
                KalmanNoiseFilter newKalmanFilter = new KalmanNoiseFilter();
                newKalmanFilter.SetParameters(1, 1, 0.02f, 1, 0.02f, 0.0f);

                filterList.Add(newKalmanFilter);
                newFilter = newKalmanFilter;

                break;
            }

            case FilterType.KalmanVelocity:
            {
                KalmanVelocityNoiseFilter newKalmanFilter = new KalmanVelocityNoiseFilter();
                newKalmanFilter.SetParameters(1, 1, 0.02f, 1, 0.02f, 0.0f);

                filterList.Add(newKalmanFilter);
                newFilter = newKalmanFilter;

                break;
            }

            case FilterType.SavitzkyGolay:
            {
                break;
            }

            case FilterType.FIR:
            {
                break;
            }

            case FilterType.Median:
            {
                MedianFilterWrapper newFilterW = new MedianFilterWrapper();
                newFilterW.SetParameters(9);

                filterList.Add(newFilterW);
                newFilter = newFilterW;

                break;
            }
            }

            if (updateUI && FilterUI.Instance != null)
            {
                FilterUI.Instance.InitChartForKey(key);
            }



            return(newFilter);
        }
Пример #4
0
 public void DeleteFilter(FilterBase filter, CMCustomUDPData.DataKey key)
 {
     filters[(int)key].Remove(filter);
 }
Пример #5
0
        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();
        }
Пример #6
0
        public void InitChartForKey(CMCustomUDPData.DataKey dataKey)
        {
            filterKey = dataKey;

            filterChart.Invoke((Action) delegate
            {
                var chart = filterChart.ChartAreas[0];

                chart.AxisX.Minimum  = 0;
                chart.AxisX.Maximum  = 1;
                chart.AxisY.Minimum  = -chartSize;
                chart.AxisY.Maximum  = chartSize;
                chart.AxisX.Interval = 0;
                chart.AxisY.Interval = 0;
            });

            flowLayoutFilters.Invoke((Action) delegate
            {
                flowLayoutFilters.Controls.Clear();

                List <FilterBase> filters = FilterModuleCustom.Instance.filters[(int)filterKey];

                if (filters != null)
                {
                    foreach (FilterBase filter in filters)
                    {
                        if (filter is NestedSmoothFilter)
                        {
                            SmoothFilterControl newControl = new SmoothFilterControl();
                            newControl.SetFilter((NestedSmoothFilter)filter);

                            flowLayoutFilters.Controls.Add(newControl);
                        }
                        else
                        if (filter is KalmanNoiseFilter)
                        {
                            KalmanFilterControl newControl = new KalmanFilterControl();
                            newControl.SetFilter((KalmanNoiseFilter)filter);

                            flowLayoutFilters.Controls.Add(newControl);
                        }
                        else
                        if (filter is MedianFilterWrapper)
                        {
                            MedianFilterControl newControl = new MedianFilterControl();
                            newControl.SetFilter((MedianFilterWrapper)filter);

                            flowLayoutFilters.Controls.Add(newControl);
                        }
                        else
                        if (filter is KalmanVelocityNoiseFilter)
                        {
                            KalmanVelocityFilterControl newControl = new KalmanVelocityFilterControl();
                            newControl.SetFilter((KalmanVelocityNoiseFilter)filter);

                            flowLayoutFilters.Controls.Add(newControl);
                        }
                    }
                }

                Button addButton = new Button();
                addButton.Text   = @"ADD FILTER";
                addButton.Click += new System.EventHandler(this.AddButtonClick);

                flowLayoutFilters.Controls.Add(addButton);
            });
        }