EPICS Controls Argonne National Laboratory

Experimental Physics and
Industrial Control System

1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  <20192020  2021  2022  2023  2024  Index 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  <20192020  2021  2022  2023  2024 
<== Date ==> <== Thread ==>

Subject: Re: asynPortDriver: get all addresses for ASYN_MULTIDEVICE
From: "Dunning, Michael via Tech-talk" <[email protected]>
To: Mark Rivers <[email protected]>
Cc: tech-talk <[email protected]>
Date: Wed, 20 Nov 2019 13:20:16 -0800
Mark,
This works great, thanks a lot for the suggestion.  

There's just one minor detail I need to work out: my poller thread starts before iocInit so I get an empty set at the beginning of my poller thread.  This (before my poller loop starts) is where I have the "run once" commands to poll the devices.
An epicsThreadSleep(0.5) is enough delay, but what's the preferred method of delaying the poller thread to start after iocInit?  Add an initHook and check for initHookAfterIocRunning?  


Thanks again,
Mike



Michael Dunning
SLAC National Accelerator Laboratory
2575 Sand Hill Road
Menlo Park, CA 94025
(650) 926-5200


On Tue, Nov 19, 2019 at 5:48 PM Mark Rivers <[email protected]> wrote:
Hi Michael,


One solution is to implement the drvUserCreate() method in your driver.


drvUserCreate can call the getAddress() method to get the address of this device from the pasynUser passed to it.  You can then build an std::set of the addresses that are actually used.  You only insert a new address into the set if std::set.find() does not find the address in the set already.  Once you call getAddress() you then call the base class asynPortDriver::drvUserCreate() to complete the operation.


Your driver can then loop over the entries in the std::set.


Mark



________________________________
From: Tech-talk <[email protected]> on behalf of Dunning, Michael via Tech-talk <[email protected]>
Sent: Tuesday, November 19, 2019 4:02 PM
To: EPICS Tech-Talk
Subject: asynPortDriver: get all addresses for ASYN_MULTIDEVICE

I've written an asynPortDriver for a TCP/IP-to-BitBus gateway which talks to power supply controllers.  The driver sends addressed messages to each controller and receives similar messages as responses.  The controllers may have non-sequential addresses in the [1, 200] range.

It works well with a single controller, and now I'm adding support for multiple controllers.  Since the gateway doesn't support multiple sockets, I'm using ASYN_MULTIDEVICE (multiple addresses using a single asyn port).

To poll the controllers, I need to loop over all addresses in my driver.  If I have sequential addresses that's easy, but mine may be non-sequential and I don't want to loop over non-existent addresses.
Is there a way to get a list of all registered addresses for a given port from asynManager somehow?  By "registered" I mean an address that's present in a record and tied to a specific port, e.g.:

record(bo, "$(ps):StateSetpt") {
    field(DESC, "Power Supply On/Off")
    field(DTYP, "asynInt32")
    field(OUT,  "@asyn($(asynPort), $(address), 0) STATE_SETPT")
    field(ZNAM, "OFF")
    field(ONAM, "ON")
}

My first attempt would be to follow the asynReport (pasynManager->report) function which sets up a linked list and prints all addresses.  Am I on the right track?  Or is there something built-in that I missed?



Thanks,
Mike

Michael Dunning
SLAC National Accelerator Laboratory
2575 Sand Hill Road
Menlo Park, CA 94025
(650) 926-5200

Replies:
RE: asynPortDriver: get all addresses for ASYN_MULTIDEVICE Mark Rivers via Tech-talk
References:
asynPortDriver: get all addresses for ASYN_MULTIDEVICE Dunning, Michael via Tech-talk
Re: asynPortDriver: get all addresses for ASYN_MULTIDEVICE Mark Rivers via Tech-talk

Navigate by Date:
Prev: BigRecord in exampleCPP Pierrick M Hanlet via Tech-talk
Next: RE: asynPortDriver: get all addresses for ASYN_MULTIDEVICE Mark Rivers via Tech-talk
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  <20192020  2021  2022  2023  2024 
Navigate by Thread:
Prev: Re: asynPortDriver: get all addresses for ASYN_MULTIDEVICE Mark Rivers via Tech-talk
Next: RE: asynPortDriver: get all addresses for ASYN_MULTIDEVICE Mark Rivers via Tech-talk
Index: 1994  1995  1996  1997  1998  1999  2000  2001  2002  2003  2004  2005  2006  2007  2008  2009  2010  2011  2012  2013  2014  2015  2016  2017  2018  <20192020  2021  2022  2023  2024 
ANJ, 20 Nov 2019 Valid HTML 4.01! · Home · News · About · Base · Modules · Extensions · Distributions · Download ·
· Search · EPICS V4 · IRMIS · Talk · Bugs · Documents · Links · Licensing ·