Difference between revisions of "Future Development Ideas"

From EPICSWIKI
(Added version hints.)
(Ned's items, reorganized.)
Line 5: Line 5:




== Documentation (3.14/3.15) ==
== Things which could be done Now ==
 
These items can be worked on immediately as they do not depend on any other work to have been completed, and could thus be included in the next 3.14 release.
 
 
=== Documentation (3.14/3.15) ===


Lots we can do here:
Lots we can do here:
Line 17: Line 22:




== IOCSH Command Registration (3.14/3.15) ==
=== PV Aliases (3.14/3.15) ===
 
The ability to add aliases to existing records has already been demonstrated and is a desirable feature, although the implementation that goes into Base might be somewhat different.  The hard part is deciding how to define the aliases.
 
 
=== Longer strings using char arrays (3.14/3.15) ===


Add DBD file syntax to convert DBD file information into a C header file which declares the command functions (similar to how we do record types in the current code-base)This header would then be included by the C file that defines those functions, thus the C compiler would do the work of ensuring that the routine implemented actually matches the command that will call it.
Allow an array of DBF_CHAR (or DBF_STRINGs) to be combined in order to put a long string value into a single field that holds more than 40 characters.  Reading a long string back should also be possible somehow.  Support in the IOC is needed, and will also require changes in all CA clients to be able to use this.
 
 
=== Named Soft Events (3.14/3.15) ===
 
Add the ability to use an event name instead of a number in the EVNT field.  EVNT is currently a short, but we only allow soft event numbers to be 8 bits, so this allows us space to add a new set of event numbers for named eventsThe event names should not have to be declared in advance, although that does leave the possibility of typos so maybe the IOC should be told first.
 
 
=== Reload subroutines at runtime (3.14/3.15) ===
 
The genSub can already do this: Allow the subroutine record subroutine name to be looked up after initialization, thus permitting subroutines to be reloaded (on vxWorks anyway).
 
 
=== Timestamp on Value Change (3.14/3.15) ===
 
Be able to select whether a record's timestamp should indicate when a record last processed (current behavior), or when its value last changed.  Since the timestamp gets set by the record's process() routine, this is best done by adding a menu field to each record type, making the recGblGetTimeStamp() call conditional on that field and add another call to it inside the monitor() routine.


The command information in the DBD file will also be useful for future versions of the IRMIS parser for st.cmd scripts, where we need to be able to tie the device support configuration commands into IRMIS' need to map hardware devices to record addresses.


=== Automated Testing (3.14/3.15) ===


== PV Aliases (3.14/3.15) ==
Convert mrkSoftTest so tests run automatically.  If it's easy to run tests they will be run more often...


The ability to add aliases to existing records has already been demonstrated and is a desirable feature, although the implementation that goes into Base might be somewhat different.


From Jeff: Give CAS the ability to make use of a prefix for all PV names that gets stipped before passing them to the tool.  Not efficient to implement this on RSRV.
=== Extended Device Support ===


Asyn's device support layers needs to be converted to Extended support, so their hardware addresses can be changed at runtime.  The same applies to many other device support, but Asyn is probably the largest low-hanging fruit here.


== Longer strings using arrays (3.14/3.15) ==


Allow an array of DBF_CHAR or DBF_STRINGs to be compined in order to put a long string value into a single field that holds more than 40 characters.
=== EPICS IOC IDE ===


Starting from Ken Evans' Eclipse IDE for EPICS, make it easy to add new record types and/or device support to an IOC from externally built support modules.  This will probably require adding an XML file to all support modules that describes what they provide and how to integrate them into the IOC application.  This is an Eclipse/GUI programming task and should not require C coding or making any changes to Base.


== Named Soft Events (3.14/3.15) ==


Add the ability to use an event name instead of a number in the EVNT field.  EVNT is currently a short, but we only allow soft event numbers to be 8 bits, so this allows us space to add a new set of event numbers for the named events.  Ideally the event names would not have to be declared in advance, although that does leave the possibility of typos causing havoc.
== Things which are already under way ==


These tasks are already being worked on but have stalled.  They might be hard for someone else to take over at this stage.


== 3.15 Cleanup ==
=== 3.15 Cleanup ===


3.15 already includes the Up change to the build system; the ramifications of this change have not been followed up completely though:
3.15 already includes the Up change to the build system; the ramifications of this change have not been followed up completely though:
Line 54: Line 79:




== Compiling DBD Files (3.15) ==
=== Compiling DBD Files (3.15) ===


My Perl implementation of the DBD file parser is still in process, and I'm hoping to revive this development effort to convert all DBD file information into C tables that get compiled into the IOC executable.
My Perl implementation of the DBD file parser is still in process, and I'm hoping to revive this development effort to convert all DBD file information into C tables that get compiled into the IOC executable.
Line 61: Line 86:




== Unbundling (3.15) ==
=== CA Event Filtering (3.15++) ===
 
LANSCE's Time and Flavored Data requirements.  It might be wise to do the Unbundling task before merging these changes.
 
Jeff's plan is to be able to attach an expression to a channel subscription, which is evaluated by the client's server thread to check each monitor event to determine whether to send it to this client or not.  This could use an enhanced CALC expression parser and evaluation routine to do the expression, we just need a better parser since the expression might include record names.  Discussion about how the values for the expression get saved such that they have the value at the time the data was pushed into the event queue; they might have changed since them.  Jeff's fixed size event that contains those expression value resolves that issue, but it is very restrictive in terms of flexibility.
 
 
== Things which can't be done yet ==
 
These are tasks are waiting for other tasks to be completed before they can be worked on.
 
=== IOCSH Command Registration (3.15) ===
 
Add DBD file syntax to convert DBD file information into a C header file which declares the command functions (similar to how we do record types in the current code-base).  This header would then be included by the C file that defines those functions, thus the C compiler would do the work of ensuring that the routine implemented actually matches the command that will call it.
 
The command information in the DBD file will also be useful for future versions of the IRMIS parser for st.cmd scripts, where we need to be able to tie the device support configuration commands into IRMIS' need to map hardware devices to record addresses.
 
 
=== Array Field Support (3.15++) ===
 
Make it much easier to add array fields to record types without having to do as much coding in the record support.  See [http://www.aps.anl.gov/epics/core-talk/2007/msg00078.php Ben Franksen email]
 
 
=== Unbundling (3.15++) ===


Split Base into three or more independent modules.  Each module would have its own version number, and the modules can therefore each have an independent existance, although there would obviously be specific dependencies associated with particular versions.
Split Base into three or more independent modules.  Each module would have its own version number, and the modules can therefore each have an independent existance, although there would obviously be specific dependencies associated with particular versions.
Line 69: Line 117:
I see the unbundled modules as follows:
I see the unbundled modules as follows:


=== Core ===
==== Core ====


Depends on: Nothing
Depends on: Nothing
Line 84: Line 132:




=== Channel Access Client ===
==== Channel Access Client ====


Depends on: Core
Depends on: Core
Line 96: Line 144:




=== Channel Access Server ===
==== Channel Access Server ====


Depends on: Core, IOC
Depends on: Core, IOC
Line 109: Line 157:




=== IOC ===
==== IOC ====


Depends on: Core, CAC, CAS
Depends on: Core, CAC, CAS
Line 124: Line 172:




== Redundancy (?) ==
=== Merge Redundancy code (?) ===


DESY's redundant control of remote I/O, allowing hot-spare backup IOCs.  No idea what this looks like, what tests are available or how easy it will be to merge.
DESY's redundant control of remote I/O, allowing hot-spare backup IOCs.  No idea what this looks like, what tests are available or how easy it will be to merge.




== CA Event Filtering (3.15++) ==
=== Variable Length Strings (3.15++) ===


LANSCE needs Time and Flavored Data to replace ancient VAXen.  Jeff's plan is to be able to attach an expression to a channel subscription, which is evaluated by the client's server thread to check each monitor event to determine whether to send it to this client or not.  This could use an enhanced CALC expression parser and evaluation routine to do the expression, we just need a better parser since the expression might include record names.  Discussion about how the values for the expression get saved such that they have the value at the time the data was pushed into the event queue; they might have changed since them.  Jeff's fixed size event that contains those expression value resolves that issue, but it is very restrictive in terms of flexibility.
3.15 already includes the BaseString C++ classes in libCom, and I intend to create a set of C wrapper routines for the base class operations (started, currently incomplete).  This can form the basis of a new variable length string type for use in the database in addition to DBF_STRING.




== Variable Length Strings (3.15++) ==
=== Alternate DB File Formats (3.15++) ===
 
I'm already adding my new BaseString C++ classes to libCom, and I intend to create a set of C wrapper routines for the base class operations (started, currently incomplete).  This can form the basis of a new string type for use in the database in addition to the DBF_STRING.
 
 
== Alternate DB File Formats (3.15++) ==


There are calls to replace the existing DB file format with an XML-based format.  Currently the DB file parser is too highly integrated into the process of record creation to be able to add a second format, but it would be feasible to separate these two and hence allow an expat-based or similar parser to be written.  This would probably require a close analysis and upgrade to the locking arrangements of the database.
There are calls to replace the existing DB file format with an XML-based format.  Currently the DB file parser is too highly integrated into the process of record creation to be able to add a second format, but it would be feasible to separate these two and hence allow an expat-based or similar parser to be written.  This would probably require a close analysis and upgrade to the locking arrangements of the database.
Line 146: Line 189:




== Asynchronous Gets (3.15++) ==
=== Asynchronous Gets (3.16++) ===


From Ben Franksen: Async dbGetLinkCallback: Needs an upgrade to the record support interface, later in the process.  Or maybe include a dbGetLinkCallback() with the private callback routine, and require new record types to use this. Talk to synApps about this (Tim).
From Ben Franksen: Async dbGetLinkCallback: Needs an upgrade to the record support interface, later in the process.  Or maybe include a dbGetLinkCallback() with the private callback routine, and require new record types to use this. Talk to synApps about this (Tim).




== Multiple Master problem (3.15++) ==
=== Multiple Master problem (3.16++) ===


From Jeff: Changes to output values in a PLC or similar device initiated outside of the output record. This could be resolved adding a new routine to the RSET that the device support calls back when it has a new raw ouptut value to back-propagate to the VAL field.  Currently done by setting PACT and calling the record's process routine to use its second-half processing only.  Again, talk to Tim about this.
From Jeff: Changes to output values in a PLC or similar device initiated outside of the output record. This could be resolved adding a new routine to the RSET that the device support calls back when it has a new raw ouptut value to back-propagate to the VAL field.  Currently done by setting PACT and calling the record's process routine to use its second-half processing only.  Again, talk to Tim about this.




== Online Record Creation (3.16++) ==
=== Online Record Creation (3.16++) ===


With good database locking, it might be feasible to look at the ability to add new record instances at runtime, and maybe delete as well.  This would probably need a change to the record interface to initialize the new instances.
With good database locking, it might be feasible to look at the ability to add new record instances at runtime, and maybe delete as well.  This would probably need a change to the record interface to initialize the new instances.




== Dynamically Loaded Modules (3.16++) ==
=== Dynamically Loaded Modules (3.16++) ===


After converting the DBD load process into table registration, it should become easier to allow support modules (containing record types, device support and other drivers) to be discovered and loaded dynamically.  Unloading is a very different matter though, we don't have the shutdown facilities to allow that.
After converting the DBD load process into table registration, it should become easier to allow support modules (containing record types, device support and other drivers) to be discovered and loaded dynamically.  Unloading is a very different matter though, we don't have the shutdown facilities to allow that.
== ... ==

Revision as of 22:41, 8 August 2007

These are my notes for what I think we can/should add to V3 through an evolutionary process. The ordering is probably vaguely right, but not necessarily that accurate.



Things which could be done Now

These items can be worked on immediately as they do not depend on any other work to have been completed, and could thus be included in the next 3.14 release.


Documentation (3.14/3.15)

Lots we can do here:

  • Write a "Building EPICS" guide (chapter in AppDevGuide?)
  • Restructure the AppDevGuide to make it more accessible
  • Convert AppDevGuide into an OpenDocument Text file (keeping index markers)
  • Update the Record Reference Manual to 3.14 and beyond (generate tables automatically from DBD files?)
  • Look at all the documentation we have and see what's missing
  • Data Access, other new CA-related documentation...


PV Aliases (3.14/3.15)

The ability to add aliases to existing records has already been demonstrated and is a desirable feature, although the implementation that goes into Base might be somewhat different. The hard part is deciding how to define the aliases.


Longer strings using char arrays (3.14/3.15)

Allow an array of DBF_CHAR (or DBF_STRINGs) to be combined in order to put a long string value into a single field that holds more than 40 characters. Reading a long string back should also be possible somehow. Support in the IOC is needed, and will also require changes in all CA clients to be able to use this.


Named Soft Events (3.14/3.15)

Add the ability to use an event name instead of a number in the EVNT field. EVNT is currently a short, but we only allow soft event numbers to be 8 bits, so this allows us space to add a new set of event numbers for named events. The event names should not have to be declared in advance, although that does leave the possibility of typos so maybe the IOC should be told first.


Reload subroutines at runtime (3.14/3.15)

The genSub can already do this: Allow the subroutine record subroutine name to be looked up after initialization, thus permitting subroutines to be reloaded (on vxWorks anyway).


Timestamp on Value Change (3.14/3.15)

Be able to select whether a record's timestamp should indicate when a record last processed (current behavior), or when its value last changed. Since the timestamp gets set by the record's process() routine, this is best done by adding a menu field to each record type, making the recGblGetTimeStamp() call conditional on that field and add another call to it inside the monitor() routine.


Automated Testing (3.14/3.15)

Convert mrkSoftTest so tests run automatically. If it's easy to run tests they will be run more often...


Extended Device Support

Asyn's device support layers needs to be converted to Extended support, so their hardware addresses can be changed at runtime. The same applies to many other device support, but Asyn is probably the largest low-hanging fruit here.


EPICS IOC IDE

Starting from Ken Evans' Eclipse IDE for EPICS, make it easy to add new record types and/or device support to an IOC from externally built support modules. This will probably require adding an XML file to all support modules that describes what they provide and how to integrate them into the IOC application. This is an Eclipse/GUI programming task and should not require C coding or making any changes to Base.


Things which are already under way

These tasks are already being worked on but have stalled. They might be hard for someone else to take over at this stage.

3.15 Cleanup

3.15 already includes the Up change to the build system; the ramifications of this change have not been followed up completely though:

  • Provide a perl script for converting 3.14 apps to 3.15
  • Bring over latest templates from 3.14
  • Implications for building extensions not worked out
  • makeBaseExt.pl is probably no longer needed
  • Install local RULES_BUILD files into a top level directory
    • Use this dir instead of the configure/O.arch directories so that a make clean doesn't remove them...
  • Change script installation rules (see ctlsys)


Compiling DBD Files (3.15)

My Perl implementation of the DBD file parser is still in process, and I'm hoping to revive this development effort to convert all DBD file information into C tables that get compiled into the IOC executable.

With this parser now being written in Perl, it will become easier to extend the new facilities that we implement, such as adding new field types (see Variable Length Strings below).


CA Event Filtering (3.15++)

LANSCE's Time and Flavored Data requirements. It might be wise to do the Unbundling task before merging these changes.

Jeff's plan is to be able to attach an expression to a channel subscription, which is evaluated by the client's server thread to check each monitor event to determine whether to send it to this client or not. This could use an enhanced CALC expression parser and evaluation routine to do the expression, we just need a better parser since the expression might include record names. Discussion about how the values for the expression get saved such that they have the value at the time the data was pushed into the event queue; they might have changed since them. Jeff's fixed size event that contains those expression value resolves that issue, but it is very restrictive in terms of flexibility.


Things which can't be done yet

These are tasks are waiting for other tasks to be completed before they can be worked on.

IOCSH Command Registration (3.15)

Add DBD file syntax to convert DBD file information into a C header file which declares the command functions (similar to how we do record types in the current code-base). This header would then be included by the C file that defines those functions, thus the C compiler would do the work of ensuring that the routine implemented actually matches the command that will call it.

The command information in the DBD file will also be useful for future versions of the IRMIS parser for st.cmd scripts, where we need to be able to tie the device support configuration commands into IRMIS' need to map hardware devices to record addresses.


Array Field Support (3.15++)

Make it much easier to add array fields to record types without having to do as much coding in the record support. See Ben Franksen email


Unbundling (3.15++)

Split Base into three or more independent modules. Each module would have its own version number, and the modules can therefore each have an independent existance, although there would obviously be specific dependencies associated with particular versions.

If we adopt this, we should bundle working subsets of modules together and release the complete bundle as a tarfile.

I see the unbundled modules as follows:

Core

Depends on: Nothing

These are the common parts used by everything:

  • Build system
  • libCom & OSI layer
    • Basic registry routines
    • IOC shell
  • Antelope
  • Flex
  • makeApp tool


Channel Access Client

Depends on: Core

Jeff Hill's responsibility.

  • CA-specific build rules (probably none)
  • CA client library
  • CA Tools
  • CA application makeApp templates


Channel Access Server

Depends on: Core, IOC

Jeff Hill's responsibility.

  • CAS-specific build rules (probably none)
  • GDD
  • The CAS server tool
  • RSRV (the old CA server code)
  • CAS application makeApp templates


IOC

Depends on: Core, CAC, CAS

The rest is code that runs on the IOC.

  • IOC-specific build rules
  • Static and runtime database access
  • Runtime database
  • Standard record types
  • Soft device support
  • The registry (device, driver, record, function)
  • IOC application makeApp templates


Merge Redundancy code (?)

DESY's redundant control of remote I/O, allowing hot-spare backup IOCs. No idea what this looks like, what tests are available or how easy it will be to merge.


Variable Length Strings (3.15++)

3.15 already includes the BaseString C++ classes in libCom, and I intend to create a set of C wrapper routines for the base class operations (started, currently incomplete). This can form the basis of a new variable length string type for use in the database in addition to DBF_STRING.


Alternate DB File Formats (3.15++)

There are calls to replace the existing DB file format with an XML-based format. Currently the DB file parser is too highly integrated into the process of record creation to be able to add a second format, but it would be feasible to separate these two and hence allow an expat-based or similar parser to be written. This would probably require a close analysis and upgrade to the locking arrangements of the database.

Need to coordinate with VDCT folks, etc.


Asynchronous Gets (3.16++)

From Ben Franksen: Async dbGetLinkCallback: Needs an upgrade to the record support interface, later in the process. Or maybe include a dbGetLinkCallback() with the private callback routine, and require new record types to use this. Talk to synApps about this (Tim).


Multiple Master problem (3.16++)

From Jeff: Changes to output values in a PLC or similar device initiated outside of the output record. This could be resolved adding a new routine to the RSET that the device support calls back when it has a new raw ouptut value to back-propagate to the VAL field. Currently done by setting PACT and calling the record's process routine to use its second-half processing only. Again, talk to Tim about this.


Online Record Creation (3.16++)

With good database locking, it might be feasible to look at the ability to add new record instances at runtime, and maybe delete as well. This would probably need a change to the record interface to initialize the new instances.


Dynamically Loaded Modules (3.16++)

After converting the DBD load process into table registration, it should become easier to allow support modules (containing record types, device support and other drivers) to be discovered and loaded dynamically. Unloading is a very different matter though, we don't have the shutdown facilities to allow that.