mrfioc2  2.3.0
Classes | Public Types | Public Member Functions | Public Attributes | List of all members
SoftSequence Struct Reference
Inheritance diagram for SoftSequence:
Inheritance graph
[legend]
Collaboration diagram for SoftSequence:
Collaboration graph
[legend]

Classes

struct  Config
 

Public Types

typedef mrf::ObjectInst< SoftSequencebase_t
 
typedef std::vector< epicsUInt64times_t
 
typedef std::vector< epicsUInt8 > codes_t
 
- Public Types inherited from mrf::Object
typedef m_obj_children_t::const_iterator child_iterator
 
typedef std::map< std::string, std::string > create_args_t
 
typedef Object *(* create_factory_t) (const std::string &name, const std::string &klass, const create_args_t &args)
 

Public Member Functions

 SoftSequence (SeqManager *o, const std::string &name)
 
virtual ~SoftSequence ()
 
virtual void lock () const
 
virtual void unlock () const
 
std::string getErr () const
 
IOSCANPVT getErrScan () const
 
epicsUInt32 getTimestampResolution () const
 
void setTimestampResolution (epicsUInt32 val)
 
void setTimestamp (const double *arr, epicsUInt32 count)
 
epicsUInt32 getTimestamp (double *arr, epicsUInt32 count) const
 
void setEventCode (const epicsUInt8 *arr, epicsUInt32 count)
 
epicsUInt32 getEventCode (epicsUInt8 *arr, epicsUInt32 count) const
 
void setTrigSrc (epicsUInt32 src)
 
epicsUInt32 getTrigSrcCt () const
 
void setRunMode (epicsUInt32 mode)
 
epicsUInt32 getRunModeCt () const
 
bool isLoaded () const
 
bool isEnabled () const
 
bool isCommited () const
 
IOSCANPVT stateChange () const
 
void load ()
 
void unload ()
 
void commit ()
 
void enable ()
 
void disable ()
 
void softTrig ()
 
epicsUInt32 counterStart () const
 
IOSCANPVT counterStartScan () const
 
epicsUInt32 counterEnd () const
 
IOSCANPVT counterEndScan () const
 
void sync ()
 
- Public Member Functions inherited from mrf::ObjectInst< SoftSequence >
virtual propertyBasegetPropertyBase (const char *pname, const std::type_info &ptype)
 
virtual void visitProperties (bool(*cb)(propertyBase *, void *), void *arg)
 
- Public Member Functions inherited from mrf::Object
const std::string & name () const
 
const Objectparent () const
 
child_iterator beginChild () const
 
child_iterator endChild () const
 
template<typename P >
mrf::auto_ptr< property< P > > getProperty (const char *pname)
 

Public Attributes

SeqManager *const owner
 
SeqHWhw
 
epicsMutex mutex
 
struct SoftSequence::Config scratch
 
struct SoftSequence::Config committed
 
bool is_enabled
 Whether user has requested enable. More...
 
bool is_committed
 clear when scratch and commited sequences differ More...
 
bool is_insync
 
epicsUInt32 numStart
 Guarded by interruptLock only. More...
 
epicsUInt32 numEnd
 
epicsUInt32 timeScale
 
IOSCANPVT changed
 
IOSCANPVT onStart
 
IOSCANPVT onEnd
 
IOSCANPVT onErr
 
std::string last_err
 

Additional Inherited Members

- Static Public Member Functions inherited from mrf::ObjectInst< SoftSequence >
static int initObject ()
 
- Static Public Member Functions inherited from mrf::Object
static ObjectgetObject (const std::string &name)
 
static ObjectgetCreateObject (const std::string &name, const std::string &klass, const create_args_t &args=create_args_t())
 
static void addFactory (const std::string &klass, create_factory_t fn)
 
static void visitObjects (bool(*)(Object *, void *), void *)
 
- Protected Member Functions inherited from mrf::ObjectInst< SoftSequence >
 ObjectInst (const std::string &n)
 
 ObjectInst (const std::string &n, A &a)
 
virtual ~ObjectInst ()
 
- Protected Member Functions inherited from mrf::Object
 Object (const std::string &n, const Object *par=0)
 
virtual ~Object ()=0
 

Detailed Description

Definition at line 133 of file mrmSeq.cpp.

Member Typedef Documentation

◆ base_t

Definition at line 135 of file mrmSeq.cpp.

◆ codes_t

typedef std::vector<epicsUInt8> SoftSequence::codes_t

Definition at line 322 of file mrmSeq.cpp.

◆ times_t

typedef std::vector<epicsUInt64> SoftSequence::times_t

Definition at line 321 of file mrmSeq.cpp.

Constructor & Destructor Documentation

◆ SoftSequence()

SoftSequence::SoftSequence ( SeqManager o,
const std::string &  name 
)

Definition at line 391 of file mrmSeq.cpp.

392  :base_t(name)
393  ,owner(o)
394  ,hw(0)
395  ,is_enabled(false)
396  ,is_committed(false)
397  ,is_insync(false)
398  ,numStart(0u)
399  ,numEnd(0u)
400  ,timeScale(0u) // raw/ticks
401 {
402  scanIoInit(&changed);
403  scanIoInit(&onStart);
404  scanIoInit(&onEnd);
405  scanIoInit(&onErr);
406 }
SeqHW * hw
Definition: mrmSeq.cpp:317
bool is_enabled
Whether user has requested enable.
Definition: mrmSeq.cpp:344
mrf::ObjectInst< SoftSequence > base_t
Definition: mrmSeq.cpp:135
bool is_insync
Definition: mrmSeq.cpp:349
bool is_committed
clear when scratch and commited sequences differ
Definition: mrmSeq.cpp:346
IOSCANPVT onErr
Definition: mrmSeq.cpp:356
epicsUInt32 numEnd
Definition: mrmSeq.cpp:352
IOSCANPVT changed
Definition: mrmSeq.cpp:356
epicsUInt32 timeScale
Definition: mrmSeq.cpp:354
const std::string & name() const
Definition: object.h:393
IOSCANPVT onEnd
Definition: mrmSeq.cpp:356
SeqManager *const owner
Definition: mrmSeq.cpp:312
IOSCANPVT onStart
Definition: mrmSeq.cpp:356
epicsUInt32 numStart
Guarded by interruptLock only.
Definition: mrmSeq.cpp:352

◆ ~SoftSequence()

SoftSequence::~SoftSequence ( )
virtual

Definition at line 408 of file mrmSeq.cpp.

408 {}

Member Function Documentation

◆ commit()

void SoftSequence::commit ( )

Definition at line 488 of file mrmSeq.cpp.

489 {
490  SCOPED_LOCK(mutex);
491  DEBUG(3, ("Committing %c\n", is_committed ? 'Y' : 'N') );
492 
493  if(is_committed) {DEBUG(3, ("Skip\n")); return;}
494 
495  // scratch.times already check for monotonic
496 
497  Config conf(scratch); // vector copies
498 
499  size_t buflen = std::min(conf.codes.size(),
500  conf.times.size());
501  conf.codes.resize(buflen);
502  conf.times.resize(buflen);
503 
504  // ensure presence of trailing end of sequence marker event 0x7f
505  if(conf.codes.empty() || conf.codes.back()!=0x7f)
506  {
507  if(!conf.times.empty() && conf.times.back()==0xffffffff)
508  throw std::runtime_error("Wow, input array is missing 0x7f and maxing out times");
509 
510  conf.codes.push_back(0x7f);
511 
512  if(conf.times.empty())
513  conf.times.push_back(0);
514  else
515  conf.times.push_back(conf.times.back()+1);
516  }
517 
518  if(conf.times.size()>2048)
519  throw std::runtime_error("Sequence too long");
520 
521  assert(!hw || hw->loaded==this);
522 
523  {
524  interruptLock L;
525  committed.swap(conf);
526  is_committed = true;
527  is_insync = false;
528 
529  if(hw && !hw->disarm())
530  sync();
531  }
532 
533  scanIoRequest(changed);
534  DEBUG(1, ("Committed\n") );
535 }
SeqHW * hw
Definition: mrmSeq.cpp:317
bool is_insync
Definition: mrmSeq.cpp:349
bool disarm()
Definition: mrmSeq.cpp:109
#define DEBUG(LVL, ARGS)
Definition: mrmSeq.cpp:45
bool is_committed
clear when scratch and commited sequences differ
Definition: mrmSeq.cpp:346
void swap(Config &o)
Definition: mrmSeq.cpp:333
void sync()
Definition: mrmSeq.cpp:574
epicsMutex mutex
Definition: mrmSeq.cpp:319
struct SoftSequence::Config scratch
IOSCANPVT changed
Definition: mrmSeq.cpp:356
struct SoftSequence::Config committed
SoftSequence * loaded
current association. may be NULL
Definition: mrmSeq.cpp:66

◆ counterEnd()

epicsUInt32 SoftSequence::counterEnd ( ) const
inline

Definition at line 305 of file mrmSeq.cpp.

305 { interruptLock L; return numEnd; }
epicsUInt32 numEnd
Definition: mrmSeq.cpp:352

◆ counterEndScan()

IOSCANPVT SoftSequence::counterEndScan ( ) const
inline

Definition at line 306 of file mrmSeq.cpp.

306 { return onEnd; }
IOSCANPVT onEnd
Definition: mrmSeq.cpp:356

◆ counterStart()

epicsUInt32 SoftSequence::counterStart ( ) const
inline

Definition at line 303 of file mrmSeq.cpp.

303 { interruptLock L; return numStart; }
epicsUInt32 numStart
Guarded by interruptLock only.
Definition: mrmSeq.cpp:352

◆ counterStartScan()

IOSCANPVT SoftSequence::counterStartScan ( ) const
inline

Definition at line 304 of file mrmSeq.cpp.

304 { return onStart; }
IOSCANPVT onStart
Definition: mrmSeq.cpp:356

◆ disable()

void SoftSequence::disable ( )

Definition at line 555 of file mrmSeq.cpp.

556 {
557  SCOPED_LOCK(mutex);
558  DEBUG(3, ("Disabling %c\n", is_enabled ? 'Y' : 'N') );
559  if(!is_enabled)
560  {DEBUG(3, ("Skip\n")); return;}
561 
562  is_enabled = false;
563 
564  if(hw) {
565  interruptLock L;
566  hw->disarm();
567  }
568 
569  scanIoRequest(changed);
570  DEBUG(1, ("Disabled\n") );
571 }
SeqHW * hw
Definition: mrmSeq.cpp:317
bool is_enabled
Whether user has requested enable.
Definition: mrmSeq.cpp:344
bool disarm()
Definition: mrmSeq.cpp:109
#define DEBUG(LVL, ARGS)
Definition: mrmSeq.cpp:45
epicsMutex mutex
Definition: mrmSeq.cpp:319
IOSCANPVT changed
Definition: mrmSeq.cpp:356

◆ enable()

void SoftSequence::enable ( )

Definition at line 537 of file mrmSeq.cpp.

538 {
539  SCOPED_LOCK(mutex);
540  DEBUG(3, ("Enabling %c\n", is_enabled ? 'Y' : 'N') );
541  if(is_enabled)
542  {DEBUG(3, ("Skip\n")); return;}
543 
544  is_enabled = true;
545 
546  if(hw) {
547  interruptLock I;
548 
549  hw->arm();
550  }
551  scanIoRequest(changed);
552  DEBUG(1, ("Enabled\n") );
553 }
SeqHW * hw
Definition: mrmSeq.cpp:317
bool is_enabled
Whether user has requested enable.
Definition: mrmSeq.cpp:344
#define DEBUG(LVL, ARGS)
Definition: mrmSeq.cpp:45
epicsMutex mutex
Definition: mrmSeq.cpp:319
void arm()
Definition: mrmSeq.cpp:102
IOSCANPVT changed
Definition: mrmSeq.cpp:356

◆ getErr()

std::string SoftSequence::getErr ( ) const
inline

Definition at line 143 of file mrmSeq.cpp.

143 { SCOPED_LOCK(mutex); return last_err; }
epicsMutex mutex
Definition: mrmSeq.cpp:319
std::string last_err
Definition: mrmSeq.cpp:358

◆ getErrScan()

IOSCANPVT SoftSequence::getErrScan ( ) const
inline

Definition at line 144 of file mrmSeq.cpp.

144 { return onErr; }
IOSCANPVT onErr
Definition: mrmSeq.cpp:356

◆ getEventCode()

epicsUInt32 SoftSequence::getEventCode ( epicsUInt8 *  arr,
epicsUInt32  count 
) const
inline

Definition at line 235 of file mrmSeq.cpp.

236  {
237  SCOPED_LOCK(mutex);
238  epicsUInt32 ret = std::min(size_t(count), committed.codes.size());
239  std::copy(committed.codes.begin(),
240  committed.codes.begin()+ret,
241  arr);
242  return ret;
243  }
epicsMutex mutex
Definition: mrmSeq.cpp:319
struct SoftSequence::Config committed

◆ getRunModeCt()

epicsUInt32 SoftSequence::getRunModeCt ( ) const
inline

Definition at line 282 of file mrmSeq.cpp.

283  {
284  SCOPED_LOCK(mutex);
285  return committed.mode;
286  }
epicsMutex mutex
Definition: mrmSeq.cpp:319
struct SoftSequence::Config committed

◆ getTimestamp()

epicsUInt32 SoftSequence::getTimestamp ( double *  arr,
epicsUInt32  count 
) const
inline

Definition at line 209 of file mrmSeq.cpp.

210  {
211  SCOPED_LOCK(mutex);
212  const double tmult = getTimeScale();
213  epicsUInt32 ret = std::min(size_t(count), committed.times.size());
214  for(epicsUInt32 i=0; i<ret; i++) {
215  arr[i] = committed.times[i]/tmult;
216  }
217  return ret;
218  }
epicsMutex mutex
Definition: mrmSeq.cpp:319
struct SoftSequence::Config committed

◆ getTimestampResolution()

epicsUInt32 SoftSequence::getTimestampResolution ( ) const
inline

Definition at line 146 of file mrmSeq.cpp.

147  {
148  SCOPED_LOCK(mutex);
149  return timeScale;
150  }
epicsMutex mutex
Definition: mrmSeq.cpp:319
epicsUInt32 timeScale
Definition: mrmSeq.cpp:354

◆ getTrigSrcCt()

epicsUInt32 SoftSequence::getTrigSrcCt ( ) const
inline

Definition at line 257 of file mrmSeq.cpp.

258  {
259  SCOPED_LOCK(mutex);
260  return committed.src;
261  }
epicsUInt32 src
Definition: mrmSeq.cpp:328
epicsMutex mutex
Definition: mrmSeq.cpp:319
struct SoftSequence::Config committed

◆ isCommited()

bool SoftSequence::isCommited ( ) const
inline

Definition at line 293 of file mrmSeq.cpp.

293 { SCOPED_LOCK(mutex); return is_committed; }
bool is_committed
clear when scratch and commited sequences differ
Definition: mrmSeq.cpp:346
epicsMutex mutex
Definition: mrmSeq.cpp:319

◆ isEnabled()

bool SoftSequence::isEnabled ( ) const
inline

Definition at line 292 of file mrmSeq.cpp.

292 { SCOPED_LOCK(mutex); return is_enabled; }
bool is_enabled
Whether user has requested enable.
Definition: mrmSeq.cpp:344
epicsMutex mutex
Definition: mrmSeq.cpp:319

◆ isLoaded()

bool SoftSequence::isLoaded ( ) const
inline

Definition at line 291 of file mrmSeq.cpp.

291 { SCOPED_LOCK(mutex); return hw; }
SeqHW * hw
Definition: mrmSeq.cpp:317
epicsMutex mutex
Definition: mrmSeq.cpp:319

◆ load()

void SoftSequence::load ( )

Definition at line 423 of file mrmSeq.cpp.

424 {
425  SCOPED_LOCK(mutex);
426  DEBUG(3, ("Loading %c\n", hw ? 'L' : 'U') );
427  if(hw) {DEBUG(3, ("Skip\n")); return;}
428 
429  // find unused SeqHW
430  {
431  interruptLock L;
432 
433  is_insync = false; // paranoia
434 
435  for(size_t i=0, N=owner->hw.size(); i<N; i++) {
436  SeqHW *temp = owner->hw[i];
437  if(temp && !temp->loaded) {
438  temp->loaded = this;
439  hw = temp;
440  break;
441  }
442  }
443 
444  if(hw) {
445  // paranoia: disable any external trigger mappings
446  owner->mapTriggerSrc(hw->idx, 0x02000000);
447 
448  if(!hw->disarm())
449  sync();
450  }
451  }
452 
453  if(!hw) {
454  last_err = "All HW Seq. in use";
455  scanIoRequest(onErr);
456  throw alarm_exception(MAJOR_ALARM, WRITE_ALARM);
457  }
458 
459  scanIoRequest(changed);
460  DEBUG(1, ("Loaded\n") );
461 }
SeqHW * hw
Definition: mrmSeq.cpp:317
bool is_insync
Definition: mrmSeq.cpp:349
bool disarm()
Definition: mrmSeq.cpp:109
#define DEBUG(LVL, ARGS)
Definition: mrmSeq.cpp:45
IOSCANPVT onErr
Definition: mrmSeq.cpp:356
void sync()
Definition: mrmSeq.cpp:574
epicsMutex mutex
Definition: mrmSeq.cpp:319
IOSCANPVT changed
Definition: mrmSeq.cpp:356
const unsigned idx
Definition: mrmSeq.cpp:59
Definition: mrmSeq.cpp:56
SeqManager *const owner
Definition: mrmSeq.cpp:312
SoftSequence * loaded
current association. may be NULL
Definition: mrmSeq.cpp:66
std::string last_err
Definition: mrmSeq.cpp:358
virtual void mapTriggerSrc(unsigned i, unsigned src)=0

◆ lock()

virtual void SoftSequence::lock ( ) const
inlinevirtual

Implements mrf::Object.

Definition at line 140 of file mrmSeq.cpp.

140 { mutex.lock(); }
epicsMutex mutex
Definition: mrmSeq.cpp:319

◆ setEventCode()

void SoftSequence::setEventCode ( const epicsUInt8 *  arr,
epicsUInt32  count 
)
inline

Definition at line 220 of file mrmSeq.cpp.

221  {
222  codes_t codes(count);
223  std::copy(arr,
224  arr+count,
225  codes.begin());
226  {
227  SCOPED_LOCK(mutex);
228  scratch.codes.swap(codes);
229  is_committed = false;
230  }
231  DEBUG(4, ("Set events\n"));
232  scanIoRequest(changed);
233  }
#define DEBUG(LVL, ARGS)
Definition: mrmSeq.cpp:45
bool is_committed
clear when scratch and commited sequences differ
Definition: mrmSeq.cpp:346
epicsMutex mutex
Definition: mrmSeq.cpp:319
struct SoftSequence::Config scratch
IOSCANPVT changed
Definition: mrmSeq.cpp:356
std::vector< epicsUInt8 > codes_t
Definition: mrmSeq.cpp:322

◆ setRunMode()

void SoftSequence::setRunMode ( epicsUInt32  mode)
inline

Definition at line 263 of file mrmSeq.cpp.

264  {
265  switch(mode) {
266  case Single:
267  case Normal:
268  break;
269  default:
270  throw std::runtime_error("Unknown sequencer run mode");
271  }
272 
273  {
274  SCOPED_LOCK(mutex);
275  scratch.mode = (RunMode)mode;
276  is_committed = false;
277  }
278  DEBUG(4, ("Set run mode %u\n", (unsigned)mode));
279  scanIoRequest(changed);
280  }
#define DEBUG(LVL, ARGS)
Definition: mrmSeq.cpp:45
bool is_committed
clear when scratch and commited sequences differ
Definition: mrmSeq.cpp:346
epicsMutex mutex
Definition: mrmSeq.cpp:319
RunMode
Definition: mrmSeq.cpp:50
struct SoftSequence::Config scratch
IOSCANPVT changed
Definition: mrmSeq.cpp:356

◆ setTimestamp()

void SoftSequence::setTimestamp ( const double *  arr,
epicsUInt32  count 
)
inline

Definition at line 182 of file mrmSeq.cpp.

183  {
184  const double tmult = getTimeScale();
185  times_t times(count);
186  // check for monotonic
187  // TODO: not handling overflow (HW supports controlled rollover w/ special 0xffffffff times)
188  for(epicsUInt32 i=0; i<count; i++)
189  {
190  if(!finite(arr[i]) || arr[i]<0.0)
191  throw std::runtime_error("times must be finite >=0");
192 
193  times[i] = (arr[i]*tmult)+0.5;
194 
195  if(i>0 && times[i]<=times[i-1])
196  throw std::runtime_error("Non-monotonic timestamp array");
197  else if(times[i]==0xffffffff)
198  throw std::runtime_error("Time overflow, rollover not supported");
199  }
200  {
201  SCOPED_LOCK(mutex);
202  scratch.times.swap(times);
203  is_committed = false;
204  }
205  DEBUG(4, ("Set times\n"));
206  scanIoRequest(changed);
207  }
#define DEBUG(LVL, ARGS)
Definition: mrmSeq.cpp:45
bool is_committed
clear when scratch and commited sequences differ
Definition: mrmSeq.cpp:346
epicsMutex mutex
Definition: mrmSeq.cpp:319
struct SoftSequence::Config scratch
std::vector< epicsUInt64 > times_t
Definition: mrmSeq.cpp:321
IOSCANPVT changed
Definition: mrmSeq.cpp:356

◆ setTimestampResolution()

void SoftSequence::setTimestampResolution ( epicsUInt32  val)
inline

Definition at line 151 of file mrmSeq.cpp.

152  {
153  {
154  SCOPED_LOCK(mutex);
155  timeScale = val;
156  }
157  DEBUG(4, ("Set time scale\n"));
158  scanIoRequest(changed);
159  }
#define DEBUG(LVL, ARGS)
Definition: mrmSeq.cpp:45
epicsMutex mutex
Definition: mrmSeq.cpp:319
IOSCANPVT changed
Definition: mrmSeq.cpp:356
epicsUInt32 timeScale
Definition: mrmSeq.cpp:354

◆ setTrigSrc()

void SoftSequence::setTrigSrc ( epicsUInt32  src)
inline

Definition at line 245 of file mrmSeq.cpp.

246  {
247  DEBUG(4, ("Setting trig src %x\n", (unsigned)src));
248  {
249  SCOPED_LOCK(mutex);
250  scratch.src = src;
251  is_committed = false;
252  }
253  DEBUG(4, ("Set trig src %x\n", (unsigned)src));
254  scanIoRequest(changed);
255  }
#define DEBUG(LVL, ARGS)
Definition: mrmSeq.cpp:45
bool is_committed
clear when scratch and commited sequences differ
Definition: mrmSeq.cpp:346
epicsUInt32 src
Definition: mrmSeq.cpp:328
epicsMutex mutex
Definition: mrmSeq.cpp:319
struct SoftSequence::Config scratch
IOSCANPVT changed
Definition: mrmSeq.cpp:356

◆ softTrig()

void SoftSequence::softTrig ( )

Definition at line 410 of file mrmSeq.cpp.

411 {
412  DEBUG(3, ("SW Triggering\n") );
413  SCOPED_LOCK(mutex);
414  if(!hw || !is_enabled) {DEBUG(3, ("Skip\n")); return;}
415 
416  {
417  interruptLock L;
419  }
420  DEBUG(2, ("SW Triggered\n") );
421 }
SeqHW * hw
Definition: mrmSeq.cpp:317
bool is_enabled
Whether user has requested enable.
Definition: mrmSeq.cpp:344
#define DEBUG(LVL, ARGS)
Definition: mrmSeq.cpp:45
INLINE void nat_iowrite32(volatile void *addr, epicsUInt32 val)
Definition: mrfIoOpsDef.h:55
epicsMutex mutex
Definition: mrmSeq.cpp:319
#define EVG_SEQ_RAM_SW_TRIG
Definition: mrmSeq.cpp:27
volatile void *const ctrlreg
Definition: mrmSeq.cpp:60
epicsUInt32 ctrlreg_hw
current in HW. either same as _user or trigger disabled
Definition: mrmSeq.cpp:70

◆ stateChange()

IOSCANPVT SoftSequence::stateChange ( ) const
inline

Definition at line 294 of file mrmSeq.cpp.

294 { return changed; }
IOSCANPVT changed
Definition: mrmSeq.cpp:356

◆ sync()

void SoftSequence::sync ( )

Definition at line 574 of file mrmSeq.cpp.

575 {
576  DEBUG(3, ("Syncing %c\n", is_insync ? 'Y' : 'N') );
577  if(is_insync)
578  {DEBUG(3, ("Skip\n")); return;}
579 
580  assert(hw);
581 
583  // we may still be _ENABLED at this point, but the trigger source is set to
584  // Disabled, so this makes no difference.
585  epicsInterruptContextMessage("SoftSequence::sync() while running\n");
586  return;
587  }
588 
589  // At this point the sequencer is not running and effectively disabled.
590  // From paranoia, reset it anyway
592 
594 
595  switch(committed.mode) {
596  case Single:
598  break;
599  case Normal:
601  break;
602  }
603 
604  epicsUInt8 src;
605 
606  // default to disabled
607  switch(owner->type) {
608  case SeqManager::TypeEVG:
609  src = 31;
610  break;
611  case SeqManager::TypeEVR:
612  src = 63;
613  break;
614  default:
615  return;
616  }
617 
618  // paranoia: disable any external trigger mappings
619  owner->mapTriggerSrc(hw->idx, 0x02000000);
620 
621  // map trigger source codes
622  // MSB governs the type of mapping
623  switch(committed.src&0xff000000) {
624  case 0x00000000: // raw mapping
625  DEBUG(5, (" Raw mapping %x\n", committed.src));
626  // LSB is code
627  src = committed.src&0xff;
628  break;
629  case 0x01000000: // software trigger mapping
630  DEBUG(5, (" SW mapping %x\n", committed.src));
631  // ignore 0x00ffffff
632  switch(owner->type) {
633  case SeqManager::TypeEVG:
634  src = 17+hw->idx;
635  break;
636  case SeqManager::TypeEVR:
637  src = 61;
638  break;
639  }
640  break;
641  case 0x02000000: // external trigger
642  DEBUG(5, (" EXT mapping %x\n", committed.src));
644  // pass through to sub-class
646  src = 24+hw->idx;
647  }
648  break;
649  case 0x03000000: // disable trigger
650  DEBUG(5, (" NO mapping %x\n", committed.src));
651  // use default
652  break;
653  default:
654  DEBUG(0, ("unknown sequencer trigger code %08x\n", (unsigned)committed.src));
655  break;
656  }
657  DEBUG(5, (" Trig Src %x\n", src));
658 
659  hw->ctrlreg_user |= src;
660 
661  // write out the RAM
662  volatile epicsUInt32 *ram = static_cast<volatile epicsUInt32 *>(hw->rambase);
663  for(size_t i=0, N=committed.codes.size(); i<N; i++)
664  {
665  nat_iowrite32(ram++, committed.times[i]);
666  nat_iowrite32(ram++, committed.codes[i]);
667  if(committed.codes[i]==0x7f)
668  break;
669  }
670 
671  {
672  epicsUInt32 ctrl = hw->ctrlreg_hw = hw->ctrlreg_user;
673  if(is_enabled)
674  ctrl |= EVG_SEQ_RAM_ARM;
675  else
676  ctrl |= EVG_SEQ_RAM_DISABLE; // paranoia
677 
678  DEBUG(3, (" SeqCtrl %x\n", ctrl));
679  nat_iowrite32(hw->ctrlreg, ctrl);
680  }
681 
682  is_insync = true;
683  DEBUG(3, ("In Sync\n") );
684 }
SeqHW * hw
Definition: mrmSeq.cpp:317
const Type type
Definition: mrmSeq.h:36
bool is_enabled
Whether user has requested enable.
Definition: mrmSeq.cpp:344
bool is_insync
Definition: mrmSeq.cpp:349
#define DEBUG(LVL, ARGS)
Definition: mrmSeq.cpp:45
#define EVG_SEQ_RAM_RESET
Definition: mrmSeq.cpp:28
INLINE void nat_iowrite32(volatile void *addr, epicsUInt32 val)
Definition: mrfIoOpsDef.h:55
epicsUInt32 src
Definition: mrmSeq.cpp:328
#define EVG_SEQ_RAM_RUNNING
Definition: mrmSeq.cpp:23
INLINE epicsUInt32 nat_ioread32(volatile void *addr)
Definition: mrfIoOpsDef.h:48
#define EVG_SEQ_RAM_SRC_MASK
Definition: mrmSeq.cpp:38
#define EVG_SEQ_RAM_REPEAT_MASK
Definition: mrmSeq.cpp:33
#define EVG_SEQ_RAM_DISABLE
Definition: mrmSeq.cpp:29
#define EVG_SEQ_RAM_ARM
Definition: mrmSeq.cpp:30
volatile void *const ctrlreg
Definition: mrmSeq.cpp:60
volatile void *const *const rambase
Definition: mrmSeq.cpp:60
struct SoftSequence::Config committed
const unsigned idx
Definition: mrmSeq.cpp:59
#define EVG_SEQ_RAM_NORMAL
Definition: mrmSeq.cpp:34
#define EVG_SEQ_RAM_SINGLE
Definition: mrmSeq.cpp:35
SeqManager *const owner
Definition: mrmSeq.cpp:312
epicsUInt32 ctrlreg_hw
current in HW. either same as _user or trigger disabled
Definition: mrmSeq.cpp:70
epicsUInt32 ctrlreg_user
user requested (based on commited sequence)
Definition: mrmSeq.cpp:70
virtual void mapTriggerSrc(unsigned i, unsigned src)=0

◆ unload()

void SoftSequence::unload ( )

Definition at line 463 of file mrmSeq.cpp.

464 {
465  SCOPED_LOCK(mutex);
466  DEBUG(3, ("Unloading %c\n", hw ? 'L' : 'U') );
467 
468  if(!hw) {DEBUG(3, ("Skip\n")); return;}
469 
470  assert(hw->loaded=this);
471 
472  {
473  interruptLock L;
474 
475  hw->disarm();
476 
477  hw->loaded = NULL;
478  hw = NULL;
479 
480  is_insync = false;
481  }
482 
483  scanIoRequest(changed);
484  DEBUG(1, ("Unloaded\n") );
485 
486 }
SeqHW * hw
Definition: mrmSeq.cpp:317
bool is_insync
Definition: mrmSeq.cpp:349
bool disarm()
Definition: mrmSeq.cpp:109
#define DEBUG(LVL, ARGS)
Definition: mrmSeq.cpp:45
epicsMutex mutex
Definition: mrmSeq.cpp:319
IOSCANPVT changed
Definition: mrmSeq.cpp:356
SoftSequence * loaded
current association. may be NULL
Definition: mrmSeq.cpp:66

◆ unlock()

virtual void SoftSequence::unlock ( ) const
inlinevirtual

Implements mrf::Object.

Definition at line 141 of file mrmSeq.cpp.

141 { mutex.unlock(); }
epicsMutex mutex
Definition: mrmSeq.cpp:319

Member Data Documentation

◆ changed

IOSCANPVT SoftSequence::changed

Definition at line 356 of file mrmSeq.cpp.

◆ committed

struct SoftSequence::Config SoftSequence::committed

◆ hw

SeqHW* SoftSequence::hw

guarded by our mutex and interruptLock only write when both held read when either held

Definition at line 317 of file mrmSeq.cpp.

◆ is_committed

bool SoftSequence::is_committed

clear when scratch and commited sequences differ

Definition at line 346 of file mrmSeq.cpp.

◆ is_enabled

bool SoftSequence::is_enabled

Whether user has requested enable.

Definition at line 344 of file mrmSeq.cpp.

◆ is_insync

bool SoftSequence::is_insync

clear when the commited sequence differs from the HW sequence (eg. commit while running) Guarded by interruptLock only

Definition at line 349 of file mrmSeq.cpp.

◆ last_err

std::string SoftSequence::last_err

Definition at line 358 of file mrmSeq.cpp.

◆ mutex

epicsMutex SoftSequence::mutex
mutable

Definition at line 319 of file mrmSeq.cpp.

◆ numEnd

epicsUInt32 SoftSequence::numEnd

Definition at line 352 of file mrmSeq.cpp.

◆ numStart

epicsUInt32 SoftSequence::numStart

Guarded by interruptLock only.

Definition at line 352 of file mrmSeq.cpp.

◆ onEnd

IOSCANPVT SoftSequence::onEnd

Definition at line 356 of file mrmSeq.cpp.

◆ onErr

IOSCANPVT SoftSequence::onErr

Definition at line 356 of file mrmSeq.cpp.

◆ onStart

IOSCANPVT SoftSequence::onStart

Definition at line 356 of file mrmSeq.cpp.

◆ owner

SeqManager* const SoftSequence::owner

Definition at line 312 of file mrmSeq.cpp.

◆ scratch

struct SoftSequence::Config SoftSequence::scratch

◆ timeScale

epicsUInt32 SoftSequence::timeScale

Definition at line 354 of file mrmSeq.cpp.


The documentation for this struct was generated from the following file: