public byte[] ToByteArray()
        {
            GenericProviderData packet = this;
            int num = Marshal.SizeOf <GenericProviderData>(packet);

            byte[] array  = new byte[num];
            IntPtr intPtr = Marshal.AllocHGlobal(num);

            Marshal.StructureToPtr <GenericProviderData>(packet, intPtr, false);
            Marshal.Copy(intPtr, array, 0, num);
            Marshal.FreeHGlobal(intPtr);
            return(array);
        }
        public void Copy(GenericProviderData other)
        {
            version = other.version;

            yaw   = other.yaw;
            pitch = other.pitch;
            roll  = other.roll;

            position_x = other.position_x;
            position_y = other.position_y;
            position_z = other.position_z;

            local_velocity_x = other.local_velocity_x;
            local_velocity_y = other.local_velocity_y;
            local_velocity_z = other.local_velocity_z;

            gforce_lateral      = other.gforce_lateral;
            gforce_longitudinal = other.gforce_longitudinal;
            gforce_vertical     = other.gforce_vertical;

            engine_rpm = other.engine_rpm;
        }
        public void Filter(GenericProviderData dataIn, ref GenericProviderData dataOut, int keyMask = int.MaxValue, bool newHistory = true)
        {
            mutex.WaitOne();

            GenericProviderData newRawData;
            GenericProviderData newFiltered;

            if (newHistory == true)
            {
                dataOut.Copy(dataIn);

                //copy to raw history
                newRawData = new GenericProviderData(dataIn.version);
                newRawData.Copy(dataIn);
                rawData.Add(newRawData);
                if (rawData.Count > maxHistorySamples)
                {
                    rawData.RemoveAt(0);
                }

                //add new filtered history
                newFiltered = new GenericProviderData(dataIn.version);
                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)
            {
                List <FilterBase> filterList = filters[i];

                float value = dataIn.data[i];
                if (filterList == null || filterList.Count == 0)
                {
                    newFiltered.data[i] = value;
                    newRawData.data[i]  = value;
                    continue;
                }

                //ignore filter if not in keyMask
                if (((1 << i) & keyMask) == 0)
                {
                    continue;
                }

                //do filters for key
                foreach (FilterBase filter in filterList)
                {
                    value = filter.Filter(value);
                }

                //filtered
                newFiltered.data[i] = dataOut.data[i] = value;
            }

            mutex.ReleaseMutex();
        }
        public int GetSize()
        {
            GenericProviderData packet = this;

            return(Marshal.SizeOf <GenericProviderData>(packet));
        }