====User Interfaces That Integrate with the Data Source==== ARDI 2026 added the new **Introspection** function to the driver framework. This optional driver feature is used to ask the underlying system for information that would be useful when creating a user-interface. For example, the **textcycle** driver that replays an Excel spreadsheet full of data uses the Introspection function to return the names of each of the columns in the worksheet. Our UI can then load these column names into a list - making it easy for users to pick exactly which column to bind their properties to. ===Using Introspection Data=== You can access Introspection data through the **/api/driverintro** function. When used on live or historical data, the endpoint takes four parameters... ^Parameter^Meaning^ |source|The ID of the data source asset| |mode|If the data source is live (0) or historical (1)| |context|The context ID (defaults to '1')| |query|A query string that is passed on to the driver| When used on event sources, it only has two... ^Parameter^Meaning^ |evsource|The driver ID| |query|A query string that is passed on to the driver| The response is in JSON format, although the exact structure of the response depends on the driver itself. The content may be as simple as a list of strings, or it may be a set of complex objects. ===Query Parameter=== The introspection function has an optional 'query' parameter that can be passed a string. This can be used in several ways... 1) It can provide the point at a hierarchy/relationship structure you want to ask about (to let you browse through hierarchies), \\ 2) It can provide search, allowing you to enter the first few letts of a name, \\ 3) It can provide simple autocomplete functionality, letting you progressively fill in content. \\ 4) By adding special characters, you can request different types of resource (ie. a '' searches for tables, '/views/' looks only for views, and 'mytable.' searches for the fields inside mytable). \\ 5) You can simply ignore it if your data source/UI doesn't need it \\ ===Filling a Select Control=== As a simple example, here's a drop-list control that we pre-fill with all of the point names that a data-source contains...
Loading Options...
This creates a **loading** indicator and a drop-list of options. The droplist is initially hidden. In the background, a call is sent to **driverintro** that returns a list of strings containing the names of every data point the source contains. These are sorted, loaded into the droplist, and then the 'loading' indicator is removed and the droplist fades in.