Example #1
0
        private GW_DataFile Concat_XmlDataFiles(GW_DataFile[] oDataFiles)
        {
            if (oDataFiles == null)
            {
                return(null);
            }

            //Concatened data file creation
            oConcatData = new GW_DataFile();
            oConcatData.DataSamplingMode = SamplingMode.MultipleRates;

            //Complete channel list creation
            foreach (GW_DataFile oFile in oDataFiles)
            {
                foreach (GW_DataChannel oChan in oFile.Channels)
                {
                    //Create the data channel into the concatenated data file if it does not exist already
                    if (!(oConcatData.DataChannelExists(oChan.Name)))
                    {
                        GW_DataChannel oConcatChan = new GW_DataChannel(oChan.Name, SamplingMode.MultipleRates);

                        //Copy XML data channel properties
                        oConcatChan.Description   = oChan.Description;
                        oConcatChan.Unit          = oChan.Unit;
                        oConcatChan.GraphicFormat = oChan.GraphicFormat.Get_Clone();

                        foreach (GraphReferenceLine oRefLine in oChan.ChannelReferenceLines)
                        {
                            oConcatChan.ChannelReferenceLines.Add(oRefLine.Get_Clone());
                        }

                        oConcatData.Channels.Add(oConcatChan);
                    }
                }
            }

            //Append current file channel samples to the concatenated data file channel
            foreach (GW_DataChannel oConcatChan in oConcatData.Channels)
            {
                double Concat_T = 0;

                foreach (GW_DataFile oFile in oDataFiles)
                {
                    GW_DataChannel oDataChan = oFile.Get_DataChannel(oConcatChan.Name);

                    if (!(oDataChan == null))
                    {
                        if (oDataChan.Samples.Count > 1)
                        {
                            for (int iSample = 0; iSample < oDataChan.Samples.Count; iSample++)
                            {
                                if (oConcatChan.Samples.Count > 0)
                                {
                                    if (iSample > 0)
                                    {
                                        Concat_T += (oDataChan.Samples[iSample].SampleTime - oDataChan.Samples[iSample - 1].SampleTime);
                                    }
                                    else
                                    {
                                        Concat_T += (oDataChan.Samples[1].SampleTime - oDataChan.Samples[0].SampleTime);
                                    }
                                }

                                SerieSample sNewSample = new SerieSample();
                                sNewSample.SampleTime  = Concat_T;
                                sNewSample.SampleValue = oDataChan.Samples[iSample].SampleValue;

                                oConcatChan.Samples.Add(sNewSample);

                                if (oConcatChan.Samples.Count == 1)
                                {
                                    oConcatChan.Min = oDataChan.Samples[iSample].SampleValue;
                                    oConcatChan.Max = oDataChan.Samples[iSample].SampleValue;
                                }
                                else
                                {
                                    if (oDataChan.Samples[iSample].SampleValue < oConcatChan.Min)
                                    {
                                        oConcatChan.Min = oDataChan.Samples[iSample].SampleValue;
                                    }
                                    if (oDataChan.Samples[iSample].SampleValue > oConcatChan.Max)
                                    {
                                        oConcatChan.Max = oDataChan.Samples[iSample].SampleValue;
                                    }
                                }
                            }
                        }
                    }
                }
            }

            //Virtual channels computations
            if (!(VCLibraries == null))
            {
                VCLibraries.InitLibrariesComputation(); //Virtual channels libraries initialization

                foreach (CS_VirtualChannel oVirtChan in VCLibraries.ChannelsComputationList)
                {
                    bool           bComputeVirtual = true;
                    GW_DataChannel oCarrierChannel = null;

                    foreach (string ChanVar in oVirtChan.ChannelVariables)
                    {
                        GW_DataChannel oDataChan = oConcatData.Get_DataChannel(ChanVar);

                        if (!(oDataChan == null))
                        {
                            if (oCarrierChannel == null)
                            {
                                oCarrierChannel = oDataChan;
                            }
                            else
                            {
                                if (oDataChan.Samples.Count > oCarrierChannel.Samples.Count)
                                {
                                    oCarrierChannel = oDataChan;
                                }
                            }
                        }
                        else
                        {
                            bComputeVirtual = false;
                            break;
                        }
                    }

                    if (oCarrierChannel != null && bComputeVirtual)
                    {
                        GW_DataChannel oVirtualData = new GW_DataChannel(oVirtChan.Name, SamplingMode.MultipleRates);

                        oVirtualData.Unit                  = oVirtChan.Unit;
                        oVirtualData.Description           = oVirtChan.Comment;
                        oVirtualData.GraphicFormat         = CANStreamTools.Convert_CSSignalFormatToSerieValueFormat(oVirtChan.ValueFormat);
                        oVirtualData.ChannelReferenceLines = CANStreamTools.Convert_CSAlarmsToSerieReferenceLines(oVirtChan.Alarms);

                        foreach (SerieSample sCarrierSample in oCarrierChannel.Samples)
                        {
                            SerieSample sVirtSample = new SerieSample();

                            sVirtSample.SampleTime = sCarrierSample.SampleTime;

                            foreach (string ChanVar in oVirtChan.ChannelVariables)
                            {
                                VCLibraries.UpDateVariableElement(ChanVar, oConcatData.Get_ChannelValueAtTime(ChanVar, sVirtSample.SampleTime));
                            }

                            oVirtChan.ComputeChannelValue();

                            if (oVirtChan.bComputed && oVirtChan.bNewValue)
                            {
                                sVirtSample.SampleValue = oVirtChan.Value;
                                oVirtualData.Samples.Add(sVirtSample);

                                if (oVirtualData.Samples.Count == 1)
                                {
                                    oVirtualData.Min = sVirtSample.SampleValue;
                                    oVirtualData.Max = sVirtSample.SampleValue;
                                }
                                else
                                {
                                    if (sVirtSample.SampleValue < oVirtualData.Min)
                                    {
                                        oVirtualData.Min = sVirtSample.SampleValue;
                                    }
                                    if (sVirtSample.SampleValue > oVirtualData.Max)
                                    {
                                        oVirtualData.Max = sVirtSample.SampleValue;
                                    }
                                }
                            }
                        }

                        if (oVirtualData.Samples.Count > 1)
                        {
                            oConcatData.Channels.Add(oVirtualData);
                        }
                    }
                }
            }

            oDataFiles = null; //Free up memory
            return(oConcatData);
        }
Example #2
0
        /// <summary>
        /// Converts the decoded PCAN trace file into a XML data file
        /// </summary>
        /// <param name="OutputFolder">Output file folder</param>
        /// <returns>Converion result (True: OK / False: Error)</returns>
        private bool WriteXmlRecordData(string OutputFolder)
        {
            if (Channels.Count == 0)
            {
                return(false);
            }

            GW_DataFile oDataFile = new GW_DataFile();

            oDataFile.DataSamplingMode = SamplingMode.MultipleRates;

            //Set data file properties
            oDataFile.DataStartTime = this.AbsDTStartTime;
            oDataFile.UserComment   = "Data file created "
                                      + DateTime.Now.ToShortDateString()
                                      + " "
                                      + DateTime.Now.ToShortTimeString();

            //Data file custom properties
            GW_XmlDataFileCustomProperty oCustProp;

            oCustProp               = new GW_XmlDataFileCustomProperty();
            oCustProp.Name          = "Base PCAN Trc file";
            oCustProp.PropertyValue = Path.GetFileName(this.BaseTrcFilePath);
            oDataFile.XmlDataFileCustomProperties.Add(oCustProp);

            oCustProp               = new GW_XmlDataFileCustomProperty();
            oCustProp.Name          = "Data decode CAN Configuration";
            oCustProp.PropertyValue = Path.GetFileName(this.oCanConfig.ConfigFilePath);
            oDataFile.XmlDataFileCustomProperties.Add(oCustProp);

            for (int i = 0; i < this.VCLibraries.Libraries.Count; i++)
            {
                oCustProp               = new GW_XmlDataFileCustomProperty();
                oCustProp.Name          = "Data decode virtual channels library #" + (i + 1).ToString();
                oCustProp.PropertyValue = Path.GetFileName(VCLibraries.Libraries[i].Name);
                oDataFile.XmlDataFileCustomProperties.Add(oCustProp);
            }

            //Set data channels
            foreach (RecordDataChannel oRecChan in Channels)
            {
                GW_DataChannel oDataChan = new GW_DataChannel(oRecChan.Name, SamplingMode.MultipleRates);

                //Channel properties
                CANParameter oCANSig = this.oCanConfig.GetCANParameter(oRecChan.Name);

                if (!(oCANSig == null)) //A CAN parameter has been found, GW_DataChannel properties will be filled using properties of the CAN Parameter
                {
                    oDataChan.Description           = oCANSig.Comment;
                    oDataChan.Unit                  = oCANSig.Unit;
                    oDataChan.GraphicFormat         = CANStreamTools.Convert_CSSignalFormatToSerieValueFormat(oCANSig.ValueFormat);
                    oDataChan.ChannelReferenceLines = CANStreamTools.Convert_CSAlarmsToSerieReferenceLines(oCANSig.Alarms);
                }
                else //No CAN parameter found, search among virtual channels
                {
                    CS_VirtualChannel oVirtual = null;

                    foreach (CS_VirtualChannelsLibrary oVirtLib in this.VCLibraries.Libraries)
                    {
                        oVirtual = oVirtLib.GetVirtualChannel(oRecChan.Name);

                        if (!(oVirtual == null))
                        {
                            break;
                        }
                    }

                    if (!(oVirtual == null)) //A virtual channel has been found, GW_DataChannel properties will be filled using properties of the virtual channel
                    {
                        oDataChan.Description           = oVirtual.Comment;
                        oDataChan.Unit                  = oVirtual.Unit;
                        oDataChan.GraphicFormat         = CANStreamTools.Convert_CSSignalFormatToSerieValueFormat(oVirtual.ValueFormat);
                        oDataChan.ChannelReferenceLines = CANStreamTools.Convert_CSAlarmsToSerieReferenceLines(oVirtual.Alarms);
                    }
                    else //No virtual channel found, GW_DataChannel will keeps its default properties values
                    {
                        //Nothing to do
                    }
                }

                //Channel samples value
                foreach (RecordDataSample oRecSample in oRecChan.Samples)
                {
                    SerieSample sDataSample = new SerieSample();

                    sDataSample.SampleTime  = oRecSample.TimeStamp / 1000;
                    sDataSample.SampleValue = oRecSample.SampleValue;

                    oDataChan.Samples.Add(sDataSample);
                }

                oDataFile.Channels.Add(oDataChan);
            }


            string OutFilePath = BuildOutputFilePtah(OutputFolder, RecordConversionFormat.Xml);

            oDataFile.Write_XmlDataFile(OutFilePath);

            return(true);
        }