0% found this document useful (0 votes)
80 views

Acat Developers Guide 0

This document provides an overview of the Assistive Context-Aware Toolkit (ACAT) developer's guide. It describes the ACAT architecture which includes a core library and extension library. Extensions can be added for features like actuators, agents, panels, word predictors, text-to-speech, and spell checking. The document also outlines the code structure, extension discovery process, and steps for creating different types of extensions.

Uploaded by

Akshar Gandhi
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
80 views

Acat Developers Guide 0

This document provides an overview of the Assistive Context-Aware Toolkit (ACAT) developer's guide. It describes the ACAT architecture which includes a core library and extension library. Extensions can be added for features like actuators, agents, panels, word predictors, text-to-speech, and spell checking. The document also outlines the code structure, extension discovery process, and steps for creating different types of extensions.

Uploaded by

Akshar Gandhi
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 112

ASSISTIVE CONTEXT-AWARE

TOOLKIT (ACAT)

DEVELOPER’S GUIDE

VERSION 0.9
TABLE OF CONTENTS

1. INTRODUCTION ................................................................................................................................. 6
1.1 Overview........................................................................................................................................ 6
1.2 References ..................................................................................................................................... 6
1.3 Organization ................................................................................................................................. 6
1.4 Glossary of terms ........................................................................................................................ 7
1.5 ACAT Features .......................................................................................................................... 11
2. ARCHITECTURE .............................................................................................................................. 13
2.1 Introduction .............................................................................................................................. 13
2.2 The ACAT Core Library ......................................................................................................... 14
2.3 The ACAT Extension Library .............................................................................................. 21
2.4 Extensions .................................................................................................................................. 22
3. CODE STRUCTURE ......................................................................................................................... 25
3.1 Solution Layout ........................................................................................................................ 25
3.2 Coding Standards and Styles............................................................................................... 26
3.2.1 Visual Studio Add-on’s ....................................................................................................... 26
3.3 Building the framework ........................................................................................................ 27
3.4 Running the application ....................................................................................................... 27
3.5 Logging ........................................................................................................................................ 28
4. EXTENSIONS .................................................................................................................................... 29
4.1 Extension Categories ............................................................................................................. 29
4.2 Extension Folder Layout ...................................................................................................... 30
4.3 Extension Discovery............................................................................................................... 31
4.4 Extension Descriptor ............................................................................................................. 31
4.5 Extension Invoker ................................................................................................................... 31
5. ACTUATORS...................................................................................................................................... 33
5.1 Introduction .............................................................................................................................. 33
5.2 Enumeration ............................................................................................................................. 33
5.3 Actuator Configuration Files ............................................................................................... 34
5.3.1 Actuators.xml Configuration File................................................................................... 34
5.3.2 SwitchConfigMap.xml Configuration File ................................................................... 36
5.4 ACAT Actuator Extensions................................................................................................... 39
5.4.1 Keyboard Actuator .............................................................................................................. 39
5.4.2 USB HID Actuators .............................................................................................................. 39
5.4.3 Winsock Actuators .............................................................................................................. 39
5.5 Steps to create an Actuator extension ............................................................................. 41
6. AGENTS .............................................................................................................................................. 46
6.1 Introduction .............................................................................................................................. 46
6.2 Enumeration ............................................................................................................................. 46
6.2.1 Application Agents .............................................................................................................. 46
6.2.2 Functional Agents ................................................................................................................ 46
6.3 Application Agents .................................................................................................................. 46
6.4 Functional Agents ................................................................................................................... 47
6.5 Agent Configuration Files..................................................................................................... 49
7. PANELS ............................................................................................................................................... 50
7.1 Introduction .............................................................................................................................. 50
7.2 Enumeration ............................................................................................................................. 51
7.3 Panel Names .............................................................................................................................. 51
7.4 Panel Configuration File ....................................................................................................... 51
7.4.1 WidgetAttributes section.................................................................................................. 53
7.4.2 Layout section ....................................................................................................................... 54
7.4.3 Animations Section ............................................................................................................. 56
7.5 Panel Configuration Mapping (PanelConfigMap.xml)............................................... 59
7.5.1 Location of PanelConfigMap.xml ................................................................................... 61
7.6 Preferred Panel Settings ....................................................................................................... 61
8. WORD PREDICTORS...................................................................................................................... 63
8.1 Introduction .............................................................................................................................. 63
8.2 Enumeration ............................................................................................................................. 63
8.3 Steps to create a Word Predictor extension ................................................................. 63
9. TEXT-TO-SPEECH (TTS) .............................................................................................................. 66
9.1 Introduction .............................................................................................................................. 66
9.2 Enumeration ............................................................................................................................. 66
9.3 Alternate Pronunciations ..................................................................................................... 66
9.4 Steps to create a TTS Extension......................................................................................... 67
10. SPELL CHECKER ......................................................................................................................... 70
10.1Introduction .............................................................................................................................. 70
10.2Enumeration ............................................................................................................................. 70
10.3ACAT Spell Checker ................................................................................................................ 70
11. THEMES ......................................................................................................................................... 72
11.1Introduction .............................................................................................................................. 72
11.2Enumeration ............................................................................................................................. 72
11.3Theme Configuration ............................................................................................................. 72
12. SCRIPTS .......................................................................................................................................... 74
12.1Introduction .............................................................................................................................. 74
12.2Syntax .......................................................................................................................................... 74
12.3Functions .................................................................................................................................... 74
12.3.1 actuate .............................................................................................................................. 74
12.3.2 highlight ........................................................................................................................... 75
12.3.3 highlightSelected .......................................................................................................... 76
12.3.4 select ................................................................................................................................. 76
12.3.5 transition ......................................................................................................................... 77
12.3.6 stop .................................................................................................................................... 77
12.3.7 run...................................................................................................................................... 77
12.3.8 beep ................................................................................................................................... 77
12.4Macros ......................................................................................................................................... 78
13. COMMAND PROCESSING......................................................................................................... 80
13.1Introduction .............................................................................................................................. 80
13.2Command Handlers ................................................................................................................ 80
13.2.1 Panel Command Handlers ........................................................................................ 80
13.2.2 Agent Command Handlers........................................................................................ 82
13.3ACAT Commands ..................................................................................................................... 82
13.3.1 Functional Agents Activation Commands .......................................................... 82
13.3.2 Window Management Commands ........................................................................ 83
13.3.3 Talk Window Management Commands .............................................................. 84
13.3.4 Function Key Commands .......................................................................................... 84
13.3.5 Modifier Key Commands ........................................................................................... 85
13.3.6 Panel Reposition Commands ................................................................................... 86
13.3.7 Clipboard Commands ................................................................................................. 87
13.3.8 Navigation Commands ............................................................................................... 87
13.3.9 Panel Display Commands ......................................................................................... 88
13.3.10 Zoom Commands ........................................................................................................ 89
13.3.11 Mouse Commands....................................................................................................... 90
13.3.12 Document Editing Commands ............................................................................... 91
13.3.13 Miscellaneous Commands ....................................................................................... 92
14. SETTINGS ...................................................................................................................................... 93
14.1Introduction .............................................................................................................................. 93
14.2Settings ........................................................................................................................................ 93
14.2.1 Scanning Settings ......................................................................................................... 93
14.2.2 Scanner Appearance ................................................................................................... 96
14.2.3 Log Settings .................................................................................................................... 98
14.2.4 Talk Window Settings .............................................................................................. 101
14.2.5 Word Prediction Settings ........................................................................................ 103
14.2.6 Mouse Grid Scanning Settings ............................................................................... 105
14.2.7 Mouse Radar Scanning Settings ........................................................................... 106
14.2.8 Text-to-Speech Settings ........................................................................................... 108
14.2.9 Mute Screen Settings ................................................................................................ 109
14.2.10 Miscellaneous Settings ............................................................................................ 110
14.3Formatting Date and Time................................................................................................. 112
1. INTRODUCTION
1.1 Overview
ACAT is an open source platform developed by researchers at Intel Labs with the goal
to benefit people with motor neuron diseases and quadriplegia. Intel created this
platform for Prof. Stephen Hawking to replace his decade's old system. It is
developed for windows and is meant to provide access to windows applications and
capabilities through limited interfaces. It enables users to easily, accurately and
quickly communicate using keyboard simulation and text to speech capability. It also
enables users to perform common tasks such as editing, managing documents,
navigating the Web and accessing emails. The unique and highly configurable system
provides researchers with a modern standard software interface to create
customized solutions enabled by inputs such as touch, eye blinks and eyebrow
movements.

1.2 References
The ACAT User Guide meant for end-users which has details on the ACAT
Application.

1.3 Organization
This document is organized as follows.
Chapter 1 Introduction to ACAT, glossary of terms.
Chapter 2 Architecture. A high-level description of the building blocks of ACAT
Chapter 3 Code Structure. Coding standards, style, building the toolkit.
Chapter 4 Extensions. The plug-in’s for ACAT. Enumeration and invocation
Chapter 5 Actuators. Enumeration, configuration and development of Actuator
extensions.
Chapter 6 Agents. Enumeration, configuration and development of Application
and Functional Agents.
Chapter 7 Panels. Enumeration, configuration and development of Scanners,
Dialogs and Menu extensions.
Chapter 8 Word Predictors. Enumeration, configuration and development of
word predictor extensions.
Chapter 9 Text-to-Speech (TTS). Enumeration, configuration and development
of TTS extensions.

6 INTRODUCTION | ACAT Developer’s Guide


Chapter 10 Spell Checker. Enumeration, configuration and development of Spell
Check extensions.
Chapter 11 Themes. Configuration of color schemes for the ACAT UI.
Chapter 12 Scripts. The ACAT scripting language.
Chapter 13 Command Processing. Development of command handlers.
Chapter 14 Settings. User preference settings.

1.4 Glossary of terms


A glossary of terms is presented here. Some descriptions here use words that are
defined in the glossary and these words are highlighted in in bold face.

Term Description

ACAT Assistive Context-Aware Toolkit.

A generic term for an ACAT window. There are three types


Panel
of Panels – Scanners, Dialogs and Menus

A Panel primarily used for text entry, cursor navigation etc.


The Alphabet scanner for instance, is used for text entry.
The Mouse scanner is used to move the cursor on the
desktop.
The Alphabet scanner is shown here.

Scanner

7 INTRODUCTION | ACAT Developer’s Guide


Term Description

A Panel which is a dialog box. ACAT uses Dialogs to enable


the user to configure ACAT settings.
The General Settings dialog is shown here.

Dialog

A Panel consisting of selectable options presented as a


Menu. The menu options are displayed with text and/or
icons.
The Main menu is shown here.

Menu

8 INTRODUCTION | ACAT Developer’s Guide


Term Description

A Menu that contains options which pertain to the current


context on the desktop. Context includes the foreground
application, the application window that currently has
focus, etc. For instance, if the user is interacting with a
Browser, the Contextual Menu would include options
relevant to browsing such as Back, Add to Favorites,
Search, etc.
The Contextual Menu for Internet Explorer is shown here.

Contextual Menu

The process of highlighting elements on a Panel on a timer.


In the scanner below, the rows of letters are highlighted in
succession on a timer. Scanning enables the user to make a
selection by using the switch trigger.

Scanning

A specific scanning sequence where widgets are


Animation
highlighted in a pre-defined pattern.

9 INTRODUCTION | ACAT Developer’s Guide


Term Description

ACAT plug-in’s. Extensions are deployed as DLL’s.


Extensions enable the extensibility and customization of
Extension
ACAT. There are various types of Extensions such as those
for Word Prediction, Text-to-Speech conversion, etc.

A generic term for an element on an ACAT Panel. A widget


Widget could refer to a button, a row of buttons, a box of rows, or a
menu item.

A hardware or software device that triggers an event when


activated. For instance, a mouse is an actuator which
Actuator triggers a click event when the button is pressed. Fingers
or facial muscles can also be used as actuators. Actuators
are input devices and drive the ACAT UI.

Actuators are composed of switches, which when


triggered, raise events. The buttons on a mouse, the keys
Switch on a keyboard are examples of switches. Specific hand
gestures or facial movements can also be recognized and
translated into switch events.

The process of activating a switch. A switch trigger


Switch Trigger generates an event which is translated into action such as
activating a button or selecting a menu item.

Text-to-Speech The process of converting written text to audible speech.

TTS An acronym for Text-to-Speech.

Software that predicts the next word based on the


Word Predictor
previous words in a sentence.

A generic name for ACAT Extension that can refer to an


Agent
Application Agent or a Functional Agent.

10 INTRODUCTION | ACAT Developer’s Guide


Term Description

An ACAT Extension that interfaces ACAT with an


Application application such as Notepad, Microsoft Word, Internet
Agent Explorer etc. Application Agents provide contextual
information about the applications to ACAT.

An ACAT Extension that implements a specific function


Functional Agent
such as File Browsing.

Theme A set of color schemes used to visually render the Panels.

The ACAT Talk window enables the user to converse. The


Talk Window user enters text into the window and presses ENTER to
convert the text to speech.

Configuration Configuration files are XML files that are used to customize
File ACAT.

1.5 ACAT Features


The following table lists the features included in the Open Source ACAT solution.
Scanners The scanners included are Alphabet, Cursor Navigation,
Punctuations, and Mouse Navigation.
Word Prediction ACAT’s Word Prediction is powered by Presage, the
intelligent predictive text engine created by Matteo Vescovi.
http://presage.sourceforge.net
Text-to-Speech Conversion from text to speech through the Microsoft
Speech Synthesizer which is a part of the Windows platform.
Spell Checker A rudimentary spell checker is included.
Actuators Actuator switches are supported are:
 Keyboard
 Facial gesture recognition through the ACAT Vision
software
 The ACAT infrared switch
 Off-the-shelf assistive USB switches

11 INTRODUCTION | ACAT Developer’s Guide


Application Support Applications supported through the Application Agents are:
 Notepad
 Microsoft Word
 WordPad
 Acrobat Reader
 Eudora Email
 Internet Explorer
 Chrome Browser
 Firefox Browser

Functional Agents Functional Agents included are:


 File Browser
 Launch Application
 Switch Applications
 Switch Windows
 Lecture Manager
 Volume Control
 New File
 Abbreviations Management

12 INTRODUCTION | ACAT Developer’s Guide


2. ARCHITECTURE
2.1 Introduction
ACAT is structured as a plug-in framework. This enables developers easily to extend
the capabilities by adding Extensions aka plug-ins (see Chapter 4). The extensions
are dynamically discovered and loaded at runtime. They provide services such as
text-to-speech conversion, input switch trigger handling and word prediction.
Figure 1 shows the high level architecture. The ACAT Core library and the ACAT
Extension library provide all the core functionalities of ACAT. They enumerate and
load the various extensions at runtime. Applications interact with extensions through
well-defined interfaces. Extensions raise events to notify subscribers when
something interesting happens.

Figure 1: High-level Architecture

13 ARCHITECTURE | ACAT Developer’s Guide


2.2 The ACAT Core Library
The ACAT Core library is a single DLL that provides all the core services. Figure 2
shows the components that make up the Core library.

Figure 2: ACAT Core Library Components


The following set of figures describe where each of the components fit into the ACAT
framework and what their specific roles are. Some of the terms used here are
described in the glossary (see section 1.4).
Figure 3 shows the Alphabet scanner and the components of the ACAT framework
that are responsible for the display and scanning of widgets on the scanner.

14 ARCHITECTURE | ACAT Developer’s Guide


Figure 3: ACAT Core Components for Panel display and Scanning

The following table describes the components shown in Figure 3.

Component Description

All the scanners, dialogs and menus are also


extensions. The word ‘Panel’ is used to denote a
scanner, a dialog or a menu. ACAT uses the Window
stacking model to display panels. The look and feel
of panels can be configured through Panel config
files, and the preferred panels to display can also be
Panel Management configured. The Panel Manager in this component
is responsible for enumerating panels, handling
requests to display them, maintaining the stack of
active panels, activating and deactivating them.

See Chapter 7 for details on Panels.

15 ARCHITECTURE | ACAT Developer’s Guide


Component Description

The Animation Manager in this component is


responsible for loading animation files which contain
the scanning sequence for scanners, executing the
Animation
scanning process and handling transitions between
Management
scanning sequences.

See Chapter 7 for details on Animations.

A widget is a wrapper class around the controls in a


scanner. It contains additional attributes controlling
the appearance and behavior such as fonts, colors
and text. The Widget Manager in this component
reads the attributes for the active scanner,
Widget Management
instantiates the widget objects for the elements in
the scanner and also controls the appearance of the
scanner elements during scanning.

See Chapter 7 for details on Widgets.

Next-word prediction during text entry is one of the


key features of ACAT. The Word Prediction
Manager in this component enumerates installed
Word Predictor
Word prediction extensions, and activates and
Management
configures the preferred Word prediction extension.

See Chapter 8 for details on Animations.

ACAT supports color schemes for the scanners,


dialogs and menus. The Theme Manager in this
component enumerates and manages installed
Theme Management
themes.

See Chapter 11 for details on Themes.

Figure 4 shows the Talk window and the Alphabet scanner. The user types text into
the Talk window and then converts it to speech.

16 ARCHITECTURE | ACAT Developer’s Guide


Figure 4: ACAT Core Components for Talk Window

The following table describes the components shown in Figure 4.

Component Description

The Talk window feature is primarily used to


converse. The user types into the Talk window and
ACAT converts the text to speech. It also enables the
Talk Window
user to carry out web searches, and learns the user’s
Management
writing style for better word prediction. The Talk
Window Manager in this component activates and
manages the Talk window.

Text-to-Speech (TTS) extensions are used to convert


text to audible speech. This enables the user to
converse or deliver speeches. The TTS Manager in
Text-to-Speech (TTS) this component enumerates installed TTS
Management extensions, activates and configures the preferred
TTS extension.

See Chapter 9 for details on Text-to-Speech.

17 ARCHITECTURE | ACAT Developer’s Guide


Figure 5 shows ACAT with the Notepad application as an example. The Alphabet
scanner is used to enter text into Notepad. The caret position and the text entered
are tracked by ACAT and this contextual information is used for word prediction.

Figure 5: ACAT Core Components for Application Management

The following table describes the components shown in Figure 5.

Component Description

18 ARCHITECTURE | ACAT Developer’s Guide


Component Description

Application Agents are extensions that interact


with applications such as Notepad, Microsoft Word
ant Internet Explorer. They provide contextual
information about the application such as the control
that the user is interacting with, and if the user is
editing a document, the text from the document etc.
Agent Management There are also Functional Agents which provide
specific functionalities such as file browsing. The
Agent Manager in this component is responsible for
functions such as enumerating Agents, monitoring
the foreground application, and activating agents.

See Chapter 6 for details on Agents.

Actuators are input switch triggers to drive ACAT. When triggered, they translated an
action on the ACAT UI such as selecting a widget. ACAT supports a number of input
switch mechanisms such as a camera using facial gestures as a switch, a keyboard or
off-the-shelf assistive switches.

Figure 6: ACAT Core Components for Input Switches

19 ARCHITECTURE | ACAT Developer’s Guide


The following table describes the components shown in Figure 6.

Component Description

The Actuator Manager in the Actuator Management


component is responsible for functions such as
enumerating the available switches and raising
Actuator Management
events to indicate switch triggers.

See Chapter 5 for details on Actuators.

The following table describes the remaining components in the ACAT Core Library.

Component Description

ACAT supports rudimentary spell checking and auto-


correction. This is useful for applications such as
Notepad which do not have a native spell checker or
auto-corrector. The Spell Check Manager in this
Spellcheck
component enumerates installed spell check
Management
extensions, activates and configures the preferred
extension to use.

See Chapter 10 for details on Spell Checkers.

ACAT supports the notation of a ‘user’ and each user


can have multiple ‘profiles’. All ACAT settings such
as scanner timings, look-and-feel, preferred panel
User Management configurations, preferred word predictors, preferred
actuators are associated with a user and a profile.
The User Manager in this component manages ACAT
users and profiles.

20 ARCHITECTURE | ACAT Developer’s Guide


Component Description

Scanning sequences are controlled through scripts.


The Interpreter component interprets scripts into
intermediate code which is then executed during
Interpreter
scanning.

See Chapter 12 for details on Scripts.

The Core library has a Widget library that contains


Widgets widgets for the various elements of the scanners,
dialogs and menus.

This component contains a host of utility functions


Utility for audit logging, debug trace logging, window
management, timers, Win32 Interop etc.

2.3 The ACAT Extension Library


The ACAT Extension Library has helper classes and base classes for the development
of Panels and Agents. The following table describes the components in the ACAT
Extension library.

Figure 7: The ACAT Extension Library

Component Description

21 ARCHITECTURE | ACAT Developer’s Guide


Component Description

The base classes for Application agents do most of


the heavy lifting required to support applications
such as Notepad, Microsoft Word, and Internet
Application Agent Base Explorer, etc. This makes it easier to derive and
Classes extend the functionality provided by the base
classes.

See Chapter 6 for details on Agents.

ACAT supports a host of ‘commands’, strings that


represent action verbs Examples of commands are
CmdTalkWindowToggle to toggle the visibility of
the Talk window, CmdMainMenu to display the
Main menu. These commands can be attached to
Command Handlers
events such as actuating an element on a scanner.
The Extension library has default handlers for
various commands.

See Chapter 13 for details on Command Handlers.

The Extension library has a number of utility/helper


Utility Classes classes to display dialogs, load/store ACAT settings
etc.

2.4 Extensions
Extensions are DLL’s or plug-in’s dynamically discovered and loaded at runtime.
They provide services such as Text-to-Speech, Word Prediction etc. Figure 8 shows
the six categories of Extensions.
Chapter 4 provides an introduction to Extensions.

22 ARCHITECTURE | ACAT Developer’s Guide


Figure 8: Extensions
The following table lists the categories with a brief description. The extensions are
deployed as individual DLL’s..

Extension Category Description

Includes all the Panels – Scanners, Menus and


Dialogs.
UI Extensions
See Chapter 7 for details on Panels.

23 ARCHITECTURE | ACAT Developer’s Guide


Extension Category Description

Interfaces with HW/SW Actuators.


Actuator Extensions
See Chapter 5 for details on Actuators.

Provides next-word prediction.


Word Predictor
Extensions See Chapter 8 for details on Word Predictors.

Converts text to speech


Text-toSpeech
Extensions See Chapter 9 for details on Text-to-Speech
extensions.

Includes Application and Functional Agents.


Application Agents interface with apps on the
desktop and Functional Agents provide services such
Agent Extensions
as File Browsing.

See Chapter 6 for details on Agents.

Performs spell checking for applications that don’t


Spell Checker have native spell checkers.
Extensions
See Chapter 10 for details on Spell Checkers.

24 ARCHITECTURE | ACAT Developer’s Guide


3. CODE STRUCTURE
The ACAT solution is completely self-contained and builds the ACAT libraries,
extensions and applications. The solution requires Visual Studio 2012. The
applications are 32-bit.

3.1 Solution Layout


There are four top level solution folders in the solution: Applications, Assets,
Extensions and Lib.

Figure 9: Solution Layout


Project dependencies are setup to build the components in the following order:
1. Lib\Core (ACATCore.dll)
2. Lib\Extension (ACATExtension.dll),
3. Extensions
4. Applications.

25 CODE STRUCTURE | ACAT Developer’s Guide


3.2 Coding Standards and Styles
The code for ACAT adheres to a uniform coding standard as enforced by StyleCop,
which is based on Microsoft’s .NET Framework Design Guidelines. The following rules
are followed:
1. One class per file.
2. Class members are defined in the following order
 Fields
 Constructors
 Destructors
 Delegates
 Events
 Enums
 Interfaces
 Properties
 Indexers
 Methods
 Structs
 Classes
3. Within each category, class members are laid out alphabetically.
4. Naming conventions
 All public members begin with an uppercase letter.
 All private fields begin with an underscore.
 All private and protected members begin with a lowercase.
 Hungarian notation is not used.
5. “using” statements are listed with the .NET imports first. They are listed
alphabetically.
6. Every function, field and property, whether public, private or protected, is
documented.
7. Local calls are not prefixed with the ‘this’ operator.
8. Public properties have getters and setters.
9. Wherever applicable, classes are derived from IDisposable.
10. Most functions return void or a bool.
11. All errors are handled gracefully without escalating to the user. Only fatal
exceptions are displayed to the user.
12. Line lengths are restricted to around 80 characters.
13.

3.2.1 Visual Studio Add-on’s


The following Visual Studio add-on’s make life easier:
1. StyleCop (free) which ensures the code follows .NET coding standards.

26 CODE STRUCTURE | ACAT Developer’s Guide


2. CodeMaid (free) which reorganizes and cleans up the code in accordance
with StyleCop rules
3. ReSharper (paid) which looks for unused variables, uninitialized variables
etc.

3.3 Building the framework


The requirements for building the solution are:
 Windows 7 or higher
 Visual Studio 2012
 At least 1 GB of free disk space
 NET 4.5 on Windows 7. Windows 8.x already has .NET 4.5
There are no interdependencies between the any of the projects in the solution. All
projects link with the ACATCore.dll and ACATExtension.dll. The Post-Build for
these two libraries copies them to the $\Redistributable folder. All the projects in
the solution reference them from this folder.
During runtime, since all the extensions are discovered and dynamically loaded, it
requires them to be laid out in a specific folder structure under the application’s run
folder. Refer to section 4.2 for details on the folder structure. All the extensions
must be deployed to the application’s run folder. The Post-Build process for
ACATApp takes care of this. It executes the batch file $\deploy.bat. This batch file
deploys all the extension DLL’s and configuration files from their respective build
folders to ACATApp’s bin\$Configuration folder.
Note: Never build an individual project in the solution. Always do a build at the
solution level as some of the projects have Post-Build scripts and they must execute
to ensure that the DLL’s are copied and deployed properly. If you build an individual
project, your changes may not take effect as your DLL may not get deployed to the
applications run directory.

3.4 Running the application


ACAT’s Word Prediction is powered by Presage, the intelligent predictive text engine
created by Matteo Vescovi. http://presage.sourceforge.net . Before running
ACATApp, the Presage word prediction software must be installed. The installer for
Presage can be found under $\Applications\SetupClean\Install. Run the installer and
accept all defaults. After installation is complete, the Presage service icon will appear
in the systray. Alternatively, run the installer for the ACAT application and this will
install Presage. After Presage is installed, run ACATApp from Visual Studio.
The F5 key can be used as the input trigger for the application. Refer to the ACAT
User Guide on getting started with ACATApp.

27 CODE STRUCTURE | ACAT Developer’s Guide


3.5 Logging
ACAT uses debug log traces liberally. Debug logs can be enabled through a preference
setting (see section 14.2.3) The DebugView utility
(https://download.sysinternals.com/files/DebugView.zip )can be used to view debug
messages. All debug messages are prefixed with the name of the class and the name
of the function that made the call. These prefixes can be used in DebugView as filters
to selectively view log messages.

28 CODE STRUCTURE | ACAT Developer’s Guide


4. EXTENSIONS
ACAT extensions are DLL’s which are discovered at runtime and loaded dynamically.

4.1 Extension Categories


Extensions fall under one of the following categories.

Extension Category Description

Extensions that interface with the switch input


trigger mechanism. The user makes a selection in
Actuator Extensions
the UI by activating the switch. This is similar to
clicking a mouse button.

Extensions that convey contextual information


Application Agent about an application such as Notepad or Microsoft
Extensions Word. Typically, there is one Application Agent
per application.

Extensions that provide specific functions such as


Functional Agent
a File Browser to open files, Application Launcher
Extensions
to launch applications etc.

Extensions that perform spell check and auto


correct during text entry for applications such as
Spell Checker Extensions
Notepad which do not have native spell checkers
or auto-correctors

Extensions that provide TTS services. For


Text-to-Speech (TTS) instance, ACAT has an extension that uses the
Extensions Microsoft Speech Synthesizer to convert text to
speech.

Extensions that contain scanners, dialogs and


UI Extensions
menus.

29 EXTENSIONS | ACAT Developer’s Guide


Extension Category Description

Extensions that provide next-word prediction.


Word Prediction ACAT has a word predictor based the Presage
Extensions Intelligent Predictive Text Engine
(http://presage.sourceforge.net)

4.2 Extension Folder Layout


Extensions are stored in folders under the Extension in the ACATApp run directory.
Any number of extension folders can be specified. The ACAT setting ExtensionDirs
contains a semi-colon delimited list of names of extension folders. By default, ACAT
has one extension folder called “Default” under “Extensions” (see Figure 10)
Under the root folders, there is one top-level folder for each extension category.
Figure 10 shows the folder structure for extensions. The install directory for ACAT is
C:\Intel\ACAT. Below that is the Extensions root folder under which all the
extensions are stored. There is one top-level folder called Default under which there
is one sub-folder for each Extension category.

Figure 10: Extensions Folder Structure

30 EXTENSIONS | ACAT Developer’s Guide


4.3 Extension Discovery
Each extension category has an Interface which must be implemented by all
extensions that belong to the category. For instance, all Application Agents must
support the IApplicationAgent interface. All Word Prediction extensions must
support the IWordPredictor interface.
On startup, the manager for each Extension category traverses the depth of the top-
level folder for that category. It enumerates all DLL’s under the folder and for each
DLL, it caches the .NET types of classes that derive from the Interface for the category.
For instance, the Word Predictor Manager would descend into the WordPredictors
folder, examine all the DLL’s there and look for classes that derive from
IWordPredictor. Similarly, the TTS Manager would descend into the TTSEngines
folder. The Managers would then use .NET reflection to create an instances of the
objects for the Extensions.

4.4 Extension Descriptor


Every extension class has a Descriptor that uniquely identifies the class. The
Descriptor has three properties: a GUID which is a unique identifier for the extension,
a name and a friendly description. These properties are encapsulated in the
IDescriptor interface. Every extension classes must have a property that returns the
IDescriptor interface for that class.
To simplify this, extension classes can define a custom attribute called
DescriptorAttribute that defines the three properties –a GUID, name and
description. The ACAT library has a helper class called DescriptorAttribute that
reads the custom attributes and returns an IDescriptor object. As an example, the
Internet Explorer Agent has the following DescriptorAttribute with the GUID, name
and description:

[DescriptorAttribute("0B183771-C3E7-4ED2-9886-741526343140",
"Internet Explorer Agent",
"Application Agent for Internet Explorer")]
internal class InternetExplorerAgent : InternetExplorerAgentBase
{

}

Listing 1: Descriptor Attribute

4.5 Extension Invoker


Since all ACAT extensions are standalone DLL’s, they are not directly referenced in
other projects. An application may want set Properties or invoke Methods in the
extension. For instance, the File Browser functional agent returns the name of the file
the user selected through a property in the File Browser Agent class. The
YesNoScanner returns the Yes/No choice made by the user. So how does an

31 EXTENSIONS | ACAT Developer’s Guide


application access properties or invoke methods in the extension? The
ExtensionInvoker class is a helper class that enables this. It uses .NET reflection to
access the Methods/Properties in the extension class.
Let’s say the application wants to access a String property called FooString in an
extension class FooBarClass (which could be an Application Agent, a WordPredictor
Agent etc.). Follow these steps:

Step What to do

1 Derive FooBarClass from IExtension

In the FooBarClass declare a private field of type ExtensionInvoker.


2
private readonly ExtensionInvoker _invoker;

In the FooBarClass constructor, allocate _invoke.


3
_invoker = new ExtensionInvoker(this);

In the FooBarClass, declare a public property FooString.


4
public String FooString {get; set;}

Implement IExtension. It has one method GetInvoker() which returns an


ExtensionInvoker object. This object enables access to the
Methods/Properties of FooBarClass through .NETreflection.
5 public ExtensionInvoker GetInvoker()
{
return _invoker;
}

To access the FooString property use ExtensionInvoker.

6
String value = fooBarObject.GetInvoker().GetStringValue("FooString");

fooBarObject.GetInvoker().SetValue("FooString", "Hello world");

32 EXTENSIONS | ACAT Developer’s Guide


5. ACTUATORS
5.1 Introduction
Actuators are input trigger mechanisms. Actuators contain one or more switches.
ACAT actions are mapped to each switch. Every time the switch is triggered, the
ACAT user interface will respond with the action that is associated with that switch..
For instance, if a button is highlighted in the scanner and user activates the switch, it
will translate into a click event.
ACAT Actuators are managed by the Actuator Manager in the Actuator Management
component.
The following switch mechanisms are supported by ACAT:
a. Keyboard: The F5 key on the keyboard can be used as a trigger. Every time
the user hits F5, the scanner will respond by executing the action associated
with the highlighted element.
b. ACAT Vision: ACAT vision application uses a webcam to detect facial
gestures which are then translated into trigger events. The ACAT vision
module interfaces with ACAT through a TCP/IP socket interface.
c. Off-the-shelf switches: ACAT supports a number of off-the-shelf switches
which plug into the USB interface of your computer. These switches can be
configured to send specific keystrokes whenever the switch is activated. To
work with ACAT, the switches should be configured to send a F5 key press
event every time the switch is activated.
d. ACAT Infrared switch: This switch is currently under development, it is
meant to attach to a user’s glasses and can detect facial motions (cheek
movement) which are translated into trigger events.
Note: Out of the box, ACAT supports keyboard and ACAT vision as input switch
mechanisms. The mouse can also be used to activate the UI by pointing and clicking.
New hardware or software switches can be integrated with ACAT through Actuator
extensions. See section 5.5 for step-by-step instructions to develop Actuator
extensions.

5.2 Enumeration
All Actuator extension DLL’s must be installed under the Actuators root folder which
is [INSTALLDIR]\Extensions\[EXTENSION_DIR]\Actuators. Under this, each
actuator DLL should reside in its own sub-folder. For instance, the ACAT vision
actuator is installed under
C:\Intel\ACAT\Extensions\Default\Actuators\CameraActuator. During initialization,

33 ACTUATORS | ACAT Developer’s Guide


the Actuator Manager recursively walks through the Actuators root folder, loads all
the DLL’s in there and creates instances of classes that derive from ActuatorBase.

5.3 Actuator Configuration Files


Actuators and switches are configured through configuration files located in the
ACAT user’s folder which is [INSTALLDIR]\Users\[USERNAME], for example,
C:\Intel\ACAT\Users\Default, where “Default” is the default user name. There are
two configuration files – Actuators.xml and SwitchConfigMap.xml. The reason for
locating these files in the User folder is customization. The command to execute
actions performed when a switch is activated is configured through these files.
Locating them in the user folder allows for mapping based on user preferences.

5.3.1 Actuators.xml Configuration File


This file contains a list of Actuators and for each Actuator, the list of switches it
supports. An Actuator can have multiple switches. Listing 2 is a sample file that
shows two actuators – one for the keyboard and the other for the ACAT vision module
which uses a Webcam to track facial gestures.

<?xml version="1.0" encoding="utf-8"?>


<ACAT>
<Actuators>
<Actuator name="Keyboard" id="D91A1877-C92B-4D7E-9AB6-F01F30B12DF9" enabled="true">
<Switch name="S9" source="F5" enabled="true" beepFile="beep.wav"
acceptTime="@AcceptTime"/>
<Switch name="H1" source="Ctrl+T" enabled="true"/>
<Switch name="H2" source="Ctrl+Alt+M" enabled="true"/>
<Switch name="H4" source="Alt+C" enabled="true"/>
</Actuator>

<Actuator name="CameraActuator" id="A5B9BFF9-0A35-41AC-8989-69A3D60F4435"


enabled="true">
<Switch name="CT" source="CT" enabled="true" acceptTime="@AcceptTime"/>
<Switch name="ER" source="ER" enabled="true" acceptTime="@AcceptTime"/>
</Actuator>
</Actuators>
</ACAT>

Listing 2: Actuators.xml configuration file


Each <Actuator> element has a list of <Switch> elements. The following table lists the
attributes for the <Actuator> element.

<Actuator>
Attribute Type Description

Name String A meaningful name of the Actuator.

34 ACTUATORS | ACAT Developer’s Guide


<Actuator>
Attribute Type Description

The GUID for the Actuator. This should be


Id GUID the same as the GUID used in the
string DescriptorAttribute (section 4.4) of the
C# class for the Actuator.

Set this to “true” to enable this Actuator


Enabled String
and “false” to disable it.

The attributes for the <Switch> element are listed below.

<Switch>
Attribute Type Description

Name of the switch. This should match


the name of the switch in the
Name String
SwitchMapConfig configuration file (see
section 5.3.2).

A string containing meta data about the


switch. This depends on the type of the
switch and is opaque data. The switch
extension class can interpret this data
source String any which way it chooses. The Keyboard
switch for instance uses this to specify
the hot key combination such as Alt+T.
When Alt+T is pressed on the physical
keyboard, the switch is triggered.

Set this to “true” to enable the switch and


“false” to disable it. If not specified,
enabled String
default value is “true”. If set to false, this
switch will not be enumerated.

35 ACTUATORS | ACAT Developer’s Guide


<Switch>
Attribute Type Description

Set this to “true” if the switch should


actuate when triggered. Note that
enabled should be set to true as well. If
actuate String
you set actuate to false, and enabled to
true, the switch will be enumerated, but
actuated.

Name of the WAV file that will be played


whenever the switch is triggered. Just
the file, not the full path. If not specified,
beepFile String
no beep will be sounded. The WAV file
should reside in the ACAT Assets\Sounds
folder.

Accept time for a switch is the minimum


length of time in milliseconds that the
switch should stay engaged in order for
ACAT to recognize it as a valid switch
event. This eliminates false positives in
the detection algorithm. As an analogy,
let’s say this is set to 100ms for a
keyboard switch. The key would have to
stay pressed for at least 100 ms to ACAT
acceptTime Integer or
to recognize it as a valid key press.
String
Choose this value carefully.

Set this to a numeric value in


milliseconds. Or set it to the macro
@AcceptTime to indicate that the ACAT
setting AcceptTime (see section 14.2.1)
should be used as the value (see section
Error! Reference source not found. on
Macros).

5.3.2 SwitchConfigMap.xml Configuration File


The SwitchConfigMap.xml configuration file maps each of the switches to an action.
The action is specified as a Command that will be executed when the switch is
triggered. Different mappings can be specified for each of the panel types – Scanners,

36 ACTUATORS | ACAT Developer’s Guide


Dialogs and Menus. This gives the flexibility to enable/disable/configure switch
trigger actions for each of the panel types.
Listing 3 shows a sample of the SwitchMapConfig.xml configuration file. It configures
the two Actuators – Keyboard and the ACAT vision module discussed in the previous
section.

<?xml version="1.0" encoding="utf-8"?>


<ACAT>
<SwitchMap panel="default" enabled="true">
<Actuators>
<Actuator name="Keyboard" enabled="true">
<Switch name="S9" onTrigger="default()"/>
</Actuator>

<Actuator name="CameraActuator" enabled="true">


<Switch name="CT" onTrigger="default()"/>
</Actuator>
</Actuators>
</SwitchMap>

<SwitchMap panel="Scanner" enabled="true">


<Actuators>
<Actuator name="Keyboard" enabled="true">
<Switch name="S9" onTrigger="default()"/>
<Switch name="H1" onTrigger="run(@CmdTalkWindowToggle)"/>
<Switch name="H2" onTrigger="run(@CmdMainMenu)"/>
</Actuator>

<Actuator name="CameraActuator" enabled="true">


<Switch name="CT" onTrigger="default()"/>
<Switch name="ER" onTrigger="run(CmdTalkWindowToggle)"/>
</Actuator>
</Actuators>
</SwitchMap>

<SwitchMap panel="Dialog" enabled="true">


<Actuators>
<Actuator name="Keyboard" enabled="true">
<Switch name="S9" onTrigger="default()"/>
</Actuator>
</Actuators>
</SwitchMap>

<SwitchMap panel="ContextMenu" enabled="true">


<Actuators>
<Actuator name="Keyboard" enabled="true">
<Switch name="S9" onTrigger="default()"/>
</Actuator>
</Actuators>
</SwitchMap>
</ACAT>

37 ACTUATORS | ACAT Developer’s Guide


Listing 3: SwitchConfigMap.xml configuration file

The file contains a list of <SwitchMap> elements. Each <SwitchMap> element has a
list of Actuators to be included in the mapping. For each <SwitchEleemnt>, the
onTrigger attribute specifies the command to execute when the switch is triggred.
The attributes for the <SwitchMap> element are listed below.

<SwitchMap>
Attribute Type Description

The panel type to which this switch


mapping applies. Possible values are:
Scanner, Dialog, ContextMenu and
default. If set to Scanner, the mapping
will apply to all scanners. Likewise, for
panel String
Dialog and ContextMenu, the mapping
will apply only to dialogs and menus. A
value of default indicates the mapping is
the default if there is no mapping
specified for the panel type.

Set this to “true” to enable this mapping,


enabled String
“false” to disable it.

The attributes for the <Actuator> element are:

<Actuator>
Attribute Type Description

Name of the Actuator. Must be the same


name String as the name specified in Actuators.xml
(see section 5.3.1).

Set this to “true” to enable this mapping,


enabled String
“false” to disable it.

The attributes for the <Switch> element are:

38 ACTUATORS | ACAT Developer’s Guide


<Switch>
Attribute Type Description

Name of the switch. Must be the same as


name String the name specified for the switch in
Actuators.xml (see section 5.3.1)

The script to execute when this switch is


triggered. In the example in Listing 3, the
run function is invoked with a command
to execute. For a complete list of
onTrigger String
commands supported by ACAT, see
section 13.3. A value of default()
indicates default action which is
equivalent to a mouse click.

5.4 ACAT Actuator Extensions


The ACAT Core library has support for the Keyboard actuator, and provides base
classes for developing USB Hid, Winsock client Winsock server actuators.

5.4.1 Keyboard Actuator


The Keyboard actuator is a part of the Actuator Management component of the ACAT
Core library. It uses Windows keyboard hooks to capture keystrokes no matter
which application is active. Each keystroke is compared with the key mapping
specified in the Actuators.xml file (see section 5.3.1). If an Actuator switch for
keystroke is found, that switch is triggered.

5.4.2 USB HID Actuators


If the switch hardware is a USB HID device (most of them are), the ACAT Core library
has a USBDevice class which handles all the heavy lifting of opening the device,
reading data asynchronously, detecting device connect/disconnect etc. The
WordsPlus actuator which is a part of the ACAT solution is an example of a USB HID
actuator which uses the USBDevice class.

5.4.3 Winsock Actuators


The base classes for Winsock actuators can be used to develop a server or client
based actuator. This is useful for software switches where the source of the switch
can be another application or DLL. Switch events are sent to ACAT over a socket
interface. The Winsock server actuator listens for incoming connections whereas the

39 ACTUATORS | ACAT Developer’s Guide


Winsock client actuator makes connections to a TCP/IP server. The CameraActuator
which is a part of the ACAT solution is an example of a Winsock client actuator which
connects to another executable that runs the vision algorithm for facial gesture
detection.
The base classes also handle parsing of the switch event data received over the
socket. After parsing the data, they also trigger switch events based on information in
the data. The data for sending Actuator switch events to ACAT is a semi-colon
delimited string in the format described below. To use a different format, derive from
the base class and override the functions that parse the data.
gesture=<gesture_type>;action=<gesture_event>;conf=<confidence>;
time=<timestamp>;actuate=<flag>;tag=<userdata>

Field Value

Should be the same as the ‘source’ field in


gesture Actuators.xml (see section 5.3.1). ACAT looks up
the list of switches for the Actuator and finds the
one whose ‘source’ value matches this.

Specifies the switch action. Should be one of the


values of the SwitchAction enum type: “Down” to
indicate the switch has engaged, similar to a key-
down event on a keyboard), “Up” to indicate the
switch has been released (similar to a key-up event
on a keyboard) or “Trigger” to indicate the switch
has been triggered (similar to a key-press
action keyboard event). Depending on the fidelity of the
switch mechanism, a Down followed by an Up can
be used, or the Trigger can be used instead. Note
that if Up/Down events are used, ACAT will
enforce the AcceptTime (see section 14.2.1) to
determine whether to raise a switch trigger event
or not. If only “Trigger” is used, then AcceptTime
is ignored.

conf The confidence level (for future use)

time The timestamp of the event in Ticks.

40 ACTUATORS | ACAT Developer’s Guide


Field Value

Value should be “true” to denote whether to


actuate actually carry out the action, “false” to denote
otherwise.

tag Opaque data to pass meta-data to the Actuator.

5.5 Steps to create an Actuator extension


The ACAT solution has two examples of Actuators.
1. The WordsPlus actuator reads data from a switch box plugged into the USB
port. You can use this as reference to develop USB-based Actuators. The
ACAT Core library has support to open and read data from USB Hid devices.
2. The CameraActuator is an example of a soft actuator. It uses TCP/IP to
communicate to the ACAT vision software. The vision software sends trigger
events over TCP/IP.
The following steps outline the steps to create an Actuator extension. Let’s assume
the actuator we are creating is called FooActuator which interfaces with a hardware
switch over USB or a serial interface. Let’s assume the hardware switch has two
switches which can be triggered independently. Each switch is mapped to an ACAT
action which will be executed when the switch is activated. Assume the switches are
named S1 and S2 configured as follows:
 S1 acts as the primary switch in that it maps to a “select” action on the ACAT
UI, like the click of a mouse button.
 Activating S2 displays the Contextual menu. This switch is active only when a
Scanner is the active panel.
First let’s update the configuration files Actuators.xml (see section 5.3.1) and
SwitchConfigMap.xml (see section 5.3.2) with information about FooActuator.
Follow these steps to update Actuators.xml:

Step What to do

1 Edit Actuators.xml.

41 ACTUATORS | ACAT Developer’s Guide


Step What to do

Add an <Actuator> node as shown below. Generate a GUID and assign it


to the id attribute. The actuator has two switches S1 and S2.
<Actuator name="FooActuator"
2 id="B5B9D4FF9-1135-67AC-8080-9A3D60F4435"enabled="true">
<Switch name="S1" source="S1" enabled="true"
acceptTime="@AcceptTime"/>
<Switch name="S2" source="S2" enabled="true"
acceptTime="@AcceptTime"/>
</Actuator>

Follow these steps to update SwitchConfigMap.xml:

Step What to do

1 Edit SwitchConfigMap.xml.

In the SwitchMap node for the default panel


(<SwitchMap panel="default") add the following entry for switch S1.
2 <Actuator name="FooActuator" enabled="true">
<Switch name="S1" onTrigger="default()"/>
</Actuator>

In the node for “Scanner” (<SwitchMap panel="default"), add the


following entry for switch S2
3 <Actuator name"FooActuator" enabled="true">
<Switch name="S2" onTrigger="run(@CmdContextMenu)”/>
</Actuator>

Add code for FooActuator in the ACAT solution.

Step What to do

In the ACAT solution, add a new Class Library FooActuator to the


1
Extensions\Default\Actuators solution folder.

Go to the Properties for this project and set the “Platform target” to “Any
2
CPU”.

42 ACTUATORS | ACAT Developer’s Guide


Step What to do

Add references to ACATCore.dll and ACATExtension.dll in the


3 $\Redistributable folder. In the Properties for these two DLL’s, set
“Copy Local” to false.

4 Add a class called FooSwitch, derive it from ActuatorSwitchBase.

5 Specify ActuatorBase as the base class for FooActuator.

To the project, add a class called FooSwitch. Specify


6
ActuatorSwitchBase as the base class.

Add the DescriptorAttribute custom attribute to the class. For the


GUID, specify the same GUID you used in Actuators.xml above.
7 [DescriptorAttribute(
"B5B9D4FF9-1135-67AC-8080-69A3D60F4435",
"Foo Actuator",
"Interface to the Foo USB Switch Trigger Hardware")]

In the FooActuator class:


a. Override the Init() function to initialize the hardware device, like
opening the serial port, creating a thread to read data over the
port or creating an data event handler.
8 b. Override the CreateSwitch() function to return a FooSwitch
object.
c. Override Pause() and Resume() to set a class variable which
reflects the current state of the actuator. If the actuator is in a
paused state, it should not raise any events.

Activate the hardware to trigger switch #1. The read handler in


9 FooActuator reads the data coming in that indicates switch #1 was
activated.

The base class ActuatorBase exposes a public property called Switches


which is an array of switches. The array is created by the base class
10
during initialization by parsing the SwitchConfigMap.xml file. Search
this array for the switch object with the name “S1”.

43 ACTUATORS | ACAT Developer’s Guide


Step What to do

Call OnSwitchTriggered() method with the switch object to raise the


11 event. ACAT will execute the action associated with this switch, which is
the select action.

Some switches trigger two events – one when the switch is activated and
the other when the switch is released (or deactivated). This is akin to
the keyboard KeyDown and Keyup events. In this case, instead of calling
OnSwitchTriggered, call OnSwitchActivated() when the switch is down
12 and and OnSwitchDeactivated() when the switch is released. The
actuator manager will analyze both the events and determine the time
elapsed between the down and the up. If the time elapsed is less than
the AcceptTime (the AcceptTime attribute in SwitchConfigMap.xml), the
switch event will be ignored. This takes care of false positives.

Update dependencies in the ACAT solution for the FooActuator project


to make sure it is built in the right order. Ensure that:
13
a. FooActuator has dependencies on ACATCore and ACATExtension.
b. PostBuildSolution has a dependency on FooActuator.

FooActuator.dll must now be deployed to the run directory of the


application.

a. Edit $\deploy.bat.
b. Look for the section “Deploying Actuator DLLs” and add the
14
following lines there:
set SOURCEDIR=Extensions\Default\Actuators\FooActuator
set TARGETDIR=%INSTALLDIR%\%SOURCEDIR%
if not exist %TARGETDIR% mkdir %TARGETDIR%
copy .\%SOURCEDIR%\bin\%CONFIG%\FooActuator.dll %TARGETDIR%

Build the solution. Examine the output folder of ACATApp and verify
15 that FooActuator.dll file is deployed to
Extensions\Default\Actuators\FooActuator

Run the application and verify that the switch events are being handled
16
properly.

44 ACTUATORS | ACAT Developer’s Guide


The Actuator extension can be developed as an independent project outside the ACAT
solution. All the steps outlined above still hold. In the Post-Build event for the
project, make sure the DLL is deployed into its proper location in the run folder of
ACATApp.

45 ACTUATORS | ACAT Developer’s Guide


6. AGENTS
6.1 Introduction
Agents are ACAT extensions managed by the Agent Manager in the Agent
Management component. There are two types of Agents – Application Agents and
Functional Agents.
Application Agents are extensions that interact with applications such as Notepad,
Microsoft Word ant Internet Explorer. They provide contextual information about
the application such as the control that the user is interacting with, and if the user is
editing a document, the text from the document etc.
The ACAT feature set is enhanced through Functional Agents such as the File
Browser agent which enables the user to manage files, the Launch Application agent
which enables the user to start instances of applications.

6.2 Enumeration

6.2.1 Application Agents


All Application Agents extension DLL’s must be installed under the top-level folder
[INSTALLDIR]\Extensions\[EXTENSION_DIR]\AppAgents. Under this, each agent
DLL should reside in its own sub-folder. For instance, the agent for Notepad is
installed under C:\Intel\ACAT\Extensions\Default\AppAgents\NotepadAgent.
During initialization, the Agent Manager recursively walks through the AppAgents
folder, loads all the DLL’s in there and creates instances of classes that derive from
IApplicationAgent.

6.2.2 Functional Agents


All Functional Agents extension DLL’s must be installed under the top-level folder
[INSTALLDIR]\Extensions\[EXTENSION_DIR]\FunctionalAgents. Under this,
each agent DLL should reside in its own sub-folder. For instance, the File Browser
Functional agent is installed under
C:\Intel\ACAT\Extensions\Default\FunctionalAgents\FileBrowserAgent. During
initialization, the Agent Manager recursively walks through the FunctionalAgents
folder, loads all the DLL’s in there and creates instances of classes that derive from
IFunctionalAgent.

6.3 Application Agents


Application Agents are extension DLL’s associated with specific applications. The
Agent Manager tracks focus changes on the user’s desktop. Whenever a focus change
is detected, the Agent Manager checks the installed Application Agents to find the one

46 AGENTS | ACAT Developer’s Guide


is associated with the foreground process. If it finds one, it activates it and sends
focus change messages to it. The Application Agent can then act on these messages
by displaying a scanner that is appropriate for the application window or control that
currently has focus. If the focused control is an edit control for instance, the agent can
also track the caret position, extract the text where the cursor is and raise events to
trigger next-word prediction.
For example, if the user is editing a document in Notepad, the Agent Manager
automatically activates the Notepad Application Agent which tracks the caret position
and editing changes. If the user then switches to Internet Explorer, the Agent
Manager detects the focus shift and activates the Internet Explorer agent which then
displays a contextual menu for Internet Explorer to enable the user to navigate the
browser.
Every Application Agent implements a ProcessSupported property which is a list of
processes the agent supports. The Agent Manager maintains a mapping of processes
and the Application Agents that are associated with them. Note that there may be
multiple Application Agents for a process. If there is a conflict, the preferred agent to
use can be specified through a configuration file (see section 6.5).
ACAT has base classes for Application Agents for the following applications.
 Acrobat Reader
 Chrome Browser
 Windows Photo Viewer
 Eudora Email
 Firefox Browser
 Internet Explorer
 Microsoft Word
 Notepad
 WordPad
In addition to these, there is an Agent to handle dialogs and one to handle menus. If
the foreground window is either a dialog or a menu, the Agent Manager activates the
dialog or menu agent. These agents display scanners to enable the user to easily
navigate dialogs and menus.

6.4 Functional Agents


Functional Agents are different from Application Agents. While Application Agents
are associated with external applications, Functional Agents interact with
‘applications’ internal to ACAT, such as File Brower and Application Launcher.
Typically, Functional Agents display a dialog docked alongside a scanner. The user
interacts with the dialog and the result of the user action is conveyed to the caller.
For example, the File Browser agent displays a dialog with a list of files and a scanner
to allow the user to specify a search filter (see Figure 11). When the user selects a file

47 AGENTS | ACAT Developer’s Guide


from the list, the dialog exits. The caller can query for the name of the selected file
and perform the necessary action.

Figure 11: File Browser Agent

Functional Agents are activated by calling ActivateAgent() in the Agent Manager. The
name of the agent is passed as the parameter. The names of Functional Agents are
specified in the DescriptorAttribute custom attribute (see section 4.4). If there are
multiple Functional agents with the same name, the preferred agent can be specified
though a configuration file (see section 6.5)
ACAT has the following Functional Agents:

Agent Name Description

Abbreviations Agent Enables the user to add/modify/delete


abbreviations

FileBrowser Agent Enables file management – open/delete


files.

Launch App Agent Displays a list of favorite applications


and enables the user to launch them.

48 AGENTS | ACAT Developer’s Guide


Agent Name Description

Lecture Manager Agent Enables delivery of speeches/lectures


by converting text to speech. User can
pace the lecture.

New File Agent Enables user to create new text/Word


documents.

Switch Windows Agent Displays a list of open windows and


enable the user to activate a window
(the Windows Alt+Tab equivalent)

Volume Settings Agent Enables the user to set the volume level
of text-to-speech

6.5 Agent Configuration Files


If there is a conflict where there are multiple Application Agents for the same process,
or multiple Functional Agents with the same name, the preferred agent can be
specified through the configuration file PreferredAgents.xml. This file resides in the
ACAT user’s folder which is [INSTALLDIR]\Users\[USERNAME], for example,
C:\Intel\ACAT\Users\Default, where “Default” is the default user name.
A sample PreferredAgents.xml is shown in the listing below.

<ACAT>
<PreferredAgents>
<PreferredAgent agentId="EC2EA972-934B-4EE0-A909-3EA0140AC738"/>
<PreferredAgent agentId="E9B930AD-CB35-478C-BDA6-D7FC43349019"/>
</PreferredAgents>
</ACAT>

Listing 4: PreferredAgents.xml
This file lists the GUID’s of the agents to use in case of a conflict. Each agent C# class
has a GUID associated through the DescriptorAttribute custom attribute (see
section 4.4).

49 AGENTS | ACAT Developer’s Guide


7. PANELS
7.1 Introduction
A “panel” in ACAT can refer to a Scanner, Menu or a Dialog (see Figure 12). Panels
are essentially Forms with buttons and labels. The look and feel has been designed to
make the elements appear clean and seamless without borders. Colors are selected
to maximize contrast (see Chapter 11 on Themes). UI Elements such as buttons,
labels, text boxes, check boxes are called widgets. Widgets on the panel are scanned
(highlighted) on a timer. Every panel has a specific scanning sequence aka
animation sequence which enables the user to zero-in on the widget to activate. If
the user activates the switch mechanism while a widget is highlighted, an action or a
command for that widget is executed. For instance, if the widget ‘a’ in the Alphabet
scanner is actuated, it causes the letter ‘a’ to be sent to the active window. If the user
activates the switch when a box of letters is highlighted, animation transitions into
the next sequence in which the rows of letters in the box are successively highlighted.

Figure 12: Types of ACAT Panels


The attributes of the widgets such as colors, fonts, text and actions, animations,
transitions between animations are all configured in panel configuration files.
Every panel must have at least one associated configuration file. Multiple
configuration files may be associated with a single panel. This gives the flexibility to
reuse the panel Form and create panel variations by defining different widget layouts,
different animation sequences etc. The mapping between a panel and its
configuration file(s) is specified through a mapping file called PanelConfigMap.xml.
See section 7.4 for details on this.
The Panel Management, WidgetManagement and AnimationManagement components
(see 2.2) of the ACAT Core library handle everything to do with panels – instantiating

50 PANELS | ACAT Developer’s Guide


them, parsing the configuration files, handling animations, converting input triggers
to actions, etc.
The rest of this section gives details on panel configurations and walks through the
process creating panels.

7.2 Enumeration
All panels are .NET Forms, and must implement the IPanel interface. All DLL’s with
panel forms must be installed under the top-level folder
[INSTALLDIR]\Extensions\[EXTENSION_DIR]\UI. The recommended directory
structure is to have Scanners, Dialogs and Menus DLL’s with their associated panel
configuration files in their own sub-folders under the top-level folder. On startup,
the Panel Manager recursively descends into the top level UI folder, caches the .NET
class Types of all the classes that implement IPanel and the names of the all
configuration files. In addition to the UI folder, the Panel Manager also walks through
the top level folder for Agents (see section 6.2) as Agent DLL’s can also have Panels.
For instance, the File Browser Agent DLL has a panel that displays the names of files.

7.3 Panel Names


All panels are part of UI extensions and like all extensions classes, they have a
DescriptorAttribute (see section 4.4) with a GUID, a name and a friendly
description. The Alphabet scanner for example has the following
DescriptorAttribute:
[DescriptorAttribute(
"D1C82679-8E84-4F1B-BB93-ED55EFC744CC",
"AlphabetScanner",
"The Alphabet Scanner")]

Requests to display panels may come from any extension. The request will contain
the name of the scanner to display. For instance, when the foreground window is an
edit control, a request will come in to display the AlphabetScanner.

7.4 Panel Configuration File


The panel configuration file is an xml file that defines the widget attributes in a panel,
the parent –child hierarchy of widgets in the Form and the set of animations used for
scanning. The configuration file has three sections: WidgetAttributes, Layout and
Animations. Here is an example of a simple numeric scanner and its configuration
file. The numeric scanner has two rows of buttons as show in Figure 1. The buttons
are named B1 through B14 in the Form. The buttons are laid inside two
TableLayout elements. The table with the top row of buttons is called Row1 and the
table with the bottom row of buttons is called Row2.

51 PANELS | ACAT Developer’s Guide


Figure 13: The Numbers Scanner
The panel configuration file for this scanner is shown below. It has the three sections
– WidgetAttributes, Layout and Animations.

<?xml version="1.0" ?>


<ACAT>
<WidgetAttributes>
<WidgetAttribute name="B1" label="(" value="@CmdGoBack"
fontname="ACAT Icon" fontsize="16"
bold="true" mouseClickActuate="true"/>
<WidgetAttribute name="B2" label="-" value="-"
fontname="Arial" fontsize="14"
WIDGETATTRIBUTES bold="true" mouseClickActuate="true"/>
SECTION ...
...
<WidgetAttribute name="B14" label="0" value="0"
fontname="Arial" fontsize="14"
bold="true" mouseClickActuate="true"/>
</WidgetAttributes>

<Layout>
<Widget class="RowWidget" name="Row1">
<Widget class="ScannerButton" name="B1"/>
<Widget class="ScannerButton" name="B2"/>
...
...
<Widget class="ScannerButton" name="B7"/>
</Widget>
LAYOUT SECTION
<Widget class="RowWidget" name="Row2">
<Widget class="ScannerButton" name="B8"/>
<Widget class="ScannerButton" name="B9"/>
...
...
<Widget class="ScannerButton" name="B14"/>
</Widget>
</Layout>

52 PANELS | ACAT Developer’s Guide


<Animations>
<Animation name="TopLevelRotation"
start="true"
iterations="@HalfScanIterations">
<Widget name="Row1"
onSelect="transition(ButtonRotationRow1)"/>
<Widget name="Row2"
onSelect="transition(ButtonRotationRow2)"/>
</Animation>

<Animation name="ButtonRotationRow1"
iterations="@ColumnScanIterations"
onEnd="transition(TopLevelRotation)"
hesitateTime="@HesitateTime"
onSelect="actuate(@SelectedWidget);
transition(TopLevelRotation);">
<Widget name="B1"/>
<Widget name="B2"/>
ANIMATIONS SECTION
...
...
<Widget name="B7"/>
</Animation>

<Animation name="ButtonRotationRow2"
iterations="@ColumnScanIterations"
onEnd="transition(TopLevelRotation)"
hesitateTime="@HesitateTime"
onSelect="actuate(@SelectedWidget);
transition(TopLevelRotation);">
<Widget name="B8"/>
<Widget name="B9"/>
...
...
<Widget name="B14"/>
</Animation>
</Animations>
<ACAT>

Listing 5: Sample Panel Configuration File

7.4.1 WidgetAttributes section


This is a list of <WidgetAttribute> elements, each of which maps to one widget
element in the panel Form. In this case, since there are 14 buttons, there will be 14
WidgetAttribute entries. The following table lists the attributes for the
WidgetAttribute element.

Attribute Description

Name Should be the same as the name of the UI control in the


Form

53 PANELS | ACAT Developer’s Guide


Attribute Description

Label The text to display on the widget

value Represents a literal or a command. If it is a literal such


as ‘a’, ‘b’, ‘1’, the corresponding character is sent into
the keyboard buffer simulating a keypress. If it
represents a command, the string should begin with an
@ symbol, e.g. @CmdMainMenu.

fontsize Size of the font in points.

fontname Name of the font to use , eg “Arial”

bold Whether to use boldface or not. Set this to “true” or


“false”

tooltip Optional tooltip string to display when the widget is


highlighted. Some scanners use this feature.

mouseClickActuate Allow the user to click on the widget with the mouse to
actuate the button. Set this to “true” to allow activation
with a mouse click, “false” otherwise.

onMouseClick (Optional) The script to execute if mouseClickActuate is


set to true. See Chapter 12 for details on scripts.

7.4.2 Layout section


The Layout section defines the hierarchy in the widget layout. For instance, the
Alphabet scanner is divided into ‘boxes’ at the top level, the next level down is a set of
rows in a box and then next level down is the individual widgets in each row. The
Layout section defines this hierarchy. In this case, it would define a Box widget
consisting of four Row widgets and each Row widget consisting of seven Button
widgets. Each level in the hierarchy contains a group of widgets. This is important
information for scanning. When a widget is highlighted, all its descendants are
highlighted as well.

54 PANELS | ACAT Developer’s Guide


Figure 14: Widget Layout Hierarchy

ACAT could have derived the hierarchical relationship by querying the controls in the
Form itself. But this would not give the flexibility of grouping controls in ways other
how they are defined in the form. The Layout section enables us to group elements
from different parents into a group.
The Layout section is a list of <Widget> nodes, each of which could have a list of
<Widget> nodes and so on. The attributes of a Widget node are listed in the table
below.

Attribute Description

name Should be the same as the name of the UI control in


the Form.

class The .NET class type of the widget. The


WidgetManager uses this to instantiate the widget
object through .NET reflection.

Subclass A string meta-data. This is used as the ‘hint’ to


decide whether the widget should be enabled or not
at runtime, depending on the context.

colorScheme The color scheme to use for this widget. Should be


defined in the Theme (see Chapter 11 on Themes)

disabledButtonColorScheme The color scheme to use for this widget if it were to


be disabled.

55 PANELS | ACAT Developer’s Guide


Attribute Description

panel The name of the Panel to use to interact with this


widget if the widget is a part of a Dialog. For
instance, if the Volume settings dialog has a text box
to enter the volume level as a number, set the panel
attribute to “Number”.

enabled Set to “true” to enable the widget, “false” to disable


it, “contextual” to indicate the enabled state is
determined at runtime based on the current
context.

defaultEnabled “true” or “false”. Applies only if the ‘enabled’


attribute is set to “contextual”. If none of the
handlers in ACAT can determine the enabled state,
“enabled” state is set to this attribute’s value.

7.4.3 Animations Section


The Animations section is a list of <Animation> nodes and lists all the scanning
sequences and the transitions between scanning sequences. Each Animation node
represents one scanning sequence. There are actions associated with each animation
sequence and these actions are specified using a script. See Chapter 12 for details on
scripting.
Each Animation element has a list of Widget nodes which represent the widgets that
will participate in the scanning sequence. For instance, in the XML snippet shown in
Listing 6, buttons B8 through B14 will be scanned one after another.

56 PANELS | ACAT Developer’s Guide


<Animation name="ButtonRotationRow2"
iterations="@ColumnScanIterations"
onEnd="transition(TopLevelRotation)"
hesitateTime="@HesitateTime"
onSelect="actuate(@SelectedWidget);
transition(TopLevelRotation);">
<Widget name="B8"/>
<Widget name="B9"/>
<Widget name="B10"/>
<Widget name="B11"/>
<Widget name="B12"/>
<Widget name="B13"/>
<Widget name="B14"/>
</Animation>

Listing 6: The <Animation> Element


The Animation element has the following attributes:

Attribute Description

name Name of the animation sequence

start Set to “true” if this is the starting sequence. There can


only be one Animation node with this attribute set to
“true”. When the Panel is displayed, this will be the first
scanning sequence. If not specified, default value is
“false”.

autoStart Set this to “true” if the first scanning sequence should


start immediately when the panel is displayed, or
should it wait for the user to activate the switch trigger
mechanism to start the scanning sequence. Default
value is “true”.

onEnd The script to run when the scanning sequence ends.


Typically, the script will transition to the next scanning
sequence.

onSelect The script to execute when the user selects a widget for
activation. This script executes only if the Widget node
in this sequence does not have an onSelect attribute.

57 PANELS | ACAT Developer’s Guide


Attribute Description

onEnter Script to execute before the scanning sequence starts.

iterations Number of times to repeat this scanning sequence.


Default value is 1. Scanning will go on forever if the
value is set to -1. Set this attribute to the numeric value
or to one of the pre-defined variables for iterations. See
section Error! Reference source not found. for a list
of variable names. The values for these are read from
the user preferences file.

steppingTime The number of milliseconds a widget stays highlighted


before moving on to the next widget. Set this value
carefully. Too low a value may result in more errors and
too high a value may slow down scanning. Arrive at the
ideal setting through trial and error.
Specify the value as a number in milliseconds or one of
the pre-defined macros for timings (see section Error!
Reference source not found.). The values for macros
are substituted from the user preferences.

hesitateTime The number of additional milliseconds to keep the first


widget highlighted in the sequence. Usually the first
widget is hard to select, and this attribute gives the user
that extra bit of time to react and make a selection.
Specify the value as a number in milliseconds or one of
the pre-defined macros for timings (see section Error!
Reference source not found.). The values for macros
are substituted from the user preferences.

The Animation element has a list of Widget elements which point to the UI controls
on the Form that will participate in the scanning sequence. The attributes for the
Widget element are:

Attribute Description

onSelect Event handler script to execute if this widget is selected.

58 PANELS | ACAT Developer’s Guide


Attribute Description

onHighlightOn Event handler script to execute when this widget is


highlighted

onHighlightOff Event handler script to execute which this widget is un-


highlighted

onMouseClick Event handler script to execute when the user clicks on


this widget with the mouse.

hesitateTime The number of extra milliseconds to keep this widget


highlighted.
Specify the value as a number in milliseconds or one of
the pre-defined macros for timings (see section Error!
Reference source not found.). The values for macros
are substituted from the user preferences.

7.5 Panel Configuration Mapping (PanelConfigMap.xml)


As discussed in section 7.1, a panel can have one or more configuration files. This
gives the flexibility to customize multiple versions of scanning sequences, labels on
the scanner buttons etc., for a single panel. The mapping between a panel and its
configuration file(s) is done through a file called PanelConfigMap.xml. A snippet of
the mapping file for the Alphabet scanner and the Mouse scanner is shown in Listing
7. This shows the Alphabet scanner with two alternative layouts – one where the
letters on the scanner are arranged alphabetically and one where they are not. Both
use the same scanner Form, only the configuration files (the configFile attribute) are
different.

59 PANELS | ACAT Developer’s Guide


<ACAT>
<ConfigMapEntries>
<ConfigMapEntry panelClass="Alphabet" configName="ConfigAlphabetQWERTY"
formId="D1C82679-8E84-4F1B-BB93-ED55EFC744CC"
configFile="AlphabetScannerQWERTY.xml"/>

<ConfigMapEntry panelClass="Alphabet" configName="ConfigAlphabetABC"


formId="D1C82679-8E84-4F1B-BB93-ED55EFC744CC"
configFile="AlphabetScannerABC.xml"/>

<ConfigMapEntry panelClass="Mouse" configName="ConfigMouseScanner"


formId="9F350464-4135-4B03-9F44-5FB3B5226AD0"
configFile="MouseScanner.xml"/>

<ConfigMapEntry panelClass="Mouse" configName="ConfigMouseScanner2"


formId="0190D5B7-FA40-48A9-B888-267C60072C57"
configFile="MouseScanner2.xml"/>
...
...
</ConfigMapEntries>
</ACAT>

Listing 7: Sample PanelConfigMap.xml


The attributes for ConfigMapEntry are:

Attribute Description

panelClass Refers to the category or name of the scanner.


Examples are Alphabet, Mouse, Cursor,
NotepadContextMenu etc. A scanner is created by
specifying its name to the CreatePanel() method in the
PanelManager. If the Alphabet scanner needs to be
created, “Alphabet” is used as the parameter. Similarly,
to create the contextual menu for Notepad,
“NotepadContextMenu” is used as the parameter.
ACAT checks the PanelConfigMap.xml for this name to
determine which configuration file to use with the
scanner.

configName A unique id for this entry. A GUID string can be used


instead to ensure that it is unique. In case there are
multiple configurations for the same panel, this field
will be used to specify which configuration is to be used
(see section 7.6).

60 PANELS | ACAT Developer’s Guide


Attribute Description

configFile The filename (not the complete path) to the


configuration file for the panel.

7.5.1 Location of PanelConfigMap.xml


PanelConfigMap.xml can be located anywhere under the top-level UI folder (see
section 7.2) or the top-level Agents folder (see section 6.2). ACAT recursively scans
these folders, looks for all PanelConfigMap.xml files under these folders, parses them
and creates a look-up table mapping the panel name (panelClass attribute) with its
one or more configurations.

7.6 Preferred Panel Settings


As discussed in sections 7.1and 7.5, a panel can have multiple configurations. For
instance, the Alphabet scanner may have two configurations - one with a QWERTY
layout and one alphabetical. Or a contextual menu may have to alternate
configurations – one with just the icons for the menu items, and one with icons and
the menu text. Panels may be used in any combinations. For instance, a user may
prefer using the Alphabet scanner with the QWERTY layout, and contextual menus
with just the icons. This is configured through the PreferredPanelConfig.xml file
which is located in the User folder. A sample listing of this file is shown in Listing 8.
This file is a list of PanelConfigs groups. Each group has list of panel names (the
panelClass attribute) and the name of the preferred configuration to use (the
configName attribute). The file may contain any number of groups of panels. Each
group is identified by a meaningful name.
Listing 8 shows four groups of configurations – MenusWithText,
MenusWithoutText, Scanners1 and Scanners2. Let’s say the user prefers to have
contextual menus with icons only, no text, and also the Alphabet scanner with the
QWERTY layout. The preferred groups to use are MenusWithoutText and
Scanners2. The user preference setting PreferredPanelConfigNames is used to
specify a semi-colon delimited names of the preferred groups to use. In this case,
<PreferredPanelConfigNames>MenusWithoutText;Scanners2</PreferredPanelConfigNames>

<ACAT>
<PanelConfigs name="MenusWithText" description="Contextual Menus with text">
<PanelConfig panelClass="NotepadContextMenu"
configName="ConfigNotepadContextMenu"/>
<PanelConfig panelClass="MSWordContextMenu"
configName="ConfigMSWordContextMenu"/>
<PanelConfig panelClass="WordPadContextMenu"
configName="ConfigWordPadContextMenu"/>
...

61 PANELS | ACAT Developer’s Guide


...
</PanelConfigs >
<PanelConfigs name="MenusWithoutText" description="Contextual Menus with Icons
only">
<PanelConfig panelClass="NotepadContextMenu"
configName="ConfigNotepadContextMenuIconsOnly"/>
<PanelConfig panelClass="MSWordContextMenu"
configName="ConfigMSWordContextMenuIconsOnly"/>
<PanelConfig panelClass="WordPadContextMenu"
configName="ConfigWordPadContextMenuIconsOnly"/>
...
...
</PanelConfigs>
<PanelConfigs name="Scanners1" description="Scanner Config 1">
<PanelConfig panelClass="Alphabet"
configName="ConfigAlphabetABC"/>
<PanelConfig panelClass="Cursor"
configName="ConfigCursorsScanner1"/>
...
...
</PanelConfigs>
<PanelConfigs name="Scanners2" description="Scanner Config 2">
<PanelConfig panelClass="Alphabet"
configName="ConfigAlphabetQWERTY"/>
<PanelConfig panelClass="Cursor"
configName="ConfigCursorsScanner2"/>
...
...
</PanelConfigs>
</ACAT>

Listing 8: Sample PreferredPanelConfigMap.xml

62 PANELS | ACAT Developer’s Guide


8. WORD PREDICTORS
8.1 Introduction
ACAT supports word auto-complete and next-word prediction during text entry.
While the user enters text into a text window, ACAT tracks the word being typed.
Depending on the application, ACAT can get the text in the window, the current
position of the caret, and using this information, read the previous words in the
sentence. It uses this as contextual information to make suggestions to for auto-
completion or next-word prediction.

8.2 Enumeration
All Word Predictor (WP) extension DLL’s must be installed under the top-level folder
[INSTALLDIR]\Extensions\[EXTENSION_DIR]\WordPredictors. Under this, each
WP extension DLL should reside in its own sub-folder. For instance, the extension for
the Presage Word Predictor is installed under
C:\Intel\ACAT\Extensions\Default\WordPredictors\Presage. During initialization,
the Word Prediction Manager recursively walks through the WordPredictors folder,
loads all the DLL’s in there and caches C# Types of classes derived from the
IWordPredictor interface. All WP extensions must implement this interface.
Only one Word Predictor can be active at any time. The ACAT preference setting
PreferredWordPredictor should be set to the name or GUID of the Word Predictor
to use. The name or GUID should be the same as the one specified in the
DescriptorAttribute custom attribute (see section 4.4) associated with the C# class
of the Word Prediction extension.

8.3 Steps to create a Word Predictor extension


The Presage WP extension under Extensions\Default\WordPredictors in the ACAT
solution is a good starting point for creating WP extensions. To create a WP
extension called FooWordPredictor, follow these steps.

Step What to do

In the WordPredictors solution folder in the ACAT solution, create a


1
Class library called FooWordPredictor.

Go to the Properties for this project and set the “Platform target” to
2
“Any CPU”.

63 WORD PREDICTORS | ACAT Developer’s Guide


Step What to do

Add references to ACATCore.dll and ACATExtension.dll in the


3 $\Redistributable folder. In the Properties for these two DLL’s, set
“Copy Local” to false.

4 Derive FooWordPredictor from IWordPredictor.

Add the DescriptorAttribute custom attribute to the


FooWordPredictor class. Generate a GUID for the id field.
5
DescriptorAttribute(
"439ADCA3-36AD-653F-9CD3-4594ADC71AF1",
"Foo Word Predictor",
"Word prediction based on Foo technology ")]

Implement the method and properties in the IWordPredictor


interface. The documentation for IWordPredictor has all the details
on what each of the properties and methods do.

Perform initialization in the Init() function.

The core function is Predict(String prevWords, String


currentWord). The first parameter is a string representing the
previous words in the current sentence. The second parameter is the
6 current word being typed. If both are null or empty, it means the
beginning of a new sentence. The functions should return a list of
strings which represents a hit list of the words predicted.

There is also the Learn(String textToLearn) function which takes a


string representing something the user typed during text entry. If the
word prediction supports learning user’s writing style, the text to learn
can be added to the word prediction model more accurate prediction
results.

Update dependencies in the ACAT solution for the FooWordPredictor


project to make sure it is built in the right order. Ensure that
7 a. FooWordPredictor has dependencies on ACATCore and
ACATExtension projects.
b. The PostBuildSolution project has a dependency on
FooWordPredictor.

64 WORD PREDICTORS | ACAT Developer’s Guide


Step What to do
FooActuator.dll must now be deployed to the run directory of the
application.
1. Edit $\deploy.bat
2. Look for the section “Deploying Actuator DLLs” and add the
8 following lines there.
set SOURCEDIR=Extensions\Default\WordPredictors\FooWordPredictor
set TARGETDIR=%INSTALLDIR%\%SOURCEDIR%
if not exist %TARGETDIR% mkdir %TARGETDIR%
copy .\%SOURCEDIR%\bin\%CONFIG%\FooWordPredictor.dll %TARGETDIR%

Now build the solution. Examine the output folder of ACATApp and
9 verify that FooWordPredictor.dll file is deployed to
Extensions\Default\WordPredictors\FooWordPredictor

In the Settings.xml file (see section 14.2.5) set


PreferredWordPredictor to the name or the GUID of
FooWordPredictor specified in Step 5.

Run the ACATApp application and type into the Talk window or into a
10 Notepad window. The Alphabet scanner should update the prediction
word list as you type or move the cursor around.

The WP extension can be developed as an independent project outside the ACAT


solution. All the steps outlined above still hold. In the Post-Build event for the
project, make sure the DLL is deployed into its proper location in the run folder of
ACATApp.

65 WORD PREDICTORS | ACAT Developer’s Guide


9. TEXT-TO-SPEECH (TTS)
9.1 Introduction
Text-to-Speech (TTS) extensions perform text to speech conversions. ACAT invokes
TTS whenever the user desires.

9.2 Enumeration
All Text-to-speech extension DLL’s must be installed under the top-level folder
[INSTALLDIR]\Extensions\[EXTENSION_DIR]\TTSEngines. Under this, each
Text-to-speech extension DLL should reside in its own sub-folder. For instance, ACAT
has a TTS extension based on the Microsoft Speech Synthesizer is installed under
C:\Intel\ACAT\Extensions\Default\TTSEngines\SAPIEngine. During initialization,
the TTS Manager walks recursively through the TTSEngines folder, loads all the DLL’s
in there and caches C# Types of classes derived from the ITTSEngine interface.
Only one TTS Extension can be active at any time. In Settings.xml (see section 14.2.8)
PreferredTTSEngines should be set to the name of the TTS extension to use. The
name should be the same as the one specified in the DescriptorAttribute custom
attribute (see section 4.4) associated with the C# class of the TTS extension.

9.3 Alternate Pronunciations


Text-to-speech engines may have problems pronouncing certain words properly.
ACAT uses an XML configuration file containing a mapping between the actual
spelling and the phonetic spelling. The file should reside under the ACAT user’s
folder which is [INSTALLDIR]\Users\[USERNAME], for example,
C:\Intel\ACAT\Users\Default, where “Default” is the default user name.
The Text-to-speech Management component has a helper class called
Pronunciations which loads the pronunciations XML file and maintains the mapping
between the actual spelling and the phonetic spelling. It looks up the mapping table
and replaces words in an input string with their phonetic spellings. When the result
string is converted to speech, the all the words will be pronounced properly.
Listing 9 shows a sample pronunciations file with the actual spelling of words and
their corresponding phonetic spelling.

66 TEXT-TO-SPEECH (TTS) | ACAT Developer’s Guide


<ACAT>
<Pronunciations>
<Pronunciation word="aluminum" pronunciation="al loo mini yum"/>
<Pronunciation word="xerox" pronunciation="zee rocks"/>
<Pronunciation word="defense" pronunciation="dee fence"/>
</Pronunciations>
</ACAT>

Listing 9: Sample Pronunciations File

9.4 Steps to create a TTS Extension


The SAPIEngine TTS extension under Extensions\Default\TTSEngines in the ACAT
solution is a good starting point for creating TTS extensions. To create a TTS
extension called FooTTS, follow these steps.

Step What to do

In the TTSEngines solution folder in the ACAT solution, create a Class


1
library called FooTTS.

Go to the Properties for this project and set the “Platform target” to
2
“Any CPU”.

Add references to ACATCore.dll and ACATExtension.dll in the


3 $\Redistributable folder. In the Properties for these two DLL’s, set
“Copy Local” to false.

4 Derive FooTTS from ITTSEngine.

Add the DescriptorAttribute custom attribute to the FooTTS class.


Generate a GUID for the id field.
5 DescriptorAttribute(
"ACD342A3-34FD-AC3F-8CFD3-48384ACFF1",
"Foo TTS",
"Text to Speech Extension based on Foo technology ")]

67 TEXT-TO-SPEECH (TTS) | ACAT Developer’s Guide


Step What to do

Implement the method and properties in the ITTSEngine interface.


The documentation for ITTSEngine has all the details on what each of
the properties and methods do.

Perform initialization in the Init() function.


6
The core functions are Speak() and SpeakAsync() which convert text
to speech. The async version returns immediately and returns a
‘bookmark’. When the conversion has completed, the
EvtBookmarkReached event must be raised passing the bookmark as
the parameter.

Update dependencies in the ACAT solution for the FooTTS project to


make sure it is built in the right order. Ensure that
7 a. FooTTS has dependencies on ACATCore and ACATExtension
projects.
b. The PostBuildSolution project has a dependency on FooTTS.

FooTTS.dll must now be deployed to the run directory of the


application.
1. Edit $\deploy.bat
2. Look for the section “Deploying TTSEngine DLLs” and add the
8 following lines there.
set SOURCEDIR=Extensions\Default\TTSEngines\FooTTS
set TARGETDIR=%INSTALLDIR%\%SOURCEDIR%
if not exist %TARGETDIR% mkdir %TARGETDIR%
copy .\%SOURCEDIR%\bin\%CONFIG%\FooTTS.dll %TARGETDIR%

Now build the solution. Examine the output folder of ACATApp and
9 verify that FooTTS.dll file is deployed to
Extensions\Default\TTSEngines\FooTTS

In the Settings.xml file (see section 14.2.8) set PreferredTTSEngines


to the name or the GUID of FooTTS specified in Step 5.

Run the ACATApp application and type into the Talk window and press
10
ENTER. FooTTS should convert the text just entered into speech.

68 TEXT-TO-SPEECH (TTS) | ACAT Developer’s Guide


The TTS extension can be developed as an independent project outside the ACAT
solution. All the steps outlined above still hold. In the Post-Build event for the
project, make sure the DLL is deployed into its proper location in the run folder of
ACATApp.

69 TEXT-TO-SPEECH (TTS) | ACAT Developer’s Guide


10. SPELL CHECKER
10.1 Introduction
Spell Checker extensions perform spell checks during text entry. Applications such as
MS Word have built-in support for spell checking, but not all applications do. If the
user were to use the auto-complete or next-word prediction through Word Prediction
to enter text, spell check is really not required. However the feature is made available
for developers to implement spell checking if they so desire.
During text entry, a call to the spell checker is made whenever a word is completed.
The completed word is passed to the spell checker extension. The spell checker
returns the correctly spelt word if it was misspelt. ACAT then does an in-place
replacement of the misspelt word with the one that is correctly spelt.

10.2 Enumeration
All Spell check extension DLL’s must be installed under the top-level folder
[INSTALLDIR]\Extensions\[EXTENSION_DIR]\SpellCheckers. Under this, each
Spell check extension DLL should reside in its own sub-folder. For instance, ACAT has
a rudimentary spell check extension based on a look-up table. It is installed under
C:\Intel\ACAT\Extensions\Default\SpellCheckers\SpellCheck. During initialization,
the Spell Check Manager recursively walks through the SpellCheckers folder, loads all
the DLL’s in there and caches C# Types of classes derived from the ISpellCheck
interface.
Only one Spell Checker can be active at any time. The ACAT preference setting
PreferredSpellChecker should be set to the name of the Spell Check extension to
use. The name should be the same as the one specified in the DescriptorAttribute
custom attribute (see section 4.4) associated with the C# class of the Spell Check
extension.

10.3 ACAT Spell Checker


ACAT has a rudimentary Spell Check extension called SpellCheck. It uses an XML file
to store a lookup table of misspelt words. The file is called SpellCheck.xml and is
stored in the ACAT user’s folder. Listing 10 shows a sample listing of the file.

70 SPELL CHECKER | ACAT Developer’s Guide


<ACAT>
<Spellings>
<Spelling word="i" replaceWith="I"/>
<Spelling word="cant" replaceWith="can't"/>
<Spelling word="dont" replaceWith="don't"/>
<Spelling word="shouldnt" replaceWith="shouldn't"/>
<Spelling word="couldnt" replaceWith="couldn't"/>
<Spelling word="wouldnt" replaceWith="wouldn't"/>
<Spelling word="id" replaceWith="I'd"/>
<Spelling word="ive" replaceWith="I've"/>
<Spelling word="havent" replaceWith="haven't"/>
<Spelling word="isnt" replaceWith="isn't"/>
</Spellings>
</ACAT>

Listing 10: Sample SpellCheck.xml

71 SPELL CHECKER | ACAT Developer’s Guide


11. THEMES
11.1 Introduction
The color schemes and fonts for the ACAT scanners, menus and dialogs are
configured through Theme configuration files which can be accesses through the
Theme Manager.

11.2 Enumeration
All Theme files are stored under the top-level folder [INSTALLDIR]\Assets\Skins.
Under this, each Theme is stored in a separate sub-folder. The name of the Theme is
the same as the name of the folder. A Skin.xml file lists all the colors to use for the
various elements in the panels. If background bitmaps are used, the bitmaps are
stored under the theme folder as well.

11.3 Theme Configuration


Listing 11 shows a snippet of Skin.xml which has color settings for all the UI
elements in ACAT. It has a list of <ColorScheme> elements, each of which applies to
a UI element on a panel.
The following table has a description of the attributes for the <ColorScheme> node.
For each of the element, you have the choice of specifying the color or the name of an
image file that will be used as the background. If the background image is specified,
the color element is ignored. All image files are to be stored in the folder for the
theme. The colors can be specified either as a value of the .NET Colors enum (Black,
Red, White etc.) or as an RGB (#FFF20, #333745 etc.).

Attribute Description

name Refers to the UI widget to which this


color scheme applies.

Background Background color of the widget in its


normal state.

Foreground Foreground color of the widget in its


normal state.

72 THEMES | ACAT Developer’s Guide


Attribute Description

highlightBackground Background color of the widget in the


highlighted state.

highlightForeground Foreground color of the widget in the


highlighted state.

highlightSelectedBackground Background color of a selected widget


in the highlighted state

highlightSelectedForeground Foreground color of a selected widget


in the highlighted state

<ACAT>
<Skin>
<ColorSchemes>
<ColorScheme name="Scanner"
background="Black"
foreground="#FFF200"
highlightSelectedBackground="Blue"
highlightSelectedForeground="White"
highlightBackground="#FFF200"
highlightForeground="Black"/>

<ColorScheme name="ContextMenuIconButton"
background="#21409A"
backgroundImage="contextIconNormal.png"
foreground="#FFF200"
highlightSelectedBackground="Black"
highlightSelectedForeground="White"
highlightBackground="#FFF200"
highlightBackgroundImage="contextIconHighlight.png"
highlightSelectedBackgroundImage="contextIconHighlightSelected.png"
highlightForeground="Black"/>
</ColorSchemes>
</Skin>
</ACAT>

Listing 11: Snippet of Skins.xml

73 THEMES | ACAT Developer’s Guide


12. SCRIPTS
12.1 Introduction
Scripting is primarily used in Panel configuration files (see section 7.4) to handle
transition between scanning sequences, and to execute actions when widgets are
selected with the input switch trigger. The scripting language is very simple and the
Interpreter module in ACAT interprets the script.

12.2 Syntax
The syntax is simple. The script is a semi-colon delimited list of function calls. Here
is a snippet from the <Animations> section of a Panel configuration file.
<Widget name="B2
onSelect="actuate(@SelectedWidget);transition(TopLevelRotation)"/>

The onSelect attribute has a script that is executed when the widget B2 is selected.
The script makes two function calls – actuate() and transition(). The call to actuate()
has one argument – @SelectedWidget which is an macro for the selected widget.
This call triggers the Actuate event in ACAT for widget B2. The transition() call
switches the scanning sequence to the one named TopLevelRotation. Functions do
not have any return values. All arguments are passed by value.

12.3 Functions
This section describes the syntax and usages of all the pre-defined functions
supported by ACAT.

12.3.1 actuate

Syntax actuate(widgetNameOrMacro)
Parameters widgetNameOrAlias
Name or alias of the widget to actuate
Description Actuates the widget identified by the specified name or alias. Any
command associated with the widget is executed. The command is
specified in the WidgetAttribute section (see section 0) of the Panel
configuration file.
Use the @SelectedWidget macro (see section 12.4) as the alias for
the widget that is currently selected.

74 SCRIPTS | ACAT Developer’s Guide


Examples To actuate a widget identified by the name B1:
actuate(B1)
To actuate the currently selected widget:
actuate(@SelectedWidget)

12.3.2 highlight

Syntax highlight(widgetNameOrAlias, onOff)


Parameters widgetNameOrAlias
Name or alias of the widget to actuate
onOff
Set to “true” to highlight the widget, “false” to un-highlight it.
Description Highlights or un-highlights the specified widget. If onOff is true,
highlights the widget using the highlightBackground and
highlightForeground attributes from the active theme (see Chapter
11). If onOff is false, the widget is displayed in normal colors using
the background and foreground attributes from the active theme.
If the parameter refers to an alias, it should be one of the following
macros (see section 12.4).
@SelectedWidget for the currently selected widget
@SelectedRow for the currently selected row
@SelectedBox for the currently selected box.
Examples To highlight a widget identified by the name B1:
highlight(B1, true)
To highlight a Row identified by the name Row1:
highlight(Row1, true)
To un-highlight a widget identified by the name B1:
highlight(B1, false)
To highlight the currently selected widget:
highlight(@SelectedWidget, true)

75 SCRIPTS | ACAT Developer’s Guide


12.3.3 highlightSelected

Syntax highlightSelected(widgetNameOrAlias, onOff)


Parameters widgetNameOrAlias
Name or alias of the widget to actuate
onOff
Set to “true” to highlight the widget, “false” to un-highlight it.
Description Highlights or un-highlights the specified widget. If onOff is true,
highlights the widget using the highlightSelectedBackground and
highlightSelectedForeground attributes from the active theme (see
Chapter 11). If onOff is false, the widget is displayed in normal
colors using the background and foreground attributes from the
active theme.
If the parameter refers to an alias, it should be one of the following
macros (see section 12.4).
@SelectedWidget for the currently selected widget
@SelectedRow for the currently selected row
@SelectedBox for the currently selected box.
Examples To highlight a widget identified by the name B1:
highlightSelected(B1, true)
To un-highlight a widget identified by the name B1:
highlightSelected (B1, false)
To highlight the currently selected widget:
highlightSelected (@SelectedWidget, true)

12.3.4 select

Syntax select(widgetName)
Parameters widgetName
Name of the widget to select
Description Marks the specified widget as selected. Note that there is no change
in the visual appearance of the widget. It merely sets the state of the
widget as selected. After making this call, the @SelectedWidget
macro will point to the widget selected.
Examples To select a widget identified by the name B1:
select(B1)

76 SCRIPTS | ACAT Developer’s Guide


12.3.5 transition

Syntax transition(animationName)
Parameters animationName
Name of the animation to transition to
Description Transitions the scanning sequence to the specified animationName.
The name should be a valid animation sequence in the <Animations>
section of the Panel configuration file (see section 7.4.3).
Examples To transition to a scanning sequence called TopLevelRotation:
transition(topLevelRotation)

12.3.6 stop

Syntax stop()
Description Stops scanning that is currently in progress.
Examples To stop scanning:
stop()

12.3.7 run

Syntax run(command)
Parameters command
Name of the command to run.
Description Runs the specified command. For a list of commands and command
handling, see Chapter 13.
Examples To toggle the TalkWindow:
run(@CmdTalkWindowToggle)

12.3.8 beep

Syntax beep()
Description Plays a beep.

77 SCRIPTS | ACAT Developer’s Guide


Examples To beep:
beep()

12.4 Macros
The following table lists the macros that can be used as values for the various timings
and iteration counts during scanning. These macros can be used in the panel
configuration files (see section 7.4) to control the speed, the number of scan
iterations and to reference selected widgets.
The values for each of the macros listed below are assigned from the user preference
settings (see section 14.2.1).

Macro Description

@SteppingTime The length of time in milliseconds a widget stays


highlighted during scanning. The value for this is
assigned from the SteppingTime setting in user
preferences (see section 14.2.1 for details).

@HesitateTime The additional length of time the first element


stays highlighted. The value is added on to the
Stepping time. The value for this is assigned
from the HesitateTime setting in user
preferences (see section 14.2.1 for details).

@HalfScanIterations The number of times to scan the top-level


widgets in a scanner. The value for this is
assigned from the HalfScanIterations setting in
user preferences (see section 14.2.1 for details).

@RowScanIterations This setting controls the number of times to scan


the rows in a scanner. The value for this is
assigned from the RowScanIterations setting in
user preferences (see section 14.2.1 for details).

@ColumnScanIterations The number of times to scan the widgets in a


row in a scanner. The value for this is assigned
from the ColumnScanIterations setting in user
preferences (see section 14.2.1 for details).

78 SCRIPTS | ACAT Developer’s Guide


Macro Description

@TabScanTime Length of time each element stays highlighted in


menus and dialogs. The value for this is assigned
from the TabScanTime setting in user
preferences (see section 14.2.1 for details).

@FirstRepeatTime Some buttons have a ‘repeat’ behavior. Even


after they are selected, they stay highlighted for
an additional length of time to enable the user to
select them again with the input switch trigger.
The value for this is assigned from the
FirstRepeatTime setting in user preferences
(see section 14.2.1 for details).

@SelectedWidget The widget that is currently selected. A widget is


tagged as ‘selected’ if the user actuates the input
trigger while the widget is highlighted, or
through a call to the select() function (see
section 12.3.4).

@SelectedRow The row of widgets that is currently selected. A


row is tagged as ‘selected’ if the user actuates the
input trigger while the row is highlighted, or
through a call to the select() function (see
section 12.3.4).

@SelectedBox The box of rows that is currently selected. A box


is tagged as ‘selected’ if the user actuates the
input trigger while the row is highlighted, or
through a call to the select() function (see
section 12.3.4).

79 SCRIPTS | ACAT Developer’s Guide


13. COMMAND PROCESSING
13.1 Introduction
Commands are actions that are performed when the user actuates a widget.
Commands are assigned to widgets in one of two ways:
1. Through the setting for the value attribute for a widget in the
WidgetAttributes section of the Panel configuration file (see section 0).
2. Through the run command (see section 12.3.7) in the Animations section of
the Panel configuration file (see section 7.4.3).
Commands are also assigned to input switch actuators through the run command
associated with switches in the SwitchConfingMap.xml (see section 5.3.2).

13.2 Command Handlers


Commands are first sent to the currently active Panel. If the Panel does not handle it,
the command is sent to the currently active Agent. Details on handling commands by
Panels and Agents follow.

13.2.1 Panel Command Handlers


Scanners and Menus must implement command dispatchers to intercept and execute
commands resulting from widget actuations by the user. Dialogs do not implement
command handlers.
The RunCommandDispatcher class in Panel Management component processes
commands. This class has a method called Execute() which is invoked to execute the
command. Scanners and Menus implement the IScannerPanel interface. One of the
properties of this interface is CommandDispatcher .
RunCommandDispatcher CommandDispatcher { get; }

ACAT invokes the Execute method in the returned object to execute a command.
13.2.1.1 DefaultCommandDispatcher
The DefaultCommandDispatcher class in the ACAT Extension library handles most
of the commands. See section 13.3 for a list of commands supported by this class. If
the Panel uses commands from the default list, it can return a
DefaultCommandDispatcher object as the return value of the
CommandDispatcher property.
13.2.1.2 Custom Commands
The following table lists steps to handle commands that are not in the default
command list (see section 13.3) or to override handling of the default commands.

80 COMMAND PROCESSING | ACAT Developer’s Guide


Step What to do

Define a class in the Panel class, say, CommandHandler. Derive this


1
class from RunCommandHandler.

Override the Execute method in CommandHandler and add code to


handle the custom commands. Example below handles custom
commands CmdFooBar1 and CmdFooBar2.
public override bool Execute(ref bool handled)
{
handled = true;

switch (Command)
{
case "CmdFooBar1":
2 // Add code to handle this command
break;

case "CmdFooBar2":
// Add code to handle this command
break;

default:
handled = false;
break;
}

return true;
}

Define a class in the Panel class, say, Dispatcher. Derive this class
3
from DefaultCommandDispatcher.

In the constructor of Dispatcher, add the custom commands as shown


below.
4
Commands.Add(new CommandHandler("CmdFooBar1"));
Commands.Add(new CommandHandler("CmdFooBar2"));

Instantiate the Dispatcher object in the Panel class constructor.


5
_dispatcher = new Dispatcher(this);

81 COMMAND PROCESSING | ACAT Developer’s Guide


Step What to do

Return it in the getter for the CommandDispatcher property.

public RunCommandDispatcher CommandDispatcher


6 {
get { return _dispatcher; }
}

To override the handling of default commands, override the Execute


method in the Dispatcher class and add handlers for the default
command. For instance, to override the default handling of
CmdTalkWindowToggle which toggles the visibility of the Talk
window:

public override bool Execute(ref bool handled)


{
bool retVal = true;

7 switch (Command)
{
case "CmdTalkWindowToggle":
// Add code to handle this command
break;

default:
retVal = base.Execute(ref handled);
break;
}

return retVal;
}

13.2.2 Agent Command Handlers


ACAT invokes the OnRunCommand function in the Agent class to execute
commands. All Agent classes derive from the AgentBase base class which has the
base class implementation of this function. Override OnRunCommand in the Agent
class implementation to handle the command, and call the base class implementation
if not handled.

13.3 ACAT Commands


This section lists the commands supported by the ACAT Extension library. Any
commands not listed here must be handled by the scanner (see section 13.2.1) or by
the agent (see section 13.2.2).

13.3.1 Functional Agents Activation Commands


The following commands activate Functional agents.

82 COMMAND PROCESSING | ACAT Developer’s Guide


Command Description

Activates the Functional agent that enables the


CmdSwitchWindows user to shift focus between windows of the
currently active foreground application.

CmdFileBrowser Activates the File Browser functional agent that


enables file management.

Activates the Functional agent that enables the


CmdSwitchApps user to shift focus between active windows on the
desktop.

CmdNewFileAgent Activates the Functional agent that enables the


user to create new text and Word documents.

CmdLaunchApp Activates the Functional agent that enables the


user to launch applications.

CmdShowAbbreviationSet Activates the Functional agent that manages


tings Abbreviations – edit/add/delete abbreviations.

CmdLectureManager Activates the Lecture Manager to deliver lectures.

13.3.2 Window Management Commands


The following commands manage the active application window.

Command Description

CmdCloseWindow Closes the active window.

CmdMoveWindow Enables the user to reposition the active window


on the desktop.

CmdSizeWindow Enables the user to resize the active window.

83 COMMAND PROCESSING | ACAT Developer’s Guide


Command Description

CmdMinimizeWindow Minimizes the active window.

CmdMaxRestoreWindow Toggles the active window between Maximize


and Restore.

CmdMaximizeWindow Maximizes the active window

CmdRestoreWindow Restores the active window.

Partially maximizes the active window. The size


CmdParitalMaximizeWind of the partially maximized window is controlled
ow by the user preference setting
WindowMaximizeSizePercent (see xxx).

CmdMaximizePartialMaxi Toggles the size of the active window between


mizeToggle Maximize and partial Maximize.

13.3.3 Talk Window Management Commands


The following commands manage the Talk window.

Command Description

CmdTalkWindowToggle Toggles the visibility of the Talk window.

CmdTalkWindowClear Clears the text in the Talk window.

CmdTalkWindowClose Closes the Talk window.

13.3.4 Function Key Commands


The following commands activate Function keys.

84 COMMAND PROCESSING | ACAT Developer’s Guide


Command Description

F1 The F1 key.

F2 The F2 key.

F3 The F3 key.

F4 The F4 key.

F5 The F5 key.

F6 The F6 key.

F7 The F7 key.

F8 The F8 key.

F9 The F9 key.

F10 The F10 key.

F11 The F11 key.

F12 The F12 key.

13.3.5 Modifier Key Commands


The following commands activate the modifier keys.

Command Description

CmdShiftKey The Shift key.

85 COMMAND PROCESSING | ACAT Developer’s Guide


Command Description

CmdCtrlKey The Ctrl key.

CmdAltKey The Alt key.

CmdCapsLock The Caps Lock key.

CmdNumLock The Num Lock key.

CmdScrollLock The Scroll Lock key.

CmdEnterKey The ENTER key.

13.3.6 Panel Reposition Commands


The following commands reposition the Panel to one of the four corners of the
display.

Command Description

CmdAutoPositionScanner Launches the auto-position scanner that enables


the user to select the Panel position.

CmdPositionScannerTopR Repositions the Panel to the top right corner of


ight the display.

CmdPositionScannerTopL Repositions the Panel to the top left corner of the


eft display.

CmdPositionScannerBott Repositions the Panel to the bottom right corner


omRight of the display.

86 COMMAND PROCESSING | ACAT Developer’s Guide


Command Description

CmdPositionScannerBott Repositions the Panel to the bottom left corner of


omLeft the display.

13.3.7 Clipboard Commands


The following commands perform clipboard operations.

Command Description

CmdCut Cut to clipboard.

CmdCopy Copy to clipboard.

CmdPaste Paste from clipboard.

13.3.8 Navigation Commands


The following commands perform navigation in the active window.

Command Description

CmdPrevChar Activates the Left arrow key.

CmdNextChar Activates the Right arrow key.

CmdPrevLine Activates the Up arrow key.

CmdNextLine Activates the Down arrow key.

CmdPrevWord Moves the caret to the previous word (Ctrl+Left).

CmdNextWord Moves the caret to the next word (Ctrl+Right).

87 COMMAND PROCESSING | ACAT Developer’s Guide


Command Description

CmdPrevPara Moves the caret to the beginning of the previous


paragraph.

CmdNextPara Moves the caret to the beginning of the next


paragraph.

CmdPrevPage Activates the Page Up key.

CmdNextPage Activates the Page Down key.

CmdHome Activates the Home key.

CmdEnd Activates the End key.

CmdTopOfDoc Moves the caret to the top of the document.

CmdEndOfDoc Moves the caret to the bottom of the document.

13.3.9 Panel Display Commands


The following tables display ACAT panels.

Command Description

CmdPunctuationScanner Displays the Punctuations scanner.

CmdCursorScanner Displays the Cursor scanner.

CmdMouseScanner Displays the Mouse scanner.

CmdMainMenu Displays the Main menu.

88 COMMAND PROCESSING | ACAT Developer’s Guide


Command Description

CmdSettingsMenu Displays the Settings menu.

CmdContextMenu Displays the Contextual menu.

CmdShowGeneralSettings Displays the General Settings dialog.

CmdShowScanSettings Displays the Scanner Settings dialog.

CmdShowWordPredictionS Displays the Word Prediction Settings dialog.


ettings

CmdShowMouseRadarSetti Displays the Mouse Radar Settings dialog.


ngs

CmdShowMouseGridSettin Displays the Mouse Grid Settings dialog.


gs

CmdShowVoiceSettings Displays the Text-to-Speech Settings dialog.

CmdShowMuteScreenSetti Displays the Mute Screen Settings dialog.


ngs

CmdShowDesignSettings Displays the Scanner Design Settings dialog.

CmdShowAboutBox Displays the About box.

13.3.10 Zoom Commands


The following commands perform zoom operations. Note that these are applicable
only if the active window supports it, e.g., Web Browsers, Acrobat Reader, and MS
Word etc.

Command Description

89 COMMAND PROCESSING | ACAT Developer’s Guide


Command Description

CmdZoomIn Zooms-in.

CmdZoomOut Zooms-out.

CmdZoomFit Zooms to fit in window.

13.3.11 Mouse Commands


The following commands control the mouse.

Command Description

CmdRightClick Clicks the mouse right button.

CmdLeftClick Clicks the mouse left button.

CmdLeftDoubleClick Double-clicks the mouse left button.

CmdLeftClickAndHold Clicks and holds the mouse left button.

CmdRightDoubleClick Double-clicks the mouse right button.

CmdRightClickAndHold Clicks and holds the mouse right button.

CmdMoveCursorNW Moves the mouse cursor one pixel in the


northwest direction.

CmdMoveCursorN Moves the mouse cursor one pixel up..

CmdMoveCursorNE Moves the mouse cursor one pixel in the


northeast direction.

90 COMMAND PROCESSING | ACAT Developer’s Guide


Command Description

CmdMoveCursorW Moves the mouse cursor one pixel left.

CmdMoveCursorE Moves the mouse cursor one pixel right.

CmdMoveCursorSW Moves the mouse cursor one pixel in the


southwest direction.

CmdMoveCursorS Moves the mouse cursor one pixel down.

CmdMoveCursorSE Moves the mouse cursor one pixel in the


southeast direction.

13.3.12 Document Editing Commands


The following commands apply when editing a document.

Command Description

CmdUndo Undoes the last operation (Ctrl-Z).

CmdRedo Redoes the last operation (Ctrl-Y).

CmdSelectModeToggle Toggles the select mode. If select mode is ON,


using any of the navigation keys selects the text.

CmdFind Finds text (Ctrl-F).

CmdSelectAll Selects everything. (Ctrl-A).

CmdDeletePrevChar Deletes the previous character (Backspace).

CmdDeleteNextChar Deletes the next character (the Delete key)

91 COMMAND PROCESSING | ACAT Developer’s Guide


Command Description

CmdDeletePrevWord Deletes the previous word.

13.3.13 Miscellaneous Commands

Command Description

CmdExitAppWithConfirm Displays a confirmation dialog and exits the


application.

CmdExitApp Exits the application.

92 COMMAND PROCESSING | ACAT Developer’s Guide


14. SETTINGS

14.1 Introduction
ACAT user preferences are stored in a file called Settings.xml which is located in the
ACAT User folder [INSTALLDIR]\Users\[USERNAME]\Profiles\[PROFILENAME].
The name of the default user is “Default” and the default profile is also “Default”. For
the default user/profile, the settings file is located under
[INSTALLDIR]\Users\Default\Profiles\Default.
There are a number of settings to control the behavior of ACAT. Some of these
settings can be modified through the ACAT GUI (refer to the ACAT User Guide).
Others have to be modified by editing Settings.xml in a text editor. Settings.xml is
created by serializing the Settings class in ACAT.

14.2 Settings
The remainder of this section lists all the ACAT settings. The ACATPreferences class
in the ACAT Extension Library holds all these settings. The class marked as
Serializable and the settings are serialized and de-serialized to Settings.xml.
The settings listed here are grouped by functionality.

14.2.1 Scanning Settings


The settings listed in this section are related to scanning – timings, number of
iterations etc.

Setting Description

The length of time each element stays highlighted


while scanning. This applies to scanners only.
Timings for menus and dialogs are controlled by
SteppingTime the TabScanTime setting.

Type: Integer
Units: Milliseconds
Default: 1000

93 SETTINGS | ACAT Developer’s Guide


Setting Description

The additional length of time the first element


stays highlighted. The value is added on to the
Stepping time. Selecting the very first element in
a box, or a row can be challenge as the user may
have to activate the input switch in quick
succession. HesitateTime tags on an additional
delay for the first element to give the user enough
HesitateTime time to select it. For instance, if the stepping time
is set to 1000 milliseconds and HesitateTime is
set to 250 milliseconds, the first element in a
scanner will stay highlighted for 1250
milliseconds.

Type: Integer
Units: Milliseconds
Default: 250

Length of time each element stays highlighted in


menus and dialogs
TabScanTime
Type: Integer
Units: Milliseconds
Default: 1000

Some buttons have a ‘repeat’ behavior. Even after


they are selected, they stay highlighted for an
additional length of time to enable the user to
select them again with the input switch trigger.
This is applicable to navigation keys for instance.
If the user selects a down arrow to go to the next
line, it is quite likely she want to keep the down
FirstRepeatTime arrow pressed. The FirstRepeatTime setting
gives the user additional time to continue
selecting the same button. This is analogous to
keeping a key pressed on a physical keyboard.

Type: Integer
Units: Milliseconds
Default: 1000

94 SETTINGS | ACAT Developer’s Guide


Setting Description

This is the length of time the user’s input switch


should be held down in order for ACAT to
recognize it as a valid trigger event. For instance,
if a button (such as a mouse button) is used as a
trigger, and this setting is set to 200, the user
must hold the button down for at least 200
AcceptTime milliseconds for a trigger event to activate.
Setting this to too low a value will result in a large
number of false positives.

Type: Integer
Units: Milliseconds
Default: 50

The number of times to scan the top-level widgets


in a scanner. For instance, the widgets in the
Alphabet scanner are divided into two boxes. This
HalfScanIterations setting controls the number of times to scan these
boxes.

Type: Integer
Default: 4

The widgets in a scanner are arranged in rows.


This setting controls the number of times to scan
RowScanIterations the rows.

Type: Integer
Default: 1

The number of times to scan the widgets in a row


in a scanner.
ColumnScanIterations
Type: Integer
Default: 1

95 SETTINGS | ACAT Developer’s Guide


Setting Description

Set this to true to play an audio beep every time


the input switch is triggered. The sound file
played is beep.wav located in the Assets\Sounds
SelectClick folder.

Type: String
Values: true, false
Default: false

14.2.2 Scanner Appearance


The settings listed here are related to the visual appearance of the panels.

Setting Description

The default font to use for displaying text in the


panels. The WidgetAttribute element (see
section 0) in panel configuration files has the font
name has one of the attributes. If the font name is
FontName not specified in the panel configuration file, this
setting is used.

Type: String
Default: Arial

The default font size to use for displaying text in


the panels. The WidgetAttribute element (see
section 0) in panel configuration files has the font
size has one of the attributes. If the size is not
FontSize specified in the panel configuration file, this
setting is used.

Type: Integer
Default: 18

96 SETTINGS | ACAT Developer’s Guide


Setting Description

Used to scale the size of the scanner up or down.


Higher the value, larger the scanner. The default
ScannerScaleFactor value of 10.0 displays the scanner unscaled.

Type: Float
Default: 10.0

The color theme (see Chapter 11) to use with


panels.
Skin
Type: String
Default: BlackYellow

When the user repositions the scanner to one of


the corners of the display, the position is saved
permanently if this is set to true. Otherwise, the
AutoSaveScannerLastPos positon is reset when the application restarted.
ition
Type: String
Values: true, false
Default: false

Widgets on panels can be enabled/disabled


depending on the current context. For instance, if
the Talk window is empty, the button that clears
the Talk window is disabled.
If this setting is set to true, disabled widgets are
ScanDisabledElements scanned. Otherwise they are skipped over and
only widgets that are enabled are scanned.

Type: String
Values: true, false
Default: true

97 SETTINGS | ACAT Developer’s Guide


Setting Description

The default position of the panels on the screen.


The panels can be positioned in one of the four
corners.
ScannerPosition
Type: String
Values: TopRight, TopLeft, BottomLeft,
BottomRight
Default: TopRight

If set to true, the active panel will auto-hide after


a period of inactivity, i.e., when no input switch
trigger is detected. The time span for the period
of inactivity is controlled by HideOnIDleTimeout
HideScannerOnIdle setting. The panel is shown when an input switch
trigger is detected.

Type: String
Values: true, false
Default: false

The idle time period of inactivity in milliseconds.


If no input switch trigger is detected for this time
interval, ACAT will auto-hide the active panel.
HideOnIdleTimeout The panel is shown when an input switch trigger
is detected.

Type: Integer
Default: 5000

The names of the preferred scanner


configurations to use. See section 7.6 for a
PreferredPanelConfigNa detailed description of scanner configurations
mes
Type: String
Default: MenusWithText

14.2.3 Log Settings


The settings listed here are related to logging ACAT activity.

98 SETTINGS | ACAT Developer’s Guide


Setting Description

Setting this to true enables debug trace logging.


This should be always be turned off, and enabled
only for troubleshooting. Turning it on may affect
performance. To view the debug messages, a
utility such as DebugView
DebugMessagesEnable (https://download.sysinternals.com/files/DebugView.zip)
may be used.

Type: String
Values: true, false
Default: false

This setting applies only if


DebugMessagesEnable is set to true. Setting this
to true enables all logging all debug trace
messages to a file. The log files are stored in the
Logs folder under the ACAT install directory.
DebugLogMessagesToFile This should enabled only for troubleshooting as it
can affect performance and also consume disk
space.

Type: String
Values: true, false
Default: false

Setting this true enables logging of Audit log


messages. Auditing ACAT logs events such as
switch activation, activating contextual menus,
activating windows etc. This logs user activity
and should be used only for troubleshooting or
user study. With each audit event, time stamps
AuditLogEnable and meta-data are also logged. All audit log file
are stored in the AuditLogs folder under the
ACAT install directory. The AuditLogFilter
setting controls which type of events are audited.

Type: String
Values: true, false
Default: false

99 SETTINGS | ACAT Developer’s Guide


Setting Description

Applies only if AuditLogEnable is set to true.


This is a semi-colon delimited names of events to
be logged. A value of * logs all events. The names
of events are:

Abbreviation: When the user expands an


abbreviation.
ActiveWindowChange: Whenever active focus
changes on the desktop.
AnimationEnd: When scanning sequence ends
on a panel.
AutoComplete: When the user auto-completes a
word by selecting one from the word prediction
list.
FocusChanged: When focus changes from one
control to another in the active application
AuditLogFilter window.
MouseMover: When the user activates the mouse
mover in the Mouse scanner to move the mouse
on the desktop.
MuteScreen: When the Mute screen is activated.
ScannerActivity: Logs events related to a panel
such as panel display, panel close etc.
TalkWindow: When the talk window is shown
or closed.
TextToSpeech: When text is converted to speech.
SwitchActuate: When a switch trigger is
detected.
UISwitchDetect: When the scanner receives the
switch trigger event and a widget is activated as a
result.

Type: String
Default: *

100 SETTINGS | ACAT Developer’s Guide


14.2.4 Talk Window Settings
These are settings related to the Talk window.

Setting Description

Setting this to true retains the text in the Talk


window when it is closed and restores the text
RetainTalkWindowContent when the Talk window is displayed.
sOnHide
Type: String
Values: true, false
Default: true

Size of the font in the Talk window. A value of


0.0 uses the default font size.
TalkWindowFontSize
Type: Float
Default: 0.0

Settings this to true displays the Talk window


when the ACAT application is launched.
ShowTalkWindowOnStartup
Type: String
Values: true, false
Default: true

Setting this to true displays the current date


and time in the Talk window.
TalkWindowDisplayDateTi
meEnable Type: String
Values: true, false
Default: true

If TalkWindowDisplayDateTimeEnable is set
to true, this setting controls the format of the
TalkWindowDisplayDateFo date field in the date/time stamp. See section
rmat 14.3 for details on the format string.

Type: String
Default: ddd, MMM d, yyyy

101 SETTINGS | ACAT Developer’s Guide


Setting Description

If TalkWindowDisplayDateTimeEnable is set
to true, this setting controls the format of the
TalkWindowDisplayTimeFo time field in the date/time stamp. See section
rmat 14.3 for details on the format string.

Type: String
Default: h:mm tt

Setting this to true displays a border around the


Talk window.
TalkWindowShowBorder
Type: String
Values: true, false
Default: true

Setting this to true displays the title bar for the


Talk window.
TalkWindowShowTitleBar
Type: String
Values: true, false
Default: true

Setting this to true displays a translucent glass


behind the Talk window covering the entire
desktop.
EnableGlass
Type: String
Values: true, false
Default: true

If EnableGlass is set to true, this setting


controls the opacity of the glass. A value of 1.0
makes it completely opaque. Setting it to 0.0
GlassOpacity makes it completely transparent.

Type: Float
Values: 0.0 to 1.0
Default: 0.8

102 SETTINGS | ACAT Developer’s Guide


Setting Description

If set to true, a fade-in effect is used when the


glass is displayed.
GlassFadeIn
Type: String
Values: true, false
Default: false

14.2.5 Word Prediction Settings


These are settings related to next-word prediction.

Setting Description

Name of the extension to use for next-word


prediction. See Chapter 8 for details on Word
PreferredWordPredictor Prediction extensions.

Type: String
Default: Presage Word Predictor

Setting this to true prefixes index numbers to


the words in the word prediction list in the
PrefixNumbersInWordPredic Alphabet scanner.
tionList
Type: String
Values: true, false
Default: true

The number of words to display in the word


prediction list in the Alphabet scanner.
WordPredictionCount
Type: Integer
Default: 10

103 SETTINGS | ACAT Developer’s Guide


Setting Description

This setting is valid only if the Word Prediction


extension supports a corpus-based word
prediction model. The corpus is built from the
user’s existing writings to capture the user’s
EnableWordPredictionCor writing style. This improves the accuracy and
pusModel relevancy of next-word prediction. Set this to
true to enable corpus models.

Type: String
Values: true, false
Default: false

This setting is valid only if the Word Prediction


extension supports learning. ACAT adds text to
the word prediction model during text entry.
This improves the accuracy and relevancy of
EnableWordPredictionDyn next-word prediction. Set this to true to enable
amicModel learning.

Type: String
Values: true, false
Default: true

Word predictors are usually based on N-Gram


algorithms where the previous N words in the
current sentence are used to predict the next
word. This settings controls N. The allowable
WordPredictionNGram values depend on the capabilities of the Word
Predictor.

Type: Integer
Default: 4

104 SETTINGS | ACAT Developer’s Guide


Setting Description

Some Word Prediction return punctuations


such as periods and commas as punctuations
depending on the words typed so far. Setting
WordPredictionFilterPun this to true filters these out.
ctuations
Type: String
Values: true, false
Default: true

WordPredictionFilterMat
chPrefix

WordPredictionFilterMat
chPrefixLengthAdjust

14.2.6 Mouse Grid Scanning Settings


These settings control the movement of the mouse in the grid scanning mode. Refer
to the ACAT User Guide for details on this.

Setting Description

The vertical speed of the grid line movement


across the display.
MouseGridVerticalSpeed
Type: Integer
Default: 4

Multiplier factor for the vertical speed of the


grid line. This in conjunction with
MouseGridScanSpeedMulti MouseGridVerticalSpeed determines the
plier vertical speed of the grid line.

Type: Integer
Default: 14

105 SETTINGS | ACAT Developer’s Guide


Setting Description

Horizontal speed of the mouse cursor


movement in the grid scan mode.
MouseGridHorizontalSpeed
Type: Integer
Default: 11

Multiplier factor for the horizontal speed of


mouse cursor movement. This in conjunction
MouseGridMouseMoveSpeed with MouseGridHorizontalSpeed
Multiplier determines the horizontal speed of the mouse.

Type: Integer
Default: 6

Number of times the grid line scans the display.


MouseGridVerticalSweeps
Type: Integer
Default: 1

Number of times the mouse sweeps across the


MouseGridHorizontalSwee display.
ps
Type: Integer
Default: 1

Width of the grid line.


MouseGridLineWidth
Type: Integer
Default: 3

14.2.7 Mouse Radar Scanning Settings


These settings control the movement of the mouse in the radar scanning mode. Refer
to the ACAT User Guide for details on this.

Setting Description

106 SETTINGS | ACAT Developer’s Guide


Setting Description

The rotation speed of the radar line across the


display.
MouseRadarRotatingSpeed
Type: Integer
Default: 6

Multiplier factor for the rotation speed of the


radar line. This in conjunction with
MouseRadarRotatingSpeed MouseRadarRotatingSpeed determines the
Multiplier overall speed of rotation.

Type: Integer
Default: 4

The speed of the mouse cursor along the radar


line.
MouseRadarRadialSpeed
Type: Integer
Default: 6

Multiplier factor for the radial speed of mouse


cursor movement. This in conjunction with
MouseRadarRadialSpeedMu MouseRadarRadialSpeed determines the
ltipler overall speed of the mouse cursor.

Type: Integer
Default: 12

Number of times the radar line sweeps across


MouseRadarRotatingSweep the display.
s
Type: Integer
Default: 1

107 SETTINGS | ACAT Developer’s Guide


Setting Description

Number of times the mouse sweeps along the


radar line.
MouseRadarRadialSweeps
Type: Integer
Default: 1

Width of the radar line.


MouseRadarLineWidth
Type: Integer
Default: 3

14.2.8 Text-to-Speech Settings


These settings control text-to-speech.

Setting Description

Setting this to true enables the text to speech


feature.
EnableTextToSpeech
Type: String
Values: true, false
Default: true

Name of the extension to use for text-to-speech


conversion. See Chapter 9 for details on Text-
PreferredTTSEngines to-Speech extensions.

Type: String
Default: SAPI TTS Engine

The string to use to test text-to-speech settings.


This string is used in the Settings dialog for TTS.
UserVoiceTestString
Type: String
Default: "The boundary condition of the
universe is that it has no boundary. "

108 SETTINGS | ACAT Developer’s Guide


Setting Description

Text-to-speech is usually an asynchronous


operation. The ‘bookmarks’ feature enables the
application to get notifications when an
asynchronous call to convert text to speech has
TTSUseBookmarks completed. Setting this to true enables this
feature.

Type: String
Values: true, false
Default: true

14.2.9 Mute Screen Settings


These settings control the parameters for the Mute screen (refer to the ACAT User
Guide for details on the Mute screen).

Setting Description

How many times to scan the pin code on the


Mute screen. The default value of -1 indicates
that it scans forever until the user unlocks the
MuteScanIterations Mute screen by entering the correct pin.

Type: Integer
Default: -1

The pin code that the user has to enter to unlock


the Mute screen.
MutePin
Type: Integer
Default: 2589

The highest digit to use in the pin. If this is set


to say, 5, only 0 through 5 can be used in the
MutePinDigitMax pin.

Type: Integer
Default: 9

109 SETTINGS | ACAT Developer’s Guide


Setting Description

The Mute screen displays the current date/time.


This setting controls the format of the date field.
MuteScreenDisplayDateFo See section 14.3 for details on the format string.
rmat
Type: String
Default: dddd, MMMM d, yyyy

The Mute screen displays the current date/time.


This setting controls the format of the time field.
MuteScreenDisplayTimeFo See section 14.3 for details on the format string.
rmat
Type: String
Default: h:mm:ss tt

14.2.10 Miscellaneous Settings


These are settings not covered in the previous sections.

If set to true, hides the Windows taskbar when


the glass is displayed.
HideTaskBar
Type: String
Values: true, false
Default: false

The number of spaces to insert after a


punctuation from the ACAT scanner. The set of
punctuations includes [. ? ! , : ;’] brackets
SpacesAfterPunctuation excluded.

Type: Integer
Default: 1

110 SETTINGS | ACAT Developer’s Guide


If this is set to true, the user has to type a space, a
Tab or one of the punctuations . ? ! , : ;’ after
typing an abbreviation. Only then is the
abbreviation expanded to its full form. If set to
ExpandAbbreviationsOnS false, ACAT expands immediately after the last
eparator letter in the abbreviation is entered.

Type: String
Values: true, false
Default: false

Semi-colon delimited names of top level folders


from which ACAT extensions are to be loaded.
The extension folders are located under the ACAT
install directory. See Chapter 4 for details on
Extensions extensions. Only the names of folders and not the
complete path should be specified.

Type: String
Default: Default

Name of the extension to use for spell checking.


See Chapter 10 for details on Spell Checkers.
PreferredSpellChecker
Type: String
Default: ACAT SpellChecker

Setting this to true will auto-display a contextual


menu in ACAT if the user activates a menu in the
active application. The contextual menu has
EnableContextualMenusF options such as arrow keys, ENTER and ESCAPE
orMenus to navigate menus.

Type: String
Values: true, false
Default: true

111 SETTINGS | ACAT Developer’s Guide


Setting this to true will auto-display a contextual
menu in ACAT if the user activates a dialog in the
active application. The contextual menu has
EnableContextualMenusF options such as Tab, Shift-Tab, ENTER and
orDialogs ESCAPE to navigate dialogs.

Type: String
Values: true, false
Default: true

14.3 Formatting Date and Time


Some of the settings in section 14.2 are used to display date and time. The link below
has details on formatting the date and time strings.
https://msdn.microsoft.com/en-us/library/8kb3ddd4%28v=vs.110%29.aspx

112 SETTINGS | ACAT Developer’s Guide

You might also like