mrfioc2  2.3.0
mrmevgseq.cpp
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2016 Michael Davidsaver
3 * mrfioc2 is distributed subject to a Software License Agreement found
4 * in file LICENSE that is included with this distribution.
5 \*************************************************************************/
6 
7 #if defined(__rtems__)
8 # include <rtems.h>
9 #endif
10 
11 #include <stdio.h>
12 
13 #include <mrfCommonIO.h>
14 
15 #include "mrmevgseq.h"
16 #include "evgMrm.h"
17 
18 #include "evgRegMap.h"
19 
20 #if defined(__rtems__)
21 # define DEBUG(LVL, ARGS) do{if(SeqManagerDebug>=(LVL)) {printk ARGS ;}}while(0)
22 #elif defined(vxWorks)
23 # define DEBUG(LVL, ARGS) do{}while(0)
24 #else
25 # define DEBUG(LVL, ARGS) do{if(SeqManagerDebug>=(LVL)) {printf ARGS ;}}while(0)
26 #endif
27 
28 EvgSeqManager::EvgSeqManager(evgMrm *owner, volatile epicsUInt8 *base)
29  :SeqManager(owner->name()+":SEQMGR", TypeEVG)
30  ,owner(owner)
31  ,base(base)
32 {
33  addHW(0, base + U32_SeqControl(0) , base + U32_SeqRamTS(0,0));
34  addHW(1, base + U32_SeqControl(1) , base + U32_SeqRamTS(1,0));
35 }
36 
38 
40 {
41  return owner->getFrequency()*1e6;
42 }
43 
45 void EvgSeqManager::mapTriggerSrc(unsigned i, unsigned src)
46 {
47  assert(i<=1);
48  /* Input mapping special codes 0x02xxxxxx
49  *
50  * 0x20000000 - Disable
51  * 0x020100xx - Front panel in
52  * 0x020200xx - UV in
53  * 0x020300xx - TB in
54  */
55  if((src&0xff000000)!=0x02000000) {
56  DEBUG(0, ("EvgSeqManager::mapTriggerSrc unsupported %x\n", src));
57  return;
58  }
59 
60  InputType itype = (InputType)((src>>16)&0xff);
61  unsigned idx = src&0xff;
62 
63  for(evgMrm::inputs_iterator it = owner->beginInputs(), end = owner->endInputs();
64  it!=end; ++it)
65  {
66  bool match = it->first.second==itype && it->first.first==idx;
67  evgInput *inp = it->second;
68  epicsUInt32 map = inp->getSeqTrigMap();
69  // set or clear sequencer trigger bit
70  if(match)
71  map |= 1u<<i;
72  else
73  map &= ~(1u<<i);
74  inp->setSeqTrigMap(map);
75  }
76 }
77 
80 {
81  // SoS for sequencer 0 is bit 8
82  return (NAT_READ32(base, IrqFlag)>>8)&0x3;
83 }
virtual void mapTriggerSrc(unsigned i, unsigned src)
Called from ISR.
Definition: mrmevgseq.cpp:45
epicsFloat64 getFrequency() const
Definition: evgEvtClk.cpp:15
#define U32_SeqControl(n)
Definition: evgRegMap.h:142
virtual double getClkFreq() const
Definition: mrmevgseq.cpp:39
virtual epicsUInt32 testStartOfSeq()
Called from ISR.
Definition: mrmevgseq.cpp:79
#define U32_SeqRamTS(n, m)
Definition: evgRegMap.h:231
epicsUInt32 getSeqTrigMap() const
Definition: evgInput.cpp:92
inputs_iterator endInputs()
Definition: evgMrm.h:187
EvgSeqManager(evgMrm *owner, volatile epicsUInt8 *base)
Definition: mrmevgseq.cpp:28
#define NAT_READ32(base, offset)
Definition: mrfCommonIO.h:145
virtual ~EvgSeqManager()
Definition: mrmevgseq.cpp:37
InputType
Definition: evgInput.h:11
#define DEBUG(LVL, ARGS)
Definition: mrmevgseq.cpp:25
void addHW(unsigned i, volatile void *ctrl, volatile void *ram)
Definition: mrmSeq.cpp:765
Input_t::iterator inputs_iterator
Definition: evgMrm.h:185
void setSeqTrigMap(epicsUInt32)
Definition: evgInput.cpp:78
Definition: evgMrm.h:56
inputs_iterator beginInputs()
Definition: evgMrm.h:186