...
Gliffy Diagram | ||||||||
---|---|---|---|---|---|---|---|---|
|
Gliffy Diagram macroId 7ff4ec5a-b11f-45fa-85cd-32e9aa483bea displayName Processor.hh name Processor.hh pagePin 5
Gliffy Diagram macroId 5b09a810-5454-4cc7-a7e3-a4a5ee61db4e displayName Processor.cc name Processor.cc pagePin 79
TBD
This contains a list of the capabilities of the module/package i detail. The reader should be able to understand the basic functionalities of this package/module by reading this text.
...
Gliffy Diagram | ||||||||
---|---|---|---|---|---|---|---|---|
|
Anchor | ||||
---|---|---|---|---|
|
Gliffy Diagram | ||||||
---|---|---|---|---|---|---|
|
Gliffy Diagram | ||||||
---|---|---|---|---|---|---|
|
...
BSA asyn driver also contains a global static pointer that points to a linkedList of all drivers instantiated, and contains the same set of linkedList functions that were described above. The node structure is as follows
(TODO: convert code into diagram, adding bsaAsynDriver, pBsaEllList, and pBsaBridge)
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
Code Block | ||||||
| ||||||
typedef struct { ELLNODE node; char *named_root; char *port; bsaAsynDriver *pBsaDrv; ELLLIST *pBsaEllList; void *_pBsaBridge; } pDrvList_t; |
The functions operating on the linked list are as follows:
...
...
...
...
...
...
bsaAsynDriver is a class defined in bsaAsynDriver.h: class bsaAsynDriver:asynPortDriver.
The linked list pBsaEllList contains elements of the struct bsaList_t. This struct represents one BSA channel.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
typedef struct {
ELLNODE node;
ELLLIST *pSlaveEllList; // slave node
char bsa_name[64]; // bsa name
char bsa_type[32]; // bsa datatype
int firstParam;
int p_num[MAX_BSA_ARRAY]; // asyn parameter for number of average, asynFloat64Array, RO
int p_mean[MAX_BSA_ARRAY]; // asyn parameter for average value, asynFloat64Array, RO
int p_rms2[MAX_BSA_ARRAY]; // asyn parameter for rms2 value, asynFloat64Array, RO
int p_slope; // asyn parameter for linear conversion, asynFloat64, RW
int p_offset; // asyn parameter for linear conversion, asynFloat64, RW
int lastParam;
double slope;
double offset;
bsaDataType_t type;
devBsaPvt_t ppvt_num[MAX_BSA_ARRAY];
devBsaPvt_t ppvt_mean[MAX_BSA_ARRAY];
devBsaPvt_t ppvt_rms2[MAX_BSA_ARRAY];
char pname_num[MAX_BSA_ARRAY][64];
char pname_mean[MAX_BSA_ARRAY][64];
char pname_rms2[MAX_BSA_ARRAY][64];
char pname_slope[64];
char pname_offset[64];
bool doNotTouch;
} bsaList_t; |
_pBsaBridge receives pProcessor→getHardware(), a class defined in the timing/bsa module.
devBsaPvt_t is defined in the devScBsa.h file:
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
typedef struct {
void *dpvt;
epicsTimeStamp ts;
int nreq;
int entry_sz;
void *bptr;
} devBsaPvt_t; |
The functions operating on the linked list are as follows:
bsaAdd() initializes a bsaList_t structure and stores it in the pBsaEllList ELL linked list. pBsaEllList is stored in the structure pDrvList_t of the bsaAsynDriver.cpp file. There are different structures named as pDrvList_t in other files of the bsaDriver EPICS module, so care must be taken to not get confused. This is a visual pointer structure operated by bsaAdd():
Gliffy Diagram | ||||||||
---|---|---|---|---|---|---|---|---|
|
The software assumes that the sequence of commands called in the IOC's st.cmd file is the following:
If the IOC controls more than one ATCA carrier board, then steps 1 to 4 above are repeated in the same order. If, for example, you called all 4 commands above for board 1, it is not possible to call bsaAdd() expecting it will be applied to board 1 again. After bsaAsynDriverConfigure() the door is closed to add additional BSA channels.
bsaAdd() starts by searching for getting the last element of the pDrvEllList linked list. This is the list that contains the configuration for each ATCA carrier board. One element of this list corresponds to one carrier board. The software assumes that the last element of the list is the one that is still open to receive BSA channels with bsaAdd(). It obtains the last element and check if the pointer to a pBsaDrv is null or if the port is still not defined. These two configurations only happen when bsaAsynDriverConfigure() is called. If the driver was not configured yet, then we are adding BSA channels to the right pDrvList_t. In case the driver is configured, this means that addBsa was called for the first time after cpswLoadYamlFile(). This way, a new pDrvList_t element must be created and appended to the end of the pDrvEllList linked list.
...