Project

General

Profile

Add VME Module » History » Version 2

Ole Hansen, 04/05/2018 09:35 AM

1 1 Ole Hansen
h1.  How to add a VME Module to Podd
2
3
R. Michaels, Mar 23, 2015
4
5
A VME module is a device that sits in a VME crate and reads data. This document explains how to add a new VME module to the decoder for the Podd analyzer.
6
7
Note: I don't expect anyone to invent a new Fastbus module, so I'm only explaining VME. This is part of the "OO Decoder Upgrade" circa 2014.
8
9
Follow these steps. Details are shown below.
10
11
* Write a module class that inherits from VmeModule. An example would be SkeletonModule. You could copy that and make changes.
12
* Warning: your class must not be abstract ! If it is, the module will not be instantiated. (this means that methods=0 in base class must be defined).
13
* Add the "DoRegister" lines to your new module class. Note, each module has a unique identifying number, the "model number". E.g. 3801 for a Struck model 3801 scaler.
14
* Add the class to the namespace Decoder in Decoder.h
15
* Add it to the Makefile
16
* Add it to the haDecode_LinkDef.h file
17
* Add the appropriate lines to the crate map file db_cratemap.dat 
18
19
Note that you can also "make your module a plugin":https://github.com/JeffersonLab/analyzer/blob/master/hana_decode/README_NEWMODULE.md. Using a plugin in Podd is an ideal way to develop and test your new module. (Thanks to Steve Wood for that.)
20
21
Here are a few technical details.
22
23
The "DoRegister" lines look like this, e.g. in @Fadc250Module.C@
24
25
<pre>
26
 Module::TypeIter_t Fadc250Module::fgThisType =
27
    DoRegister( ModuleType( "Decoder::Fadc250Module" , 250 ));
28
</pre>
29
30
The last number (250) is the "model number" and must be unique for
31
that class.  It essentially signals what class to use.
32
The model number must also appear in the @db_cratemap.dat@ file.
33
Actually, this was always the case.
34
35
The line in haDecode_LinkDef.h looks like this:
36
<pre>
37
#pragma link C++ class Decoder::Fadc250Module+; 
38
</pre> 
39
40
Important: If you fail to add the above line to @haDecode_LinkDef.h@ the code
41
will compile and run, but the class is not instantiated (and an error
42
message is shown) which means basically no module.  It could take awhile
43
to figure that out if you miss the error messages.
44
45
The OO Decoder is very reliant on the @db_cratemap.dat@ file, so effort
46
must be put into making that correct.  If a module is not in the cratemap
47
it will be ignored !  Put in all modules that were ever used during the 
48
experiment.  If a module is in the cratemap but not defined, a warning 
49
is issued.  For example, there is no such thing as a model 5678 VME module.  
50
For Fastbus (unlike VME !), the modules are discoverable from the data, 
51
and if they are not in the cratemap a warning is issued.  Fix it.  
52
53
One advantage of the new OO Decoder scheme is that you can "Get"
54
a module.  This is useful for modules with complex behaviour.
55
See @tstfadc_main.C@, @tstf1tdc_main.C@, or @tstskel_main.C@
56
for examples
57 2 Ole Hansen
<pre><code class="cpp">
58 1 Ole Hansen
fadc = evdata->GetModule(9,5); // crate 9, slot 5
59
60
if (fadc->GetMode()==1) {// do one thing, e.g.
61
    h1->Fill(fadc->GetData(1,11,0));
62
} 
63
if (fadc->GetMode()==2)
64
    cout<<"do something else"; 
65 2 Ole Hansen
</code></pre>