EPICS Base  7.0.6.1
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
chfPlugin.h
Go to the documentation of this file.
1 /*************************************************************************\
2 * Copyright (c) 2010 Brookhaven National Laboratory.
3 * Copyright (c) 2010 Helmholtz-Zentrum Berlin
4 * für Materialien und Energie GmbH.
5 * Copyright (c) 2014 ITER Organization.
6 * SPDX-License-Identifier: EPICS
7 * EPICS BASE is distributed subject to a Software License Agreement found
8 * in file LICENSE that is included with this distribution.
9 \*************************************************************************/
10 
11 /*
12  * Author: Ralph Lange <[email protected]>
13  */
14 
15 /* Based on the linkoptions utility by Michael Davidsaver (BNL) */
16 
17 #ifndef CHFPLUGIN_H
18 #define CHFPLUGIN_H
19 
20 #include <dbCoreAPI.h>
21 #include <dbDefs.h>
22 #include <epicsTypes.h>
23 #include <dbChannel.h>
24 
25 struct db_field_log;
26 
82 #ifdef __cplusplus
83 extern "C" {
84 #endif
85 
90 typedef struct chfPluginIf {
91 
92  /* Memory management */
103  void * (* allocPvt) (void);
104 
115  void (* freePvt) (void *pvt);
116 
117  /* Parameter parsing results */
124  void (* parse_error) (void *pvt);
125 
135  int (* parse_ok) (void *pvt);
136 
137  /* Channel operations */
146  long (* channel_open) (dbChannel *chan, void *pvt);
147 
170  void (* channelRegisterPre) (dbChannel *chan, void *pvt,
171  chPostEventFunc **cb_out, void **arg_out,
172  db_field_log *probe);
173 
197  void (* channelRegisterPost) (dbChannel *chan, void *pvt,
198  chPostEventFunc **cb_out, void **arg_out,
199  db_field_log *probe);
200 
210  void (* channel_report) (dbChannel *chan, void *pvt, int level, const unsigned short indent);
211 
218  void (* channel_close) (dbChannel *chan, void *pvt);
219 
220 } chfPluginIf;
221 
222 typedef enum chfPluginArg {
223  chfPluginArgInvalid=0,
224  chfPluginArgBoolean,
225  chfPluginArgInt32,
226  chfPluginArgDouble,
227  chfPluginArgString,
228  chfPluginArgEnum
229 } chfPluginArg;
230 
231 typedef struct chfPluginEnumType {
232  const char *name;
233  const int value;
235 
236 typedef struct chfPluginArgDef {
237  const char * name;
238  chfPluginArg optType;
239  unsigned int required:1;
240  unsigned int convert:1;
241  unsigned int tagged:1;
242  epicsUInt32 tagOffset;
243  epicsUInt32 choice;
244  epicsUInt32 dataOffset;
245  epicsUInt32 size;
246  const chfPluginEnumType *enums;
248 
249 /* Simple arguments */
250 
251 #define chfInt32(Struct, Member, Name, Req, Conv) \
252  {Name, chfPluginArgInt32, Req, Conv, 0, 0, 0, \
253  OFFSET(Struct, Member), sizeof( ((Struct*)0)->Member ), NULL}
254 
255 #define chfBoolean(Struct, Member, Name, Req, Conv) \
256  {Name, chfPluginArgBoolean, Req, Conv, 0, 0, 0, \
257  OFFSET(Struct, Member), sizeof( ((Struct*)0)->Member ), NULL}
258 
259 #define chfDouble(Struct, Member, Name, Req, Conv) \
260  {Name, chfPluginArgDouble, Req, Conv, 0, 0, 0, \
261  OFFSET(Struct, Member), sizeof( ((Struct*)0)->Member ), NULL}
262 
263 #define chfString(Struct, Member, Name, Req, Conv) \
264  {Name, chfPluginArgString, Req, Conv, 0, 0, 0, \
265  OFFSET(Struct, Member), sizeof( ((Struct*)0)->Member ), NULL}
266 
267 #define chfEnum(Struct, Member, Name, Req, Conv, Enums) \
268  {Name, chfPluginArgEnum, Req, Conv, 0, 0, 0, \
269  OFFSET(Struct, Member), sizeof( ((Struct*)0)->Member ), Enums}
270 
271 /* Tagged arguments */
272 
273 #define chfTagInt32(Struct, Member, Name, Tag, Choice, Req, Conv) \
274  {Name, chfPluginArgInt32, Req, Conv, 1, OFFSET(Struct, Tag), Choice, \
275  OFFSET(Struct, Member), sizeof( ((Struct*)0)->Member ), NULL}
276 
277 #define chfTagBoolean(Struct, Member, Name, Tag, Choice, Req, Conv) \
278  {Name, chfPluginArgBoolean, Req, Conv, 1, OFFSET(Struct, Tag), Choice, \
279  OFFSET(Struct, Member), sizeof( ((Struct*)0)->Member ), NULL}
280 
281 #define chfTagDouble(Struct, Member, Name, Tag, Choice, Req, Conv) \
282  {Name, chfPluginArgDouble, Req, Conv, 1, OFFSET(Struct, Tag), Choice, \
283  OFFSET(Struct, Member), sizeof( ((Struct*)0)->Member ), NULL}
284 
285 #define chfTagString(Struct, Member, Name, Tag, Choice, Req, Conv) \
286  {Name, chfPluginArgString, Req, Conv, 1, OFFSET(Struct, Tag), Choice, \
287  OFFSET(Struct, Member), sizeof( ((Struct*)0)->Member ), NULL}
288 
289 #define chfTagEnum(Struct, Member, Name, Tag, Choice, Req, Conv, Enums) \
290  {Name, chfPluginArgEnum, Req, Conv, 1, OFFSET(Struct, Tag), Choice, \
291  OFFSET(Struct, Member), sizeof( ((Struct*)0)->Member ), Enums}
292 
293 #define chfPluginArgEnd {0}
294 
295 /* Extra output when parsing and converting */
296 #define CHFPLUGINDEBUG 1
297 
305 DBCORE_API const char* chfPluginEnumString(const chfPluginEnumType *Enums, int i, const char* def);
306 
313 DBCORE_API int chfPluginRegister(const char* key, const chfPluginIf *pif, const chfPluginArgDef* opts);
314 
315 #ifdef __cplusplus
316 }
317 #endif
318 
319 #endif // CHFPLUGIN_H
Definition: link.h:175
DBCORE_API const char * chfPluginEnumString(const chfPluginEnumType *Enums, int i, const char *def)
Return the string associated with Enum index &#39;i&#39;.
The core data types used by epics.
void(* channelRegisterPost)(dbChannel *chan, void *pvt, chPostEventFunc **cb_out, void **arg_out, db_field_log *probe)
Register callbacks for post-event-queue operation.
Definition: chfPlugin.h:197
long(* channel_open)(dbChannel *chan, void *pvt)
Open channel.
Definition: chfPlugin.h:146
void(* parse_error)(void *pvt)
A parsing error occurred.
Definition: chfPlugin.h:124
void(* freePvt)(void *pvt)
Free private resources.
Definition: chfPlugin.h:115
void(* channel_close)(dbChannel *chan, void *pvt)
Channel close request.
Definition: chfPlugin.h:218
int(* parse_ok)(void *pvt)
Configuration has been parsed successfully.
Definition: chfPlugin.h:135
void(* channelRegisterPre)(dbChannel *chan, void *pvt, chPostEventFunc **cb_out, void **arg_out, db_field_log *probe)
Register callbacks for pre-event-queue operation.
Definition: chfPlugin.h:170
DBCORE_API int chfPluginRegister(const char *key, const chfPluginIf *pif, const chfPluginArgDef *opts)
Register a plugin.
Channel filter simplified plugin interface.
Definition: chfPlugin.h:90
void(* channel_report)(dbChannel *chan, void *pvt, int level, const unsigned short indent)
Channel report request.
Definition: chfPlugin.h:210
Miscellaneous macro definitions.