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."); }
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); } }