Exemple #1
0
 public static void stop_execution(niFgen niFgenObj, niScope niScopeObj)
 {
     niFgenObj.AbortGeneration();
     Debug.WriteLine("[NIFGEN] Generation aborted.");
     niFgenObj.ClearArbMemory();
     Debug.WriteLine("[NIFGEN] Memory cleared.");
     niFgenObj.Dispose();
     Debug.WriteLine("[NIFGEN] Successfully disposed.");
     niScopeObj.Abort();
     Debug.WriteLine("[NISCOPE] Acquisition aborted.");
     niScopeObj.Dispose();
     Debug.WriteLine("[NISCOPE] Successfully disposed.");
 }
Exemple #2
0
        public void TXThread()
        {
            int waveform_handle;
            int max_waveform_size;
            int total_sent = 0;
            int write_cnt  = 0;

            byte[] nifgen_symbols = new byte[307200];
            int    last_symbol    = 0;

            ffmpegReader.send_webcam_data = webcam_bool;
            ffmpegReader.tx_byte_range    = byte_range;

            try
            {
                // T2.1 - Configure NIFGEN

                string NIFGEN_CHANNEL_NAME = (string)"0";
                double NIFGEN_sample_rate  = fs_tx;
                double NIFGEN_gain         = 1.0;
                double NIFGEN_offset       = 0.0;

                double[] waveform;
                double   t_end = 0;
                nifgen_initiated = false;
                waveform_handle  = 0;

                // max_waveform_size = (int)(ffmpegReader.BUFFER_SIZE * ((8 / M) * (fs_tx/fsym_tx)));

                niFgenObj = new niFgen("PXI1Slot8", true, true);
                niFgenObj.ConfigureChannels(NIFGEN_CHANNEL_NAME);
                // Allocate 1/2th of the memory to streaming waveform
                max_waveform_size = 1228800 * 2; // niFgenObj.GetInt32(niFgenProperties.MemorySize) / (8 * 2);

                int NIFGEN_OUTMODE = 1;          // arbitrary waveform
                niFgenObj.ConfigureOutputMode(NIFGEN_OUTMODE);
                niFgenObj.ConfigureSampleRate(NIFGEN_sample_rate);
                Debug.WriteLine("NIFGEN Configured");

                // T2.2 - Initialize parameters for reading from ffmpeg buffer
                byte[]   d;
                bool     read_zeros     = false;
                bool     old_read_zeros = true;
                bool     add_barker     = true;
                int      prev_write_end = 0;
                int      last_checked   = 0;
                int      n_cycle        = 1;
                double[] bark           = { 1, 1, 1, 1, 1, -1, -1, 1, 1, -1, 1, -1, 1 };
                // T2.3- Initialize Matlab instance
                mtx.create_matlab_instance("C:\\Users\\Gizem\\source\\repos\\NIMultiThreadConsole\\NIMultiThreadConsole");
                mtx.initalize_tx_params(M, fsym_tx, fs_tx, fc);

                Debug.WriteLine("Matlab Initialized");

                // var watch = System.Diagnostics.Stopwatch.StartNew();

                while (!(niscope_ended))
                {
                    if (write_cnt == 0)
                    {
                        niFgenObj.AllocateWaveform(NIFGEN_CHANNEL_NAME, max_waveform_size, out waveform_handle);
                        Debug.WriteLine("[NIFGEN] Waveform allocated");
                        Debug.WriteLine("[NIFGEN] Max Waveform size is {0}", max_waveform_size);
                        niFgenObj.SetInt32(niFgenProperties.StreamingWaveformHandle, waveform_handle);
                        niFgenObj.ConfigureArbWaveform(NIFGEN_CHANNEL_NAME, waveform_handle, NIFGEN_gain, NIFGEN_offset);
                        niFgenObj.ConfigureOutputEnabled(NIFGEN_CHANNEL_NAME, true);
                        nifgen_configured = true;
                        add_barker        = true;
                        // niFgenObj.WriteWaveform(NIFGEN_CHANNEL_NAME, waveform_handle, waveform.Length, waveform);
                        // total_sent += waveform.Length;
                        // Debug.WriteLine("[NIFGEN] First waveform written, length {0}.", waveform.Length);
                        // niFgenObj.InitiateGeneration();

                        // StreamingSpaceAvailableInWaveform = 1150325
                        // StreamingWaveformName = 1150326,
                        // Debug.WriteLine(niFgenObj.GetInt32(niFgenProperties.StreamingSpaceAvailableInWaveform, niFgenObj.GetString(niFgenProperties.StreamingWaveformName)));//1150325, niFgenObj.GetString(1150326)));
                    }

                    // T2.4 - Read from FFMPEG buffer
                    // watch.Restart();
                    old_read_zeros = read_zeros;
                    d = ffmpegReader.read_from_buffer(ref prev_write_end, ref last_checked, ref n_cycle, out read_zeros);

                    // watch.Stop();

                    if (read_zeros)//((d.Length == ffmpegReader.EMPTY_LENGTH) && !(ffmpegReader.EMPTY_LENGTH == last_checked - prev_write_end + 1))
                    {
                        waveform = new double[(int)(ffmpegReader.EMPTY_LENGTH * (8 / M) * (fs_tx / fsym_tx))];
                        if (!old_read_zeros)
                        {
                            Buffer.BlockCopy(bark, 0, waveform, (int)(fs_tx / fsym_tx) * sizeof(double), bark.Length * sizeof(double));
                        }
                        add_barker = true;

                        // read_zeros = true;
                    }
                    else
                    {
                        // Debug.WriteLine("read_from_buffer Execution Time: {0} ms = {1} ticks = {2} samples/tick", watch.ElapsedMilliseconds, watch.ElapsedTicks, (d.Length * (8 / M) * (fs_tx / fsym_tx)) / watch.ElapsedTicks);
                        // Debug.WriteLine("[ML] Bytes read from FFMPEG. Length = {0} bytes, = {1} samples", d.Length, d.Length * (8 / M) * (fs_tx / fsym_tx));
                        // T2.5 - Use Matlab script to generate TX data
                        // watch.Restart();
                        // double[] output_data;
                        waveform = mtx.generate_tx_data(d, add_barker, max_waveform_size, ref t_end);
                        // File.WriteAllLines("DEBUG_d", d.Select(x => x.ToString()));

                        Buffer.BlockCopy(d, 0, nifgen_symbols, last_symbol, d.Length);
                        last_symbol += d.Length;
                        // watch.Stop();
                        // Debug.WriteLine("generate_tx_data Execution Time: {0} ms = {1} ticks", watch.ElapsedMilliseconds, watch.ElapsedTicks);

                        // watch.Restart();

                        // watch.Stop();
                        // Debug.WriteLine("Convert array Execution Time: {0} ms = {1} ticks", watch.ElapsedMilliseconds, watch.ElapsedTicks);

                        // Debug.WriteLine("[ML] TX data generated");
                        read_zeros = false;
                        add_barker = false;
                    }

                    // T2.6 - Send that data to AWG with NIFGEN

                    if (total_sent + waveform.Length < max_waveform_size)
                    {
                        // During generation, the available space may be in multiple locations with, for example, part of the available space at the end of the streaming waveform and the rest at the beginning.
                        // In this situation, writing a block of waveform data the size of the total space available in the streaming waveform causes NI-FGEN to return an error, as NI-FGEN will not wrap the data from the end of the waveform to the beginning and cannot write data past the end of the waveform buffer.

                        // watch.Restart();
                        // niFgenObj.SetWaveformNextWritePosition(NIFGEN_CHANNEL_NAME, waveform_handle, 1, total_sent);
                        niFgenObj.WriteWaveform(NIFGEN_CHANNEL_NAME, waveform_handle, waveform.Length, waveform);
                        // watch.Stop();
                        // Debug.WriteLine("[NIFGEN] Waveform #{0} is written, length {1}, took {2} ms = {3} ticks", write_cnt, waveform.Length, watch.ElapsedMilliseconds, watch.ElapsedTicks);
                        // Debug.WriteLine("Write Execution Time: {0} ms = {1} ticks", watch.ElapsedMilliseconds, watch.ElapsedTicks);

                        total_sent += waveform.Length;
                    }
                    else
                    {
                        if ((nifgen_initiated == false))
                        {
                            nifgen_initiated = true;
                            niFgenObj.InitiateGeneration();
                            Debug.WriteLine("Initiated");
                        }

                        // Write to the beginning of the waveform
                        // relativeTo: 0-current, 1-beginning
                        // total_sent = 0;
                        // watch.Restart();
                        niFgenObj.SetWaveformNextWritePosition(NIFGEN_CHANNEL_NAME, waveform_handle, 1, 0);
                        niFgenObj.WriteWaveform(NIFGEN_CHANNEL_NAME, waveform_handle, waveform.Length, waveform);
                        // watch.Stop();
                        // Debug.WriteLine("Write buffer is full. Moving to the beginning.");
                        // Debug.WriteLine("Write Execution Time: {0} ms = {1} ticks", watch.ElapsedMilliseconds, watch.ElapsedTicks);

                        total_sent = waveform.Length;
                    }
                    if (read_zeros)
                    {
                        // Debug.WriteLine("[NIFGEN] Waveform #{0} 0s written, length {1}, took {2} ms = {3} ticks", write_cnt, waveform.Length, watch.ElapsedMilliseconds, watch.ElapsedTicks);
                        // Debug.WriteLine("[NIFGEN] Waveform #{0} 0s written, length {1}, total {2}", write_cnt, waveform.Length, total_sent);
                        Debug.WriteLine("[NIFGEN] 0s written {0}", waveform.Length);
                    }
                    else
                    {
                        // niFgenObj.InitiateGeneration();
                        // Debug.WriteLine("Initiated");
                        Debug.WriteLine("[NIFGEN] data written {0}", waveform.Length);
                        // Debug.WriteLine("[NIFGEN] Waveform #{0} is written, length {1}, total {2}", write_cnt, waveform.Length, total_sent);
                        // break;
                        // if (nifgen_initiated)
                        // {
                        //     Debug.WriteLine("[NIFGEN] Writing debugs");
                        //     File.WriteAllLines("DEBUG_d.txt", d.Select(x => x.ToString()));
                        //     File.WriteAllLines("DEBUG_waveform.txt", waveform.Select(x => x.ToString()));
                        //     throw new System.Exception("[NIFGEN] Wrote debugs");
                        // }
                    }

                    write_cnt += 1;
                }
                // Debug.WriteLine("[NIFGEN] The last waveform written #{0}", write_cnt);
                Debug.WriteLine("[NIFGEN] Writing debugs");
                // File.WriteAllLines("DEBUG_d.txt", d.Select(x => x.ToString()));
                string tx_file_name = "tx_debug_fc" + fc.ToString() + "_fsym_tx" + fsym_tx.ToString() + "_fs_tx" + fs_tx.ToString() + "_fs_rx" + fs_rx.ToString() + "_webcam" + (webcam_bool ? 1 : 0).ToString() + "_tx_range" + byte_range.ToString() + ".txt";
                int    tx_file_ctr  = 1;
                string tx_new_file_name;
                do
                {
                    tx_new_file_name = tx_file_ctr.ToString() + tx_file_name;
                    tx_file_ctr     += 1;
                } while (File.Exists(tx_new_file_name));

                // File.WriteAllLines(tx_new_file_name, waveform.Select(x => x.ToString()));
                throw new System.Exception("[NIFGEN] Exiting NIFGEN");
            }
            catch (Exception e)
            {
                Debug.WriteLine("[NIFGEN] The last waveform written #{0}", write_cnt);
                Debug.WriteLine("Exception caught {0}", e);
                niFgenObj.AbortGeneration();
                Debug.WriteLine("[NIFGEN] Generation aborted.");
                niFgenObj.ClearArbMemory();
                Debug.WriteLine("[NIFGEN] Memory cleared.");
                niFgenObj.Dispose();
                Debug.WriteLine("[NIFGEN] Successfully disposed.");
                // Write tx symbols

                /*
                 * string tx_file_name = "tx_symbols_fc" + fc.ToString() + "_fsym_tx" + fsym_tx.ToString() + "_fs_tx" + fs_tx.ToString() + "_fs_rx" + fs_rx.ToString() + "_webcam" + (webcam_bool ? 1 : 0).ToString() + "_tx_range" + byte_range.ToString() + ".txt";
                 * int tx_file_ctr = 1;
                 * string tx_new_file_name;
                 * do
                 * {
                 *  tx_new_file_name = tx_file_ctr.ToString() + tx_file_name;
                 *  tx_file_ctr += 1;
                 * } while (File.Exists(tx_new_file_name));
                 *
                 * File.WriteAllLines(tx_new_file_name, nifgen_symbols.Select(x => x.ToString()));
                 * */
                // stop_execution(niFgenObj, niMT2.niScopeObj);
            }
        }