Presentation is loading. Please wait.

Presentation is loading. Please wait.

PVManager Gabriele Carcassi Feb 18 2010. PVManager goals  Simplify data collection and aggregation  Simplify (UI) development  Re-use code as much.

Similar presentations


Presentation on theme: "PVManager Gabriele Carcassi Feb 18 2010. PVManager goals  Simplify data collection and aggregation  Simplify (UI) development  Re-use code as much."— Presentation transcript:

1 PVManager Gabriele Carcassi Feb 18 2010

2 PVManager goals  Simplify data collection and aggregation  Simplify (UI) development  Re-use code as much as possible

3 So you want to write a UI… channel.addListener(new Listener() { public void doSomething(Event evt) { myWidget.setFoo(evt.getWhatever()); }

4 So you want to write a UI… channel.addListener(new Listener() { public void doSomething(Event evt) { Toolkit.execute(new Runnable() { myWidget.setFoo(evt.getWhatever()); }

5 So you want to write a UI… channel.addListener(new Listener() { public void doSomething(Event evt) { Toolkit.execute(new Runnable() { synchronized(evt) { myWidget.setFoo(evt.getWhatever()); }

6 So you want to write a UI… channel.addListener(new Listener() { public void doSomething(Event evt) { Toolkit.execute(new Runnable() { synchronized(evt) { myCopy = copy(evt.getWhatever()); myWidget.setFoo(myCopy); }

7 Wish one could write PV > pv = PVManager.read( listOf(statisticsOf(vDouble(pvNames)))).atHz(10); pv.addPVValueChangeListener(new PVValueChangeListener() { public void pvValueChanged() { myWidget.setFoo( pv.getValue().getMoo()); } } );

8 UI subsystem requirements  Single threaded  Notification must be done on event thread  Data objects must be changed on the event thread only (avoid inconsistencies and simplify responding to events)  Work must be offloaded to other threads as much as possible (to prevent unresponsiveness)  Refresh rate up to 50Hz (faster is useless and counter productive)

9 Channel Access  Multi threaded  Notification done on connection threads  Data objects changed on connection threads  Rate is not limited: aggregated can be KHz

10 Collect, aggregate and notify  Need to collect the data at the source rate  Collector could be a queue, a cache, a timed cache  Aggregate the data at the UI rate, and notify on UI thread NotifierCollectorMonitor

11 Transform and calculate  While we are on other thread, we compose and calculate what we need (single array for a table, FFT of a waveform, statistics, prepare synch’ed arrays, …) NotifierCollectorMonitor Cache PV Function

12 UI or not UI  Everything you can do in the UI you should be able to do at the command line  PVManager can work without a UI (notification is simply done on the timer thread) Command line clients Logging/archiving Republish the data through PVData/PVAccess  PVManager is a standalone library pvmanager.sourceforge.net

13 3 APIs for the price of one  Data interfaces: where to put the data Decoupled from the other two. Needed so that the client can focus more on what he needs and can work with both EPICS V3 and EPICS V. Other talk  Building blocks API: perform computation API based on interfaces, you can add your pieces though the goal is to have most of them already there  Expression API: define what you want to read Internal DSL (Doman Specific Language), type safe

14 BUILDING BLOCKS API

15 User objects NotifierCollectorMonitor Cache PV Function

16 PV  Defines: void add/removePVValueChangeListener (PVValueChangeListener listener); String getName() ; T getValue(); void close(); boolean isClosed();  PVValueChangeListener defines: void pvValueChanged();

17 Under the hood NotifierCollectorMonitor Cache PV Function

18 Function  Defines: T getValue(); Class getType()  A function object returns a value of a particular type. Argument number and types are determined by the constructor of an actual function.

19 Under the hood NotifierCollectorMonitor Cache PV Function

20 Collector extends Function >  Defines: void collect(); List getValue();  Collects a bunch of values of the same type  Typically takes a Function as argument On a collect call, will take a new value On getValue returns a number of values  Could be a queue (values returned only once) or a cache (returns the last n values, last 30 sec of values)

21 Under the hood NotifierCollectorMonitor Cache PV Function

22 ValueCache extends Function  Defines: void setValue(T);  You can put a value in (and read a value out)

23 Under the hood NotifierCollectorMonitor Cache PV Function

24 DataSource  Defines: void connect(DataRecipe recipe); void disconnect(DataRecipe recipe);  DataRecipe defines: Map > getChannelsPerCollectors()  For each collector, list of channels with their caches  To update a channel: Lock Collector, update cache, Collector.collect()

25 Under the hood NotifierCollectorMonitor Cache PV Function

26 Notification  ThreadSwitch defines: void post(Runnable run);  It allows to execute a piece of code on a target thread  Notifier defines: Notifier(PV pv, Function function, ThreadSwitch onThread); void notifyPv();  On notifyPV() calculates the new value, switches thread and sets the pv’s value.

27 EXPRESSION API

28 PVManager  Example: PV > pv = PVManager.read( listOf(statisticsOf(vDouble(pvNames)))).atHz(10);  Defines: static PVManagerExpression read(SourceRateExpression pvExpression); static PVManagerExpression read(DesiredRateExpression pvExpression);

29 PVManagerExpression  Defines: PVManagerExpression from(DataSource connectionManager) PVManagerExpression andNotify(ThreadSwitch onThread) PV atHz(double rate)  Default DataSource and ThreadSwitch can be specified

30 Source/DesiredRateExpression  Two different types for the two different data rates  The collectors change Source to Desired: static DesiredRateExpression > queueOf(SourceRateExpression expression)  External libraries for either types or operations defines static constructors for expressions: static SourceRateExpression vDouble(String name) static DesiredRateExpression > listOf(List > expressions)

31 Example (again) PV > pv = PVManager.read( listOf(statisticsOf(vDouble(pvNames)))).atHz(10); pv.addPVValueChangeListener(new PVValueChangeListener() { public void pvValueChanged() { myWidget.setFoo( pv.getValue().getMoo()); } } ); List

32 Example (again) PV > pv = PVManager.read( listOf(statisticsOf(vDouble(pvNames)))).atHz(10); pv.addPVValueChangeListener(new PVValueChangeListener() { public void pvValueChanged() { myWidget.setFoo( pv.getValue().getMoo()); } } ); List > Which implies creating the caches for all channels

33 Example (again) PV > pv = PVManager.read( listOf(statisticsOf(vDouble(pvNames)))).atHz(10); pv.addPVValueChangeListener(new PVValueChangeListener() { public void pvValueChanged() { myWidget.setFoo( pv.getValue().getMoo()); } } ); List > Creates all the collectors, and the functions that calculate the statistics

34 Example (again) PV > pv = PVManager.read( listOf(statisticsOf(vDouble(pvNames)))).atHz(10); pv.addPVValueChangeListener(new PVValueChangeListener() { public void pvValueChanged() { myWidget.setFoo( pv.getValue().getMoo()); } } ); DesiredRateExpression > Creates the function that assembles the list

35 Example (again) PV > pv = PVManager.read( listOf(statisticsOf(vDouble(pvNames)))).atHz(10); pv.addPVValueChangeListener(new PVValueChangeListener() { public void pvValueChanged() { myWidget.setFoo(pv.getValue().getMoo()); } } ); PV > Creates the Notifier, the DataRecipe, passes it to the DataSource, …

36 Low complexity point  The API is very expressive You can combine operators, the syntax is very compact, you specify things once  But it does not hide choices You need to specify all transformations, including how to go from source rate to desired rate  It hides the complexity of the implementation of your choices The API actually does something!

37 Eclipse/CSS integration  The library is packaged in org.csstudio.utility.pvmanager Extension point based on DataSource The activator configures the default ThreadSwitch to use SWT and default DataSource to use a CompositeDataSource made up of all extensions point  All other plugins can simply use PVManager.read()  Other plugins for extension points org.csstudio.utility.pvmanager.sim for simulated data org.csstudio.utility.pvmanager.epics for epics v3

38 What’s done  SimulationDataSource Same syntax for channels as utility.pv.som  JCADataSource Supports VDouble, VInt, VString and VEnum  Probe was ported to use PVManager (in BNL branch)  OrbitViewer prototype built on PVManager

39 What’s need to be done  JCADataSource Mass connection can be optimized to scale better  Operators Will need to understand which operators are useful, how to define them for “maximum combination power” Allow to easily define “custom functions” Add other common operators - A CALC operator? - A histogram operator? - An FFT operator? - …


Download ppt "PVManager Gabriele Carcassi Feb 18 2010. PVManager goals  Simplify data collection and aggregation  Simplify (UI) development  Re-use code as much."

Similar presentations


Ads by Google