AFHBA404
AFHBA404 connects ACQ2106 to PCI-Express
AcqHw.cpp
Go to the documentation of this file.
1 
10 extern "C" {
11 #include "../local.h"
12 #include "../rtm-t_ioctl.h"
13 #include "afhba-llcontrol.h"
14 
15 }
16 
17 #include "AcqSys.h"
18 #include "Env.h"
19 #include <iostream>
20 #include <iomanip>
21 #include <fstream>
22 #include <sstream>
23 #include <string.h>
24 
25 #include <stdio.h> // because sprintf()
26 
27 #include <assert.h>
28 
29 #include <sys/mman.h>
30 
31 
32 #define PAGE_SIZE 0x1000
33 
35 struct Dev {
36  int devnum;
37  int fd;
38  char* host_buffer;
40  struct LBUF {
41  char* base;
42  char* cursor;
44 
45  struct XLLC_DEF xllc_def;
46 
47  Dev(int _devnum) {
48  memset(this, 0, sizeof(Dev));
49  devnum = _devnum;
50  }
51 };
52 
53 /* XO uses SAME kbuffer as AI, but 4K up */
54 #define AO_OFFSET 0x1000
55 
56 #define XO_HOST (dev->host_buffer+AO_OFFSET)
57 
58 
59 void _get_connected(struct Dev* dev, unsigned vi_len)
60 {
61 
62 }
63 
65 {
66  mlockall(MCL_CURRENT);
67  goRealTime();
68 }
69 
70 
72 class ACQ_HW_BASE: public ACQ
73 {
75  static void raw_store(const char* fname, const char* base, int len)
76  {
77  FILE *fp = fopen(fname, "w");
78  if (fp == 0){
79  perror(fname);
80  }
81  fwrite(base, len, HBA::maxsam, fp);
82  fclose(fp);
83  }
84 
85 protected:
86  Dev* dev;
87  unsigned tl0;
88 
89  unsigned *dox;
90  int sample;
91  const int spix;
92  int pw32_double_buffer; // for back-compatibility with old PWM code
93 
94  ACQ_HW_BASE(int devnum, string _name, VI _vi, VO _vo, VI _vi_offsets,
95  VO _vo_offsets, VI& sys_vi_cursor, VO& sys_vo_cursor) :
96  ACQ(devnum, _name, _vi, _vo, _vi_offsets,
97  _vo_offsets, sys_vi_cursor, sys_vo_cursor),
98  dev(new Dev(devnum)),
99  tl0(0xdeadbeef),
100  sample(0),
101  spix(vi_offsets.SP32/sizeof(unsigned)+SPIX::TLATCH),
102  pw32_double_buffer(Env::getenv("PW32_DOUBLE_BUFFER", 1))
103  {
104  dev->host_buffer = (char*)get_mapping(dev->devnum, &dev->fd);
107  dev->lbuf_vi.base = (char*)calloc(vi.len(), HBA::maxsam);
109  dev->lbuf_vo.base = (char*)calloc(vo.len(), HBA::maxsam);
111  }
112  virtual ~ACQ_HW_BASE() {
113  raw_store((getName()+"_VI.dat").c_str(), dev->lbuf_vi.base, vi.len());
114  raw_store((getName()+"_VO.dat").c_str(), dev->lbuf_vo.base, vo.len());
115 
117  }
118 
119  virtual void arm(int nsamples);
121  virtual unsigned tlatch(void);
123  virtual void action(SystemInterface& systemInterface);
125  virtual void action2(SystemInterface& systemInterface);
127 };
128 
130 class ACQ_HW: public ACQ_HW_BASE
131 {
132 
133 public:
134  ACQ_HW(int devnum, string _name, VI _vi, VO _vo, VI _vi_offsets,
135  VO _vo_offsets, VI& sys_vi_cursor, VO& sys_vo_cursor);
136  virtual ~ACQ_HW()
137  {}
138  virtual bool newSample(int sample);
141 };
142 
143 /* TLATCH now uses the dynamic set value */
144 #undef TLATCH
145 
146 #define TLATCH0 ((unsigned*)(dev->host_buffer + vi_offsets.SP32))[SPIX::TLATCH]
147 
148 ACQ_HW::ACQ_HW(int devnum, string _name, VI _vi, VO _vo, VI _vi_offsets,
149  VO _vo_offsets, VI& sys_vi_cursor, VO& sys_vo_cursor) :
150  ACQ_HW_BASE(devnum, _name, _vi, _vo, _vi_offsets,
151  _vo_offsets, sys_vi_cursor, sys_vo_cursor)
152 {
153  if (ioctl(dev->fd, AFHBA_START_AI_LLC, &dev->xllc_def)){
154  perror("ioctl AFHBA_START_AI_LLC");
155  exit(1);
156  }
157  if (G::verbose){
158  printf("[%d] AI buf pa: 0x%08x len %d\n", dev->devnum, dev->xllc_def.pa, dev->xllc_def.len);
159  }
160 
161  if (vo.len()){
162  struct XLLC_DEF xo_xllc_def;
163  if (vo.len()){
164  xo_xllc_def = dev->xllc_def;
165  xo_xllc_def.pa += AO_OFFSET;
166  xo_xllc_def.len = vo.hwlen();
167 
168  if (vo.DO32){
169  int ll = xo_xllc_def.len/64;
170  xo_xllc_def.len = ++ll*64;
171  dox = (unsigned *)(XO_HOST + vo_offsets.DO32);
172  }
173  if (ioctl(dev->fd, AFHBA_START_AO_LLC, &xo_xllc_def)){
174  perror("ioctl AFHBA_START_AO_LLC");
175  exit(1);
176  }
177  if (G::verbose){
178  printf("[%d] AO buf pa: 0x%08x len %d\n", dev->devnum, xo_xllc_def.pa, xo_xllc_def.len);
179  }
180 
181  if (vo.DO32){
182  if(Env::getenv("DO32_HW_TRACE", 0)){
183  /* marker pattern for the PAD area for hardware trace */
184  for (int ii = 0; ii <= 0xf; ++ii){
185  dox[ii] = (ii<<24)|(ii<<16)|(ii<<8)|ii;
186  }
187  }
188  }
189  }
190  }
191  TLATCH0 = 0xdeadbeef;
192 }
193 
194 
196 #define VITOSI(field) \
197  (vi.field && \
198  memcpy(reinterpret_cast<char*>(systemInterface.IN.field+vi_cursor.field), dev->lbuf_vi.cursor+vi_offsets.field, \
199  vi.field*sizeof(systemInterface.IN.field[0])))
200 
201 
202 
203 void ACQ_HW_BASE::action(SystemInterface& systemInterface)
205 {
206  VITOSI(AI16);
207 
208  if (G::verbose > 1){
209  fprintf(stderr, "VITOSI(AI32) \"%s\" memcpy(%p, %p, %ld)\n", toString().c_str(),
210  systemInterface.IN.AI32+vi_cursor.AI32,
212  vi.AI32*sizeof(systemInterface.IN.AI32[0])
213  );
214  }
215  VITOSI(AI32);
216  VITOSI(DI32);
218  VITOSI(SP32);
219 }
220 
222 #define SITOVO(field) \
223  (vo.field && \
224  memcpy(XO_HOST+vo_offsets.field, reinterpret_cast<char*>(systemInterface.OUT.field+vo_cursor.field), \
225  vo.field*sizeof(systemInterface.OUT.field[0])))
226 
228 #define SITOVO2(field) \
229  (vo.field && \
230  memcpy(dev->lbuf_vo.cursor+vo_offsets.field, (char*)systemInterface.OUT.field+vo_cursor.field, \
231  vo.field*sizeof(systemInterface.OUT.field[0])))
232 
235 void ACQ_HW_BASE::action2(SystemInterface& systemInterface) {
236  SITOVO(AO16);
237  SITOVO(DO32);
238  if (pw32_double_buffer) SITOVO(PW32);
239 
240  SITOVO2(AO16);
241  SITOVO2(DO32);
242  SITOVO2(PW32);
243  SITOVO2(CC32);
244  if (++sample < HBA::maxsam){
245  dev->lbuf_vi.cursor += vi.len();
246  dev->lbuf_vo.cursor += vo.len();
247  }
248  pollcount = 0;
249 }
250 
251 
252 
254 bool ACQ_HW::newSample(int sample)
255 {
256  unsigned tl1;
257 
258  if (nowait || (tl1 = TLATCH0) != tl0){
259  memcpy(dev->lbuf_vi.cursor, dev->host_buffer, vi.len());
260  tl0 = tl1;
261  return true;
262  }else if (sample == 0 && wd_mask){
263  dox[0] ^= wd_mask;
264  return false;
265  }else{
266  return false;
267  }
268 }
269 
271 unsigned ACQ_HW_BASE::tlatch(void)
272 {
273  return *(unsigned*)(dev->lbuf_vi.cursor+vi_offsets.SP32);
274 }
277 {
278  cerr << "ACQ_HW_BASE::arm: TODO" <<endl;
279 }
280 
281 
288 {
289 protected:
290  int pw32_double_buffer; // for back-compatibility with old PWM code
291  int nb;
292  int **raw;
293 
294  unsigned tlatch0(int ib){
295  return raw[ib][spix];
296  }
297  unsigned *tl0_array;
298  int verbose;
299 public:
300  ACQ_HW_MULTI(int devnum, string _name, VI _vi, VO _vo, VI _vi_offsets,
301  VO _vo_offsets, VI& sys_vi_cursor, VO& sys_vo_cursor, int nbuffers);
302  virtual ~ACQ_HW_MULTI()
303  {}
304  virtual bool newSample(int sample);
306 };
307 
308 ACQ_HW_MULTI::ACQ_HW_MULTI(int devnum, string _name, VI _vi, VO _vo, VI _vi_offsets,
309  VO _vo_offsets, VI& sys_vi_cursor, VO& sys_vo_cursor, int _nbuffers):
310  ACQ_HW_BASE(devnum, _name, _vi, _vo, _vi_offsets,
311  _vo_offsets, sys_vi_cursor, sys_vo_cursor),
312  nb(_nbuffers),
313  tl0_array(new unsigned[_nbuffers]),
314  verbose(Env::getenv("ACQ_HW_MULTI_VERBOSE", 0))
315 {
316  struct ABN abn;
317  int ib;
318 
319  raw = new int* [nb];
320  abn.ndesc = nb;
321  abn.buffers[0].pa = dev->xllc_def.pa;
322 
323  for (ib = 0; ib < nb; ++ib){
324  if (dev->xllc_def.pa != RTM_T_USE_HOSTBUF){
325  assert(0); // this path not valid.
327  }
329  raw[ib] = (int*)(dev->host_buffer + ib*PAGE_SIZE);
330  }
331 
332  if (ioctl(dev->fd, AFHBA_START_AI_ABN, &abn)){
333  perror("ioctl AFHBA_START_AI_ABN");
334  exit(1);
335  }
336 
337  if (verbose) for (ib = 0; ib < nb; ++ib){
338  printf("[%d] [%d] AI buf pa: 0x%08x len %d\n", dev->devnum, ib, dev->xllc_def.pa, dev->xllc_def.len);
339  }
340  printf("[%d] AI buf pa: 0x%08x len %d nb:%d\n", dev->devnum, dev->xllc_def.pa, dev->xllc_def.len, nb);
341 
342  for (ib = 0; ib < nb; ++ib){
343  tl0_array[ib] = 0xdeadbeef;
344  }
345 }
346 
348 bool ACQ_HW_MULTI::newSample(int sample)
349 {
350  int ib = sample%nb;
351  unsigned tl1;
352  // @@todo HANDLE MULTIPLE BUFFERS
353  if (nowait || (tl1 = tlatch0(ib)) != tl0_array[ib]){
354  memcpy(dev->lbuf_vi.cursor, raw[ib], vi.len());
355  tl0_array[ib] = tl1;
356  return true;
357  }else if (sample == 0 && wd_mask){
358  dox[0] ^= wd_mask;
359  return false;
360  }else{
361  return false;
362  }
363 }
364 
368 {
369 protected:
370  const int& nmean;
371 
372  unsigned *dox;
373  int **raw;
374  unsigned *tl0_array;
375 
376  int verbose;
377 
378  bool _newSample(int sample);
379 public:
380  ACQ_HW_MEAN(int devnum, string _name, VI _vi, VO _vo, VI _vi_offsets,
381  VO _vo_offsets, VI& sys_vi_cursor, VO& sys_vo_cursor, int nmean);
382  virtual ~ACQ_HW_MEAN()
383  {}
384  virtual bool newSample(int sample);
386  virtual void action(SystemInterface& systemInterface);
388  virtual void action2(SystemInterface& systemInterface);
390 };
391 
392 
393 ACQ_HW_MEAN::ACQ_HW_MEAN(int devnum, string _name, VI _vi, VO _vo, VI _vi_offsets,
394  VO _vo_offsets, VI& sys_vi_cursor, VO& sys_vo_cursor, int _nmean) :
395  ACQ_HW_MULTI(devnum, _name, _vi, _vo, _vi_offsets,
396  _vo_offsets, sys_vi_cursor, sys_vo_cursor, _nmean),
397  nmean(nb),
398  verbose(Env::getenv("ACQ_HW_MEAN_VERBOSE", 0))
399 {
400 
401 }
402 
403 bool ACQ_HW_MEAN::_newSample(int sample)
404 {
405  for (int ib = 0; ib < nmean; ++ib){
406  unsigned tl1;
407  if ((tl1 = raw[ib][spix]) != tl0_array[ib]){
408  tl0 = tl0_array[ib] = tl1;
409  return true;
410  }
411  }
412  return false;
413 }
414 bool ACQ_HW_MEAN::newSample(int sample)
416 {
417  if (nowait){
418  return true;
419  }else if (_newSample(sample)){
420  if (verbose){
421  fprintf(stderr, "TLATCH:%08x\n", tl0);
422  }
423  return true;
424  }else{
425  return false;
426  }
427 }
428 
429 void ACQ_HW_MEAN::action(SystemInterface& systemInterface)
431 {
436  for (int ic = 0; ic < vi.AI32; ++ic){
437  int total = 0;
438 
439  for (int sam = 1; sam < nmean; ++sam){
440  total += raw[sam][ic] >> 8;
441  }
442  total += raw[0][ic] >> 8;
443  systemInterface.IN.AI32[vi_cursor.AI32+ic] = ((total/nmean) << 8) | (raw[0][ic]&0x00ff);
444  }
445 }
446 void ACQ_HW_MEAN::action2(SystemInterface& systemInterface)
448 {
449 
450 }
451 
454  const int nskip;
455 public:
456  ACQ_HW_MEAN_SKIPPER(int devnum, string _name, VI _vi, VO _vo, VI _vi_offsets,
457  VO _vo_offsets, VI& _sys_vi_cursor, VO& _sys_vo_cursor, int _nmean, int _nskip) :
458  ACQ_HW_MEAN(devnum, _name, _vi, _vo, _vi_offsets,
459  _vo_offsets, _sys_vi_cursor, _sys_vo_cursor, _nmean),
460  nskip(_nskip)
461  {
462  fprintf(stderr, "%s skip:%d\n", __FUNCTION__, nskip);
463  tl0 = 0;
464  }
465 
466  virtual bool newSample(int sample);
467 };
468 
470 {
471  unsigned tl1;
472 
473  if (nowait){
474  return true;
475  }else{
476  tl1 = TLATCH0;
477 
478  // Detect 32 bit rollover, every 23.8h @ 50KHz
479  bool over0 = tl0 + nskip < tl0; // endpoint overflow
480  bool over1 = tl1 < tl0; // current overflow
481 
482  if (!(over0 || over1)){ // TRUE, almos ALL the time.
483  if (tl1 > tl0 + nskip){
484  tl0 = tl1;
485  if (verbose){
486  fprintf(stderr, "TLATCH:%08x\n", tl0);
487  }
488  return true;
489  }
490  }else{ // use 64b pointers - brute force and ignorance rules OK!
491  unsigned long long endpoint = tl0; endpoint += nskip;
492  unsigned long long current = tl1; if (over1) current += 1ULL<<32;
493 
494  if (current > endpoint){
495  tl0 = tl1;
496  if (verbose){
497  fprintf(stderr, "TLATCH:%08x ROLLOVER\n", tl0);
498  }
499  return true;
500 
501  }
502  }
503  return false;
504  }
505 }
506 
513 ACQ* ACQ::factory(int devnum, string _name, VI _vi, VO _vo, VI _vi_offsets,
514  VO _vo_offsets, VI& sys_vi_cursor, VO& sys_vo_cursor)
515 {
516  static int HW;
517  static int skip;
518  if (getenv("HW") != 0){
519  sscanf(getenv("HW"), "%d,%d", &HW, &skip);
520  }
521 
522 
523  if (HW == 1){
524  int multi = Env::getenv("HW_MULTI", 0);
525  if (multi){
526  return new ACQ_HW_MULTI(devnum, _name, _vi, _vo, _vi_offsets, _vo_offsets, sys_vi_cursor, sys_vo_cursor, multi);
527  }
528  return new ACQ_HW(devnum, _name, _vi, _vo, _vi_offsets, _vo_offsets, sys_vi_cursor, sys_vo_cursor);
529  }else if (HW > 1){
530  if (skip > 1){
531  return new ACQ_HW_MEAN_SKIPPER(devnum, _name, _vi, _vo, _vi_offsets, _vo_offsets, sys_vi_cursor, sys_vo_cursor, HW, skip);
532  }else{
533  return new ACQ_HW_MEAN(devnum, _name, _vi, _vo, _vi_offsets, _vo_offsets, sys_vi_cursor, sys_vo_cursor, HW);
534  }
535  }else{
536  return new ACQ(devnum, _name, _vi, _vo, _vi_offsets, _vo_offsets, sys_vi_cursor, sys_vo_cursor);
537  }
538 }
539 
PAGE_SIZE
#define PAGE_SIZE
Definition: AcqHw.cpp:32
ACQ_HW_MULTI::pw32_double_buffer
int pw32_double_buffer
Definition: AcqHw.cpp:290
ACQ_HW_BASE::tl0
unsigned tl0
Definition: AcqHw.cpp:87
afhba-llcontrol.h
ACQ::vi_cursor
const VI vi_cursor
index for each Input type in System Interface
Definition: AcqSys.h:95
RTM_T_USE_HOSTBUF
#define RTM_T_USE_HOSTBUF
Definition: rtm-t_ioctl.h:75
goRealTime
void goRealTime(void)
Definition: afhba-llcontrol.c:138
ACQ_HW_MULTI::tlatch0
unsigned tlatch0(int ib)
Definition: AcqHw.cpp:294
abn
struct ABN abn
Definition: InlineDataHandlerMuxAO_LLC.cpp:56
ACQ_HW::newSample
virtual bool newSample(int sample)
checks host buffer for new sample, if so copies to lbuf and reports true
Definition: AcqHw.cpp:254
ACQ_HW_MEAN::~ACQ_HW_MEAN
virtual ~ACQ_HW_MEAN()
Definition: AcqHw.cpp:382
ACQ_HW_MULTI
as per ACQ_HW, but with multi dma buffers use for applications like THOMSON where multi back to back ...
Definition: AcqHw.cpp:288
AcqSys.h
acqproc global class interface definition.
VI
Models Vector Input.
Definition: AcqSys.h:24
XO_HOST
#define XO_HOST
Definition: AcqHw.cpp:56
ACQ::ACQ
ACQ(int devnum, string _name, VI _vi, VO _vo, VI _vi_offsets, VO _vo_offsets, VI &sys_vi_cursor, VO &sys_vo_cursor)
Definition: AcqSys.cpp:116
TLATCH
@ TLATCH
Sample Number.
Definition: AcqSys.h:37
ABN::ndesc
int ndesc
Definition: rtm-t_ioctl.h:58
VITOSI
#define VITOSI(field)
copy VI.field to SI.field
Definition: AcqHw.cpp:196
SPIX
SPIX
SPIX: defined fields in SP32 array.
Definition: AcqSys.h:36
ACQ::vo_offsets
const VO vo_offsets
byte offset for each Output type in Local Vector Out
Definition: AcqSys.h:94
ACQ_HW_MULTI::nb
int nb
Definition: AcqHw.cpp:291
AFHBA_START_AI_ABN
#define AFHBA_START_AI_ABN
Definition: rtm-t_ioctl.h:104
ACQ_HW_MEAN_SKIPPER
takes mean of N samples, newSample returns true after skip samples
Definition: AcqHw.cpp:453
ACQ::devnum
int devnum
AFHBA404 device numbers 0..N.
Definition: AcqSys.h:91
AO_OFFSET
#define AO_OFFSET
Definition: AcqHw.cpp:54
ACQ_HW_MULTI::~ACQ_HW_MULTI
virtual ~ACQ_HW_MULTI()
Definition: AcqHw.cpp:302
ACQ_HW_MEAN
output the mean of nb values
Definition: AcqHw.cpp:368
ACQ_HW_MULTI::ACQ_HW_MULTI
ACQ_HW_MULTI(int devnum, string _name, VI _vi, VO _vo, VI _vi_offsets, VO _vo_offsets, VI &sys_vi_cursor, VO &sys_vo_cursor, int nbuffers)
Definition: AcqHw.cpp:308
ACQ_HW_MULTI::tl0_array
unsigned * tl0_array
Definition: AcqHw.cpp:297
HBA::start_shot
virtual void start_shot()
Definition: AcqHw.cpp:64
XLLC_DEF::pa
u32 pa
SRC or DST buffer PA - round to 1K RTM_T_USE_HOSTBUF=> use Driver buffer 0.
Definition: rtm-t_ioctl.h:47
ACQ_HW_BASE::~ACQ_HW_BASE
virtual ~ACQ_HW_BASE()
Definition: AcqHw.cpp:112
ACQ_HW_MULTI::newSample
virtual bool newSample(int sample)
checks host buffer for new sample, if so copies to lbuf and reports true
Definition: AcqHw.cpp:348
POLLCOUNT
@ POLLCOUNT
pollcount: number of times SW polled for incoming.
Definition: AcqSys.h:39
VI::AI32
int AI32
AI32 values from the HW.
Definition: AcqSys.h:29
XLLC_DEF::len
unsigned len
length in bytes - will round up to next %64
Definition: rtm-t_ioctl.h:46
ACQ_HW_MEAN::_newSample
bool _newSample(int sample)
Definition: AcqHw.cpp:403
XLLC_DEF
Definition: rtm-t_ioctl.h:45
ACQ::wd_mask
unsigned wd_mask
watchdog mask.
Definition: AcqSys.h:89
VO::hwlen
int hwlen(void) const
Definition: AcqSys.cpp:75
ACQ_HW_BASE::arm
virtual void arm(int nsamples)
prepare to run a shot nsamples long, arm the UUT.
Definition: AcqHw.cpp:276
VI::SP32
int SP32
SP32 values from the HW.
Definition: AcqSys.h:31
ACQ_HW::~ACQ_HW
virtual ~ACQ_HW()
Definition: AcqHw.cpp:136
Dev
struct Dev : interface to AFHBA404 device driver.
Definition: AcqHw.cpp:35
SystemInterface::IN
struct SystemInterface::Inputs IN
ACQ_HW::ACQ_HW
ACQ_HW(int devnum, string _name, VI _vi, VO _vo, VI _vi_offsets, VO _vo_offsets, VI &sys_vi_cursor, VO &sys_vo_cursor)
Definition: AcqHw.cpp:148
ACQ_HW_MULTI::verbose
int verbose
Definition: AcqHw.cpp:298
ACQ_HW_BASE::action2
virtual void action2(SystemInterface &systemInterface)
late action(), cleanup
Definition: AcqHw.cpp:235
ACQ_HW_BASE::sample
int sample
Definition: AcqHw.cpp:90
HBA::maxsam
static int maxsam
max samples in shot (for raw memory alloc)
Definition: AcqSys.h:133
IO::vi
const VI vi
Definition: AcqSys.h:69
ACQ_HW_MEAN::action2
virtual void action2(SystemInterface &systemInterface)
late action(), cleanup
Definition: AcqHw.cpp:446
ACQ_HW
concrete base class.
Definition: AcqHw.cpp:131
ACQ::factory
static ACQ * factory(int devnum, string _name, VI _vi, VO _vo, VI _vi_offsets, VO _vo_offsets, VI &sys_vi_cursor, VO &sys_vo_cursor)
Definition: AcqHw.cpp:513
VO
Models Vector Output.
Definition: AcqSys.h:48
ACQ
abstract model of an ACQ2106 box.
Definition: AcqSys.h:83
Env::getenv
static int getenv(const char *key, int def)
Definition: Env.h:26
Dev::LBUF::base
char * base
Definition: AcqHw.cpp:41
Dev::lbuf_vi
struct Dev::LBUF lbuf_vi
ABN
Definition: rtm-t_ioctl.h:57
Dev::lbuf_vo
struct Dev::LBUF lbuf_vo
verbose
int verbose
Definition: InlineDataHandlerMuxAO_LLC.cpp:59
ib
int ib
Definition: InlineDataHandlerMuxAO_LLC.cpp:57
SystemInterface::Inputs::AI32
int * AI32
Definition: AcqSys.h:171
ACQ_HW_MULTI::raw
int ** raw
Definition: AcqHw.cpp:292
ACQ_HW_BASE::spix
const int spix
Definition: AcqHw.cpp:91
VO::len
int len(void) const
Definition: AcqSys.cpp:79
ACQ_HW_BASE::pw32_double_buffer
int pw32_double_buffer
Definition: AcqHw.cpp:92
Dev::devnum
int devnum
Definition: AcqHw.cpp:36
Env
Definition: Env.h:19
AFHBA_START_AI_LLC
#define AFHBA_START_AI_LLC
ioctl ACQ2106 Start Low Latency Control Inbound outputs actual pa used
Definition: rtm-t_ioctl.h:90
ACQ_HW_BASE
concrete model of ACQ2106 box.
Definition: AcqHw.cpp:73
SITOVO
#define SITOVO(field)
copy SI.field to VO
Definition: AcqHw.cpp:222
VO::DO32
int DO32
DO32 values from the algorithm.
Definition: AcqSys.h:54
VI::len
int len(void) const
Definition: AcqSys.cpp:30
Dev::fd
int fd
Definition: AcqHw.cpp:37
ACQ::vi_offsets
const VI vi_offsets
byte offset for each Input type in Local Vector In
Definition: AcqSys.h:93
_get_connected
void _get_connected(struct Dev *dev, unsigned vi_len)
Definition: AcqHw.cpp:59
ACQ_HW_MEAN::newSample
virtual bool newSample(int sample)
checks host buffer for new sample, if so copies to lbuf and reports true
Definition: AcqHw.cpp:414
get_mapping
void * get_mapping(dev_t devnum, int *pfd)
Definition: afhba-llcontrol.c:86
ACQ_HW_BASE::action
virtual void action(SystemInterface &systemInterface)
on newSample, copy VO from SI, copy VI to SI
Definition: AcqHw.cpp:203
ACQ_HW_BASE::dev
Dev * dev
Definition: AcqHw.cpp:86
SITOVO2
#define SITOVO2(field)
copy SI.field to XO archive.
Definition: AcqHw.cpp:228
ACQ_HW_MEAN::ACQ_HW_MEAN
ACQ_HW_MEAN(int devnum, string _name, VI _vi, VO _vo, VI _vi_offsets, VO _vo_offsets, VI &sys_vi_cursor, VO &sys_vo_cursor, int nmean)
Definition: AcqHw.cpp:393
Env.h
Dev::LBUF::cursor
char * cursor
Definition: AcqHw.cpp:42
ACQ_HW_MEAN::dox
unsigned * dox
Definition: AcqHw.cpp:372
Dev::LBUF
local buffer interface .
Definition: AcqHw.cpp:40
SystemInterface
Models interface with external PCS.
Definition: AcqSys.h:161
G::verbose
int verbose
Definition: acqproc.cpp:34
ACQ::toString
virtual string toString()
Definition: AcqSys.cpp:131
ABN::buffers
struct XLLC_DEF buffers[MAXABN]
Definition: rtm-t_ioctl.h:59
IO::getName
string getName()
Definition: AcqSys.h:75
assert
#define assert(p)
Definition: acq-fiber-hba.h:55
ACQ_HW_MEAN::tl0_array
unsigned * tl0_array
Definition: AcqHw.cpp:374
Dev::host_buffer
char * host_buffer
Definition: AcqHw.cpp:38
nbuffers
int nbuffers
Definition: afhba_stream_drv.c:73
AFHBA_START_AO_LLC
#define AFHBA_START_AO_LLC
ioctl ACQ2106 Start Low Latency Control Outbound
Definition: rtm-t_ioctl.h:95
TLATCH0
#define TLATCH0
find sample count in VI.
Definition: AcqHw.cpp:146
IO::vo
const VO vo
Definition: AcqSys.h:70
ACQ_HW_MEAN::raw
int ** raw
Definition: AcqHw.cpp:373
G::samples_buffer
int samples_buffer
number of samples in each VI buffer (default:1)
Definition: acqproc.cpp:37
clear_mapping
void clear_mapping(int fd, void *hb)
Definition: afhba-llcontrol.c:108
ACQ_HW_MEAN_SKIPPER::ACQ_HW_MEAN_SKIPPER
ACQ_HW_MEAN_SKIPPER(int devnum, string _name, VI _vi, VO _vo, VI _vi_offsets, VO _vo_offsets, VI &_sys_vi_cursor, VO &_sys_vo_cursor, int _nmean, int _nskip)
Definition: AcqHw.cpp:456
Dev::Dev
Dev(int _devnum)
Definition: AcqHw.cpp:47
ACQ_HW_MEAN::verbose
int verbose
Definition: AcqHw.cpp:376
Dev::xllc_def
struct XLLC_DEF xllc_def
Definition: AcqHw.cpp:45
getenv
int getenv(const char *key, int def, int(*cvt)(const char *key))
Definition: acqproc.cpp:23
ACQ_HW_MEAN::nmean
const int & nmean
Definition: AcqHw.cpp:370
G::nsamples
int nsamples
samples to capture (default:2, typ 200000)
Definition: acqproc.cpp:38
ACQ_HW_MEAN::action
virtual void action(SystemInterface &systemInterface)
on newSample, copy VO from SI, copy VI to SI
Definition: AcqHw.cpp:429
ACQ_HW_MEAN_SKIPPER::newSample
virtual bool newSample(int sample)
checks host buffer for new sample, if so copies to lbuf and reports true
Definition: AcqHw.cpp:469
ACQ_HW_BASE::dox
unsigned * dox
Definition: AcqHw.cpp:89
ACQ_HW_BASE::ACQ_HW_BASE
ACQ_HW_BASE(int devnum, string _name, VI _vi, VO _vo, VI _vi_offsets, VO _vo_offsets, VI &sys_vi_cursor, VO &sys_vo_cursor)
Definition: AcqHw.cpp:94
ACQ_HW_BASE::tlatch
virtual unsigned tlatch(void)
returns latest tlatch from lbuf
Definition: AcqHw.cpp:271
ACQ::nowait
bool nowait
newSample doesn't block for new Tlatch (eg bolo in set with non bolo uuts).
Definition: AcqSys.h:88
ACQ::pollcount
int pollcount
Definition: AcqSys.h:90