Scope
OutputsDAQmx.cpp
1 #include "stdafx.h"
2 #include "OutputsDAQmx.h"
3 #include "parameters/IO.h"
4 #include "parameters/Scope.h"
5 #include "ScopeDatatypes.h"
6 #include "helpers/ScopeException.h"
7 
8 namespace scope {
9 
10 OutputsDAQmx::OutputsDAQmx(const uint32_t& _area, const parameters::OutputsDAQmx& _outputparams, const parameters::Scope& _params)
11  : Outputs(_area) {
12 
13  int32_t samplingtype = (_params.requested_mode()==DaqModeHelper::continuous)?DAQmx_Val_ContSamps:DAQmx_Val_FiniteSamps;
14 
15  std::wstring commontrig = _params.commontrigger();
16 
17  task.CreateTask();
19  , L"XYZPOut"
20  , -_outputparams.range()
21  , _outputparams.range());
22 
23  // Calculate pixelrate and number of pixels to generate
24  double pixelrate = 1/(_params.areas[area]->daq.pixeltime()*1E-6);
25  int32_t pixelsperchan = _params.areas[area]->Currentframe().TotalPixels();
26 
27 
28  if ( _params.requested_mode() == DaqModeHelper::nframes )
29  //DBOUT(L" _params.requested_mode() == DaqModeHelper::nframes");
30  pixelsperchan = _params.areas[area]->Currentframe().TotalPixels() * _params.areas[area]->daq.requested_frames() * _params.areas[ThisAreaOrMasterArea(area)]->daq.averages();
31 
32  // Configure timing (if using ReferenceClock timing ClockString gives "")
34  , pixelrate
35  , pixelsperchan
36  , samplingtype);
37  if ( DaqTimingHelper::Mode::ReferenceClock ==_outputparams.daq_timing() )
38  //DBOUT(L"DaqTimingHelper::Mode::ReferenceClock ==_outputparams.daq_timing()");
39  task.ConfigureReferenceClock(_outputparams.referenceclocksource(), _outputparams.referenceclockrate());
40 
41  task.ConfigureBuffer( _params.areas[area]->Currentframe().TotalPixels());
42 
43  // Regenerate frame samples if we are in nframes mode
44  if ( _params.requested_mode() == DaqModeHelper::nframes )
45  //DBOUT(L"_params.requested_mode() == DaqModeHelper::nframes");
46  task.SetRegeneration(true);
47 
48  // Export the pixel/sample clock
49  task.ExportSignal(DAQmx_Val_SampleClock, _outputparams.exportpixelclockterminal());
50 
51  // All (exept the first aouttask) wait for the first tasks start trigger
52  if ( area != 0 ) {
53  //DBOUT(L"area != 0 ");
54  task.ConfigureDigStartTrigger(commontrig, DAQmx_Val_Rising);
55  }
56  // If T-Series triggered first output task waits for external trigger (and all other tasks waiting for first output task)
57  else if ( _params.timeseries.triggered() )
58  //DBOUT(L"_params.timeseries.triggered()");
59  task.ConfigureDigStartTrigger(_params.timeseries.triggerchannel(), DAQmx_Val_Rising);
60 }
61 
63  Stop();
64  task.Clear();
65 }
66 
68  task.Start();
69 }
70 
72  writeabort = true;
73  task.Stop();
74 }
75 
76 int32_t OutputsDAQmx::Write(const std::vector<int16_t>& _xyzp, const uint32_t& _blocks) {
77  int32_t written = 0;
78  assert(_blocks!=0);
79  int32_t sizeperchannel = static_cast<int32_t>(_xyzp.size() / 4); // number of samples in each output channel
80  int32_t blocksize = sizeperchannel/_blocks;
81  int32_t lastblocksize = blocksize + (sizeperchannel - blocksize*_blocks); // adjust size of last block if sizeperchannel is not a multiple of blocksize
82  DBOUT(L"OutputsDAQmx::Write blocksize " << blocksize << L" last block " << lastblocksize);
83  DBOUT(L"OutputsDAQmx::Write blocks " << _blocks << L" sizeperchannel " << sizeperchannel << L" totblocksize " << (_blocks-1)*blocksize+lastblocksize);
84  try {
85  for ( uint32_t b = 0 ; b < _blocks ; b++ ) {
86  if ( writeabort == true ) {
87  DBOUT(L"OutputsDAQmx::Write writeabort");
88  break;
89  }
90  DBOUT(L"OutputsDAQmx::Write block " << b);
91  task.SetWriteOffset(b*blocksize); // set write offset in the device buffer
92  written += task.WriteAnalogI16((_xyzp.data()+4*b*blocksize) // set offset in the data vector
93  , ((b==_blocks-1)?lastblocksize:blocksize), false, 2, DAQmx_Val_GroupByScanNumber); // data layout is by sample
94  }
95  } catch (...) { ScopeExceptionHandler(__FUNCTION__); }
96  writeabort = false;
97  return written;
98 }
99 
102  try {
103  task.CreateTask();
105  , L"XYZPOut"
106  , -_params.range()
107  , _params.range());
108  task.WriteAnalogI16(std::make_shared<std::vector<int16_t>>(4,0)->data(), 1, true);
109  task.WaitUntilDone(500);
110  task.Clear();
111  } catch (...) { ScopeExceptionHandler(__FUNCTION__); }
112 }
113 
114 }
Parameters for x/y-scanner/fast z/Pockels signal generation with NI-DAQmx where all output channels (...
Definition: IO.h:552
ScopeString commontrigger
The trigger channel which is the internal common master trigger for all devices.
Definition: Scope.h:262
void SetRegeneration(const bool &_regenerate)
Sets the mode of sample regeneration.
Definition: DAQmxTask.cpp:177
The master parameters class.
Definition: Scope.h:204
ScopeNumber< double > referenceclockrate
rate in Hertz of the reference clock.
Definition: IO.h:577
void ConfigureReferenceClock(const std::wstring &_src, const float64 &_rate)
Configures the reference clock for the task.
Definition: DAQmxTask.cpp:128
int32_t WaitUntilDone(const float64 &_waittime)
Waits until the task is done.
Definition: DAQmxTask.cpp:163
std::array< std::unique_ptr< Area >, SCOPE_NAREAS > areas
holds AreaParameters for all areas.
Definition: Scope.h:231
void Start() override
Start task, last the first output task (all other are waiting for it as their start trigger)...
std::wstring ClockString(const scope::DaqTimingHelper::Mode &_timing, const std::wstring &_externalclocksource)
Generates a string for the sample clock from daq_timing.
Definition: DAQmxTask.cpp:46
std::atomic< bool > writeabort
Signal for aborting a write operation (since write is performed in several blocks, abort can happen in between)
Definition: Outputs.h:13
ScopeString triggerchannel
channel name for trigger input
Definition: Runstates.h:78
uInt32 ConfigureBuffer(const uInt32 &_sampsperchannel)
Configure the daqmx output buffer on the PC.
Definition: DAQmxTask.cpp:201
ZeroOutputsDAQmx(const parameters::OutputsDAQmx &_params)
Create a simple tasks for writing a scalar zero to all channels.
ScopeString referenceclocksource
source terminal of the reference clock
Definition: IO.h:573
void ExportSignal(int32 _signal, const std::wstring &_terminal)
Exports a signal to an output terminal.
Definition: DAQmxTask.cpp:167
OutputsDAQmx(const uint32_t &_area, const parameters::OutputsDAQmx &_outputparams, const parameters::Scope &_params)
Creates the task for scanner, pockels, and fast-z output with NI DAQmx.
Timeseries timeseries
the TimeseriesParameters
Definition: Scope.h:240
int32 WriteAnalogI16(const int16 *_data, int32 _sampsperchan, bool _autostart=false, int32 _timeout=2, bool32 _layout=DAQmx_Val_GroupByChannel)
Writes several samples to the buffer of an analog output task.
Definition: DAQmxTask.cpp:258
void SetWriteOffset(int32 posreltofirst)
Sets the write offset relative to the first buffer position.
Definition: DAQmxTask.cpp:172
ScopeValue< DaqTiming > daq_timing
where to get the sampling clock from? Onboard, from external reference clock, or from external source...
Definition: IO.h:567
int32_t Write(const std::vector< int16_t > &_xyzp, const uint32_t &_blocks=1) override
Writes values for one frame of X-Y-fastZ and pockels data to the device buffer.
ScopeString externalclocksource
source terminal of an external clock
Definition: IO.h:580
This is the include file for standard system include files, or project specific include files that ar...
ScopeValue< DaqMode > requested_mode
requested acquisition mode (see DaqModeHelper)
Definition: Scope.h:279
void Start(void)
Starts the task.
Definition: DAQmxTask.cpp:145
ScopeNumber< bool > triggered
the current/first repeat is triggered on triggerchannel
Definition: Runstates.h:81
In here all declarations for all kinds of datatypes Scope needs.
#define DBOUT(s)
A debug output to the debug console.
Definition: helpers.h:153
ScopeString channelsstring
the four analog output channels to use for x, y, z, Pockels
Definition: IO.h:564
void ScopeExceptionHandler(const std::string &_origin, const bool &_log, const bool &_showmessagebox, const bool &_trace, const bool &_rethrow)
Handles all exceptions and does nice logging.
void CreateAOVoltageChannel(const std::wstring &_devices, const std::wstring &_channelname=L"", float64 _minval=-10.0, float64 _maxval=10.0, int32 _units=DAQmx_Val_Volts, const std::wstring &_customscalename=L"")
Creates an analog output channel Allowed values for terminal configuration (from NiDAQmx.h): Values for DAQmx_PhysicalChan_AI_TermCfgs and DAQmx_PhysicalChan_AO_TermCfgs Value set TerminalConfigurationBits .
Definition: DAQmxTask.cpp:182
Wraps a DAQmx Analog Output task.
Definition: DAQmxTask.h:137
void Clear(void)
Clear the task.
Definition: DAQmxTask.cpp:153
ScopeString exportpixelclockterminal
terminal to which the pixel/sampleclock is exported
Definition: IO.h:583
void CreateTask(const std::wstring &_name=L"")
Definition: DAQmxTask.cpp:91
void ConfigureSampleTiming(const std::wstring &_src, const float64 &_rate, const int32 &_samplesperchan, const int32 &_samplingtype=DAQmx_Val_ContSamps, const int32 &_actedge=DAQmx_Val_Rising)
Configures a sample timing for the task.
Definition: DAQmxTask.cpp:109
const uint32_t area
which area this one is for
Definition: Outputs.h:10
ScopeNumber< double > range
Output range of the DAC to use for all outputs.
Definition: IO.h:526
~OutputsDAQmx()
Stop and clear output task.
DAQmx::CDAQmxAnalogOutTask task
The DAQmx task for x/y-scanners/fast z/Pockels clocked by a pixel clock.
Definition: OutputsDAQmx.h:23
void Stop() override
Stop task.
void ConfigureDigStartTrigger(const std::wstring &_src, const int32 &_trigedge=DAQmx_Val_Rising)
Configures the start trigger.
Definition: DAQmxTask.cpp:134
void Stop(void)
Stops the task.
Definition: DAQmxTask.cpp:149
Wraps hardware connection for signal output to scanners, fast z control, and pockels cell...
Definition: Outputs.h:6