mrfioc2  2.3.0
devMrmBuf.cpp
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2015 Paul Scherrer Institute (PSI), Villigen, Switzerland
3 * mrfioc2 is distributed subject to a Software License Agreement found
4 * in file LICENSE that is included with this distribution.
5 \*************************************************************************/
6 #include "devObj.h"
7 #include "mrf/object.h"
8 #include "mrf/databuf.h"
9 #include "mrmDataBufTx.h"
10 
11 #include <epicsExport.h>
12 #include "devMrmBuf.h"
13 
14 #define BUF_RX ":BUFRX"
15 #define BUF_TX ":BUFTX"
16 
17 struct mrmBufferInfo {
20 };
21 
22 extern "C" {
23 
24 mrmBufferInfo_t *mrmBufInit(const char *dev_name) {
25 
26  mrmBufferInfo_t *data = NULL;
27  mrf::Object *object = NULL;
28  std::string bufRxName(dev_name);
29  std::string bufTxName(dev_name);
30 
31  if(!dev_name) {
32  errlogPrintf("mrmBufInit ERROR: NULL device name!\n");
33  return NULL;
34  }
35 
36  if(!(data = (mrmBufferInfo_t *)calloc(1, sizeof(mrmBufferInfo_t)))) {
37  errlogPrintf("mrmBufInit ERROR: failed to allocate memory for buffer info!\n");
38  return NULL;
39  }
40 
41  bufRxName += BUF_RX;
42  bufTxName += BUF_TX;
43 
44  object = mrf::Object::getObject(bufRxName);
45  if(!object) {
46  errlogPrintf("mrmBufInit WARNING: failed to find object '%s'\n", bufRxName.c_str());
47  } else {
48  data->bufRx = dynamic_cast<dataBufRx*>(object);
49  }
50 
51  object = mrf::Object::getObject(bufTxName);
52  if(!object) {
53  errlogPrintf("mrmBufInit WARNING: failed to find object '%s'\n", bufTxName.c_str());
54  } else {
55  data->bufTx = dynamic_cast<mrmDataBufTx*>(object);
56  }
57 
58  if(!data->bufRx && !data->bufTx) {
59  errlogPrintf("mrmBufInit: ERROR: failed to find both objects!\n");
60  free(data);
61  data = NULL;
62  }
63 
64  return data;
65 }
66 
67 epicsStatus mrmBufRxSupported(mrmBufferInfo_t *data) {
68 
69  if(!data) {
70  errlogPrintf("mrmBufRxSupported ERROR: NULL data parameter!\n");
71  return -1;
72  }
73 
74  if(data->bufRx) {
75  return 1;
76  }
77 
78  return 0;
79 }
80 
81 epicsStatus mrmBufTxSupported(mrmBufferInfo_t *data) {
82 
83  if(!data) {
84  errlogPrintf("mrmBufTxSupported ERROR: NULL data parameter!\n");
85  return -1;
86  }
87 
88  if(data->bufTx) {
89  return 1;
90  }
91 
92  return 0;
93 
94 }
95 
96 epicsStatus mrmBufEnable(mrmBufferInfo_t *data) {
97 
98  if(data && data->bufRx) {
99  data->bufRx->dataRxEnable(true);
100  }
101 
102  if(data && data->bufTx) {
103  data->bufTx->dataTxEnable(true);
104  }
105 
106  return 0;
107 }
108 
109 epicsStatus mrmBufDisable(mrmBufferInfo_t *data) {
110 
111  if(data && data->bufRx) {
112  data->bufRx->dataRxEnable(false);
113  }
114 
115  if(data && data->bufTx) {
116  data->bufTx->dataTxEnable(false);
117  }
118 
119  return 0;
120 }
121 
122 epicsStatus mrmBufMaxLen(mrmBufferInfo *data, epicsUInt32 *maxLength) {
123 
124  if(!data->bufTx) {
125  errlogPrintf("mrmBufMaxLen: ERROR: transfer structure not initialized!\n");
126  return -1;
127  }
128 
129  try {
130  *maxLength = data->bufTx->lenMax();
131  } catch(std::exception &e) {
132  errlogPrintf("mrmBufMaxLen: EXCEPTION: %s\n", e.what());
133  return -1;
134  }
135 
136  return 0;
137 }
138 
139 epicsStatus mrmBufSend(mrmBufferInfo *data, epicsUInt32 len, epicsUInt8 *buf) {
140 
141  if(!data->bufTx) {
142  errlogPrintf("mrmBufSend: ERROR: transfer structure not initialized!\n");
143  return -1;
144  }
145 
146  try {
147  data->bufTx->dataSend(len, buf);
148  } catch(std::exception &e) {
149  errlogPrintf("mrmBufSend: EXCEPTION: %s\n", e.what());
150  return -1;
151  }
152 
153  return 0;
154 }
155 
156 epicsStatus mrmBufRegCallback(mrmBufferInfo *data, mrmBufRecievedCallback callback, void * pass) {
157 
158  if(!data->bufRx) {
159  errlogPrintf("mrmBufRegCallback: ERROR: receive structure not initialized!\n");
160  return -1;
161  }
162 
163  try {
164  data->bufRx->dataRxAddReceive(callback, pass);
165  } catch(std::exception &e) {
166  errlogPrintf("mrmBufRegCallback: EXCEPTION: %s\n", e.what());
167  return -1;
168  }
169 
170  return 0;
171 }
172 
173 } /* extern "C" */
mrmDataBufTx * bufTx
Definition: devMrmBuf.cpp:19
#define BUF_RX
Definition: devMrmBuf.cpp:14
epicsStatus mrmBufRxSupported(mrmBufferInfo_t *data)
Checks whether receive buffer is supported.
Definition: devMrmBuf.cpp:67
epicsStatus mrmBufEnable(mrmBufferInfo_t *data)
Disable buffer sending logic.
Definition: devMrmBuf.cpp:96
void(* mrmBufRecievedCallback)(void *arg, epicsStatus status, epicsUInt32 length, const epicsUInt8 *buffer)
Buffer received callback function.
Definition: devMrmBuf.h:33
epicsStatus mrmBufRegCallback(mrmBufferInfo *data, mrmBufRecievedCallback callback, void *pass)
Register data receive callback function.
Definition: devMrmBuf.cpp:156
epicsStatus mrmBufTxSupported(mrmBufferInfo_t *data)
Checks whether transferring buffer is supported.
Definition: devMrmBuf.cpp:81
Base object inspection.
Definition: object.h:378
static Object * getObject(const std::string &name)
Definition: object.cpp:107
C interface for data buffer sending and receiving.
epicsStatus mrmBufSend(mrmBufferInfo *data, epicsUInt32 len, epicsUInt8 *buf)
Send buffer data.
Definition: devMrmBuf.cpp:139
virtual epicsUInt32 lenMax() const OVERRIDE FINAL
virtual void dataTxEnable(bool) OVERRIDE FINAL
mrmBufferInfo_t * mrmBufInit(const char *dev_name)
Initialize buffer data structure.
Definition: devMrmBuf.cpp:24
epicsStatus mrmBufMaxLen(mrmBufferInfo *data, epicsUInt32 *maxLength)
Get maximum supported buffer length.
Definition: devMrmBuf.cpp:122
#define BUF_TX
Definition: devMrmBuf.cpp:15
virtual void dataRxEnable(bool)=0
virtual void dataSend(epicsUInt32 len, const epicsUInt8 *buf) OVERRIDE FINAL
Transmit a byte array.
dataBufRx * bufRx
Definition: devMrmBuf.cpp:18
epicsStatus mrmBufDisable(mrmBufferInfo_t *data)
Disable buffer sending logic.
Definition: devMrmBuf.cpp:109
virtual void dataRxAddReceive(dataBufComplete fptr, void *arg=0)=0
Register to receive data buffers.