Win CE Integrators Guide
|
Revision 1.12, 7th Dec
2011 www.touch-base.com\documentation\embedded |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
OverviewThese notes refer to the UPDD CE driver 4.1.10
first released April 2011. For customers using the earlier 4.0.6
release please refer to the instructions here. Windows CE or Windows Embedded Compact are
embedded operating systems. For OEMs requiring a touch screen, or other
pointer interface on Windows CE devices, the Touch-Base Universal Pointer
Device Driver suite of software includes a 5.x, 6.x and 7.x CE driver. With this release UPDD supports an interface with the standard Windows CE GWES (Graphics, Windowing, and Events Subsystem) touch interface. This allows for calibration via the built in CE control panel Stylus option and provides an interface to the gesture interface in Windows CE 6.0 and later. The old ‘mouse’ interface is retained for testing purposes and can also be used in situations whereby the GWES touch interface is not part of the CE image. This UPDD version is built on the same
software base as all other UPDD variants so that most UPDD functions
available on other platforms are now supported in Windows CE (except for minor differences to accommodate variance
in the Windows CE implementation). Known exceptions are listed in the limitation section below. The UPDD
Application Program Interface is supported on Windows CE allowing 3rd
party utilities to be developed. The main differences between the new and previous driver are: ·
based
on the new 4.1.10 driver architecture ·
has been
implemented as a native CE touch device driver interfacing with the standard
Windows CE GWES touch interface ·
utilises CE
calibration procedure ·
supports
the native gesture interface introduced in Win CE 6 ·
is
shipped with the new command line utility ·
uses
the standard UPDD settings file History
Hardware InterfacesSerial – Available Oct 11 build onwards. USB has been tested on X86 and ARM processors. If there are USB interface issues on other processors we may need to be supplied a target system to investigate further and modify the UPDD USB interface where applicable. Other interfaces such as PS/2, ISA etc could be added if required. See important Port Interface issues below. Processor supportThe driver has been tested in house with X86 and ARM CE. We can build drivers for other processors, as supported by the Microsoft CE Platform Builder, on request. At the time of writing, the processors supported by UPDD in the various versions of CE are as follows:
More
information on the CE product range is available here: http://www.microsoft.com/windowsembedded/en-us/develop/windows-embedded-products-for-developers.aspx Any system/processor can
be supported as long as a Board Support Package is available for the target
processor. Read http://www.microsoft.com/windowsembedded/en-us/downloads/board-support-packages-for-windows-embedded.aspx for more information on BSP’s Target hardware may have
to be supplied for testing if any problems are experienced with the driver. Important note: Although we have built the CE components for the processors listed above we can not test the driver on all supported processors due to lack of target hardware. In theory the drivers should work on the target processor as long as the component build process utilises the relevant BSP. Software deliveryIn
this environment, UPDD is supplied as a number of separate components.
Software sent via email will be held in the file ZIP file TBUPDDCE.ZIP.. Touch-Base utilises virus
detection software on all of our systems but recipients of the software
should pass the files through their own virus checking software before
proceeding with installation. Normally a software package will be supplied with just one touch
controller supported in which case the settings
file can be used as supplied, unless using a serial controller and the
com port needs to be changed via the autoinstalldevice setting. If the software package
contains more than one controller definition this setting is also used to
indicate the serial controller definition to use. ComponentsThe UPDD CE package consists of the following
components:
RequirementsThe basic system requirements for utilising
UPDD are as follows: ·
Supported CE
version: 5, 6 or 7. ·
Supported
processor version or one where a BSP program can be supplied. Alternatively
x86 based images can be run on a standard PC using the LOADCEPC utility. ·
Supported
touch controller ·
The target CE
system must contain the touch screen CE components as described here: ·
The target
system image must have been created with the appropriate platform builder
with any relevant system packs. We
have had a customer report that he was showing ‘crazy’ errors in
the CE log file and identified the problem as being a CE update applied to
his Visual Studio 2005. He rolled back
the updates and the error disappeared! Using the componentsThe
components can either be installed on an existing CE system or embedded into
a CE image as detailed below. Installing on existing imageInstalling into an already created image
can be performed for two reasons, either to test / demo the driver prior to
embedding or as a permanent installation solution whereby there is not an option
to embed the driver into the desired image. If installing the driver for test or demo
purposes then the driver can be installed, tested/demoed and then
discarded. However, if the
installation is being used to install the driver as a fully working solution
this can only be achieved on systems that have persistent storage for the
file system and the registry such that the changes to the system are retained
over a reboot and available during driver load. These notes are based on installing on a
CE5 image that did not contain the touch stylus components built into the
image and therefore the driver was configured to use the basic mouse
interface to handle cursor movements and click. Whether a post installation is possible
for a given system depends completely on the architecture of that specific
system and in some cases may simply not be possible. However these notes can
be used as a starting point to experiment. As a minimum the system will need: 1)
Persistent
disk storage, such as a flash drive or similar device. 2)
A mechanism
to save updates to the registry again typically on a flash device. 3)
A mechanism
to load files onto the target system. You will also need a tool to edit the
registry. One such editor is described here Without these aspects the software will
probably not work in a post installation scenario. There may well be other
dependencies which prevent this working so we cannot guarantee that post
installation will be successful and this will need to be assessed on a case
by case basis. The steps to follow are: 1)
Identify the system path
by examining registry entry HKEY_LOCAL_MACHINE\Loader\SystemPath
or HKEY_LOCAL_MACHINE\Launch\SystemPath
for
the system path entry. This lists the folders searched by the system for
.dll or .exe files.
Identify if one of these folders is on your persistent storage device
which can be used for the driver modules and settings file or create a new
folder and add its location to this registry entry. If you need to add
additional folder names to the system path you will need a registry editor,
such as ceregeditor or SLRE.
2)
The
driver’s touch interface into CE is via GWES or standard mouse port.
The GWES interface will only be available if the image was built for touch
and includes the Touch Screen (Stylus) component. If the touch component is not built into
the image (the stylus calibration option in the
control panel will be missing) then edit the supplied settings file
tbupdd.ini to add this entry: 3)
Extract the
supplied updd files and copy to the target system
by whatever means are appropriate, copy to the folder described in Step 1
above. The files *.bib, *.dat, *.h *.reg are not required on the target. 4)
Take the file
tbupdd.reg and add all the registry settings from
it to the registry on the device, using a suitable registry editor. 5)
Create a
further registry setting EmbeddingIt
is assumed that the developer is using the appropriate Visual Studio,
Platform Builder and service packs to create the relevant Win CE image for
the target hardware. The
software is supplied in a form to make it easy for users with little
experience with Windows CE to get up and running as quickly as possible. CE
experts with knowledge of the BIB structure are free to amend the
configuration files as required, so long as the embedded files are located in
accessible locations on the target and with the correct attributes. For
users unfamiliar with Windows CE we suggest the following guides to creating
a Windows CE image. http://msdn.microsoft.com/en-US/library/ee483161(v=WinEmbedded.60).aspx (CE 6 / 7) http://msdn.microsoft.com/en-us/library/aa446910.aspx (CE5)
1. Expand the tbupddce.zip file. Some of the files are target specific,
these target specific files are shown by the black highlight in the example
below (in this case for the x86 target): 2. Copy the
files for your chosen target (processor) to the root folder of your build
system (typically c:\wince500, c:\wince600 or c:\wince700).
Having followed the above instructions
you should now be able to build and test your CE image. Additional embedding notes:1.
Registry entries ·
If using a USB device then one
of the entries in the .reg settings refers to the
device and will contain the USB VID and PID values. The VID and PID values
MUST match the VID and PID of the controller in use. If the supplied files do
not match the controllers VID and PID, manually edit the values to match e.g.
Controller has hex VID = 1234 and PID = 11 values. Hex 1234 = decimal 4660 and Hex 11 = decimal 17.Based on this example the
settings would be as follows: ·
Ensure
the InputConfig entry is updated to indicate a
touch screen is in use. For more information on this setting see http://msdn.microsoft.com/en-us/library/ee482243.aspx
2. Modify any settings in the UPDD settings file as required. See Driver
Setting section below for more information. 3. If system does not have persistent registry or file system determine
appropriate calibration strategy as described in the calibrate section below. 4. Make any
required software changes to the system components. See “Port interface issues” below. TestingOne
feature of the CE touch interface is that there is no mouse cursor shown.
This is by design as in a touch environment the visual feedback is at the
point of touch. The easiest and quickest test is to touch on the CE desktop
– when dragging on this screen a “wire frame” marker is
seen. This is particularly useful when working with an uncalibrated
or unattached touch screen. Calibration considerationOnce
the image is running you can calibrate the touch screen by using the Stylus
option in the control panel. This is illustrated below. Note that the exact
screens vary according to the system configuration. This
will invoke the calibration procedure:
The
calibration data is held in tbupdd.ini with a separate managed copy in the
registry. Unless the target system has persistent storage for the registry,
or the file system holding tbupdd.ini (/application data/updd/tbupdd.ini), or
eeprom storage is used then calibration data will
not be saved across a reboot. If
persistent storage is available for the tbupdd.ini or registry file then no
further action is required. In the case that a persistent registry is
available the software saves the calibration data to the registry and this
data is written to tbupdd.ini at startup. The
location of the registry data is subject to change and should not be set
manually. However, if calibration data is not held
in permanent or non volatile memory then the following calibration options
should be considered. Calibration optionsManual Calibration. The stylus calibration invoked to perform manual
calibration. An implementation using manual calibration needs to decide on a
strategy for initiating the calibration procedure. E.g. executing the
calibration program at start-up, or placing an icon on the desktop. These and other
options are implemented via the platform configuration. One option we are
considering is that the driver will automatically invoke the calibration
procedure at startup based on a system setting. This would be used in
environments where calibration was performed every time the system started.
Please contact us if this is required. In cases where neither persistent storage nor
EEPROM based calibration are available the calibrated data can be embedded in
the target image to pre-calibrate the system. This approach is only suitable
for systems where the calibration data does not change significantly over
time or with use. To pre-calibrate the system: 1)
Calibrate normally 2)
From a command prompt (cmd.exe) type “tbutils
dump4tba”. – for more information see Command Line Interface document 3)
Open the file tbcalib.tba created by this
process and copy the string contained in it (if no file is created ensure you
are running the program in a writable folder and try again, e.g.
/application/data/updd). 4)
Paste the string into the calibration styles section for the controller
replacing the default info shown in red below. This is in the copy of
tbupdd.ini in your build environment: 5)
Rebuild the target image. If correct calibration
data is stored in the settings file then the default settings will offer a calibrated
system. Some controllers
support the saving of calibration data in persistent memory (eeprom) on the controller itself. This feature is only
available for controllers that explicitly support this feature and where
support has been added to the driver. UPDD 4.1.10 supports a common framework
for eeprom calibration, so that in due course all
controllers with eeprom support on any platform
will be supported on all. If the setting file has
an entry ‘eeprom protocol = ‘protocol
id’ then this indicates that updd
supports eeprom storage for the touch controller
but it does not necessarily indicate if this is supported in CE due to
differences in the CE platform. See EEprom documentation for more
information about supported controllers under CE. For supported
controllers simply set the eeprom calibration
option in tbupdd.ini to 1 [updd\parameters\controller\ts001] eeprom calibration=0x1 eeprom protocol=’protocol id’ – This
is the protocol
id used by the driver to support eeprom in the
controller. If eeprom
calibration is enabled the driver automatically loads the calibration data at
startup. Calibration
beeps
Calibration
beep option
to be investigated and not currently available. Please
contact Touch-Base should this be required. Calling calibration from an application
This section to be confirmed as is untested and speculation only. It
has been copied from an article on the internet… Sometimes it may be necessary to cause a touch
calibration to occur from an application, perhaps because of drift or because
the initial values as set during the production process weren’t quite
right. This is fairly straightforward to achieve as the
relevant method is exposed by coredll.dll All that is needed is to declare a platform invoke
(P/Invoke) to the coredll.dll method,
which can then be called from within application code: A C# compact framework example would
be: using System; using System.Runtime.InteropServices; namespace DynamicDevices.Utilities { /// /// Expose /// public class NativeMethods { [DllImport("coredll.dll")] public static
extern void TouchCalibrate(); } } Rotate
The
current version of the driver supports operation in a fixed rotated mode. All
that is required is to calibrate in the desired rotation. This
article http://msdn.microsoft.com/en-us/library/ms914404.aspx
describes how to set Portrait mode as default if required Dynamic
rotation is not yet supported. Given that GWES is used and is responsible for
rotation it is possible that this will also just work, but this is subject to
confirmation. Driver settings and general notesThe
driver’s settings are located in the UPDD settings
file and will usually be set to
the default settings for the controller in use. These settings are defined as
part of generating the CE driver for a given touch screen device.
On the CE target system
there will be 2 copies of tbupdd.ini \windows\tbupdd.ini or \Windows\tbupdd.ini.orig (Oct 11 onwards) \application
data\updd\tbupdd.ini This is because the BIB script
creates the first entry and the DAT script then creates the second real
working entry. The working copy has to be in \application data in order to be
writeable. Should you require this to be in a different writable location
then define the following registry entry: HKEY_LOCAL_MACHINE\Drivers\BuiltIn\updd\settings=<path to ini>.
This identifies the full path to tbupdd.ini Pre
Oct 11 - We did not find a method to eliminate the \windows copy. The
redundant copy can be ignored and in any case is very small. Post
Oct 11 - We determined it is not possible
to delete the \windows copy so we now copy the file to \Windows\tbupdd.ini.orig and this is in turn copied to the active
area. This is handled by the .dat file so no user
action is required. Serial port device and com port
selection
The setting autoinstalldevice is used
to direct the installation of the device through the UPDD PNP manager. For
USB devices this is handled automatically but for serial devices this setting
is used to select the required serial device and specify the com port, even
when only one is configured in the software package. This setting is described below. Example [updd\parameters] autoinstalldevice=1¬Microchip,
AR1100, Serial¬¬COM1 Description autoinstalldevice is comprised
of several fields separated by the “¬” symbol as described below: 1) The controller
id. Usually 1. This tells the PnP manager which TSNNN (default controller
settings – one per supported controller in the settings file) entry to
select during installation of the device. This value should not be changed
unless you have a software package with multiple controllers and you wish to
select a controller other than the first defined for installation. E.g. to
select TS003 set this to 3. 2) The name with
which the device will be installed. This can be freely edited. 3) Unused (needed
for compatibility with the standard updd
installer). 4) The
COM port. This can be edited as required. This is the com port that will
be selected when the device is installed. See important Port Interface issues below when defining
serial ports. Sound
Not currently supported in the new driver. Please
contact us should this be required. Mouse
Mode
As
standard the GWES touch interface does not utilize the mouse cursor therefore
there is no mouse cursor movement when touching the screen. In fact, when using the touch interface the
mouse cursor becomes invisible. For
test purposes, during the development of the new native touch interface we
retained the previous mouse interface (which utilises
the SendInputAPI) and this can be enabled if mouse
emulation (and therefore mouse cursor movement) is required. It should be noted that operating systems
are moving away from the system cursor when utilising
touch and we believe more end users should be encouraged to use touch without
the traditional mouse cursor utilized for visual placement feedback. Mouse
cursor is Mouse interface, other or no visual feedback is Touch. However,
should you wish to see mouse cursor movement then the following UPDD setting
will enable the old mouse interface: [updd\parameters] cesendinput=0x00000001 It
should be noted that any touch functionality built into the OS which is
enabled when touch input is processed via the GWES touch interface will be
lost if the touch data is passed via the mouse interface. This is likely to be more relevant to
Windows Compact (CE 7) than pre CE 7 versions. We
believe that for mouse mode to work you will need to configure the Mouse Catalog
in your CE image. Priority levels
In order to provide
adequate performance it is necessary for the driver to execute at a higher
priority than other active processes. In particular the explorer component
consumes a lot of CPU in some cases, so dragging items on the desktop can be
slowed. By default all critical threads in the driver execute at priority
level 249 which gives good results in most cases (which was the same as the
HID mouse). Should you wish to alter
this priority for any reason you can change the following settings. For the main driver
(upddce.dll) add the Priority setting in tbupdd.ini setting in the [updd] section. [updd] .... priority=0x000000FA For the USB interface component
(tbupddceusb.dll) add the registry setting [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\updd] "priority"=dword:fa Touch packet data rate
In years gone by it had
been observed on some lower end systems that if all the incoming data packets
from fast touch controllers are processed it can have a detrimental effect on
the performance of the system. By
default the driver processes 100% of the packets. This percentage can be adjusted by the UPDD
setting [updd\Parameters\1\]:SampleRate. Changing the setting from
64hex (100 dec) to 32hex (50 dec)
indicates to process 50% of incoming packets. Right Click processingA "right click on
hold" feature in Windows CE is provided by the WinCE component AYGSHELL.
Windows CE generates this right click automatically when the left touch is
held stationary for a certain period of time. There is nothing that the
driver can currently do to influence this. If this component is present in a
Win CE image the right click on hold feature is enabled and you will see the
progress indicator if you hold a touch steady for a period of time. When building an image
AYGSHELL may or may not be included depending on your requirements. If installing the touch
driver on an already created image you may or may not have right click
processing depending on the inclusion of AYGSHELL in the image. If you do have right click processing and
wish to disable or adjust the right click threshold we are currently unaware
of how this is achieved but there are references on the web to a registry
entry that can be used to adjust the time “This amount of time can be
controlled by the OEM through a registry setting” but we’ve been
unable to find it! Further, this article http://msdn.microsoft.com/en-us/library/aa925176.aspx
implies that applications can specify if right click processing is enabled
within an application. Multi-monitor supportWindows
CE does not support multiple monitors. However UPDD will support a
configuration where 2 or more monitor and associated touch-screens are
utilized in a “shadow” configuration, i.e. where both monitors
show the same image. No special UPDD configuration is required for this mode, each additional controller detected will bind to the
same device definition. Calibration can take place on either monitor. It is
assumed that calibration on one monitor is good for the other so the devices
must be identical. Multi-controller definitionsIn
some cases you may receive a package that supports multiple controller
definitions. In this case you will see multiple entries listed in tbupdd.reg in sections beginning: [HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients... This occurs when a controller case have multiple VID or
PID designators. In this case the default tbupdd.reg
file must be amended so that the bootstrap VID and PID entries (shown here) [HKEY_LOCAL_MACHINE\Drivers\BuiltIn\updd] "vid"=dword:afa "pid"=dword:3e8 Match
the controller in use. The default settings will match the first listed
controller. NB the bootstrap entries are in HEX whereas the LoadClients entries are in decimal. GesturesStarting with CE version
6.0 Windows CE supports gesture functionality allowing gestures from the
touch-screen to be passed to applications that support such gestures. This
functionality can be enabled by selecting the items shown below in the CE
catalog. This functionality is part of GWES and so cannot be used when in Mouse Mode is used.
It is only useful when applications are in use that
support this functionality.
An interesting article
describing this functionality is available at Another comprehensive
gesture article: http://blogs.msdn.com/b/marcpe/archive/2009/06/29/let-s-talk-about-touch-part1.aspx
Touch gestures in WEC7
are further described here http://msdn.microsoft.com/en-us/library/ee499124.aspx. ToolbarsA toolbar is an area on
the touch screen that acts independently from the main calibrated video area.
A toolbar can simply be used to mask off areas of the calibrated video area
or they can be used to trigger an event.
Toolbar utilisation is described in the Toolbar document.
To utilize in a CE environment the toolbars would need to be
configured in a OS using the UPDD Console, Toolbar
dialog and then embed the toolbar entries in the settings file into the CE
settings file. Touch Stylus NotesSettingsWe are aware that
Microsoft publishes a number of settings that relate to the GWES touch stylus
and we are unsure if these settings relate to all versions of CE or have in
some cases been superseded by newer versions of the OS. Nevertheless we are aware that various
settings are documented that may or may not affect stylus usage.
Experimentation would be necessary to determine the affect they have on the
stylus interface. One such reference
to stylus registry settings is here. Double
Click Setting
One interesting entry is
the DblTapDist
setting at HKEY_CURRENT_USER\ControlPanel\Pen documented as “Default
setting is 20 pixels. Indicates the size of a reference rectangle constructed
around the location of a stylus tap. If a second tap occurs inside the
rectangle within the allowed time, it is considered a double-tap.” UsageA good overview of CE
touch related issues can be viewed here. DiagnosticsIf you’ve embedded
the software and the touch does not work there are several things you can
check. Several of these require an active debugger connection, such as that
provided by Platform Builder. 1) Check for known issues Check the known issues section. 2) Manually reload the
driver
This operation requires a
connection to the driver process (implemented in upddce.dll). If a message
indicates that this connection cannot be made then recheck that upddce.dll is
in place and check all registry settings. If you are using a USB
controller and a message box pops up at startup asking for a driver for a
specified device, then check if this message occurs without the controller
plugged in. If not then this suggests an error in the registry settings, pay
particular attention that the vendor id and product id match the controller
in use. See the multi controller definitions section later in this document
if you have more than one controller listed. 3) Check the UPDD modules
loaded Check in the debug log that
both upddce.dll and tbupddceusb.dll (if using USB) are loaded and not
subsequently unloaded. Typically the module load entry will read: PID:00400003 TID:03770006 OSAXST1: >>>
Loading Module 'tbupddceusb.dll' (0xC0845838) at address 0xEE5B0000-0xEE5B6000
in Process 'NK.EXE' (0x85302A60) As see in the debug log below:
Check the log for other
messages including the text UPDD, particularly when touching the screen. In
the event of USB errors useful information is output in the log. 4) Enable UPDD debug log
information Additional UPDD debug
information can also be seen by setting the tbupdd.ini debuglevel
setting to 5. TBUPDD.INI file [UPDD] Debuglevel=0x00000005 The USB component also
shows more debug information when executed in a debug build. Serial debug connection If you wish to use a
Serial connection to the Windows CE device for debug purposes we did document
many years ago that there is a consideration that is not always made clear in
the Microsoft documentation. A null modem cable is required, but this differs
from a standard null modem cable in that the RI pin is connected straight
through. Without this connection it will be impossible to make a serial
connection from the NT host to the Win CE device. Nowadays most system integrators do not
debug over serial so we are not sure if this is still a valid issue. Port interface issues – importantSerial
Touch-screens
may be connected to a CE device via a standard serial (COM). A CE image
builder should bear in mind that the default CE image generated by platform
builder might well make assumptions regarding the usage of such ports. E.g.
debug output will be sent to the first physical COM port, preventing its use.
By default, CE creates two com port instances, Com 0 and Com 1. Com 0 is used
as the debug port and relates to the physical port com 1. Com 1 is therefore
the first port that can be used by the touch screen that actually relates to
the physical Com 2 port. Many
customers have been unable to get their touch screens working with a default
CE build until they have plugged the touch screen into com2 or changed the
BIOS so that serial port is referenced as Com2, although the references in
the CE build refer to com 1 !!!! In
some circumstances the CE builder will need to amend the CE configuration to
alter the default serial port behavior. If you are not familiar with this
procedure we have technical bulletin that covers this subject. Port initialisation
This needs to be reinstated for the
new driver as and when required…. We
have discovered that with serial communications on some motherboards if we
set up UART flow control options then we receive either no data or garbage.
When this setup is omitted the serial port works as expected. This is fine for serial controllers that
do not need either a specific state or change of state in the CTS/RTS lines
in order to operate. We
have introduced a device level setting called “IgnoreDCB”
and if it is set to 0x00000001 then the com port flow control initialisation is skipped. [updd\Parameters\1\]:IgnoreDCB = 0x00000001 We
found that the TI OMAP Platform motherboard required this setting. USB
The CE image must be
amended to support the USB host controller (this is the system’s USB
host controller and NOT the USB touch controller). Consult the
manufacturer’s documentation and or Platform Builder help for details
of how to achieve this with the particular model of hardware in use. A 3rd
party driver might be required for the host controller, although this has not
the case for the hardware we have tested so far. To ensure the CE
system’s USB host controller is functioning use a HID mouse prior to
testing the USB touch controller. PS/2
PS/2 support needs to be reinstated
for the new driver as and when required…. Known issuesThe
list of known issues is as follows: 1)
Could not ActivateDevice warning message in debug log with touch
working fine 2)
After
installing driver image worked once but failed to boot on subsequent reboots 3)
Hotplug of device
not working LimitationsKnown
limitations to be addressed as required: USB
and serial (Oct 11 onwards) support
only. Other interfaces to be added as required. No
sound support. Dynamic
rotate untested. Hardware
based eeprom storage not supported. Limited
testing of software based eeprom calibration
storage. No
GUI settings dialog (UPDD Console) to allow for dynamic setting changes. Contact For further
information or technical assistance please email the technical support team
at technical@touch-base.com. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||