Example #1
0
        public static StorageFile FinishRecording(RecordingScope recording, StorageFileFormat format, Action <float> progress)
        {
            if (recording.Busy)
            {
                throw new Exception("Recording is still ongoing. Stop the recording before storing it");
            }
            string filename = null;

            switch (format)
            {
            case StorageFileFormat.MATLAB:
                filename = StoreMatlab(recording, progress);
                break;

            case StorageFileFormat.CSV:
                filename = StoreCsv(recording, progress);
                break;

            default:
                break;
            }
            //and clean up
            recording.Dispose();

            return(new StorageFile()
            {
                info = new FileInfo(filename), format = format
            });
        }
Example #2
0
        public static void FinishRecordingAsync(RecordingScope r, StorageFileFormat format, Action <float> progress, Action <StorageFile> success, Action <Exception> failure)
        {
            //Check if recording is done (i.e. no data is gonna be added and we can store it safely)
            Thread frt = new Thread(FinishRecording);

            frt.Start(new object[] { r, format, progress, success, failure });
        }
Example #3
0
        private static double[] getTimeAxis(RecordingScope r, int offset = 0, int number = -1)
        {
            if (number < 1)
            {
                number = r.acqInfo.Count() - offset;
            }
            int totalNumberOfSamples = r.acqInfo.Skip(offset).Take(number).Select(x => x.samples).Sum();

            double[] timeAxis = new double[totalNumberOfSamples];

            int    sampleOffset = 0;
            UInt64 timeOrigin   = r.acqInfo[0].firstSampleTime;

            for (int l = offset; l < offset + number; l++)
            {
                RecordingScope.AcquisitionInfo inf = r.acqInfo[l];
                double timeZero = (inf.firstSampleTime - timeOrigin) / 1.0e9;
                for (int i = 0; i < inf.samples; i++)
                {
                    timeAxis[sampleOffset + i] = timeZero + inf.samplePeriod * i;
                }

                sampleOffset += inf.samples;
                if (sampleOffset >= totalNumberOfSamples)
                {
                    break;
                }
            }
            return(timeAxis);
        }
Example #4
0
        private static string StoreCsv(RecordingScope recording, Action <float> progress)
        {
            string       filename      = Utils.GetTempFileName(".csv");
            StreamWriter textWriter    = File.CreateText(filename);
            CsvWriter    csvFileWriter = new CsvWriter(textWriter);

            //Construct records
            List <RecordingRecord> records = new List <RecordingRecord>();
            int    nSamples   = 0;
            UInt64 timeOrigin = recording.acqInfo[0].firstSampleTime;

            for (int i = 0; i < recording.acqInfo.Count(); i++)
            {
                var acqInfo = recording.acqInfo[i];
                records.Add(new RecordingRecord((double)(acqInfo.firstSampleTime - timeOrigin) / (double)1.0e9));
                for (int j = 1; j < acqInfo.samples; j++)
                {
                    records.Add(new RecordingRecord());
                }
                nSamples += acqInfo.samples;
            }


            foreach (var pair in recording.channelBuffers)
            {
                object  data      = pair.Value.GetData(0, nSamples);
                float[] floatData = null;
                byte[]  byteData  = null;
                if (data.GetType() == typeof(float[]))
                {
                    floatData = (float[])data;
                }
                if (data.GetType() == typeof(byte[]))
                {
                    byteData = (byte[])data;
                }

                for (int i = 0; i < nSamples; i++)
                {
                    if (pair.Key == AnalogChannel.ChA && floatData.Length == nSamples)
                    {
                        records[i].chA = floatData[i];
                    }
                    else if (pair.Key == AnalogChannel.ChB && floatData.Length == nSamples)
                    {
                        records[i].chB = floatData[i];
                    }
                    else if (pair.Key == LogicAnalyserChannel.LA && byteData.Length == nSamples)
                    {
                        records[i].logicAnalyser = byteData[i];
                    }
                }
            }
            csvFileWriter.Configuration.RegisterClassMap <RecordingRecordMapper>();
            csvFileWriter.Configuration.HasExcelSeparator = true;
            csvFileWriter.WriteRecords(records);
            textWriter.Close();
            return(filename);
        }
Example #5
0
        private static void FinishRecording(object arg)
        {
            object[]             args      = arg as object[];
            RecordingScope       recording = (RecordingScope)args[0];
            StorageFileFormat    format    = (StorageFileFormat)args[1];
            Action <float>       progress  = args[2] as Action <float>;
            Action <StorageFile> success   = args[3] as Action <StorageFile>;
            Action <Exception>   failure   = args[4] as Action <Exception>;

            success(FinishRecording(recording, format, progress));
        }
Example #6
0
        public bool StartRecording(TimeSpan timeInterval, int acquisitionsPerInterval)
        {
            if (Recording != null)
            {
                Logger.Warn("Can't start recording since a previous recording still exists");
                return(false);
            }


            this.RecordingLastAcquisitionTimestamp = DateTime.Now;
            this.RecordingInterval = timeInterval;
            this.RecordingAcquisitionsPerInterval  = acquisitionsPerInterval;
            this.RecordingAcquisitionsThisInterval = 0;

            Recording = new RecordingScope();

            return(true);
        }
        public bool StartRecording(TimeSpan timeInterval, int acquisitionsPerInterval)
        {
            if (Recording != null)
            {
                Logger.Warn("Can't start recording since a previous recording still exists");
                return false;
            }

            this.RecordingLastAcquisitionTimestamp = DateTime.Now;
            this.RecordingInterval = timeInterval;
            this.RecordingAcquisitionsPerInterval = acquisitionsPerInterval;
            this.RecordingAcquisitionsThisInterval = 0;

            Recording = new RecordingScope();

            return true;
        }
Example #8
0
        private static string StoreMatlab(RecordingScope recording, Action <float> progress)
        {
            string           filename      = Utils.GetTempFileName(".mat");
            MatlabFileWriter matFileWriter = new MatlabFileWriter(filename);

            matFileWriter.Write("Description", "Scope data");

            Type dataType;
            MatLabFileArrayWriter arrayWriter;

            foreach (var pair in recording.channelBuffers)
            {
                dataType    = pair.Value.GetDataType();
                arrayWriter = matFileWriter.OpenArray(dataType, pair.Value.GetName(), true);
                int offset = 0;
                foreach (RecordingScope.AcquisitionInfo acqInfo in recording.acqInfo)
                {
                    arrayWriter.AddRow(pair.Value.GetData(offset, acqInfo.samples));
                    offset += acqInfo.samples;
                }
                arrayWriter.FinishArray(dataType);
                if (progress != null)
                {
                    progress(.3f);
                }
            }

            #if false
            //Store time axis
            dataType    = typeof(double);
            arrayWriter = matFileWriter.OpenArray(dataType, "time", true);
            for (int i = 0; i < recording.acqInfo.Count; i++)
            {
                arrayWriter.AddRow(getTimeAxis(recording, i, 1));
            }
            arrayWriter.FinishArray(dataType);
            #endif
            if (progress != null)
            {
                progress(.6f);
            }

            //Store acquisition times
            dataType    = typeof(double);
            arrayWriter = matFileWriter.OpenArray(dataType, "acquisitionStartTime", true);
            UInt64 timeOrigin = recording.acqInfo[0].firstSampleTime;
            arrayWriter.AddRow(recording.acqInfo.Select(x => (double)(x.firstSampleTime - timeOrigin) / (double)1.0e9).ToArray());
            arrayWriter.FinishArray(dataType);
            if (progress != null)
            {
                progress(.9f);
            }

            //Store settings
            //FIXME: a struct would be better than just dropping all the variables straight in the top level
            foreach (var kvp in recording.settings)
            {
                dataType    = typeof(double);
                arrayWriter = matFileWriter.OpenArray(dataType, kvp.Key, true);
                arrayWriter.AddRow(kvp.Value.ToArray());
                arrayWriter.FinishArray(dataType);
            }

            matFileWriter.Close();
            return(filename);
        }