16 #include <epicsMath.h> 18 #include <dbConvertFast.h> 19 #include <chfPlugin.h> 22 #include <db_field_log.h> 32 static void *myStructFreeList;
35 chfPluginEnumType modeEnum[] = { {
"abs", 0}, {
"rel", 1}, {
NULL,0} };
38 chfPluginArgDef opts[] = {
46 static void * allocPvt(
void)
51 static void freePvt(
void *pvt)
56 static int parse_ok(
void *pvt)
64 static db_field_log* filter(
void* pvt, dbChannel *chan, db_field_log *pfl) {
74 if (pfl->type == dbfl_type_val) {
75 DBADDR localAddr = chan->addr;
76 localAddr.field_type = pfl->field_type;
77 localAddr.field_size = pfl->field_size;
78 localAddr.no_elements = pfl->no_elements;
79 localAddr.pfield = (
char *) &pfl->u.v.field;
80 status = dbFastGetConvertRoutine[pfl->field_type][
DBR_DOUBLE]
81 (localAddr.pfield, (
void*) &val, &localAddr);
84 recGblCheckDeadband(&my->
last, val, my->
hyst, &send, 1);
85 if (send && my->
mode == 1) {
91 db_delete_field_log(pfl);
96 static void channelRegisterPre(dbChannel *chan,
void *pvt,
97 chPostEventFunc **cb_out,
void **arg_out, db_field_log *probe)
103 static void channel_report(dbChannel *chan,
void *pvt,
int level,
const unsigned short indent)
106 printf(
"%*sDeadband (dbnd): mode=%s, delta=%g%s\n", indent,
"",
107 chfPluginEnumString(modeEnum, my->
mode,
"n/a"), my->
cval,
108 my->
mode == 1 ?
"%" :
"");
111 static chfPluginIf pif = {
125 static void dbndShutdown(
void* ignore)
129 myStructFreeList =
NULL;
132 static void dbndInitialize(
void)
134 if (!myStructFreeList)
137 chfPluginRegister(
"dbnd", &pif, opts);
LIBCOM_API void *epicsStdCall freeListCalloc(void *pvt)
LIBCOM_API void epicsStdCall freeListInitPvt(void **ppvt, int size, int nmalloc)
LIBCOM_API void epicsStdCall freeListCleanup(void *pvt)
LIBCOM_API void epicsStdCall freeListFree(void *pvt, void *pmem)
Extended replacement for the Posix exit and atexit routines.
#define epicsAtExit(F, A)
Convenience macro to register a function and context value to be run when the process exits...
epicsExportRegistrar(dbndInitialize)