EPICS Controls Argonne National Laboratory

Experimental Physics and
Industrial Control System

2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  <20202021  2022  2023  2024  Index 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  <20202021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: Re: double filters
From: Ben Franksen via Core-talk <core-talk at aps.anl.gov>
To: EPICS Core Talk <core-talk at aps.anl.gov>
Date: Thu, 2 Apr 2020 17:46:50 +0200
Here is a short update.

tl;dr: Ralph had it right.

For the envisioned array put modifier, I am now side-stepping server
side filters as suggested by Ralph. Instead I have added a simple
structure which I coined "address modifier":

typedef struct {
    long start;
    long incr;
    long end;
} dbAddrModifier;

dbChannel now contains a pointer to such a thing, which is NULL by
default and gets allocated and initialized if the PV name has a [s:i:e]
modifier (JSON syntax is not supported). I added two functions to
dbAccess: dbPutModifier and dbPutFieldModifier that work like dbPut and
dbField, respectively, only with an extra parameter of type
dbAddrModifier*. The old dbPut/Field functions call these with a NULL
pointer, so this is fully source compatible. (May later replace these
with macros.)

The implementation is straight-forward and works as far as I have tested
it (which is: not much yet).

I am now in the process of writing unit tests. In my naivety I thought
it would be a simple matter to start with Dirk's linkFilterTest,
copy-paste that and adapt it. The first problem here is that in base
there is no array valued output record type. So I grabbed the simple
arrRecord from test/ioc/db, and turned that into an output record. For
reasons that are completely unclear to me I can't seem to get this to
work at all. Every time I process the OUT link it writes only zeros,
even if the link is specified with a plain PV name (w/o any modifiers).

I have now picked my test patch and applied it on top of Dirk's branch
dbChannelForDBLinks. Same result. I am now posting some code in the hope
that someone spots where I have made a mistake.

Here is the record type definition:

include "menuGlobal.dbd"
include "menuConvert.dbd"
include "menuScan.dbd"
recordtype(arrout) {
  include "dbCommon.dbd"
  field(VAL, DBF_NOACCESS) {
    prompt("Value")
    special(SPC_DBADDR)
    pp(TRUE)
    extra("void *val")
  }
  field(OUT, DBF_OUTLINK) {
    prompt("Output Link")
  }
  field(NELM, DBF_ULONG) {
    prompt("Number of Elements")
    special(SPC_NOMOD)
    initial("1")
  }
  field(FTVL, DBF_MENU) {
    prompt("Field Type of Value")
    special(SPC_NOMOD)
    menu(menuFtype)
  }
  field(NORD, DBF_ULONG) {
    prompt("Number elements read")
    special(SPC_NOMOD)
  }
  field(OFF, DBF_ULONG) {
    prompt("Offset into array")
  }
  field(DOL, DBF_INLINK) {
    prompt("Desired Output Link")
  }
}

And this is my process routine (I checked that init_record correctly
allocates the VAL array and loads it with the data from my DOL):

static long process(struct dbCommon *pcommon)
{
    struct arroutRecord *prec = (struct arroutRecord *)pcommon;
    long status;

    prec->pact = TRUE;
    /* read DOL */
    if (!dbLinkIsConstant(&prec->dol)) {
        long nReq = prec->nelm;

        status = dbGetLink(&prec->dol, prec->ftvl, &prec->val, 0, &nReq);
        if (status) {
            recGblSetSevr(prec, LINK_ALARM, INVALID_ALARM);
            return (status);
        }
        prec->nord = nReq;
    }
    /* soft "device support": write OUT */
    status = dbPutLink(&prec->out, prec->ftvl, &prec->val, prec->nord);
    if (status) {
        recGblSetSevr(prec, LINK_ALARM, INVALID_ALARM);
        return (status);
    }
    recGblGetTimeStamp(prec);
    recGblFwdLink(prec);
    prec->pact = FALSE;
    return 0;
}

Cheers
Ben

Am 30.03.20 um 09:49 schrieb Ralph Lange via Core-talk:
> On Mon, 30 Mar 2020 at 06:08, Johnson, Andrew N. via Core-talk
> <core-talk at aps.anl.gov <mailto:core-talk at aps.anl.gov>> wrote:
> 
>>     I gets worse though. If we add put/write filters to the picture, then
>>     the feature is no longer "no cost". In fact, supporting it is not
>>     possible without a lot of overhead.
> 
>     I agree that put filters are probably completely different to
>     get/monitor filters, and there will probably be only a few put filters.
> 
> 
> The longer I think about it, the more I think that "put filters" should
> indeed be something completely separate. Maybe the put variant should
> not be called "filter" in the first place, but... "operator"? "manipulator"?
> The data is different. (Mostly no meta data, no timestamp, no "from the
> record" type.) The operation is different (as seen in the array case).
> There are no pre-queue / post-queue considerations. Many very reasonable
> filters have no equivalent put-thing.
> 
> Filters and put-things could share configuration and instantiation
> mechanism, maybe in a separate namespace - to e.g. allow "arr" and the
> "[]" to point to the filter and the put-thing.
> Limitations and restrictions could easily apply to one direction only.
> (Chained array filters are ok, chained array put-things are not.)
> 
> I think such an approach could simplify the implementation.
> 
> Cheers,
> ~Ralph


-- 
...it is impossible to speak of a depoliticized economy as the liberals
do, or of a separation between economic exploitation and political
oppression as the Marxists articulate. The basic distinction, rather, is
between power and creativity...
             -- Jonathan Nitzan and Shimshon Bichler: Capital as Power

Attachment: signature.asc
Description: OpenPGP digital signature


Replies:
Re: double filters Ben Franksen via Core-talk
References:
double filters Ben Franksen via Core-talk
Re: double filters Johnson, Andrew N. via Core-talk
Re: double filters Ben Franksen via Core-talk
Re: double filters Johnson, Andrew N. via Core-talk
Re: double filters Ralph Lange via Core-talk

Navigate by Date:
Prev: Build failed: EPICS Base base-7.0-575 AppVeyor via Core-talk
Next: Re: double filters Ben Franksen via Core-talk
Index: 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  <20202021  2022  2023  2024 
Navigate by Thread:
Prev: Re: double filters Ben Franksen via Core-talk
Next: Re: double filters Ben Franksen via Core-talk
Index: 2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  2019  <20202021  2022  2023  2024 
ANJ, 02 Apr 2020 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·