Home

GWv4

Monitoring and Calibration

GWv4 is used for monitoring and calibration of electronic control units (ECU’s). It can either be used whilst connected to an ECU for realtime monitoring and calibration changes or offline as a stand-alone calibration file editor.

GWv4 offers many features including PC based data-logging, auto mapping, scripting / automation and more.

XCP / A2L Support

Licensing options are available to support ASAM Standardised XCP / A2L based ECUs in addition to GEMS proprietary protocol.

With GEMS Simulink® Enabled products such as the EM80-M ECU, you can run your own Simulink® models on ECUs with real-time monitoring and calibration via GWv4.

More Information

Introducing GWv4

Subsections of Home

Subsections of Introduction

Notation

Some common notation is used throughout this documentation:

Menu commands are signified in bold type with a pipe symbol | between each level of the menu.

For example, UndoCtrl-Z indicates that you should click on the ‘Undo’ item in the ‘Edit’ menu.

Text Entry

This Font is used to indicate text that should be typed in by the user.

Getting Started

Working on tractive systems (which includes but is not limited to engine(s), motor(s), inverter(s), high voltage battery packs and high voltage cables) requires special experience and training.

Incorrect installation or use of GEMS Electronic Control units (ECUs) or software may lead to electrical / mechanical damage, injury or even death. As such, installation must only be performed by users with experience with electronic control systems and a competence of Windows based computer software.

All accompanying documentation must be read thoroughly before installation is attempted.

If you are in any doubts regarding the fitting and use of this product, please contact your reseller or GEMS directly at tech.support@gems.co.uk

General Engine Management Systems (GEMS) Ltd shall not be held responsible for any mechanical or electrical damage or personal injury occurring whilst using this product. Neither shall GEMS be held responsible for damage, injury or death caused by the misuse, misunderstanding or miscalibration of this product.

Installing GWv4

Download and run the installer from gems.co.uk/downloads/software. For more details, see Installation.

Licensing GWv4

A license is required for useful operation of the software. There are different types of license that will allow different types of ECU to be used with GWv4.

Software licenses are installed via License....

For more details on software licenses and Dongles, see Licensing the Software.

GWv4 Quick Start

Upon starting GWv4 for the first time, the Quick Start window will be shown which offers some convenient links for commonly used features:

The Start Page The Start Page

The Quick Start page automatic popup can be suppressed by unchecking Show Quick Start At Startup. You can show the start page again at any time from Start Page.

Installing an ECU Definition File

Interaction with an ECU or Calibration file requires and ECU Definition File to be installed.

The easiest way to install ECU definition files (*.ecudef / *.gin / *.a2l) is to drag & drop the file from Windows File explorer onto the application. Alternatively when connecting to an ECU or opening a Calibration file the software will guide you through the process of installing one.

For more details, see ECU Definition Files.

Opening a Calibration File

A calibration file contains a copy of the ECU configuration memory - this contains all the values to which tables / maps / options have been calibrated. From the main menu select Open Calibration...Ctrl-O and select the calibration you wish to open, or New Calibration... to start a new calibration.

Starting from a blank calibration will typically be a lot of work to get up-and-running with. We would therefore recommend that a base calibration is used as a starting point rather than a blank calibration, depending upon your application. Many base calibrations are available online (gems.co.uk/downloads). Alternatively, contact GEMS.

Note

Calibration files are sometimes referred to as ‘map’ or ‘mapping’ files. This terminology could be confused with ‘map’ objects (e.g. The Fuel Map), so the term ‘calibration’ is used in the GWv4 software.

Working with Calibrations

Calibrations are conceptually made up of the following objects:

  • Maps - ‘Matrix’ objects with 2 input axes and a 3rd output value axis. This allows a value to be produced based on two other variables via a look-up table.

    For example, the Fuel Map maps Engine Speed and Engine Load onto an injection pulsewidth value. A map can be viewed as a 3D Map Graph, Map Grid, or Map Slice.

  • Tables - ‘Vector’ objects with a single input axis and an output axis. This allows one value to be produced based on the value of another via a look-up table.

    For example Boost limit outputs the channel Boost Limit, based on an input Engine Speed. Tables can be viewed as a Table Graph or a Table Grid.

  • Options - ‘Scalar’ objects - options represent a single values that can be changed by the user - for example Fuel Cut.

    Options can be displayed in a Option Full List or a Option Selection List.

The values of all these objects collectively defines the calibration.

All the available objects for the ECU that is currently loaded into the workspace are displayed in the Views.

To upload the current calibration to the ECU from the main menu select: ECU | Upload Current Calibration, or click the ‘Upload Current Calibration’ button on the tool bar. This will connect to the currently connected ECU and upload the calibration into it.

For more please read the Calibrations section.

Channels / Measurements

Channels can also be viewed in GWv4. Channels are updated in real-time by the ECU and are not stored within the ECU’s configuration. So channels are not part of the Calibration; rather they are readings / measurements of current values - for example Engine Speed.

Channels can be viewed as:

Note

In prior versions of GWv4, Channels were known as Parameters. Since this has overlap with the semantically different Simulink.Parameter, the naming was changed to Channels. Scalar (single-valued) Simulink.Signal values map onto Channel, as do scalar A2L MEASUREMENTs. Channels are always scalar values. However, it is possible to have Table or Map objects that are not stored in the Calibration and are essentially Measurements.

Setting up the Workspace

GWv4 has a very flexible workspace with many objects for displaying and edit your calibration in the best possible way. See the Workspace and Tabs sections for more details.

Connecting to an ECU

  1. Check that your communications lead is properly connected.
  2. Check your Connection Settings.
  3. Check that your ECU has power.
  4. Click ‘Connect’, or Press Shift+F7. When you connect, the calibration in the ECU will be downloaded and displayed.

If you are having problems connecting, refer to Connection Troubleshooting.

Storing ECU Changes Permanently

Depending upon the ECU type / configuration, changes made to the Calibration whilst ‘online’ to the ECU may not be ‘saved’ in the ECU immediately.

Either use Auto Store to turn on automatic storage, or manually store changes using Store Changes in ECUCtrl+K.

See Storing Calibration Changes Permanently for more details and a discussion on why this is optional.

Licensing the Software

GWv4 License

GWv4 requires either a software license or a hardware dongle to be installed to edit GEMS calibrations and connect to GEMS ECUs (apart from the demo calibration).

To purchase a license key for GWv4, please contact GEMS.

Once your order has been placed and payment cleared, you will receive an email with your license key from licencing@gems.co.uk.

XCP License

In order to use the software to connect to XCP / A2L (ASAM Standard) based ECUs, a separate license is required. In order to use XCP features you do not also need a license to support GEMS ECUs.

If you would like to purchase an XCP license, please contact GEMS.

License Activation

Online Activation

  • Start GWv4.
  • Select License....
  • In the License dialog that appears, click ‘License Activation’.
  • Copy the license key provided in the email and paste into the box.
  • Click ‘Activate’.
Tip

You can use the same license key twice so that you can have a copy of GWv4 activated on both your laptop and your desktop PC at the same time.

Offline Activation

If you are having issues connecting to our license server (it may be blocked by some network firewall software), click ‘Activate Offline’. Your machine key will be shown. Contact GEMS with your machine key and your license key - we’ll be able to provide you with a unlock code. Enter the code in the Unlock Code box and click ‘Activate’.

Moving a License

Once activated your license is locked to the computer it was first activated on. If you wish to move your license, you must first de-activate your license on your current computer before activating it on a new one.

To do this select the Deactivate License from the Licenses window. On confirmation, the license will be removed from the current computer. If your computer has been damaged, lost or stolen, please contact our support team via tech.support@gems.co.uk with your license key.

Subsections of Licensing the Software

USB Dongle

Note

The preferred option for licensing GWv4 is via software licensing. This section is for reference for customers who are still using USB dongles.

USB Dongle

The USB dongle is a copy protection device. Certain software features are not available if the dongle is not present or if they have not been enabled in the dongle.

Dongles are available as a USB dongle which plugs into the USB port.

Installation

Some dongles require additional drivers to be installed for it to work with your operating system. These drivers are not installed automatically when installing GWv4.

Hardware Dongle drivers can be downloaded separately from gems.co.uk/downloads/drivers.

To install the dongle drivers, run the dongle installation program - the installer will walk you through the process.

Installation

Downloads

  • Visit gems.co.uk/downloads/software.
  • Click the ‘Download’ button for the GWv4 product.
  • When prompted by your internet browser, save the installer file to a easy to find location.
  • When downloading is complete, locate the downloaded file and run the installer. Follow the prompts given by the installer.
Note

The installer does not include drivers for USB products or the GEMS dongle. These files and must be downloaded separately if required from gems.co.uk/downloads/drivers.

Checking for Updates

GWv4 will check for updates when started. If a new version is available, a notification will be displayed with a link to download and install the update from within GWv4 itself.

Updates can be checked for manually from Help | Check for Update.

Note

Some anti-virus / security products will block connections to the internet from GWv4. You will need to ensure that GWv4 is allowed through your firewall.

Warning

If using Windows 7, checking for updates may fail with WinHTTP error code 12175. If this occurs, you’ll need to enable TLS 1.2 support. See the Easy Fix section at microsoft.com.

Beta Channel

If you would like to use the beta version of GWv4, you can select the Help | Update: Use Beta Channel option. Beta versions of software are released much more frequently but may not be stable. Using the beta version helps us to detect unexpected problems with the software before making it a public release.

GWv4 Revision History


================================================================================
Version 4.05.34 - 08 October 2025
================================================================================

ComboBoxView: fixed handling of 'no_match_text' property, which was not always 
    showing the text when the current index was -1.

Fixed possible crash in Log Mapping function (out of bounds raw value cache access).
Fixed issue with hiding of caret during screenshot capture via COM interface.
Fixed fill algorithm screenshots in manual.

================================================================================
Version 4.05.33 - 02 October 2025
================================================================================

GridView: 'columns' property name fixed in scripting docs.
GridView: When objects are used in grid cells that are volatile (e.g. channels),
    they will now automatically register for updates and invalidate the grid.
GridView: Update on timer to avoid performance issues if updating very frequently.

================================================================================
Version 4.05.32 - 04 September 2025
================================================================================

Fix CAN comms with CAN-FD capable PCAN devices - writes were not working since 4.05.29.

================================================================================
Version 4.05.31 - 19 August 2025
================================================================================

Fixed crash if NumberEditView has a tooltip since changing to use dynamic editor type in 4.05.29.
CAN DBC files are now interpreted in Latin1 encoding rather than UTF-8.  For example, fixes display of exported degrees symbol in other applications.
Fixed scripting reference for CANRxChannel - property "messageCount" was incorrectly documented as "channelCount".

================================================================================
Version 4.05.30 - 11 August 2025
================================================================================

GridView: Added "selected" property to allow scripting to determine if the grid is selected.
GridView: Added "selection" event for notification of grid selection change.

T#4416: Gear Position calibration wizard: Added enabling functionality:
    Reworked CAN ID handling for CAN Telemetry (Rx + Tx) to move code dependency (help enable scripting).
    CAN Rx telemetry dialog now indicates if a message is being used by the calibration - i.e. if any options references data from the message.
        The tooltip on the message will show the list of options that reference the message.
    Added scripting interface for CAN Rx telemetry setup (ecu.canRxSetup property).

B#6110: Fixed: XCP calibration appears empty after connect.  
   Transfer of calibration data to PC now stores at the untranslated address when ADDRESS_MAPPING is used to fix regression in 4.05.28.

T#5966: Application may now include a "docs" subfolder in the installation folder that contains additional documentation files.
    The application will look for a "docs" folder in the installation folder and include it in the Help|Documents menu.
    This allows custom documentation to be included with the application, e.g. for branded builds.

================================================================================
Version 4.05.29 - 29 July 2025
================================================================================

Branded build: Enable CAN telemetry setup from the main menu.
Scripting: Added CAN port handling via app.listCANPorts() and app.openCANPort().
Added CANFrame class to scripting.
Added getComcodeChannel to Option script class.
Avoid creating JS context twice when opening Wizards.
Avoid creating JS context on checkable controls that do not have a script set 
  on them.
Vector CAN adaptor: Fixed conversion of CAN-FD DLC to message length.
PCAN: Tentative CAN-FD Rx support for FD-capable PCAN devices.
Scripting: Added exception handlers for property getters/setters to translate exceptions to JS instead of potentially aborting the application.
Number Edit: Added editor type property (CAN ID / Text / Integer / Unsigned / Floating Point).
Number Edit: Additional properties: Hex option for unsigned, font size, alignment, units label.

================================================================================
Version 4.05.28 - 07 July 2025
================================================================================

Tentative fix for crash when adding items from current tab to aspect file.
B#5636: Fixed issue where loosely matched A2L file could be selected in 
    preference to a strong match and additionally no consideration of 
    installation date, leading to incorrect values being shown.
    When searching for XCP ECU installation, there may be multiple matches.  
    matches are now considered in most recent date order.  If there is any
    with an exact EPK match then they are preferred (in date order).
Output original / installed ECU path to ECU status for user review.
Added additional checks to avoid possible crashes in XCP comms layer if 
   connection is closed during a callback.
B#5885: GridView: do not show drop-down editor for checkbox cells.
Added 'Save Geometry' checkbox to wizard configuration dialog.
B#5886: GridView: Fixed store/restore of column widths.  Widths are now stored 
    against column tag, if available.  column tags may now be any value that is 
    convertible to JSON rather than only integer values.
Display line numbers in script editor.
B#5887: Fix engine speed wizard (supplemental file).
GridView: close editor if return pressed.
XCP: close TCP connection if it appears to have an irrecoverable failure.
XCP: Take into account segment ADDRESS_MAPPING when transferring calibration to PC.
XCP: Decode UDP/TCP messages in comms monitor correctly by taking into account 
    the message header.
XCP over IP: take into account FILL bytes + partial message transfers.
A2L Loader: issue warnings about calibration regions that do now have PrgType 
    DATA or CALBRATION_VARIABLES as they are disabled and objects within those
    segments may not be editable in the application.  This policy may need 
    reviewing.
Added scripting class binding for AspectSelector View.  Added "change", 
    "beforeApply" and "afterApply" events.
Scripting: Added rescale function to ECU objects (e.g. options, tables, maps).
Fix issue with automated scripting docs for 'view'/'multisiteview' classes 
    leading to duplication of 'view' in the docs.
Fixed typo in action name for liveTrimControl (was liveTrimContol).
Added view property documentation to scripting docs (reference of properties 
    normally editable via the properties editor).
Include script ID of properties in tooltips on properties editor.  
    Tooltips are now lazy evaluated to improve performance when creating 
    property form.
B#5600: Fixed: Initially displaying tab was not applying layout constraints 
    properly in some cases but showing it again updates it.
B#5831: Fixed: It was possible to be asked to save calibration during firmware 
    update following clear step, which would save a blank calibration file.
B#6001: Fixed an issue relating to file extension handling in log download
    dialog that could lead to the downloaded log file becoming un-saveable.

================================================================================
Version 4.05.27 - 21 May 2025
================================================================================

#5039: Injection Angles / Firing Order wizard
    Scripting: IncludeWizardScript function now prevents multiple inclusion of the same script.
    Added 'Grid View' control for scriptable grid views (unlike ECU table grid views).
Added 'Show Label' property to Button view.
Added 'customize' button properties to ComboBox view (as-per Aspect Selector).
Fixed background colour on Engine History Log dialog.
Performance improvement by avoiding CPU core locking on threads requiring high precision timestamps.
Avoid XCP ECU installation flow running a second time if cancelled on the first attempt.
XCP over TCP: Improved handling of remote socket closure and connection failure.
Fixed excessive CPU usage for XCP over Ethernet connections (both TCP and UDP).

================================================================================
Version 4.05.26 - 22 April 2025
================================================================================

T#5797: Branded build: Replace gwpkg file extension.
Aspect selector: group calibration changes into a single undo command.
Fixed update of Aspect selector pattern matchers following update to requirements list.
Tentative fix for issue resulting in change of colour of drop arrow on toolbar buttons.
Fix crash when application closed after being launched with /license-manager option.
AEMcal: Fixed display of installed licenses with /license-manager option.
Prevent application abort if an exception occurs when applying Aspect Selector patterns.
Added visible line number to script error messages.
Auto-filename when saving wizards to file.
T#5725: EDX update reassigned Ign to Coil, depending on ECU version.
    Added version, version_raw, version_extension functions to 'formula' evaluator for use in EDX files for version-specific logic.
    Added 'exists' keyword to 'formula' evaluator - e.g. 'exists option("Coil 1")'
    Added top-level "conditional" section to EDX, with version / version_raw / version_extension / "epk" / "condition" expressions,
        with epk being treated as a version expression.
    Version expressions have their own sub-language.  e.g. ">=02?01 & <02?08" means version 02x01 to 02x07.
         version expressions support grouping with parenthesis, logical operators & (and), | (or).  Comparison operators are: <, <=, >, >=, =, !.
         numeric / non-numeric sequences may be ignored using '?' and the tail may be ignored using '*' (e.g. 1.2*).

Fixed: if undo history window was restored from workspace, and the menu command was used to open it again, it would be shown twice.
Fixed possible crash in layout hierarchy if switching calibrations and wizard editor is open.
Fixed engine speed calculation table in help file & modified information about the calculation.
Fixed up/down buttons on scope view configuration dialog.
Fixed possible issue in v8 scripting engine exception handler that could lead to a crash.

Updated release process to now put build artifacts into sharepoint document libraries.

================================================================================
Version 4.05.25 - 20 March 2025
================================================================================

B#5736: Fixed License activation request failure.
    Updated to use windows SChannel for license server https requests.

================================================================================
Version 4.05.24 - 10 March 2025
================================================================================

Updated compiler to 17.13.2.
Updated CRT to 14.42.34433.
B#5675: Fixed pinout in EDX file for EM80 - left hand connector had the rows inverted on the diagram.
Asepct files: use numerical values for e.g. A2D or output pin selections in aspect files.
Aspect Selector: Improved handling of requirements; ask for extra values when new requirements are added & modify aspects to match the list of requirements.
Aspect Selector: Added 'flexible' requirements for e.g. options that get set by the aspect but may vary and not considered for aspect matching.
Aspect Selector: Added 'No Match Text' option to display some default text when no aspects match the current requirements (e.g. 'User Defined').
Fixed bug leading to loss of items stored in Aspect selector view & possibly the whole layout (general XML serializer issue).
Scripting: Added IncludeWizardScript function so that wizard scripts can include scripts from other wizards as a simple way to share common code.
ComCode options: show 'Not Set' instead of 'Empty'.
Fixed crash adding signal generator view.
Added many new icons from Data Analysis and Dash Design software.
Fixed position of drop hint when dragging items in wizard manager dialog and the list is scrolled.
Pinout view: diagram can now be clicked to select the corresponding pin in the list.
T#4015: Search feature (initial basic version).

================================================================================
Version 4.05.23 - 13/02/2025
================================================================================

T#5621: Add support for Vector CAN interfaces (alpha - needs testing).
Fixed crash setting layout property on view within a group view.
Start page: do not add date to tooltips for recent files as this can be very slow on disconnected network drive.

================================================================================
Version 4.05.22 - 26/01/2025
================================================================================

T#5438: Calibration Compare: Display/edit values for items in the 'not in current ecu' / only in current ecu grids.
Installed EDX: Fixed Lambda Heater PWM options which should be a PWM channel selector instead of an output pin selector.

B#5427: Investigated multiplier sign for Oxygen Feedback log map.
Added new default settings for corrections in log maps 'Oxygen Feedback' and those beginning 'Lambda'.
Layout serialization now uses a different name for corrections since v4.05.21, meanining old corrections will be lost.
Log map corrections settings defaults may be specified in GIN files using the following attributes:
    - "correction_mul"
    - "error_as_percentage"
    - "enable_error_as_percentage"
    - "adjust_by_percentage"
Log Map may specify a physical map for the target value using the "target_map" attribute.  The target map axes must match the log map.

Pinout View: Store column widths in layout file.
Fixed theming on some combobox popup lists.
CAN Telemetry and CAN Rx setup views can now be added to layouts.
Added weather icons.
Added DisplayName field to ECU identity.
B#5413: Fixed ungrouping of group deletes the contents.
   Grouping of views now retains original title bar / border settings and size; new group views are not set to stretch mode by default to prevent unusal results.
When opening layout hierarchy view, select the originally focused window in the tree.
Fixed crash viewing properties of group view from layout hierarchy view.
B#5433: Fixed issue where properties window would show its own properties if attempting to scroll the view, in case where layout hierarchy view was open and then clicking title bar of non-selected view in main layout area.
B#5431: Fixed issue where switching tab could clear log map grid.
T#5430: Set Defaults button in template for Apply Corrections Dialog.
T#5522: Rain Light Wizard (available on request).
Added documentation on Rain Light + Limp mode calibration options in manual.
B#5545: Fixed crash when trying to edit scripts on some computers (if VS code does not happen to be installed).
Clear Selection -> Deselect from layout context menu to make it clear that the windows will not be deleted.
T#5424: Display more information in 'Install ECU Definition' dialog when connecting to XCP ECUs to include all GET_ID values received during the ECU identification process.

================================================================================
Version 4.05.21 - 13 December 2024
================================================================================

B#5425: De-optimized some functions that appeared to be giving incorrect results when compiled with optimizations enabled (VS2022).
    Fixes release-build only bug where font size fitting on grids would change for table grid "Accel Coolant Extra" when resizing or dragging the window.
Grid - setting default font-size should re-layout the grid.

Lambda mapping:
Share correction settings between views of the same object.
Fixed issue where site interpolation could generate excessive (extrapolated) corrections on partially covered sites.
Added option to convert target error to a percentage.
Changes to correction settings are now reflected in the log map view (e.g. when showing CorrectionPercent).
Correction calculator apply now uses an undo macro to group the changes into a single undo command.

================================================================================
Version 4.05.20 - 12 December 2024
================================================================================

B#5327: Fixed issue where connecting to Simulink based ECUs (e,g, EM80_M) may load base ECU definition file instead of the Simulink build specific one.
B#5329: Fixed lock-up if loading malformed A2L that repeats already created named blocks (e.g. READ_ONLY or FORMAT).

B#5360: Some ECU versions have switch selector but only allow Always ON / Always OFF selection.
    Allow 'Switches group N' in addition to 'Switches#N' for generating switch pin metadata.  All 127 switches are now generated regardless of this association.
Added internal pin functions in e.g. switch selector.

B#5358: Fixed blank first cell in grid axis for tables/maps with a fixed physical starting value.
B#5371: Fixed regression loading calibration files from several versions back, due to changes to support loading memory segment data by address range.

Fixed loading of nested top-level tabs when using horizontal tab control (e.g. GWv4).
Fixed possible infinite loop in jsonx parser.
Fixed ECU simulator not able to create internal log file for v01 log format.

T#5415: Enable addition of Wizards to tabs.

T#3228: Enable/Disable options etc based upon 'function' hierarchy / enable_if expressions in EDX files.
Added "includes" section to EDX files to include other EDX files, using paths relative to the containing EDX file.  Inclusion occurs when the "includes" section is encountered in the EDX file, parsing the file top-to-bottom.
T#5364: Enable / Disable tabs based upon an expression (extended A2L formula).
    Note that A2L formulas are not the same as general scripting with Javascript,
    but are much lighter-weight for simple expressions like these.
    A2L syntax formula editor with syntax highlighting, error list, call tips etc.
    Fixed false positives in A2L formula parsing of invalid numeric literals.
    Fixed some potential crashes when executing invalid A2L formulas.

T#5362: Set password: Add warning message to make sure you back up the calibration in case you lose it you cannot recover the password.
    Reworked password dialog.

Changed decimal places calculation to track the multiplier precision if it has a limited number of decimals.  Fixes e.g. "Log Size" on Lancer+9, which should be displayed in 0.25 MB increments.

T#5363: Rework map / table grids.
   Improved preferred size calculation.
   Axis font + contents font are now the same.
   Resizing performace is improved.
   Memory usage for double-buffering is reduced.
   Grids no longer show traditional scrollbars since they can adversly affect the layout & require changes to preferred size when shown / hidden.
   Layout style for grids is now set to disable grow/shrink when added to sizers, by default.  
   This means that grids in a vertical layout will now occupy their optimal size for the default font size.
Layouts: Take into account border / caption / tab strip when laying out views in sizers.
Work Page now shows scrollbar if (e.g.) a VBox sizer has items that can't shrink smaller than their preferred size and the contents of the sizer do not fit in the view.

================================================================================
Version 4.05.19 - 04 November 2024
================================================================================

B#5218: Updated platform.iss to use latest VC Runtime DLLs (prevents crash since updating compiler).
Branded build: Allow opening of cal files that have been edited with GWv4.
B#5222: Fixed crash when calibration file pointer changed in some cases.
When there are comms errors, do not 'grey out' channel measurement views; Only do so if it appears that the ECU went off-line to avoid flickering.
GEMSCOM protocol: Comms errors are now latched for a timeout period to avoid flickering of the connection status in the status bar.
B#5219: Fixed: GWv4 reports "cannot open ''" when programming EM80 CoPro firmware.
Added extension to A2L formulas to support C-style ternary (conditional) operator (a? b : c).
Fixed a grammar issue with handling of parenthesis in A2L formulas.
Branded build: build separate help for local disk / online (clear URLs) and include in release bundle.
Branded build: build PDF version of help and include in release bundle.
When setting/clearing security password, update cal to reflect the change.
Fixed 'clear secure calibration' in simulator.
Fixed issue with small text on splash screen on high-dpi for some builds.
T#5187: Pinout View should show pull-up / pull-down and take into account software selectable pullups:
    EDX: Allow an expression to be specified for pin / A2D pullup values.  A negative pullup value now indicates pull-down.
        Pin A2D is copied over A2D pullup, if provided.  If not then the pin is set to the corresponding A2D configuration.
    Updated EM80.gemsedx to include software selectable pullup handling in pinout view.
    Added PU/PD to pin selector grids.
B#5239: Fixed: If baud rate switched for Log Download, then revert it upon cancellation / failure.
Fixed log erase following log download.
Made XML parser slightly less strict with attribute values (allows unquoted values / tag characters in attribute values).

================================================================================
Version 4.05.18 - 18 October 2024
================================================================================

Fixed crash opening 'additional port settings' dialog.
Fixed poor performance when adding an item from view explorer representing a large number of options. 
Improved performance of reading A2L files that are Latin1 encoded (missing UTF-8 BOM).  For fastest load times, ensure that A2L files are UTF-8 encoded with a Byte Order Mark as-per ASAM spec.
Now using a much faster algorithm for looking up items in the ECU definition file based upon address range.

B#5206: Fixed issue where initial tab / work page could be blank until a different tab is selected.
B#5104: Fixed sorted lists in numerous places due to bug in VS2022 compiler for 32-bit release builds affecting std::sort on std::deque.
B#3924: Fixed issue with baud rate being reset to default when changing port settings.  Also enable setting custom rate on 'basic' port settings page with editable combobox on applicable builds.
B#5181: Adjusted decimal places calculation for items with scalars that are exact powers of 10.
B#5201: Disallow drag of tabbed views or option/channel selections to other views when layout is locked.
B#5202: Allow any version calibration to be selected for programming if calibration convert is available.

T#5204: Branded build: Integrate tuning guide from GWv4 manual into generated help.
T#5207: For XCP ECUs, added slow polling of options that are not within a MEMORY_SEGMENT considered as 'calibration file data'.
When polling XCP values, if an irrecoverable error occurs, polling of that address range will now be stopped.
For non-measurement tables / maps that are not in the calibration file, poll them at a slow rate instead of the default rate.

T#5156: Internal: Moved SDB (DBC signal database) library to package manager.

================================================================================
Version 4.05.17 - 27 September 2024
================================================================================

T#5040: When automapping wizard is hidden and associated log maps are not shown by any other views, then pause log map capture.
Changed show/hide behaviour of items in vertical tabs view to avoid loading of hidden items.  Improves startup time with complex layouts.
Sort wizard IDs in button action selector dialog.
Show scrollbars when using sizer-based layouts and the minimum size constraint is violated.
T#5076: Added 'configure' button to log playback view as when floated it was not possible to configure the view.
B#5077: Branded build: Fixed incorrect file exension for downloaded internal log files.
Fixed possible long delay + crash if loading log file into log playback before prior log had loaded fully.
T#5078: Handle drag/drop of log files to open in Log Playback.
Added new switch selector for switch number options, rather than specifying switches as integer values.  Where possible switch numbers are given a description based upon aliases and in future from additional metadata.  GIN files can specify "swt_in" attribute to indicate that the option is a switch number.
Added selectors for PWMs, A2Ds and output pins in a similar way to switches.
Branded build: Include 'license' menu item in non-admin mode.
Branded build: Fixed license error at startup due to missing configuration in installer.
T#5143: Implement missing steps in serial number programming procedure.
Switched to new XML archiver for layout files etc for significant loading performance improvement (4x in some cases).
Fixed issue that was preventing tab page unloading from working.
Import SYSTEM_CONSTANT list from A2L file into GIN structure.
Fixed build of COM automation interface documentation.
Fixed XML structure for serialization of 'invalid' colour on gradients.
Branded build: show ECU calibration password protection menus.
Branded build: added in Live Trim Control menu.
Renamed 'Virtual Pot Box' to 'Live Trim Control'.
Added "ECU Definition Extension" file support, to enhance ECU definition file functionality (e.g. adds connector pinout).  Extension files may be added to Ecudef files (packaged with GIN or ECUDEF) and additionally imported into the calibration file.
T#5125: Pinout View: Display ECU connector pinout information, including functional connections & conflicts.  Currently only editable via ECU Definition Extension files.
Increased scroll rate within work pages (tabs) since each scroll event requires a full redraw of the page which can be slow for busy layouts.
Fixed cancel button on Validate Log List dialog during log download.
T#5034: Allow log download to continue even if some blocks fail at high baud rate.
T#5151: Branded build allow custom baudrates to be set on serial ports.
Log download now offers log erase at the end of the download process.
Log download: if baud rate switch is available, software now offers baudrate switch manually at start of download.
T#5081: If an ECU Definition Extension file is loaded, Options that edit PWMs, A2Ds, Switches and Output Pins will now offer an enhanced selector control.
Fixed regression: crash opening calibration file that contains empty regions.
B#5089: AEMcal not always copying option values in compare view.  This was due to some enumeration-based items resulting in a floating point number for an underlying integer raw value.  Numbers from verbal COMPU_METHOD are now passed though the option object so that they are cast to the appropriate underlying type.

================================================================================
Version 4.05.16 - 19 July 2024
================================================================================

T#5036: Automapping wizard: Apply Corrections should also reset selected sites (option added to the Apply Corrections dialog).
Resolved some issues with some screenshots generated for the manual.
Added additional crash protection to menu/toolbar action handling system, for tentative crash report fix.
COM interface now supports GetProperty and SetProperty for docked window types.
COM interface - hide caret on windows when taking screenshots.
Installer now deletes software OpenGL MESA dlls if they were previously installed.
Build is not longer compiling in any references to OpenGL.
Ethernet ECU simulator: Full reset of ethernet layer on restart to avoid stale 
   state (e.g. ECU identity file).
Fixed crash if staring PC logging but there are missing channels in the PC logging list.
Added 'Reset Cal States to Unchanged' action.
Fixed issue with property editor using inherited/computed value would disable the editor entirely rather than just greying the value.
Log download: check if a file with same name as target directory exists and report error if so.
Added basic internal log creation to ECU simulator.
Fixed calibration copy routine from simulator calibration.
Improvements to manual.  Adding 'Tuning/Setup Guide' section with information more relevant to configuring ECUs over simply providing a user-interface feature reference.

================================================================================
Version 4.05.15 - 24 June 2024
================================================================================

B#4803: Fixed: After installing new A2L file for a new ECU version, the connecting to ECU dialog stays on screen showing ECU definitions error.
T#4833: Replaced 3D map rendering with a new software implementation that does not use OpenGL or Mesa3D.
   Resolves some issues where some systems crash when using OpenGL and some crash with Mesa3D.
   Mesa3D required an old version of the visual studio runtime (2013) to be installed so this unwanted dependency is now removed.
Changed the way the mouse rotates the 3D view.
Updated manual to use new theme.  Improved search feature + themeable apperance.
Fixed crash relating to signal generator view.
T#5027: A2L: Added support for FIX_AXIS_PAR_LIST.
T#2730: Moved PCAN depdendency to package manager.
Support GEMS IF_DATA extensions for A2L files (hex value display).
Fixed issue with limits / extended limits validation; Limits should be checked in physical values rather than internal (raw) values.
Converting to raw values for bit values will now take into account mask.  Related to limits validation issue.
Sequencer: Fixed conversion of hexadecimal property value in some cases (e.g. for CAN Command CAN IDs).
Sequencer: Fixed CAN Rx only CAN commands. Added CAN Rx message type property.
Sequencer: Added options to CAN commands for slicing the result + converting to string + appending to result variable.
GCP: Fixed issue where comms layer may issue normal commands during block transfer operations.
GCP: Avoid issuing channel reads when negotiating high-baud rate for log download (which would result in baud rate reversions).
Log download: If aborted via cancel button, offer to process any data that was already downloaded.
Added additional protocol type to comms monitor for block transfer operations to avoid incorrect decode.
Fixed auto-range calculation for gradient colour on maps / tables.

Updated to C++20 standard.
Updated to cryptopp 8.9.0.

================================================================================
Version 4.05.14 - 05 April 2024
================================================================================

T#4183: Reflash Recovery Mode improvements - detect bootloader connection and added additional guidance for users.
B#4825: Fixed issue with XCP channel updates not occurring in some cases.
Added button to Sensor Calibration View to pop up table grid/graph for raw calibration settings.
Fixed issue where option editor views were not being updated following a calibration download in some cases.
Sensor Calibration View: Added input / output channel readouts.
Sensor Calibration View: Added pullup label when showing resistance option.
Sensor Calibration View: Fixed some issues relating to scaling and range optimization when applying sensor calibration.
Number view: only allow a value height % to prevent font height fitting if a max height is set.  Now defaults to 100%.
Table Graph: Update when unit selections changed.
Scripting: For icon properties, convert to string when retrieving value.
Scripting: Added app.getDisplayUnits function to convert script unit IDs to units suitable for display on the UI.
Added 'air' icon.
Fixed crash loading layout if wizard manager defined sub-folders.
Fixed issue updating Y-axis of table graph when changing unit preferences.
Avoid occasionally marginally cut off units label on Option Editor view.
Fixed bug in saving selected object for some views (e.g. Dial).  Fixes loss of selected object in e.g. VVC Target wizard VVC mod.
Branded build - added missing measurement rate button from toolbar.

Changes to wizards (distributed separately):
Pedal calibration wizard: Show error if pedal raw is not valid when clicking 'Set Minimum'.
Oil Pressure wizard: Added unit preference selector.
Oil Pressure wizard: Added filtering hint (typically 5%).
Oil Pressure wizard: Added button to clear limp table.
MAP sensor wizard. Includes presets.
MAF sensor wizard.
Load Selector Wizard.
Timing wizard - Timing Diagnostics button.  Fixed update of Sync Strategy following selection of Crank Wheel.
    Display speed multiplier hint as a warning if Speed mul is zero.
Timing Diagnostics Wizard.

================================================================================
Version 4.05.13 - 13 March 2024
================================================================================

Updated to emerald 5.5.7.  Fixes critical issue that could lead to data log viewer not showing some channels correctly.
Branded Build: Updated raptorflash to 1.3.7.
Raptor reflash XCP request set to be fully exclusive of any other comms whilst in progress.
Raptor reflash: Ensure message queue is fully drained before completing the request.
Comms monitor: Added ID field for CAN messages and extended gcap to support packet metadata.
B#4762: Display units on map/table axes correctly instead of showing the unit identifier, which in some cases does not match the display text for the unit.

================================================================================
Version 4.05.12 - 06 March 2024
================================================================================

Branded Build: Updated raptorflash to 1.3.6 and include missing dependencies in installer.
Fixed polling rate for XCP measurements when channel rate is set to '0' (fastest) in channel lists (would otherwise read poll ASAP).
Fixed firmware recovery mode for GCM111.  For future ECUs, the ecu identity may now include RaptorRecoveryToolID and RaptorRecoveryEcuID.
When running custom protocols during firmware update, do not display messages as XCP in comms monitor.
Tentative fix for crash report relating to notification popups, possibly following main window being closed.
Fixed benign GetWindowRect failed error messages in application log.
Tentative fix for crash report from 4.05.11 during application shutdown.
Fixed handling of LOGTBL for gemscom channel reads.
When partial reads occur on serial ports, output what was actually read in comms monitor.

================================================================================
Version 4.05.11 - 04 March 2024
================================================================================

T#1590: XCP Measurements: honour selected rates in e.g. Channel List.
    Changed the way that GEMSCOM measurement rates work to honour global rate settings.
    Added global fastest measurement rate setting.
B#4790: Fixed XCP PROGRAM_CLEAR command: 2 reserved bytes before 'range' instead of 1.
B#4791: Fixed: XCP: Do not service measurement listeners while running PGM commands.
B#4792: Fixed disconnect of XCP connection in some cases leaving it impossible to reconnect.
B#4793: Display progress information during XCP firmware update (PGM).
Fixed lock up when hovering comms monitor view when running gemscom protocol.
XCP Firmware update: do not offer 'check engine stopped' or 'clear calibration' options.
XCP PGM: Use correct timeout values for PGM commands.
XCP PGM: Warn about files that are not matched to PGM sectors.
XCP PGM: Honour MIN_ST for block xfers and avoid waiting on RX.
Added some missing error texts for comms errors.

================================================================================
Version 4.05.10 - 23 February 2024
================================================================================

If trying to clear Engine History Log from ECU and an EHL file could not be 
    loaded for some reason, the the option to select an EHL version is now offered.
Fixed error unpacking A2L from ECUDEF file when not encrypted.
Fixed possible crash when shutting down XCP connection.
Made EPK Verification Failure dialog non-modal to avoid problems if EPK verification error occurs mutiple times.
Improved UI flow when connecting to unidentifiable ECUs.  There is still some room for improvement but UI is less confusing now.
Changed ECU Identity matching algorithm slighly for XCP based ECUs to allow match on EPK alone.
Comms monitor: Added basic protocol decoding for XCP messages in tool tips.
Comms monitor: Added additional columns + resizeable columns via header control.
A2L: handle NO_PHYSICAL_QTY correctly.
A2L: Handle REF_UNIT in COMPU_METHOD.  If the UNIT LongIdentifier looks like a gems unit ID and that has a display unit that is the same as specified in the UNIT, then the full unit ID is used to select the item unit.

================================================================================
Version 4.05.09 - 20 February 2024
================================================================================

Added module load information to application log.
RaptorFlash 1.3.5 adds information on loaded assemblies following reflash process.

================================================================================
Version 4.05.08 - 12 February 2024
================================================================================

B4757: Fixed file extensions and file dialog filters for ECU types that do not have a version number, which can occur for some A2L (XCP) based ECU definitions.
T4551: Updated to RaptorFlash 1.2.1. Added method of specifying Tool/ECU ID in ecudef file for use when re-flashing to add support for wider range of ECU types.
Fixed display of Identifier / Long Identifier / Description / Display Identifier in Channel list grids for A2L based ECU definitions.
When scanning for ECU definition files, if an exception occurred when scanning a file, the search will now continue rather than sliently aborting.
Fixed issue with some views not displaying width/height properties in the property grid.
Added X & Y properties to views.
Update selection in layout hierarchy view when selecting views in the main window.
Fixed layout issue when a horizontal/vertical sizer is added to a workpage and the workpage has stretchable layout enabled.
Fixed update of layout hierarchy view when adding/removing views from sidebars (if enabled in build).
Multiple selection of views on main window now updates properties view with multi-properties.
Tentative fix for crash relating to map grid views from crash report.
Added some additional memory safety checks w.r.t. property system for view properties.
Honour orthogonal max size in sizer layouts.
Added "AFR (Lambda)" unit so that ECUs that have AFR units specified in units of "AFR" will be interpreted as Lambda instead of requiring setting of base units.
T4758: Implement XCP_STORE_CAL_REQ command.

================================================================================
Version 4.05.07 - 02 February 2024
================================================================================

T4698: File handler for XCP PGM files (*.finx).
XCP Flashing (PGM):
T4700: Implement GET_PGM_PROCESSOR_INFO command.
T4701: Implement GET_SECTOR_INFO command.
T4702: Implement PROGRAM_PREPARE command.
T4703: Implement PROGRAM_START command.
T4704: Implement PROGRAM_CLEAR command.
T4705: Implement PROGRAM_FORMAT command.
T4706: Implement PROGRAM/PROGRAM_NEXT/PROGRAM_MAX commands.
T4707: Implement PROGRAM_RESET command.
T4708: Implement XCP PGM Request handler.
T4709: Implement PROGRAM_VERIFY command.

================================================================================
Version 4.05.06 - 11 January 2024
================================================================================

T4650: Update Descriptions View when selecting items in calibration compare.
T4424: Added Log playback zoom screenshots.
T4426: Added table graph selection via drag screenshot.
T4425: Replaced legacy screenshots in manipulating views documentation.
T4462: Added Lambda feedback learning documentation.
#4415: Sensor wizard development (branded build).
Wizard list: Display icons.
Wizard list: Sort by name.
Added temperature + fuel-temperature icons.
Added button to table grid title bar to pop up graph view in a floating window.
ECU detected notification: Added option to set the ECU as the selected port instead of connecting to it.
Fixed crash if a map overlay is used that does not match the size of the map it is overlaid on.
Object selector dialog: Remember prior search text.
Fixed crash when aborting log download in some cases.
Added properties for centering tacho gauge in center of view.
Added divider line property for Label view.
Added properties to number view to control value font height.
Added property to number view to show units on label instead of value.
Now using property form instead of grid for view properties.
View hierarchy will now show merged/multi-properties for selected views.
Download internal log: Ensure target folder exists before moving file + added additional error information if move fails.
T4671: Improvements to automated help generator (screenshot approval process).
T3149: Generate PDF from new help system.
T4253: Changed warning about legacy copro to 'normal' severity.

================================================================================
Version 4.05.05 - 22 November 2023
================================================================================

Added additional crash defenses - tentative fix for crash report rendering map graph.
#4599: Changed auto decimal places calculation for channels.  Options still show enough decimal places to capture the full precision of underlying raw value.
Improved auto decimal places calculation on tacho labels.
Fixed issue with potbox / midi controllers could result in value wrapping if adjusted beyond the raw limits.

================================================================================
Version 4.05.04 - 16 November 2023
================================================================================

T4585: Import log data into log maps.
T4584: Alternate view modes for log maps to show e.g. correction values.
B4520: Layouts with many tabs could run into GDI resource limits if switching through all the tabs.  
    Implemented un-loading of least recently used tabs to avoid this.  
    This new behaviour can be switched off in the preferences.
T4422: Added Signal Generator screenshot to manual.
Branded build: Enable calibration clear action.
Branded build: Enable menu in user mode.
Calibration clear: Ask user to save current calibration if it has been modified + reset filename.
Fixed colourization of map graph view when an overlay map is selected.
Added overlays on map/table grid views.
Map grid/graph: Added property to set overlay object (makes overlay scriptable).
Fixed crash if preview updated on map while 3D view is open.
Log Maps: do not display site values where capture weight is zero.
Log Maps: Added Corrections dialog for applying log map values as corrections to fuel map.
Log Maps: Added alternate view mode for displaying weight / target / target error / corrections.
Scripting: Added functions to show corrections dialog and reset values on Log Map views.
Peformance enhancement relating to update of calibration map/table views when on-line.
Changed triangulation algorithm for delaunay sparse fill.
Fixed application lock up when resizing map/table grids in some cases.
Fixed another issue leading to flickering tooltips if application is configured to use HTML tooltips.
Updated build to use C++17 standard.

================================================================================
Version 4.05.03 - 23 October 2023
================================================================================

T4330: Improved repeatability of screenshot generation.
Fixed high CPU usage when modifying multiple items at once in wizard editor (e.g. drag/drop of sizers containing multiple child items).
Branded Build: Enabled HTML tooltips.
Fixed issue with flickering HTML tooltips after show time expired.
Wizard editor: reorder page indexes to avoid issues with Layout Hierarchy view if pages were re-ordered in the wizard configuration.
Wizard manager: Import now allows selection of multiple files and options to replace existing items with the same ID.
Wizard manager: Import now does not open wizard editor.
Wizard manager: Enable multi-select for easier drag/drop and delete of multiple items.
Object Selector dialog: Added Search box for filtering the list of items.
Sensor Calibration View: 
    Fixed initial update from calibration if selected preset does not match the calibration.
    Fixed erase of presets.
    Added rename preset function.
    Honour 'Optimize Scaling' property.
    Changed allowable percentage error bo be a percentage of the total input/output range rather than a percentage difference in the value being set from what the table can represent.
    Added 'Reload from Calibration' context menu option + button on the UI.
    Use an undo scope when applying sensor calibration changes.
    Fixed issue with finding matching presets.
    Fixed drawing issue of function table graph for extrapolated values.
    Added option to enable conversion from resistance values to voltage input.
    Added script binding for setting pullup resistor value.
    Added property for defining option that selects the analog input channel for the sensor table.  This is used to automatically set the pullup resistor value, if that information is available from the ECU definition file.

Fixed script class binding for Signal Generator view.
Fixed script binding for EcuObject.getAttribute method.
Scripting: Added ecu.analogPullupValue function.
Fixed hang in Calibration Aspect screenshot generation.
Update to emerald 5.5.3.
Gin file version 3.34 (supports identifier, long_identifier, long_description).

================================================================================
Version 4.05.02 - 16 October 2023
================================================================================

T4330: Improved repeatability of screenshot generation by adding a few deferred calls when clicking buttons.
T4460: Updated log map and auto mapping documentation.
T4401: Improved theme, content, formatting and grammar in help manual.
T4456, T4457, T4458, T4459: Added static and web-based HTML help to GWv4 and included in installer.

Removed delays from Ethernet ECU simulator to speed up help generator.
Added way of specifying requirements for aspect files added to AspectSelector view.
    In general, aspect files should all operate on the exact same set of ECU objects - this provides some checking that this is the case.
Scripting: ComboBox: Fixed crash when emitting change signal if combo box selection is not valid.
Scripting: Fixed crash if an object bound to internal data is incorrectly assigned to and then accessed.
Script editors: Added 'Open in VS Code' option if VS Code is installed.
Script editors: persist window geometry.
Label View: Added Word Wrap property.
Number Gauge View: Fixed storage of Left-align property.
Resolved some issues with minimum font size global setting not being applied in various circumstances.
Changed default font size for option/channel lists.  Default size is now 0 to indicate system default.  
    Old layouts will not load their old setting.
Performance optimizations.
Fixed crash relating to cloning xml archiver state.

================================================================================
Version 4.05.01 - 04 October 2023
================================================================================

B4440: Critical: Fixed bug in XML escaping that could create invalid XML files.
    Affects many things - layout files + ecu installation manifest.
Fixed crash clicking empty item in channel list.
Fixed issue when starting a wizard could occasionally show some controls with a greyed out appearance.
T4437: Do not display lock icon for channel / option lists if layout locked.
Fixed issue in Wizard editor where items that are added that automatically generate a script ID would not be findable by the script until the wizard was saved and reloaded.
Improve appearance of Wizard steps sidebar.
Added scripting class for Option Editor View (provides "change" event + value property).
Fixed spin control for slice number on map slice view.
Fixed: Log Map Controller was not storing some of its settings in layouts.
Dial view: Honour user min/max properties if a channel has not been set on the dial and it does not have a script assigned.
    This enables dial views to be used in wizards where they are externally scripted.
Added scripting functions to get axis channel(s), position value(s) and output value for maps / tables.
Fixed crash saving calibrations with log maps in some cases.
Fixed potential crash when loading new calibration of same ECU type after being on-line to ECU.
Inherit keyboard shortcuts in floating docked windows from main application window so that they work when the floating frame is focused.
Changed wizards to be Frame type windows and inherit shortcuts from main application window.
Prefer input channel name over table name for map/table grid axes.
Scripting: Added window.setRefreshTimer function, for periodic callbacks.
Fixed crash in layout hierarchy due to delayed deletion of Wizard views.
PC based automapping:
    Use fastest polling rate for PC-based automapping channels.
    Avoid having multiple log map handlers for the same log map, generated by target / mod maps.
    Dont run log mapping when log map / controller is not visible.
    Respond to changes to base map axes (e.g. changing from Pedal to Throttle on the Fuel map).
    When uploading current cal to ECU, avoid reloading the layout unless the ECU version has changed.
    When connecting to an ECU, if the loaded calibration data exactly matches the ECU data, do not reload the layout or scan for matching calibration.
    Reset log map weighting values when starting automapping.
    Limit log map weighting values to the weight before change value.
    This essentially changes the non-automapping behaviour to be close to a rolling average rather than being a cumulative average.
    The actual calculation here subtracts the residual weight * the mean so is really an IIR type filter.
    Log map controller: Changes to UI.  'Weight' has been converted to a 'confidence' percentage which is the percentage of the logged weight vs weight before change.
        Removed weight damping parameter.
        Changed 'Enabled Automapping' from a checkbox to a button that toggles the automapping state.
        Error Modifier => Target Error.
        Change => Map Adjustment.
Added context menu for changing colour mode on map/table grids.
Fix issue with mouse capture on scrollbars if the scrollbar was deleted while dragging.
Fixed "Follow ECU" selection handling on grids with swapped axes.
Fixed cursor position on map graphs when using swapped axes.
T4441: Allow reprogramming of serial.
Fixed tooltip on grid axis header labels.
Added 'icon' property for label views.
Added optional 'custom' button for Wizards.
Branded build: updated keys.
Fix issue in some builds where layout file was always being requested when it shouldn't be.
T4329: Added support for encrypted definitions in ecudef files.
T4472: Added app.beginUndoScope / app.endUndoScope functions for scripting to group multiple changes into a single undo action.
T4476: Option to hide Wizards from menus.
T4475: Buttons using an action will get label from the action name + shortcut if the button label property is empty.
    Added dialog for creating buttons to pick from action instead of just assigning a label.
Hide SERIAL_OEM/UNIQUE_ID from ECU information dialog.
Branded build: Added dropshadow to splash screen.
T4473: Branded build: sidebar buttons.
T4473: Branded build: wizards can specify if they appear on buttons sidebar.
Branded build: include undo history on toolbar due to lack of menu bar.

================================================================================
Version 4.05.00 - 24 September 2023
================================================================================

B4298: Fixed rendered icon colour differences by loading the icon directly rather than using the shell.
Changed terminology in layout menu: Tabs => Layout, Cached Tabs => Working Layout.  This affects scripting action names.
Dropped thumbnails for layouts.  Layout selection now uses a list.
Layout selection dialog now includes a details panel with an overview of layout contents.
Added feature for builds that use Working Layouts to offer to switch the working layout to the last saved layout for a given ECU type.
T4406: Branded build: use installed layout files.  Multiple, versioned layout variants are supported.
T4408: Branded build: Installation of layout files via layout selection dialog and by drag/drop.

Fixed issue with help generator automation of mouse/keyboard events.
Help generator: fixed a screenshot that had an overwrite message box appearing. 
Fixed some possible crashes relating to property view.
T4335: Fixed a screenshot and made improvements to help generation run.
T4351: Added a script to automate help manual generation.
T4331: Select text in channel picker in Internal Logging Setup dialog to reduce keystrokes required to enter channel name.
T4310: Fixed copy/paste behaviour on maps/tables to take into account orientation properties on the view.  
    Copying/pasting data is now always done in the same orientation as presented in the view.
T4350: Add COM Automation support to branded builds.
Performance enhancement rendering autohide strips in docking framework.
Fixed colours on 'View Duty Cycle' dialog in dark mode.
Fixed bug with layout hierarchy view not updating due to layout changes to workpages that were loaded from a layout file.
Fixed repositioning of items within sizers when breaking layout.
Fixed crash selecting 'Layout Horizontally' on a dock area from the Layout Hierarchy view.
T4418: Fixed issues with sizer based layouts and calculation of maximum size constraints.
    Show implicit defaults for best_width and best_height layout properties.
    Display computed / inherited property values with grey text.
T3460: Branded build: Minimal HTML based manual with autogenerated screenshots etc.
T3461: Branded build: Integrate HTML based manual into application.
Fixed: When adding a new view, ensure it is raised in the z-order.
If not loading views with missing objects, do not load gauges that were configured to show a channel but the channel is not available.
Fixed issue where loading a layout with a missing view would not load any more views on a given workpage (if not loading missing views).
Fixed crash setting working layout auto-save preference.
Fixed: select-all text for tab name on new tab dialog.
Added option in General Preferences to use a single Working Layout for all versions of a given ECU type.
    Installers can place a file working_layout_per_version.txt containing '1' or 'true' to enable this option by default on first run.  This setting will then only be controllable withing the application preferences.
Added folder Folder Preferences for the location of non-versioned Working Layouts.
Changed the way that layouts are loaded so that missing items are retained.  This makes non-versioned Working Layouts possible.
    Builds that use predefined layouts will hide missing items.

================================================================================
Version 4.04.26 - 08 September 2023
================================================================================

T3776: Added automapping guide to manual.
T4279: Wizard List View.
T1735: ComboBox control for scriptable wizards.
Fixed a window bug where modal dialogs would be appear hidden on screen.
Added a maximum size for map graph views to prevent crashes.
Improved limits in descriptions view to avoid many decimal places for some objects.
Fix possible context menu crash on vertical tabs view.
Added scriptable combobox view.
Added option to display units next to option editors (on by default).
Label view now renders grey text when disabled.
AEMcal: Auto-install ECU definition files from ECU Definition Store.  Uninstall will now always delete permanently from ECU Definition Store.
Fix Uninstall ECU - in some cases where definition was installed in older versions, the ECU would not be removed from the installation manifest.
Dock area: fix border snapping to avoid scrollbar when snapping to bottom / right of dock area.
Fix performance issue drawing toolbars (default wxAuiToolBar implementation results in high overhead when blitting icons with alpha channel).
Fix issue with stretchable layout in some cases where fractional sizes could result in scrollbars repeatedly showing and hiding.
B4272: Fixed some issues with taking screenshots of individual windows since wxWidgets 3.2.2.1 update.

================================================================================
Version 4.04.25 - 28 July 2023
================================================================================

COM interface ProgramFirmware - case insensitive check of firmware file extension.  Prior versions would only work it file extension was all lower case (.fin or .bin).
Added example script for loading firmware.
COM jobs now report messages from transactions.
Fix regression with GIN files installation folder since adding integration testing override.

================================================================================
Version 4.04.24 - 24 July 2023
================================================================================

For builds that support it, changed default setting for 'find matching cal on 
   connect' to ON.  The key for this setting has changed so this setting is not 
   backwards compatible.
B4257: Fixed Flashing / font weight changes to log map target grid while automapping.
B4258: Fixed Poor resize performance of map grids / flashing of scrollbars.
T4289: Branded build: always attempt to open matching cal on connect.
B4921: Fixed crash right-clicking on Group view.
T4290: Sensor Calibration View: reverse engineer settings / preset from raw calibration data (without stored user settings).
Wizard editor property form - uncategorized properties are now included.
Fixed crash applying sensor calibration in non-interpolated mode.
Modify some settings and override user documents/appdata folders when running help / screenshot generator.
Audit view: sizes/positions are now stored in Device Pixels so that they scale correctly on high DPI displays.
Always draw button accelerator keys for help generator.
Fixed font size on dock auto-hide strips since wxWidgets update.
Fix default size of object selector dialog (HighDPI).
Fix default size of function dialog (HighDPI) + simplify variable/function list to 1 column.
Freeze map grid when resizing to avoid flicker.
Open Calibration Aspect: Save user geometry + improve initial size.
Added access to ECU objects via COM automation interface.
Fixed appearance of frame when dragging from view explorer.
Fixed rendering of mouse cursor when requested for screenshot from COM automation.
Remove border from table/map grids.  Also fixes issue with cell alignment and sizing of axis grids.
   Use same sizing algorithm for axis grids when grid is set to auto-size mode.
   Reworked grid sizing algorithm to be more efficient and avoid deferred axis updates.
Simplify map/table grid axis names and use full name including table name in tooltip.
Added menu option to load GCAP trace into comms monitor.
Comms monitor: fixed load/save of GCAP format.
Comms monitor: added way to load GCAP traces.
Modified resize handling for docked windows when resized via COM interface.
Fake dates in sequencer for helpgen.
Sequencer prompt is now parented to sequencer view so popups are cetered on the view.  Dialogs are also now modeless.
Hide caret in calibration notes view when running help generator.
Fixed conflict on calbrowser / calscanner settings file.

================================================================================
Version 4.04.23 - 11 July 2023
================================================================================

B4195: Updated to wxWidgets 3.2.2.1, which works around a compiler bug in MSVC17.5.4+ relating to downsampling of images.

B4169: Fixed: "ECU | Reset RTC to Current Time" crash.  Menu item also no longer enabled if ECU does have RTC channels.
T3449: New notification system.
T3451: New notification popup window design.
T3452: Change existing toaster notifications over to new notification system.
T3450: Added scripting API for showing notifications.
Fixed issue with notification popups not closing correctly in some cases.
T4139: Branded build: use much larger logo for splash screen image based upon screen size.
Scripting: Run v8 message loop at idle time - causes garbage collector to run.
Scripting: Fixed ecu.option(name) function which was looking up tables instead.
Scripting: Added app.confirm(message), app.warning(message), app.error(message) and app.information(message) functions.
Scripting: added app.isDarkTheme property.
Scripting: added app.convertUnits, app.setUnitPreference, app.getUserPreference functions.
Added UnitSelectorView and UnitPreferenceView.
Made lookup of units slighlty more permissive (e.g. units can be looked up by name (e.g. Bar instead of bar)).
Script editor: Use fixed width font & turn off word wrap.
Script editor: Changed 'Compile' button label to 'Apply'.
T4071: Scripting: support access of View properties directly instead of requiring getViewProperty / setViewProperty.
    e.g. view.title = "Hello"; instead of view.setViewProperty("title, "Hello");
T4069: Scripting: Support window.<id> to get windows as alternative to window.findViewByID().
Added Diagnostics report UI.
Diagnostics report: option to include calibration in archive.
Diagnostics report: Fixed zip file header warning due to invalid date for some files.
Diagnostics report: Screenshot: include screen grab in addition to window print.
T4131: Fixed some issues with window screenshots taken using 'print' message.
Fixed crash in some cases on New Calibration if ECU definition file was deleted from the ECU Definition Store.
T2525: Completed views section content in new help system (pending integration into public release).
T3443: Log Map Controller: separate options for showing target / modifier / maximum controls.
Added properties for log map controller settings to allow setting from scripts.
Fixed possible crash in layout hierarchy view when changing view title.
Added padding property for sizer layouts.
Disable work page "Lock Layout" context menu item if the layout is globally locked.
Disable work page stretchable layout menu item if layout locked.
Reworked property system to better support multiple selections (currently used by Wizard editor).
Branded build: fixed drag/drop of ecu definition file.
Reworked Work Page menu to put all 'add view' items in an Add View submenu since the list of possibilities has expanded.
    Very common items have been retained in the top level context menu.
Fixed 'Aborted' message that could be posted in ECU status when closing connection.  This is not indicating an error and now will be less alarming.
Improvements to MIDI controller functionality.
T4152: Added specific support for Behringer X-Touch Mini as an alternative to GEMS pot box.
T4143: Link to MIDI Controller from virtual pot pox view if no GEMS pot boxes are attached.
T4144: Fixed MIDI devices only showing first character of name.
T4145: Add Link to Controller menu to Dial view.
T4146: Link MIDI buttons to emulate pot-box press functionality.
T4147: Perist MIDI/PotBox configuration.
Moved portmidi dependency to package manager & updated to version 2.0.4.
Added support for Contour ShuttleXpress controller.
T4228: Added OEM serial number programming support.
Adjusted axis monotonicity check to allow adjacent sites to be the same without triggering a warning.

R3966: Wizards system.
Wizards are configurable pop-up dialogs that can be used to guide the user 
    through a series of steps to perform a task.
    Wizards can be launched from the menu, or from scripts.
    Wizards can either have a single page, or multiple pages with standard 
       wizard buttons (back / next / finish etc).
    A list of steps can also be shown in a sidebar.
T4070: Enable setting event handlers on objects (e.g. buttons) from other scripts.
    e.g. view.on("click", function() { ... });
    Refactored scripting classes to separate radio/check/toggle buttons to distinct classes in the documentation.
    Added event listeners for 'ecu' object.
T4068: Launch wizards in modeless dialogs.
T4072: Button property to select wizard / action to execute instead of requiring a script.
T3944: Made WorkPage (and Wizard) scriptable itself.
T3946: Script accessible key value store for storing settings in calibration / user settings.
Button view now defaults to 'strectch' mode.
Added 'Clear' button to script editor.
Top-level layouts set on workpages (or wizards) now stretch to fill the view when the view is not in stretch mode.
UI control views (button, number edit, option editor, checkbox, radiobutton, toggle button, aspect selector) now set some sensible default layout styles for use in sizer based layouts.
Added Sensor Calibration View, mainly for use in wizards to more easily configure sensors from datasheets (e.g. Fuel Pressure Sensor table + associated scalar/offset).
Update to gtest 1.13.0.

Added NewCalibration(identity, options) to COM interface.

================================================================================
Version 4.04.22 - 26 April 2023
================================================================================

B4076: Fixed directory name having trailing space in convert calibration wizard
    if name/version folders are used in the calibration file browser and
    the source calibration is untitled (or conversion is via Program Firmware).
T4022: Rewrote automated screenshot generator using NUnit. Fixed some 
    screenshots. Added Dialog HelpIds.
T4073: Preferentially show icon name / filename / empty text for icon 
    properties rather than {icon} in all cases.
Added [none] item in icon selection dialog so that icon properties can be
    cleared.
Fixed issue detaching pages from vertical tab views that could lead to crashes
    e.g. when deleting pages from the Layout Hierarchy window.
Fixed cleanup of nested vertical tab views - child windows were not being 
	destroyed in some cases, which could lead to later crash.
Fixed clearing of sidebars (for builds that use them) when clearing the layout,
    which could otherwise lead to undefined behaviour in some cases.
    Also this could lead to duplication of views within the sidebars and
    eventually long load times and poor performance.
Button View: Added 'action' property to allow choosing an application menu 
    action to execute when clicked rather than using up scripting resources.
Fixed issue regarding expansion state in properties grid.  If a property value 
    was equal to the name of a property group then when swithing to view the 
    properties of another object the group would be collapsed.
Layout hierarchy view now responds to changes to view titles.
Fixed splash screen not showing on same display as main window in some cases.
Fixed issue with button view icon disappearing if the script was changed.
Fixed loss of sidebar background colour following change to settings.  Added
    preference colour for sidebar background.
T3427: Branded build: auto install ECU definitions in ECU Definition store 
    folder.
R3386: Branded Build: Help | Diagnostics:
    T3389: Compressed archive of various diagnostic files (app log, comms 
        log, screenshot, ecu info, status log).
    T3387: Dialog to select which files to add to diagnostic report.
    T3388: Link to open email client.
Update Layout Hierarchy tree when workpage is lazy loaded.
T3418: Branded build: Changed splash screen to just show logo + remove start 
    page.

Updated to Visual Studio 2022.
Updated to boost 1.81.00.
Updated to zlib 1.2.13.

================================================================================
Version 4.04.21 - 05 April 2023
================================================================================

Added automation properties to COM interface: applicationDpiPercent, expand_all.
T3782: Window geometry - match parent display index if changed when restoring.
F3984: Allow user to specify installation location in installer.
B4024: Reverted change that could result in selected GIN files not being 
    included in firmware update packages.
Comms: Added an additional message upon EE commit completion, following 'Waiting
    for ECU to commit data to non-volatile memory".
Fixed NotesView 'show calibration notes' property was undefined and could lead 
    to the text in notes view being lost when loading tabs.
Fixed a couple of crashes relating to having map grid open when reloading 
    layout.
Various fixes to data log viewing from shared libraries.
T3376: Added 'Drag Target' property to label view to enable the label to be used 
    to drag-adjust number edits and option editors.
T3373: Optional Dial control on Channel / Option Editor.
T3374: Optional Spin Buttons on Channel / Option Editor.
B4028: Fixed restoration of column widths in channel list views.
Changed settings option 'Show "Getting Started" at Startup' to 
     'Show "Quick Start" at Startup'.
B3943: Update data pattern matchers for aspect selectors when associated dynamic
    scalars / offsets are changed.  When aspect files use physical values, 
    changes to scaling can result in different raw value patterns.
T3611: Branded build: Save/restore PC logging configuration separately to the 
    layout file.
T3379: Added Radio Button view and Toggle Button view.
T3381: Mutual exclusion group for radio buttons, checkboxes and toggle buttons.
T4067: User-settable colours for toggle button states.

Fixed issue with hover colour of buttons getting stuck in some cases for 
    owner-drawn buttons.
================================================================================
Version 4.04.20 - 10 March 2023
================================================================================

B3901: Fixed poor main window resizing performance.

F3491: New Layout System.
T3352, T3353, T3354, T3356, T3357, T3358, T3489, T3490: 
    Sizer based layouts.
Resolved issue with controls showing incorrectly for sub-vertical tab views when 
    switching the parent tab.
T3488: Refactoring of docking system.  Reduced window nesting levels to avoid 
    issues with resizing when windows internal nesting limit is reached.
Group view now directly inherits WorkPage to reduce window nesting level and 
    improve resizing performance.
T3309, T3310: Layout Hierarchy view.
    Renamed 'Tabs/Windows' menu item "Layout Hierarchy...".  
    Moved to top of the Layout menu + added to Layout context menu.
    Complete rework of Layout Hierarchy model - now supports drag & drop
       of components into sizers etc + supports nested vertical tab views.
    Changed Layout Hierarchy to a dockable view but float it by default.
Branded build: changed fixed sidebar background colour.
Branded build: added sidebars to layout hierarchy editor.
Fixed issue with serialization of built-in resource icons in layout files.
Support floating of any docked view.
Added context menu item to float / un-float docked windows.
Adjusted default outline colour for tab strips on MDI views, added 
    BaseOutline and ThemeOutline preference colours.
Adjusted default background colour for workspace (system scheme).
Adjusted default background colour for audit view.
Adjusted default line colour and use this for gauge axis colour.
Added auto-colourization for dark-mode icons that do not have an explicit 
    override rather than colourizing the icon to the current text colour.
Tab icons selection: added option to use auto-theming (or not).
Added applicationDpiPercent property to COM interface.
T3468: Add 'Apply' button to Log Map Controller.
Log Map Controller: added property to show/hide advanced controls.
T3372: Added Option Editor View.

================================================================================
Version 4.04.19 - 20 February 2023
================================================================================

Fixed crash shortly after startup in some build variants.
Added automation functions:
    ClearEcuStatus
    AppendEcuStatus
    Added "useDefaultSettings" to SetProperty.

Added internal scripting functions to automate clear / data input for Scope 
    view, for purposes of screenshot generation for new help system.

================================================================================
Version 4.04.18 - 17 February 2023
================================================================================

Behavioural change: Aspect files when applied to differing ECUs will no longer
    interpolate maps / tables that do not match in size.

T3321: New View type for selecting calibration aspect files.
T3517: Select Aspect in aspect selector that corresponds to loaded calibration.
T2491, T1709: Text based (XML) format for aspect files.  Values are stored in 
    physical units in XML aspects.
    XML Aspect files are more portable, hand editable and also do not require 
    that the original ECU definition file is installed.
Added support for ROW_DIR (in addition to existing COLUMN_DIR) maps in A2L 
    files and warn if other modes not supported for FNC_VALUES.  Row based 
    format also used for text based aspect file export.
T3921: Implemented drag/drop of tabs on vertical tab view to re-order them.
Avoid emitting baud rate changed message when identifying ECU if not really 
    changed.
Fixed text colour on drop-down menu of file explorer in dark mode.
Added additional icons:
    aspect
    brake
    brake-park
    brake-problem
    engine-load
    flame
    gear
    throttle
    pedal

Added keyboard search to icon dialog.
Added help IDs to icon dialog.
Consolidated 'add' menus on workpage context menu & ensure alphabetical.
Vertical tabs: modifying tab label will now update size constraints.
Use separate help ID for openCalibrationDropdown to avoid lookup conflicts 
   with openCalibration when used from scriptable buttons.
Branded build: Added fixed right / bottom sidebars that can be configured like 
   any other work page.
Set default shortcut key for openCalibration to Ctrl-O.
Button view: added icon property.
Consolidate title / border menus into 'Frame'.
Added menu items to prevent x/y scroll-bars being displayed for individual 
   work pages (useful for sidebars).

================================================================================
Version 4.04.17 - 10 February 2023
================================================================================

Modified the way the installer is signed to include the embedded executables,
   dlls etc, in line with how this is done in DashDesign now.
T3433, T3436: Instructions for 3rd party installer builds.
T2504, 2525, 3760: Improved reliability of screenshot generator, Added new 
    screenshots and tidied up content in help manual.
Fixed closing of docked windows via automation interface.
Log Playback - changing log file name property will now load the log file.
T3832: Include ECU status output in application log.
Update trails icon to multi-resolution.
Added top-level keyboard shortcuts for "Select Row" and "Select Column".
Added Quick Keys submenu to context menu for map / table views to make this 
   feature more discoverable.
Fixed select column feature.
Reworked context menu for map grid etc for faster operation with keyboard.
Added Selection Tools submenu for easier discovery of built-in keyboard 
   shortcuts for selection modifiers / copying tools.
T3399: Add property to make Notes view display / edit Calibration Notes.
B3856: Fixed regression loading calibration notes from cal files.
T3307: Branded Build: floating View Explorer for layout authoring.
Added missing Audit, Notes, Sequencer, Signal Generator to View Explorer.
Fixed: (Branded Build) If properties window was shown in a floating frame, 
    the menu command to show properties was creating a new float frame and 
    moving the properties view to the new frame.
Refactor serial telemetry and SDLM code to use modern emerald interface.
B3762: Reciprocal scaled items in ECU internal logs are now exported to log 
    files using a new scaling type (TID_RATIONAL) to enable correct display in
    GDA.  This also supports reciprocal user scalars.
    Requires GDA 4.2.16+, otherwise the channels will show up as raw values.
Fixed: If ECU definition failed to open when doing multi-file search, the 
    failure is now passed to the calling thread instead of resulting in an 
    unhandled exception.
T3456: Add scripting functions to change object (e.g. map / table) displayed 
    by a View.  This is now possible using 
    view.setViewProperty("object", "<object name>");
Changed default solid grid colour to ButtonFace instead of White so that under 
    dark mode the unchanged text in StateText mode is readable.
B3779: Fixed colour of string tokens in code editor.
Internal scripting: Added InvokeAction function to run any menu action.
    T3405: pop-up ECU internal logging from button.
    T3406: pop-up PC Logging from button.
    T3419: pop-up Log Playback from button.
    T3421: pop-up Ethernet Diagnostics from button.
    T3447: pop-up ECU Information from button.
    T3360: Popup comms setup / preferences from button.
Branded build: hide colour settings in non-admin mode.
T3383: Include X,Y axis values on Set Value popup when entering numbers into 
    grids.
Use 'Set Value' popup window for editing single cells on map / table grids 
    since it provides more information and is consistently sized.
Improved positioning of 'Set Value' popup window so that the grid cell(s) it 
    applies to are visible where possible.
Adjust default colours for map graph axis in dark mode.    
T3391: Branded Build: Changed default for display of toolbar on grid views.
If 'View: Slice' menu is selected on a map grid with an axis selection then
    configure the slice to view that slice.
Fixed bug in CommonGridPanel::getAxisGrid failing to get 'y' axis grid.
T3898: Map Grid: View Slice: Display slice for selected axis cell.
T3392: It should be possible to pop up 3D map graph from button at grid X/Y 
    intersection.
T3393: Branded build: 3D Map Popup: display in floated window.
Fixed issue with vertical centering of labels on buttons.
Reworked tab control to enable sizer based items to be inserted.
T3715: Add sub-grouping view to tabs / subgrouping views.
T3369: Property to show/hide expand/contract buttons on vertical tabs views.
T3366: Added General preferences to control the default for 'Show Borders' and
    'Show Titles' on new Tabs.
T3493: Icon: Spark Plug.
T3494: Icon: Steering Wheel.
T3496: Icon: Test.
T3495: Icon: Corrections.
T3497: Icon: Diagnostics.
T3498: Icon: Fuel. (+ Oil)
T3499: Icon: Pump / Fuel Pump.
T3502: Icon: Lambda.
T3503: Icon: Ellipsis (more-vertical and more-horizontal).
T3504: Icon: Sensor.
T3500: Icon: Valve.
T3501: Icon: Timing Wheel.
T3505: Icon: Engine.
T3506: Icon: Battery.
T3508: Icon: Exhaust.
T3509: Icon: Manifold.
T3510: Icon: Cam / Camshaft.
T3511: Icon: Barometer.
T3512: Icon: Fan.
T3513: Icon: Idle.
T3514: Icon: Water.
T3515: Icon: Traction Control.
Icon: Coil / Ignition Coil / Glow Plug
Icon: Turbo
T3364: Vertical tab view icons should be selectable from predefined list.
T2433: Reworked tab icon selector to use the newer multi-resolution icons.
       Importing of icons now also supports .ico and .svg.
       Improved internal SVG renderer to correct a number of rendering issues.
Image view: Added stretch / align options.
Image view: Added SVG support.
Image view: Added drag/drop from filesystem.
Optimized dark mode arrow icon rendering.
B3902: Use FunctionString type instead of BitStrings for exported Enumeration 
    types.  Fixes incorrect conversion for A2L enumerations whose underlying 
    values are floating point.

B3759: Fixed: Firmware upgrade: If bin + fin were specified and then fin 
    subsequently removed from the procedure then an error saing that the 
    firmware could not be verified was shown.

    Reworked the way that the firmware images are verified and the flows through
    this part of the firmware programming procedure.

    Firmware upgrade will also not warn if the fin + bin both use ECU definition 
    files and the fin is not the 'base' version that is compatible with the bin.
   
    Install button also now will not allow the 'base' ECU to be selected for 
    the bin file - the full ECU definition file must be installed when performing 
    firmware upgrade.
B3821: Fixed auto detect baudrate for serial ports.
GW: Allow custom baudrates to be specified in 'Set Baud Rate' dialog.
Added very basic auto-complete for JavaScript editors.  Needs extending with 
   more contextual information (object properties), built-ins and local identifiers.
GIN files: Fixed bug in deserialization of (rarely used) values that use type 
   specifiers when initial value is non-zero and the type is less than 8 bytes.

================================================================================
Version 4.04.16 - 02 December 2022
================================================================================

T3487: DockSizer (will enable sizer based layouts).
T3377: Update Number view to provide Status Light features (added additional 
    properties for labels, colours, alignment, font etc).
T1485: Add decimal places option to number gauge.

UT: Made file filter more generic for unit configuration file dialog.
#3475: Added about / help menu items to application system menu.
#3331: User settings are now first loaded from ProgramData/.../settings.xml so
    that application installers can install default user settings.
Branded build
R3482: New branded build variant.
R3401: Feature removal from branded build.
R3478: (branded build) Artwork.
R3311: (branded build) ECU type restriction.
R3423: (branded build) Configuration Options.
T3476: (branded build) Map layout defaults.
T3601: Refactoring/Unification of cal file filter generation code.
     (branded build) Altered calibration name/version space padding policy.
UT: Added command line option "/license-manager" to only show the license 
    manager dialog.

Other branded build tasks:
T3318, T3317, T3403, T3324, T3446, T3473, T3316, T3323, T3303.
UT: Changed program firmware icon.
UT: Include keyboard shortcut in default toolbar item tooltip.
GW: Menu option to compare calibration with defaults.
Added 0x4000 for strong name/version check in FIN.  If ECU identity not found in
   known address list but through manual scan then check if the ECU definition 
   was installed.
Adjusted behaviour of determining if 'Program Calibration' is included in 
   ISP procedure in case that there was not a 'strong' name/version check in 
   the FIN.
If the ISP block size cannot be determined from the ECU header then fail ISP 
   with an error message (previous versions would result in integer division 
   by zero).
Close package installation dislog prior to ISP to avoid some modality problems 
  (apparently frozen UI).
ISP of bin + fin from package: display bin name correctly on UI.
Fixed issue when recreating ethernet comms port that could lead to continual 
   multiple errors.
Ethernet ECU simulator: update serial number if CoPro reflashed.
Delay disconnection following ISP from package.
Only auto-disconnect after ISP of package if the ECU was not initially 
   connected.
Drop support for ancient calibration file format that would mean that loading
   random cal files would ask for unusual ECU types.
Suppress ECU Offline popup when doing ISP from a package instead of via 
   'Program Firmware' menu.
Prevent package install firmware + Program Firmware wizards from being open at 
   the same time.
B3264: Fixed conversion template prompt when creating a package.
B3686: Fixed Windows version definiton that caused boost asio issue.
B3681: Fixed file save as bug where folder was not found.
B3682: Fixed GW asking to install already installed packages.
Increased font size on Map Graph on HighDPI displays.
T1710: Added a global minimum font size to Preferences. 
    Enabled for grid cells, notes, dock captions and bar gauges.
Update emerald version to 5.5.2.

================================================================================
Version 4.04.15 - 24 August 2022
================================================================================

COM Automation: avoid navigation / changes during screenshots.

================================================================================
Version 4.04.14 - 23 August 2022
================================================================================

Fixed close of Log Playback config dialog in some cases where channel mappings 
    were not valid.
Added Close Log context menu action for Log Playback.
Updated to Emerald 5.4.6 (performance enhancements).
COM Automation: Added options to Click function: move_only, press, double.
COM Automation: Trigger change following setting of 'identity' property on 
    ECU Definition pickers.
COM Automation: Added some additional virtual properties to GetProperty 
    for grid cells.
Conversion template builder: supress save prompt when closing dialog during 
    automation.
Dark mode styling for Function editor.
Changed colour settings for window captions - these are now just a solid colour.
Added additional colour gradients (now shared with GDA).

================================================================================
Version 4.04.13 - 08 August 2022
================================================================================

B3287: Fixed restoration of grid columns on 'New Calibration' dialog. Tab
T3289: Automation: option to draw mouse cursor in screenshots.
T3286: Added global action / helpid to invoke configuration dialog for 
    views where applicable.
Automation: Added 'identity' property for InstalledEcuPicker, to enable 
    automation of ECU selection pickers (e.g. conversion template builder).
T3285: Automation: fixed keyboard traversal of user scalar config grid.  
    Added button with help-id for opening advanced editor.

================================================================================
Version 4.04.12 - 03 August 2022
================================================================================

B3278: Reworked Calibration Template Builder to make ECU definition file 
    selection clearer.  Fixed a potential crash.
B3284: Allow customer GIN files to be used to create conversion templates 
    following user confirmation.

B3256: Fixed Log Playback feature.  The log view is now shared with the data 
     analysis software and supports a wider range of logging formats.
T3285: Improved UI for log view configuration.

Fixed issue where if an ECU transaction succeeds but completes immediately, it 
    would be left on the transaction list making it appear the there were still
    outstanding transactions.
COM: Enable 'path' property to be set for AbstractFileBrowseEdit based controls.

Fixed possible delayed crash relating to use of alternative fuel map scaling.
Fixed some issues relating to help screenshot automation.

================================================================================
Version 4.04.11 - 29 June 2022
================================================================================

B3191: Corrected ECU simulator region checksum calculator (16bit Additive).
UT: Possible issue identified & fixed for 8bit additive region checksums.
UT: Calibration Convert: suppress overwrite popup when the application is 
    automated if the silent overwrite option is used.
UT: Added 'Keyboard' function to COM interface for simulating keyboard actions.
UT: Fixed help info generation for context menu actions.

================================================================================
Version 4.04.10 - 16 June 2022
================================================================================

UT   : Updated to Emerald 5.4.5 and emerald_id 1.2.12.
B3144: Reset calibration & file name if reconnecting.
B1996: Handle 'bool' channels / options like On/Off bit options.
B2875: Fixed issues with Tacho view configuration dialog not showing the current
       configuration in some cases (e.g. after reload of layout).  For example
       the gauge thresholds.
UT   : Automation: Added ecu_reset_supress_popup property.
UT   : Automation: Implement gethernet file transfer commands.
UT   : Automation: Added Context menu help generation.
UT   : Ethernet simulator: simulate GLD based loggers.
UT   : Support file drag/drop on file browse fields in simulator.
UT   : Added hasAttibute / getAttribute to scripting (EcuItem).
UT   : Prevent command line options (e.g. for COM) being interpreted as files
       and avoid popping up any error boxes during startup when automated to 
       prevent leaving headless background processes left running in some cases.

================================================================================
Version 4.04.09 - 16 March 2022
================================================================================

UT   : Tentative fix for possible uninitialized variable resulting in unexpected
       offline detection.

================================================================================
Version 4.04.08 - 15 March 2022
================================================================================

B2866: Fixed crash setting gradient twice in Tacho thresholds without 
       dismissing the gradient picker in the grid.
UT   : Descriptions view: added menu option for copy.
B2865: XCP: Do not log "XCP: Connected" in comms monitor following recovery from 
       an error.
UT   : XCP: log timeout errors in comms monitor & update connection error status.
T2873: If ECU name can't be verified following ISP, request that the user power 
       cycles the ECU and retry.
UT   : Firmware Programming: If successful, show a tick on 'Finish' button - in 
       case of confusion now that ECU status log is displayed.  
       Shows a cross on the finish button if failed.
       Additionally the 'Cancel' button is hidden.
       Add error to status log if user aborted ISP.

================================================================================
Version 4.04.07 - 10 March 2022
================================================================================

B2864: Tentative fix for crash when connecting to ECU via FTDI serial connection
       possibly during hotplugging check.
       Addressed race condition bug in comms layer.
       Added some additional logging of possible failures during initialization
       of device change notification handler.

================================================================================
Version 4.04.06 - 03 March 2022
================================================================================

B2827: ECU Reset detection was not working on GDI80 01X version ECUs.  Changed
          to check for 500ms offline timeout.
UT   : Made ECU Reset Popup modeless.
T2861: Program Firmware can now reprogram both CoPro + Main processor together
         This process checks if the main processor firmware version has changed
         - if not then the main processor update is skipped.
       Programming CoPro + MainPro is now also possible using GWv4 Package 
         files.
       Added 'Verify ECU Information' step.  Allows users to sanity check the 
       connected ECU prior to programming.  This option is persisted in user 
       settings but overridden by firmware Package installs.
UT   : Allow Program Firmware menu item when not connected (GWv4).
UT   : Added connection port selector to ISP sequence page.
T2558: Added 'Change Connection...' button to Connect dialog.  When connecting 
         to an ECU if the incorrect port was selected then this allows a more
         streamlined resolution to that problem.
B2842: Reset per-channel decimal places on Channels grid if changing the channel
       on a given row.  Ensure that if DP setting is changed that layout get 
       saved.
T2834: Modify LogMap calibration data mismatch warning behaviour.
B2843: EM80_M log processing error: EcuCommCode::fromDataRef: Invalid size.
        Due to address / size mismatches in imported log setup from different 
        ECU version.
        Modified Log setup file to include original ECU information + additional 
        alias information.
        Added improved import errors dialog.  Items that can't be resolved are 
           cleared in the logging list.  In future, additional error resolution 
           can be added via this dialog.
        When processing logs, if aliases that intersect a logged address end up
           with >8 byte footprint, those items that cause it are not included in
           the processed log file.
B2845: Image view: erase background, fixes display of transparent PNGs.
UT   : Automation: Support string channel values in SetSimulationProperty.
UT   : If user decides to use base ECU definition file for an ECU then continue 
         to do that by default until the correct ECU definition file is 
         installed or if the application is restarted - instead of asking
         multiple times.
UT   : Fixed second firmware image not being added to firmware packages.
UT   : Added selection properties to view objects for automation purposes.
       This also means that grid selections are now stored in layout files.
UT   : Added internal scripting functions for getting/setting/listing view 
       properties:
         getViewProperty, setViewProperty, getViewProperties.
UT   : Automation: added lastCreatedView option for obtaining last created View 
         in various automation functions involving windows.

================================================================================
Version 4.04.05 - 21 February 2022
================================================================================

B2812: EM80_M log processing fixes:
       Do not include aliased channels in the log whos bit patterns do not 
          intersect the logged data due to masking.
       Corrected the way that values are unpacked from packed samples - e.g.
       if logging only byte 2 of an 8 byte CAN RX frame, the 64bit 'data' alias 
       channel would show an incorrect value.
B2811: Use same auto-decimal places calculation used for grids on other value 
       formatting for tables/options/maps etc.
T2809: Amortize cost of auto decimal places calculation for tables / maps.
T2810: Properties to set user decimal places for axes on map graphs.
T2810: Properties to set user decimal places for axes on table graphs.
UT   : Per-channel decimal places property on channel grids.
UT   : Continue to display selection in option / channel lists when focus is 
       lost to properties panel.
UT   : Auto close ISP flow if ECU is manually reset following ISP.
UT   : Reworked comms notification processing slightly to avoid situation where
       disconnecting the ECU could result in the disconnected state not being 
       seen.
UT   : If showing a new ECU transaction progress dialog, close any completed 
       ones first.
UT   : Auto-close start dialog if starting an ECU comms operation.
UT   : Added 'Connection closed' message to comms log when comms thread has 
       finished.
UT   : If the clear calibration checkbox is hidden in ISP flow, also hide the 
       label underneath.
UT   : Increase EM80 CoPro read optimization version to 03x00.
UT   : Added Modified Date column to ECU installations list.
UT   : Enable column sorting in ECU installations right-hand list.
UT   : Fixed maximum raw calculation for bitmasked signed values.
T2792: Modified detection of legacy CoPro as missed some EM80 variants from the 
       list.  This will now apply to anything that has CoPro version.  EM80_M 
       is handled slightly differently.

================================================================================
Version 4.04.04 - 15 Feburary 2022
================================================================================

Disable multi-command packets with legacy CoPro firmware and during initial 
     ethernet ECU identification process.  Resolves comms issues to RX80 running 
     CoPro 00x37.
     Known working CoPro versions are:
     EM80 CoPro 01x07
     EM80_M CoPro 04S01

================================================================================
Version 4.04.03 - 14 February 2022
================================================================================

T2794: Detect is ECU was reset and alert user with option to re-read cal.
T2792: Implement workaround for data transfer issues with EM80 variants 
    (not EM80_M).  If GW detects that there are issues with using various data 
    transfer optimizations then the optimizations will be disabled at the cost 
    of less efficient bandwidth usage and multiple writes to the same locations
    being serialized by write barriers.
    Added support for override META strings in GIN file:
    MIN_COPRO_VERSION, COMMS_READ_OPTIMIZE, COMMS_WRITE_OPTIMIZE
    Miniumum CoPro version can be specified to issue a warning when connecting
    if the CoPro should ideally be upgraded.
UT   : Include RX/TX IDs and rate in CAN connection comms trace.
B2793: Workarounds for comms issues with SL1:
    LOGTBL reads always return 8 bytes from SL1, leading to verify errors.
    LOGTBL reads are now prevented from exceeding the max transfer size of the 
      port.
    SL1 incorrectly specified protocol read/write sizes in the ECU definition 
      file, leading to undesired effects.
Added some additional information to application log to report PCAN result 
    codes during port initialization.
Handle new PCAN_ERROR_CAUTION initialization result code which means the port 
    was still initialized (and would have undesirable knock-on effects).
2793: Fixed issue with incorrect settings in GIN file that exceed comms
      protocol limits from causing major comms issues.  e.g. SL1.  Notifications 
      are now be added to the comms trace to indicate the ECU definition file 
      issue.
UT  : Fixed auto-reconnect to Ethernet ECU simulator following ISP due to serial
      number being reset to default.

================================================================================
Version 4.04.02 - 08 February 2022
================================================================================

B2780: Fixed crash setting font size property on Channel list view.
UT   : Use fractional point sizes for font size properties.
UT   : Improved smooth adjustment of some 'stepped' properties via dial controls.
B2773: Fixed crash in Compare tab when multi-differences report is shown and
       then a new compare is loaded that cleared it.
UT   : Automation: fixed 'y' coordinate in Click function.
UT   : Automation: Added to SetProperty: path, for CalBrowser dialogs.
UT   : Fixed height of toolbar on Descriptions view.
UT   : Updated gems library - some restructuring of unit tests + bugfix to 
       SmartColour.
UT   : Removed 'manual' unit tests that are already covered by automated tests.
T2757: Rename JS classes for scripting of EcuDefinition based objects.
T2776: Assign Help IDs to buttons etc in UI for help system.
UT   : Compare Calibration: If source file was in temp folder (e.g. if it was 
       opened from an e-mail client), offer to store in base calibration folder 
       instead.
UT   : Modified semantics of 'IsPathSame' and 'IsPathAncestorOrSame' to check 
       for path equivalence.
UT   : Support Drag/Drop of firmware files (fin / bin) on applicable builds.
T2715: Added theme default colours + editable base colours & inherit some 
      colours from these.  The non-dark colour theme now has stronger border 
      outline by default.
UT   : Adjusted colour of description area of properties grid on non-dark theme.
UT   : Adjusted colours on zoom scroll-bar on non-dark theme.
UT   : Better initial gauge/view sizes on HighDPI screens.
UT   : Fixed small layout issue on signal generator view.
UT   : Fixed bug with some docked window / tab icons getting 'lost' when 
       switching dark/light theme.
UT   : Include 'size' field in file dialogs (cal / layout etc).
C2387: Added method to clear duplicates from internal logging list.
UT   : Added method to set rate on multiple selection in internal logging list 
       on EM80_M.
UT   : Added additional menu options to internal logging list setup:
        - cut 
        - copy 
        - paste 
        - select all
        - select none 
        - insert channels
        - remove duplicates

================================================================================
Version 4.04.01 - 28 January 2022
================================================================================

B2732: Fixed connect following selection of a CAN port from 'basic' port 
       settings page on new installations of the software.
T2731: Changed install location of default layouts so that they are picked up 
       without requiring user selection.  Some builds already used the correct 
       location - this fixes GWv4 and AEMcal.
UT   : Installer: Removed user info page.
UT   : Installer: Changed text relating to Non-Accelerated 3D to guide best choice.
UT   : Port Settings: Fixed default page to basic settings for some builds.
UT   : Updated Freeze icon.
UT   : Fixed: Status panel not showing any information in some cases.
UT   : Store/restore virtual pot box frame size + improve initial size on HighDPI.
UT   : Adjusted default workspace layout slightly for help generator.
UT   : Automation: Added matte to top level screenshots for drop-shadow.
UT   : Automation: Avoid pop-up when closing internal logging setup if discard 
       file option specified.
UT   : Automation: Fixed SetProperty when applied to non-docked windows.
UT   : Automation: Added to SetProperty: maximized, width_dp, height_dp, pos_x_dp, pos_y_dp, width_px, height_px, pos_x_px, pos_y_px, pinned.
UT   : Automation: Added to GetProperty: focusedWindowID, currentWorkPageID, focusedViewID, parentViewID.
UT   : Automation: Do not prompt to confirm workspace reset command.

================================================================================
Version 4.04.00 - 26 January 2022
================================================================================

Release Candidate

================================================================================
Version 4.03.47 - 25 January 2022
================================================================================

UT   : Updated to PCAN-Basic API V4.6.0.600.
T2722: Re-instate offline calibration editing.
UT   : Enable sorting of columns in Configure Units / Scaling.
       Store/restore grid columns & sorting.
UT   : Changed naming convention for UserScalars imported from A2L files.
       Unit group names generated from A2L now include source unit instead 
       of being numbered & drop the ' Units' suffix.  
       This will avoid issues with unit preferences for 
       differing A2L files where the numbered groups may not correspond to units
       of similar intent (i.e. Power2 Units vs Power [W]).
       Internal (generally hidden) scalar suffixed 'Scalar'.
UT   : Do not include 'ECU / VERSION / CAL' base unit options in non-gems 
       builds to simplify unit configuration.
UT   : Change Edit... label to Info... for units that are readonly.
UT   : Added option to store base unit overrides in the project/layout file.
UT   : PCAN ports: output API + Driver versions in comms monitor + application log.
R2273: Added units config to branded build.

================================================================================
Version 4.03.46 - 21 January 2022
================================================================================

B2703: EM80M - trying to connect to a an ECU where the full GIN is not installed,
       select base GIN and connection is immediately dropped.
UT   : If re-connecting to ECU without full GIN file, of the base gin is 
       re-selected then do not re-load the tabs unless the GIN file SHA hash 
       changed.
UT   : Packages: Set flag for the 'convert cal' option in firmware update 
       packages.
UT   : Unit Configuration: load/save will now only save/apply units that are 
       present in the currently loaded ECU definition file.
UT   : Fixed application of display units to user scalars that do not use 
       fully-qualified unit IDs.
UT   : Do not show 'Calibration Option' item in user scalar base unit selection 
       UI if there is no such option in the ECU definition file.
       Clarified Calibration to Calibration (External).
UT   : Fixed crash in file browsers if 'folder tree' is hidden.

================================================================================
Version 4.03.45 - 20 January 2022
================================================================================

UT   : Auto-configure firewall from installer script.
UT   : Support GIN file version 3.33.  Supports attributes + hidden flag on 
       User Scalars + additional GinItem fields (identifier, long identifier, 
	   description etc).
       Enumeration types now also support additional GinItem fields (attributes, 
       identifier, long identifoer, description).
       Supports custom units & unit quantities to be defined in the ECU 
       definition file.  This system will also become the basis for supporting 
       custom units in A2L files.
UT   : Resolve display unit for units throughout the UI e.g. on option / channel
       grids.
B2695: Options and conditions not showing for Internal Logging Setup:
       Fixed general issue with object search following copy of ECU definition.
B2676: Improve error message if ECU not supported.  If installing a license 
       would allow access then state the applicable license(s).
       Prefer the DEMO calibration file on new installations since this ECU type 
       does not require a license for offline access.
B2679: Fixed WorkPage contents scrollbar overlap issue.
B2584: File dialog: Fixed lock-up when deleting a newly created folder.
B2583: File dialog: Creating a new folder should just select the new folder 
       instead of trying to open the folder.
Units: fixed regression in handling of default units in units config dialog.
B2619: Do not fail loading of user units if a quantity with an blank ID is 
       encountered - instead trace a warning in the status window.
T2706: Base unit definitions on UnitSystem in the GIN file.
T2705: Unit configuration: If a dynamic unit option is available, add an option
       selector to the UI for it.
UT   : User units: do not allow quantity to be changed when creating a unit from the 
      'Configure Units' dialog.  In order to change the quantity of a value, a
      base unit override must be selected.
UT   : Changed "Co-Processor firmware mismatch" error to a warning.
UT   : Fixed background colour of units text in grid axis headers.
UT   : Added option to disable the display of value bars on individual channel 
       list grids.
UT   : Fixed clipboard format for name lists - pasting into Notepad would drop 
       the last character since it expects a null (unlike MS Word / Excel).
UT   : Include product name in version description to make related firewall 
       rules clearer.
UT   : Package dialog: store/restore window geometry.
T2682 (partial): Package Dialog: Added secondary firmware for CoPro + Base ECU 
      upgrades.
      Added force verify ecu info option to packages for gems Reflash.
      Store extended ECU identity in package.

================================================================================
Version 4.03.44 - 26 November 2021
================================================================================

Note: If user defined units have been specified then these will be upgraded but 
    archives are not backwards compatible with older versions of GWv4.

B2556: Scrollbars on map grids could hide the last row/column.
       Reworked scrolled windows to resolve scrollbar flicker issues when 
       running dark theme.
B2557: Channel and Option default number of decimal places either too high or 
    too low in some cases and are calculated differently for Channels compared 
    to Options.
T2513: Refactor Units system; unifies unit system implementation across 
     multiple products, increases flexibility, and makes user units support in 
     all apps a step closer.
T2514: Units that use relative scaling will now avoid scaling to the base unit 
     first, if possible, depending upon the scaling graph for that unit quantity.
T2270: XCP/A2L: Create UserScalars for units and unit groups.  Enables user 
     units configuration.
     Rework of ECU definition file object collections and search indexes - 
         changes affect a large amount of code.
T2269: Read unit groups from A2L annotations, e.g.
    \begin ANNOTATION
        ANNOTATION_ORIGIN "UnitGroup"
        ANNOTATION_LABEL "Pressure"
    \end
    \begin ANNOTATION
        ANNOTATION_ORIGIN "UnitQuantity"
        ANNOTATION_LABEL "pressure"
    \end
T2524: Themed message boxes.
UT   : Persist geometry of units/scaling dialogs + improved HighDPI initial size.
UT   : Create Unit dialog: do not use spin box for multipler / offset values & 
       allow larger values.
UT   : Find dialog: also support ecudef files in addition to Gin when doing 
       multi-file search.
UT   : Fixed crash calculating bit operations on unusually sized ECU 
       definition items (e.g. 6 byte values).

B2497: Activating an expired license will now report an error instead of 
       succeeding (but silently failing).
T2585: Warn user if license expiring.
UT   : Licensing: store original machine key with license activations.  When 
       deactivating licenses, use the original machine key, where possible.
UT   : Display expired licenses in License Manager view.

B2509: In commands/logging section of manual "Log Playback" gets its own invoke 
       action.
UT   : Changed some HelpIDs.
UT   : COM: Added 'deferred' option to 'options' for InvokeAction to defer action 
       invocation via the event loop - resolves problems with invoking actions 
       that display modal dialogs and never return.
UT   : COM: added way to set selections on windows.
UT   : COM: added way to simulate mouse clicks.
UT   : COM: added way to move windows.

================================================================================
Version 4.03.43 - 08 November 2021
================================================================================

UT   : Clear build folder to ensure that COM TLB gets regenerated.
T2268: Parse group name from units definition (quantity:unit:group).

================================================================================
Version 4.03.42 - 08 November 2021
================================================================================

UT   : Fixed typo for Channel List item in View Explorer.
UT   : Altered name of Send Calibration drop-down action to avoid conflict 
        with the related menu item.
T2419: Rename 'Pot' View to 'Dial'.
T2274: Units configuration file serialization.
T2396:
    Changed actions:
     actions/addPot to actions/addDial.
     action IDs (upload > send/program, download => receive)
     programChecksum => ecuStoreChanges
    Extended COM interface:
     FocusWindow, SetProperties, GetProperties, SetProperty, GetProperty, 
     LoadLayout, SaveLayout
    Assign helpIDs to fuel map specific context menu items.
    Output additional helpId info via COM.
    Added scripting functions / types to HelpID system.
    Changed the types of maps/tables/objects etc reflected in JavaScript.
    Added some convenience functions to the 'Ecu' script object for looking 
    up tables/options/maps etc.
    Scripting: added Category, Region, ChannelTable, EcuString objects.
    Scripting: added properties to Channel and Option:
    real, raw, value, text.  Equivalent to getReal/setReal/getRaw/setRaw etc.
    Updated default Function Object script to use terser lookup and ES6 
    features.
    Added control of ECU simulator to COM interface.
    Fixed usage of JavaScript object literals that have boolean properties.
    Fixed enumeration of ethernet ports in COM interface.

================================================================================
Version 4.03.41 - 29 October 2021
================================================================================

T2396: Extended COM interface.  
       Added InvokeAction, IGWv4OptionsMap, CreateOptionsMap, GenerateHelpInfo,
       EnumerateWindows, TakeScreenShot, CloseWindow.
UT   : Fixed typo in "Serial Telemetry Logging / Monitoring" menu item.
UT   : Fixed clear Calibration - selecting 'no' / canceling dialog should not 
       continue & clear the ECU.
UT   : Fixed bug where PCTL operation would be issued when PCTL does not have a 
       valid address in the ECU definition file.
UT   : Avoid 'Setting Auto Store' popup at the end of ISP in some cases.
B2441: Reworked ISP:
       Make it clear that the 'Clear Calibration' item in the ISP procedure is
       performed before re-flashing the ECU.
       Added additional clear to defaults step when a calibration is not also 
       being programmed but the ECU is cleared.
       Added option to convert the calibration file that is already in the ECU 
       during ISP.

================================================================================
Version 4.03.40 - 19 October 2021
================================================================================

UT   : Fixed some regressions in map/table models that could result in maps not 
     being shown or unhandled exceptions.
UT   : Fixed regression handling spaces in xml archives in some cases.  Fixes
       recent files list issue.
B2438: Reworked ECU definition file handling.  Since the tabs etc are now kept 
       open if possible when connecting to an ECU, if the ECU definition file 
       was manually re-installed then reconnecting to the ECU would not re-load 
       it.  This case is now detected and reconnect / reload of calibration will
       be offered.
       Additionally. when connecting to an ECU, the ECU definition file will be 
       checked for updates and if changed, a re-install will be offered.
       Successful installation will now pop up a notifcation toaster that is 
       automatically dismissed after 5 seconds rather than requiring a click to 
       close the a dialog box.

================================================================================
Version 4.03.39 - 19 October 2021
================================================================================

Fixed issue with 4.03.38 release.

B2356: Fixed calling of script functions via COM interface that do not have any 
       function arguments.
B2356: Fixed crash when exiting application whilst an XCP connection was active.
B0167: Fixed crash in JS engine when adding custom columns to compare tab.
B0169: Fixed crash if attempting to program a firmware image that is opened for 
       exclusive access by another application.
B0185: Removed Auto-Arrange tab feature.
B0205: Fixed option steps for Table/Map objects.
B0176: If protocol definition in GIN file claims that it can read/write more 
       bytes than are physically possible on the connection (e.g. CAN) then it 
       should override the size limit.
UT   : Fixed start option / offset option for Table objects.
B2410: Re-fit grid headers when there are dimensional changes to underlying 
       map/table.  Partial fix for issues with axis header sizing.  A rework of 
       grids is planned for a future version.
B2409: Fixed Re-install GIN while loading a GIN would install the file but 
       actually load the prior version.
UT   : Drag/drop of category groups from view explorer now works.  Fixed crash if 
       selecting "add to current tab" for such items.
T2350: Changed update mechanism of ECU definition file installation manifest 
       to reduce risk of corruption.
UT   : Updated to boost 1.77.0.  
       Updated to lzma 5.2.5.
       Updated to bzip2 1.0.8.
UT   : Modified ECU Simulator to allow CAN ports to be selected as external port
       in addition to serial ports (for comms testing).
B0168: Slow CAN log download.  Made a couple of tentative changes to avoid 
       suspending comms thread when reading from CAN ports - could not see any 
       800ms delays when testing with modified ECU simulator.
       Removed code to pre-empt possible transmit buffer queue full error. 
       Testing of gemscom ISP via CAN recommended.
T1760: Use SVG for GIN editor icon.
UT   : Added option to check for updates on the Beta Channel (GW only) & 
       automate deployment during release.

================================================================================
Version 4.03.38 - 18 October 2021
================================================================================

B2356: Fixed calling of script functions via COM interface that do not have any 
       function arguments.
B2356: Fixed crash when exiting application whilst an XCP connection was active.
B0167: Fixed crash in JS engine when adding custom columns to compare tab.
B0169: Fixed crash if attempting to program a firmware image that is opened for 
       exclusive access by another application.
B0185: Removed Auto-Arrange tab feature.
B0205: Fixed option steps for Table/Map objects.
B0176: If protocol definition in GIN file claims that it can read/write more 
       bytes than are physically possible on the connection (e.g. CAN) then it 
       should override the size limit.
UT   : Fixed start option / offset option for Table objects.
B2410: Re-fit grid headers when there are dimensional changes to underlying 
       map/table.  Partial fix for issues with axis header sizing.  A rework of 
       grids is planned for a future version.
B2409: Fixed Re-install GIN while loading a GIN would install the file but 
       actually load the prior version.
UT   : Drag/drop of category groups from view explorer now works.  Fixed crash if 
       selecting "add to current tab" for such items.
T2350: Changed update mechanism of ECU definition file installation manifest 
       to reduce risk of corruption.
UT   : Updated to boost 1.77.0.  
       Updated to lzma 5.2.5.
       Updated to bzip2 1.0.8.
UT   : Modified ECU Simulator to allow CAN ports to be selected as external port
       in addition to serial ports (for comms testing).
B0168: Slow CAN log download.  Made a couple of tentative changes to avoid 
       suspending comms thread when reading from CAN ports - could not see any 
       800ms delays when testing with modified ECU simulator.
       Removed code to pre-empt possible transmit buffer queue full error. 
       Testing of gemscom ISP via CAN recommended.
T1760: Use SVG for GIN editor icon.
UT   : Added option to check for updates on the Beta Channel (GW only) & 
       automate deployment during release.

================================================================================
Version 4.03.37 - 22 September 2021
================================================================================

T2204: XCP: If GET_ID not supported by the ECU, continue the connect operation 
       to allow the ECU definition file to be selected manually.
T2209: XCP: Manual selection UI flow for ECUs that can't be identified 
       automatically.
B2262: A2L files that specified negative length / layout fields in format 
    strings would result in the A2L file being silently not loaded.  Messages 
    will now be issued for format strings that are invalid in this way or if an 
    unexpected exception occurred during A2L processing.
B2180: If the ECU installation manifest is corrupted then move the file to a backup 
    and display a better error message instead of an unhandled exception box.
UT   : Pluralize single differences model names in compare panel to make it clearer 
    that the selection will reveal multiple items.

UT   : Fixed failure when opening CAN over UDP connection.
UT   : ECU Definition File search results: enable sorting + order by date 
    descending by default.

================================================================================
Version 4.03.36 - 03 August 2021
================================================================================

Fixed some issues regarding Simulink Virtual Versions on GIN files. 
       In some cases, it is important that the base GIN version is used.
Fixed uninitialized flag for forcing 13bit protocol that could lead to 
    unexpected behaviour when dealing with extended address space.
If virtual version is used for Simulink ECUs, compare the base version in the 
    extended identity with the base version in the ECU to avoid getting an error 
    message during connect.
    ECU Simulator now also reports base version in ECU header.
Fixed possible crash closing application whilst ECU simulator running.
Performance and stability enhancements.
Faster GIN file loading.
Support can_id in ATTRIBUTES from ginmake.  Displays a CAN ID editor for CAN ID 
    options etc.
Fixed: Multi-part file writes to ethernet ECUs were not being fully reported in 
    comms monitor.

================================================================================
Version 4.03.35 - 30 June 2021
================================================================================

#4919: Fixed crash when selecting firmware update, depending upon installed license.

Fixed handling of COPRO_ISP_MAX_SIZE_BYTES.

Installed ECU list - GW was stripping multi-part file extensions from the file 
   name column.  This column will now use the original file name, if available.
   Otherwise, GW will now reconstruct the file extension without losing the 
   additional parts.

================================================================================
Version 4.03.34 - 24 June 2021
================================================================================

EM80_M large firmware support.  There is now the concept of resetting the GIN 
    file on comms connections and updating of the ECU identity.

#4859: Firmware upload of EM80 CoPro: A GIN file is not required in this case -
     the UI will no longer ask for one.  Also the clear / program calibration 
     steps are hidden in that case.  Detected firmware version is displayed 
     in the title bar.
     Only enable Program Firmware menu item if connected to ECU to help avoid 
        situations where multiple ECUs are connected to the PC and the 
        configured connection is not the expected one.
Changed 'Waiting for EE...' message to something more descriptive:
    'Waiting for ECU to commit data to non-volatile storage...'.
#4720: Update firmware wizard - auto-advance if GIN installed via drag & drop.
#2521: EHL extraction issue.
#3835: Object selector for ComCodes: moved byte selector to its own row in 
       the layout to avoid size changes overlapping the dialog buttons.
#4875: 16bit checksum mode for EM80 was not calculated correctly.

================================================================================
Version 4.03.33 - 11 June 2021
================================================================================

Updated compiler to VS2019 16.10.
Fixed crash when parameter (channel) table is used and cal file uploaded to ECU.
#3784: crash on compare fixed.
Compare tab: if there is no selection in the left hand list, select the first 
     item by default.
Avoid flicker when changing tabs and the tab is lazy-loaded.
#1954: Fixed hex formatting of axes to use integer value when appropriate.
#2773: Log download - add extension if not present in user edited save filename.
#4840: PCLogging: 
    Fixed bug when reading GLO files that could read to errors in GLO => STF 
        rate detection and export.
    Changed resampling rate calculation for STF export.
    Fixed peristence of 'Export STF' option.
#4843: Fixed calculation of region checksum for EM80_M in EEROM2 - the checksum 
    size used in EEROM2 was not being used for the prior region, leading to 
    incorrect calculation.  Fixes the 'Open Matching Cal' feature.
#4718: After selecting a channel / option in a grid, the Description view should 
    update to reflect the newly selected item.

================================================================================
Version 4.03.32 - 07 June 2021
================================================================================

#4809: Fixed some issues with decoding of EM80_M logs and added regression 
       tests.
Fixed issue connecting to Simulink ECU with the base GIN - the changed 
    identity could result in the workspace being closed.
If connecting to a Simulink ECU that did not have Virtual Version defined in 
   its embedded identity but the ModelBuildID matches then load that GIN file.
Fixed crash programming firmware into unit with virtual version defined.
Fix for possible error when processing EM80_M logs leading to an end-of-stream 
   error.
#4518: Fixed bug that only allowed CoPro firmware to be programmed once per 
   GWv4 session in some cases.

================================================================================
Version 4.03.31 - 25 May 2021
================================================================================

Added additional information to application log (OS version, SSE support).
Emit warning when deserializing tabs files to identify missing channels / 
   options in tab layouts.
#4723: Adjusted default / minimum timeouts for serial ports to avoid errors 
       during identification of MINIZETA ECU.
#4723 (part 2): Fixed issue with LOGTBL on big-endian ECUs leading to errors 
      following connect and eventual reversion to individually polled channel 
      reads.
#4727: XCP: Ethernet Transport Layer (TCP and UDP).

================================================================================
Version 4.03.30 - 23 April 2021
================================================================================

Avoid exception at startup on Windows7 relating to WinHTTP used for 
    checking for updates.

================================================================================
Version 4.03.29 - 22 April 2021
================================================================================

#4630: Log processing: fixed issue where hex format would be applied to all 
     aliased channels if the first alias at the address in the log is hex.
Resolved major performance issue when displaying comms monitor due to issue 
     in wxWidgets auto double buffering.  Also affects themed scrollbars and 
     a few other controls.
#3922: CAN telemetry stream: display fixed byte value in description.
#3673: GDA/GDApro: Added check for updates.

================================================================================
Version 4.03.28 - 18 March 2021
================================================================================

Updated to wxWidgets 3.1.4.
Updated splash screen style.
#4581: Show all ECU installs if XCP license is installed.
#4517: ECU menu item 'Program Firmware...' now defaults to searching for .bin 
	as well as .fin files for firmware file uploads.
#2269: Add ECU menu item: 'Reset RTC to Current Time'.
EHL: Do not dislay v0.01 filter values for v0.02 logs.
EHL: Added some additional description to the EHL configration properties.
EHL: Use assigned parameter name for histogram name so that on GDI80 the 
     Fuel Pressure histogram is called HPP Pressure.
#4519: Fixed erroneous "Could not find ECU name in FIN" during ISP procedure.
#3730: Add a window property to allow the display of the Description field 
       in a channel or option window.

================================================================================
Version 4.03.27 - 13 January 2021
================================================================================

Altered ECU identity matching for XCP to enable definition file to be found 
    for some ECUs.
Fixed potential crash relating to install ECU search flow.

================================================================================
Version 4.03.26 - 13 January 2021
================================================================================

Avoid crash if installing A2L via drag & drop that has a syntax error in it.
ECU Simulator: fixed file browser fields.
#4351: Fixed bug with rendering of scope view Y axis.
Convert Calibration: use square brackets instead of curly braces to indicate 
    item units as per convention.
Populate advanced port settings page correctly if gCAN-UDP port selected.
Implement gemscom over gCAN-UDP for testing gcp client simulator.
Fixed problem with skinned scrollbar calculation when it has a very large range.
Fixed value column in Ecu Simulator grid.  Made the appearance not greyed out.
#3207: File dialog: Fixed drag/drop over empty row would remove file.
Allow copro write of serial number if SERIAL not set in GIN.
#4320: Combine Program Firmware + Program CoPro firmware into 'Program Firmware'
     menu option.
#4450: Add option to force-load A2L file for XCP ECUs.
#4451: Match EPK to other A2L identifiers when connecting via XCP.
Recommend disconnection from ECU if EPK verification fails.

================================================================================
Version 4.03.25 - 30 November 2020
================================================================================

#4341: Fixed display of CAN Telemetry Setup info.
#4259: Fixed bug in property grid auto column sizing that could make the 
   value column invisible.
Fixed crash using grid drop-down boxes in units/scaling dialog.
Units/scaling dialog: persist geometry.
Units/scaling dialog: UI tweak to improve dark theme appearance.
Updated V8 JavaScript engine to 2.7.220.24 and switched to cmake based build 
   system for v8 (more reliable).

================================================================================
Version 4.03.24 - 10 November 2020
================================================================================

Fixed: Refresh of ports in port settings was clearing out ethernet ECUs.
Bar gauge: Fixed clipping of value text.
Bar Gauge: Added label decimals property.
#4251: Changes to licensing model.  This also means that calibration files can 
    no longer be edited offline without a license.
Telemetry setup grids: display aliases (if any) in tooltip for grid cells.
Fixed XCP over CAN port selection regression.
XCP: added gCAN-UDP port type option for XCP client driver simulator connection.
XCP: Avoid recursive installation of ECU definition file when connecting to 
    an unknown ECU.
XCP: Made some download (ecu write) errors fatal to a given operation rather 
    than continue to retry an operation that will never succeed (e.g. access 
	denied).
A2L: Use EPK for installation version key.  If an A2L has an identical EPK to 
    another one then it is considered as being for the same ECU & will overwrite 
	any matching installations.  This is preferable to using the file hash when 
	developing A2L files.
#4256: EHL: Some ECU definition files were specifying reference scaling 
	 channels / options surrounded by single quotes, breaking lookup & 
	 therefore scaling (e.g. for Oil Temperature histograms).
     Fixed distance scaling (multiply by road speed scalar value).
EHL: Improved appearance with dark theme.  Fixed layout of histogram 
     chart on high DPI screens.
	 Improved layout of report on right hand side of EHL view.

================================================================================
Version 4.03.23 - 10 October 2020
================================================================================

#4000: Fixed update of Audit view for writable channels.
#4196: Tachometer min/max values were not being stored in tabs if equal to zero.
    The min/max values are now using a new multi-typed editor with drag 
	adjustment + reset to default option.
#4260: Fixed crash loading A2L files with COM_AXIS definitions that do not have an input quantity.
#4257: Use value limits in pot view if available.   Added option to use 
    extended limits.  And an additional option to display extended limits in the 
	new Gauge limit colour preference.
#3992: Pot view: can now specify custom limits.
#4187: CAN Telemetry: Export to DBC now 'un-applies' bit shifting multipliers on 
    ECU channels for bit shifted signals.
#4188: Opt-out instead of opt-in for fixed value support in CAN telemetry.
Made fixed value button more legible on comcode selector in telemetry grids.
#3986: Option List => Enumeration.
#4256: Engine History Log: Take into account road speed scalar for distance calculation.
#4273: Fixed crash that could occur when adding channel views during a channel data callback.
#4274: Fixed crash using 'upload current cal' when displaying a map that has dynamic table axes / axis input channel.
Added support for Kvaser CAN ports for gems comms protocol connections.
Combine CAN port configuration pages into one for gems comms configuration.
Auto update ethernet ecu list on basic port settings page.
Reworked port settings archive format.  May lose data if going back to an 
   older version.
Reworked port settings UI to enable sharing with other GEMS applications.

================================================================================
Version 4.03.22 - 10 June 2020
================================================================================

#4027: Start Page: fixed website link.
#3752, #4028: Updated safety warning upon first connect.  Now using scrollable 
    text which is more readable on high-dpi displays.
Use dark theme scrollbars on descriptions view, ecu info etc.

================================================================================
Version 4.03.21 - 05 June 2020
================================================================================

#4004: Fixed issue with file extensions for ecudef expecting two dots in some 
    places.
#4002: Fixed category tree in object selector popup dialog.
    Fixed display of items within selected categories.
Fixed html escaping routine.  Fixed display of some items in descriptions view.
Fixed layout issue on main tab control.
Adjusted default grid line colour.
#4003: Performance enhancements.

================================================================================
Version 4.03.20 - 27 May 2020
================================================================================

#3406: Rename GEMS "Parameter" => Channel in user interface due to major 
    conceptual differences with simulink / xcp nomenclature.
#3979: Display error in status bar when XCP connections experiencing errors.
Branded build: functional configuration changes.  
Language translator fix.
CAN telemetry setup: fixed 'open' icon to use dpi-aware icon.
CAN telemetry setup: "Channel" => "CAN".
CAN RX telemetry: persist window geometry.

#3406: scripting aliases gin => def, parameters => channels etc.
#3406: A2L place measurements, axis_pts, characteristics into categories.
#3977: When drag/dropping a channel / option list from view explorer, hide 
    selector control.
#3978: When drag/dropping a channel / option list from view explorer, pick a 
    better initial size.
#3780: Improved limits handling: pop up message if limits have been 
    violated & prevent editing out of range.
    Added Extended Limits mode that must be enabled in order to set values 
    outside of their typical range (up to either their extended limits or 
    full-scale if extended limits were not specified in the definition file).
#3984: Fixed - gauge axis colour was the same as background colour in light 
    theme.
Fixed right/bottom lines on map size target view not being rendered.
#3988: Branded build: changed file extensions for cal, aspect, gxt, 
    gxu, gcs, ecudef, glo.
Comms monitor: hide timestamp field if the view is thin.
    use full line for information messages.
#3931: Fixed update of controls linked to volatile values (e.g. switch in audit 
    view).
#3980: Tacho config dialog: Fixed size constraints.
#3980: Tacho config dialog: Persist geometry.
#3980: Tacho config dialog: Use edit with buddy instead of spinbox for min/max 
    due to issues with range.
#3980: Tacho: Improved auto decimal places calculation for dial labels.
Tacho - flat background.
Tacho - Round initial range to 2 s.f.  Some values have calculated min/max 
    values that have many decimal places and would otherwise result in an 
    unusual looking range.
Fixed bug in decimal places calculation for very large floating point values.
#3981: Map Slice control bar: Fixed UI sizing issues on high-dpi displays.
#3376: Get value ranges from A2L => soft / hard limits.
Display limits in descriptions view.

================================================================================
Version 4.03.19 - 14 May 2020
================================================================================

Updated to v8 version 8.1.310 (javascript engine).
Sequencer: Support Kvaser CAN ports.  This may affect existing sequencer 
    configurations that use CAN ports.
Sequencer: Enable CAN ports to be attached to comms monitor.
Sequencer: CAN command: fixed 'enable read' property.
Fix LSF (logging setup) import due to address range intersection bug.
Internal logging setup dialog - fixed white line under menu when running 
    dark mode.
Fixed issue with scrollbar range when running dark theme.
#3028: Move toaster popup when main window moves / resizes.
#3925: Fixed Reset Workspace Layout function.
Improved default sizes of workspace windows running on HighDPI.
Added throttling of status error notifications to avoid locking up UI in some 
   cases where ECU is misbehaving.
Stopped posting 'Checking COMOK' messages.
Added error code protocols to gcap and display in comms monitor.
When opening comms monitor and the log is not empty, auto scroll to the end.
Comms monitor - indication that full packet does not fit on screen.
Dont show reset ECU dialog for GEMS build following ISP.
New cal dialog: store window geometry in settings.
#3923: Branded build: Reflash recovery mode.
Branded build - updated reflash dependencies (fixes missing DLL issue).
Installed ECU lists: display original file basename in an additional column to 
   aid in disambiguating similar looking installations in some cases.
Added virtual version & access level ID internals for future use.

================================================================================
Version 4.03.18 - 08 April 2020
================================================================================

#3686,#3687,#3712: Branded build: firmware update procedure improvements.
#3688: Branded build: modified calibration conversion algorithm.
Fixed: Task dialog button - draw as normal when alt key pressed.
Branded build: altered XCP port config page to remove Load From A2L button.
Branded build: Fixed language translator.
Fixed corruption of V1 ecudef files.
Fixed extraction of ecudef in some cases.
ECU Info => ECU Information
Install ECU => Installations
Upload calibration can now upload a different version and convert.
#3518: XCP: lock for MTA transactions to avoid command ordering problems.
#3912: Send current calibration: connect if not connected.
Modified copro firmware mismatch error message slightly.
#2507: Also search last conversion templates folder in conversion ui flow.
#3914: Calibration conversion flow: fix issues with default filename.
#3913: File->Convert unhandled exception if the file cannot be opened.
#3821: EM80M: Closing internal log setup dialog would always prompt to apply 
     changes even if no changes were made.
#3782: convert: if alias conversion did not modify the calibration then do 
    not emit warning.
#3877: If ethernet ECU name changes for the same serial number then update its 
    name so that connecting to the ECU gives the correct status message.
Ethernet ECU simulator: fixed serial number.

================================================================================
Version 4.03.17 - 26 March 2020
================================================================================

#3427,#3691: Branded build licensing changes.
#3684: Branded build: remove offline cal conversion menu options.
3D maps: Removed cross-hair at the end of the site selection.
Naming changes - GIN => ECU definition where appropriate.
Branded build: Changed ECU definition/installation folder.

================================================================================
Version 4.03.16 - 09 March 2020
================================================================================

Fixed bug processing EM80M log.

================================================================================
Version 4.03.15 - 03 March 2020
================================================================================

#3828: Futher tweaks to EM80M log processing (CAN RX).

================================================================================
Version 4.03.14 - 02 March 2020
================================================================================

Alterations to EM80M Log Processing (should fix some byte ordering issues).
Comms monitor panel - fixed tooltip indexing.

================================================================================
Version 4.03.13 - 27 February 2020
================================================================================

#3741: UI for setting up EM80M internal logging.
#3743: EM80M log download / processing.
View explorer config: fixed row height under high-dpi.
View explorer config: persist window geometry.
#2499: Made the text of the notes views available by scripting (.text property).
Fixed 'print' function from scripts (now pops up a box rather than silently 
    writing to application log.
Major internal refactoring.  Changed property system over to shared gems lib.
Changed property grid sizing policy to avoid editor column getting truncated 
    if scrollbar becomes present.
Default values (ECU Object): take into account mask.
Raw log procesing - option to open in analysis s/w.

================================================================================
Version 4.03.12 - 07 February 2020
================================================================================

WIP extended ecudef format (multi-embed, encryption).
WIP reflash procedure for branded build.
#3709: Added Reset to default value context menu command for selected options.
Fixed Fixed bug in glo file reader - fixes PC logging export for data analysis.
A2L: load units from COMPU_METHOD.
Switched over PC logging file handling to glo lib (shared with data analysis s/w).
XCP Connect:
    Clear CAN buffers when opening transport.
    Modified connect sequence to send a SYNC packet following an 
        initial CONNECT packet, followed by the original connect sequence.
	These steps prevent connection failures in some circumstances.
gems lib: don't allocate object guards unless needed.
#3519: Complete rework of comms capture mechanism for comms monitor.  Comms 
     is always logged to disk now so that comms monitor can be opened after 
	 the connection started and will contain all info since connection start.
#3130: Fixed crash in Comms Monitor Panel.
#1988: Improved ordering of comms data and info messages in comms monitor 
       (particularly for XCP).
#3727: Fixed error r.e. CoPro firmware GIN file name.
Removed static scrollbar from Calibration Checker view.
Descriptions view - code root selection for those with access.
Descriptions view - open code links in Visual Studio Code if available.

================================================================================
Version 4.03.11 - 17 Jan 2020
================================================================================

Reduced timeout for copro isp commands to avoid blocking for a long time 
    in some cases - was seeing a 20 second wait at the end of CoPro ISP.
	Future CoPro will have option for timeout extension.
CoPro ISP: Do not offer conversion if in bootloader.
CoPro ISP: Offer to reset calibration to defaults.
Branded build temporary usability mod.

================================================================================
Version 4.03.10 - 16 Jan 2020
================================================================================

More extensive use of extended ECU identity:
    - Firmware inspection
	- Conversion templates (now works between different simulink model versions).
Calibration conversion: fixed directory lists so that templates are picked up 
    from "Documents/<vendor>/<app>/conversion templates".
Fixed issue saving conversion templates with more recent GIN file versions.
Fixed conversion of values used with COMPU_VTAB items in A2L files.
#3588: Following ISP of EM80-M, unit can identify as the bootloader.  The ECU
    will now be re-identified until the name matches what is expected or fail.
#3595: Do not report error if extended ECU identity is empty.
#3585: Prevent connect operation getting stuck if the unit does not contain any 
    calibration data.
#3554: Fixed: stop reading map/table axis parameters from ECU after tab hidden.
#3523: Add support for enhanced CoPro ISP (bootloader reset).
#1889: Audit view: Editable parameters should have option to display as pot / 
    edit box, with the default being an edit box.
#2245: Include application version in titlebar caption.
#3458: Convert simulink ECU calibration file when uploading new CoPro.
Update port display name if connecting via ethernet toaster popup.  Fixes
    incorrect 'Opening connection on <port>...' message.
Application configuration changes for branded build.
If model-specific ecu definition file is not available, offer to use base 
    definition if available.
Removed popup asking if you would like to "run the Install ECU wizard" and 
    just run it anyway - it can still be canceled.
Change ECU definition file installation UI flow.
Made ECU definition file installation asynchronous.
Changed text colour on virtual potbox view in dark mode.
Fixed loading of ECU identities from ECU installation store - some ECUs were 
    showing up with incorrect names or suggesting they had simulink models.
Fixed lock-up scanning for matching A2L.
#3674: Text in Manage Licenses window is clipped.
#3676: Licenses window: Added extra column for license status.
#3681: Per-object reset to defaults (if available).
ECU installations: display modified time of installed file in tooltip.
ECU uninstall: offer option to delete installed file.
ECU installations: Fixed case where "show installed only" == false.
ECU installations: Asynchronously scan ECU definitions.
Reworked ECU Info box - now generates HTML & handles A2L/XCP much better.
#1513: ECU Info box: Display Product ID if available.
XCP comms - fixed notifications to array read transactions
Debug: Support JS function ecu.rawWrite for gemscom
Workaround for undefined file size returned by copro for unsupported file types.
Compare: do not display 'Undefined' for axes if they are not named.
#3705: map grid: fixed flickering of Y axis when moving the view + empty area.
Fixed unit test failure of ecu installation handler on fast machines in some 
   cases.  Now using a hash to detect changes.

================================================================================
Version 4.03.09 - 20 December 2019
================================================================================

#3578: Fixed issue with upload of main processor firmware due to bug in padding 
    algorithm.
Fixed possible failure to load GIN files in some areas (e.g. conversion 
    template builder, ISP baud change etc).
#3579: Report error if extended identity does not match base ECU name/version 
    and do not load extended GIN.
ECU progress dialog: display messages in a text area and do not automatically 
    close if there were any errors.
Byte selector for comcode options - fixed text colour in dark mode.
#3318: Comcode selector: add an endian swap button (enabled for items with 
    associated 'bigend' option).
Can telemetry setup dialog theming changes.
#3346: Audit: allow configuration of IO ports on Object modules.

================================================================================
Version 4.03.08 - 19 December 2019
================================================================================

#3479: PC logging export: Fixed export of floating point channels.
#3572: Fixed timeout handling.  Fixes block transfer issues (e.g. copro ISP).
Branded build - open PC log in companion analysis software.
PC logging export: "open in" selector now works for 64bit analysis software.
Ethernet error: fixed handling of 'do not show again' on popup.
Fixed new Wizard implementation which had broken the ISP procedure.
Added file history drop-downs to ISP UI.
Loading overlay tweaks.
Dark mode: fixed toolbar drop indicator colour.
Fixed issue with ecu installation checking routine that was preventing
    uninstall of ecu definition files working in some cases.
Fixed loss of ECU name selection when ECU installations changed.
#3325: For tables/maps etc with floating point raw values that have a very 
    wide view range, display 2 decimal places by default.

================================================================================
Version 4.03.07 - 12 December 2019
================================================================================

Enabled ecu identity download code - fixed a couple of minor issues.
Updated icon for branded build.
Compare panel - defer compare so that view updates before running the compare
    algorithm.
Fixed some icons, particularly with light theme - some icons were still using 
    the old icon set.
Fixed theme on menu in conversion template builder.
Fixed theme on package dialog.
Fixed theme on multi-line text editors.
Improved clipping behaviour + rendering of dark mode scrollbar arrows.
Fixed slight rendering glitch on internally padded text edit control.
New tab - do not convert icon to a bitmap to retain references to built in 
    resources.
Modified theme colours slightly.  It is worth resetting the colour settings.
Toggling the theme will now reset the colour settings.

================================================================================
Version 4.03.06 - 06 December 2019
================================================================================

Ethernet ECU - do not use 13bit commands to resolve issue with some versions of 
   the CoPro.

Implemented extended ecu identity download for etherenet ECUs to enable matching
    of installed ECUs against Simulink model build identifier.
	For older versions of CoPro firmware that do not support this download, the
	build ID will not be checked - so it is still possible that the wrong gin 
	file would be picked up in that case.
Fixed abort of calibration transfer during connect sequence.

Install simulink GIN files under build ID key instead of base GIN version.
Added additional info to tooltips for ecu versions in installed ECU picker.
Improved ecu simulator appearance in dark mode.

================================================================================
Version 4.03.05 - 04 December 2019
================================================================================

#3400/#3264: tentative seed&key implementation.

================================================================================
Version 4.03.04 - 04 December 2019
================================================================================

XCP: Modified error handling.
Write failure error was not being translated to text in status window.
Fixed bug in display of verification differences - source values were always 0.
Added 'Copy to clipboard' menu option to ecu status pane.
#3531: XCP: Poll ECU with GET_STATUS.
Added some unit tests to verify xcp address translation.

================================================================================
Version 4.03.03 - 29 November 2019
================================================================================

Status messages are now stored separately from the status panel.
Added some additional status information from XCP connnect.
Crash reporting: only take screenshots of in-process windows.
XCP: Changes to command sequencing.
Branded build: set segment BSW_Cals type to RAM to avoid download.
Do not download RAM segments.
Added segment name checking in calibration file serialization.
#3530: Hide Auto Store in status bar if ECU does not support it.

================================================================================
Version 4.03.02 - 27 November 2019
================================================================================

A2L: Support VAL_BLK CHARACTERISTIC where some MATRIX_DIM arguments are 1.
A2L: Import multidimensional MEASUREMENT objects as maps/tables.
A2L: Don't hide axis tables (AXIS_PTS).
Do not show grid axis label(s) if not defined.
Do not show grid axis position gauge if there is no axis parameter.
#3477: Implemented handling of block mode transfers from slave.  This is 
    optional as it appears that for some ECUs it is slower than without it.

================================================================================
Version 4.03.01 - 26 November 2019
================================================================================

Updated to Emerald 5.01.03.
Fixed handling of A2L BYTE_ORDER - BIG_ENDIAN and MSB_FIRST have distinct values 
    even though they mean the same thing.
Fixed handling of datatype for AXIS_PTS where the record layout must be 
    interpreted differently.
Descriptions: open code reference in code viewer (super user).
Descriptions: show additional details (super user).
Find dialog: support addresses above 0x7FFFFFFF.
Find dialog: fixed tab traversal.
Map/table grid: honour formatter if default decimal places specified.
A2L: import format string from COMPU_METHOD.
A2L format conversion: leading digits length should not be zero padded.

================================================================================
Version 4.03.00 - 22 November 2019
================================================================================

*** ECU INSTALLATION MECHANISM CHANGED ***
GIN files are now compressed and installed as .ecudef files.  This will mean 
   that new installations made with this version will not be usable by other
   products that use GIN files until they are also upgraded.
   Existing GIN file installations will still work.

#3397: Implemented write cache for XCP comms.
#3490: Pass segment & timeout info to xcp protocol layer.
Implemented XCP address translation.
Use source file hash in ecu definition installation filename to avoid incorrect 
    overwrites - particularly a problem for A2L files.
Fixed manual install of A2L files via 'Install ECU' menu option.
Fixed cancel button behaviour for Install ECU.
Use compressed ecudef format for installation of GIN files and A2L files.
Use docked window for A2L warnings/errors instead of the more intrusive pop-up
    that would normally cover the connection progress dialog.
Changed colours for docking tab strips that would otherwise be unreadable with
    dark theme.
Removed absolute gin install path option for branded build.
Added command line command: --pack-ecudef src dst
Allow checking for updated GIN files for all users (useful for simulink ecus).
Fixed sequencer since refactoring of testing project (could not add items).
Tidied up Port Settings.  The numerous additional (usually best left as default) 
    options have been moved into a dialog accessible via 
	"Additional Settings...".
XCP port settings: If no port selected, then populate all possible rates so that
    "Load From A2L" is able to set the rate even if a port is not selected yet.
XCP: Honour MAX_DLC_REQUIRED.
Display port selection dialog if connecting without a valid port configured.
Flag to default branded build port settings to XCPonCAN.
Set the default port type to 'undefined' so that on a first install, clicking 
    'connect' will request setup of the port.
Fixed issue with editor column on some grids e.g. Property Grid.
Modified autocompletion algorithm for e.g. option selectors so that it will
    also match text within strings and not just at the start.
Excluded a few non-required features from branded build.
Improve sizing of name/version combo boxes in cal file browser esp on high dpi.
Improve naming of .cal files etc with interpreted A2L version string.
A2L messages + descriptions views: remove path from filenames.
#3455: Fixed possible crash if application is closed with comms running.
#3520: XCP: Verify EPK following connect if it was not read with GET_ID.
#3492: XCP: Implemented write calibration to ECU.
#3403: XCP: Graceful Disconnect.

================================================================================
Version 4.02.62 - 15 November 2019
================================================================================

Store extended ECU identity information in calibration files so that A2L file
    can be located when loading cal files.
Chnged version string seen in ECU installations box for A2L files to show 
   most appropriate identifier rather than the file hash (unless nothing else 
   is available).
Fixed axis parameter fix-up on imported A2L axes.
Added object long identifier to descriptions view, if available.
FileListGrid: increase hysteresis to avoid accidental drag/drop.
Moved most icons over to multi-resolution icons.
TabBar: handle high DPI + dark theme for arrow icons etc.
Dark Theme: Numerous visual changes.
Reworked the appearance of many gauges and views.
Reworked all 'wizard' (stepwize) dialogs.
Removed calibration compare wizard for the time being - if profiles are used 
   again then this will be requiring a redesign.
Improve radio button appearance under dark mode.
Use custom tab control throughout.
Adjustments to About Box.  
Added button to view licenses of source code dependencies.
Disallow loading/saving/editing of tabs when no ECU definition file has 
    been loaded.

================================================================================
Version 4.02.61 - 11 November 2019
================================================================================

Experimental version.

Dark Mode (incomplete).
#3384: Upgraded to VS2019 compiler.
Upgraded v8 javascript engine to 7.8.285.
Fixed build packaging of portaudio DLL.

#3377: Fixed: Entering single digit numbers for parameters/options via keyboard 
     only does not work.
#3407: Fixed Log download: Ethernet ECU could get stuck repeatedly reporting 
    'nothing to download'.
Fixed background colour of throbber on license activation dialog.
#3428: XCP license.
#3390: Rebrand.
Fixed possible crash if "open in new tab" selected for a category in the view 
    explorer.
Fixed command ID for GPS beacon programming.
Persist geometry of ECU Info Dialog.
#3169: Display simulink model information in ECU info dialog if available.

Refactoring work in progress of comms layer (possible breakages).
#3391,#3394: XCP CAN setup with option to load from an A2L file.
#1701: Ported unit tests to googletest.
#3429: XCP: Kvaser CAN port support.
#3476: XCP Timeout handling: handle EV_CMD_PENDING event.
#3478: XCP timeout handling - SYNCH packet.
#3074: XCP CAN Transport Layer.
#3402: XCP CONNECT / GET_COMM_MODE_INFO.
#3399: XCP ECU Identification.
#3398: XCP Receive cal from ECU.
Partial #3395/3396/3397/3414/3403 (xcp comms).

Modified ECU installation mechanism to accommodate A2L files which can't simply 
    be matched on name + version like gems ECUs.
Implemented command aggregation to data listener list builder to optimize 
    bandwidth slighly on parameter reads where possible.
Reworked start page - removed background image as contents would overflow on 
    high dpi displays.
Some changes to tacho defaults.
Changed resource system for icons in preparation for improved high-dpi support.
   Some icons may be a bit blurry at the moment if the display is scaled 100%.

================================================================================
Version 4.02.60 - 25 September 2019
================================================================================

#3371: Fixed regression in update of tables placed in NVM.
WIP A2L support, extended addressing.

================================================================================
Version 4.02.59 - 23 September 2019
================================================================================

Fixed row height in Find grid.
Fixed issue with sign extension of raw values.

================================================================================
Version 4.02.58 - 19 September 2019
================================================================================

Support GIN v3.32.  Major internal changes with potential for wide ranging 
   effects (e.g. PC logging, Serial Telemetry etc)

================================================================================
Version 4.02.57 - 13 September 2019
================================================================================

#3326: Interpolate on table/map grids that are placed in RAM did not update 
    the view correctly.

Tentative fix for crash in grid mouse handling code where event handlers could 
   continue executing code after grid itself may have been destroyed.

================================================================================
Version 4.02.56 - 07 August 2019
================================================================================

Build fixes due to shared code changes.
Fixed regression in serialization code.
Moved over to Emerald v5 exclusively.  
Testing of log download recommended.

================================================================================
Version 4.02.55 - 04 April 2019
================================================================================

Tentative fix for crash during clear calibration if GIN file is closed by 
    another interleaved event.
Updated internal libraries - various fixes.  Numerous consequential changes.
Changes to threading in gemscom transport layer (various changes picked up from 
    gcmapi).
Fixed crash in log playback view.
Show an error if log playback fails to load file.

================================================================================
Version 4.02.54 - 07 December 2018
================================================================================

#2623: Tentative fix for occasional crash following reconnect of EM80 following 
     failed copro update (via double click of basic port settings grid item 
	 in comms setup dialog).
Update to wxWidgets 3.0.4.

================================================================================
Version 4.02.53 - 25 October 2018
================================================================================

#2530: Conversion of GLO to STF would have incorrect endian-ness in GDA.  
     For 16bit channels, big-endian is used for backwards compatibility with 
	 legacy gda/dlog where possible.
#2528: Fixed continual loop when writing EHL.
       Fixed multiple payload size requests at atart of ethernet file xfers.
	   Fail on multiple retry failure / invalid password.
Ethernet ECU Simulator: Fixed erroneous 'Busy' error at the end of streamed 
     file writes.
EHL Dialog: Persist window geometry.
EHL Dialog: Fixed size of histogram selector on high dpi displays.
Update to latest gems lib.

================================================================================
Version 4.02.52 - 24 September 2018
================================================================================

Fixed crash setting layout lock.
Build changes, updated crypto library.

================================================================================
Version 4.02.51 - 19 September 2018
================================================================================

#2527: Added mutex to block transfer handler - possible fix for Ethernet ISP issues.
Increased timeout for block transfers.
Ecu simulator now stores a copy of the uploaded fin file under user appdata.

================================================================================
Version 4.02.50 - 13 September 2018
================================================================================

#2111: Use PCTL operation after calibration upload/clear to commit NVM.
Fixed regression of default expansion state on property grids.
#2509: Enable drag/drop of conversion template files onto GW to install them.
#2511: Crash when attempting to set table site values following load of 
       conversion template in CT builder.
#2512: Fixed assignment of values from conversion templates.
#2510: Set more appropriate default folder for saving conversion templates.
#2513: set assigned state of maps/tables that have had specific site values set.
Forward accelerator keys to tables/maps in conversion template builder.
Better initial size for table/map site value editor in conversion template 
    builder.
Persist size of map/table site value editors in conversion template builder.
Update to latest gems lib.

================================================================================
Version 4.02.49 - 10 August 2018
================================================================================

Fixed a couple of issues with file filtering in file browsers.
Added unit config to branded build.

================================================================================
Version 4.02.48 - 01 August 2018
================================================================================

Log ethernet debug info to log file instead of system debug output.

================================================================================
Version 4.02.47 - 27 July 2018
================================================================================

Fixed: ISP would report failure if the ECU has a zero sized calibration.

================================================================================
Version 4.02.46 - 26 July 2018
================================================================================

Fixed crash setting auto store state.
Optimization of string decode from GIN archive.
Pad firmware images that re not a multiple of transfer block size.

================================================================================
Version 4.02.45 - 29 June 2018
================================================================================

Fix issue in branded build installer r.e. software licensing.
Fixed issue loading very small calibration files.

================================================================================
Version 4.02.44 - 02 May 2018
================================================================================

#2306: Fixed issue with keyboard shortcut keys where initially disabled 
   shortcuts may not work once they were enabled (e.g. Ctrl-Shift-PgUp).
#2133: Display mask information for selected object in super-user info.

================================================================================
Version 4.02.43 - 09 April 2018
================================================================================

#2143: Fixed: Enable/disable user scalars had no effect in display of axis 
    columns in calibration compare.
#2123: Boostrap/build/release automation.
Report more detailed information in ethernet diagnostics (ipconfig /all).
GIN version 3.31 support.

================================================================================
Version 4.02.42 - 08 March 2018
================================================================================

#2060: Fix issue where installing some legacy GIN files can result in a 
    corrupted ecu_installations.xml file.
#2118: Prevent HighDPI scaling of icons for the time-being.
#1526: Extend Description to include "Code Name" of bits (requires GIN to be
    built with ginmake v1.70).

================================================================================
Version 4.02.41- 16/01/2018
================================================================================

#2025: Fixed compare/convert of fixed byte value commcodes in compare/convert.
Compare tab: always enable refresh button if auto refresh is off.
Small optimization to calibration load time (view explorer icons).

================================================================================
Version 4.02.40 - 03/01/2018
================================================================================

Avoid crashing if user log map does not have a base map due to loading of 
   modified/customer gin.
Fixed thread safety issue relating to baudrate change messages.
Restrict High Baud to FTDI ports only by default with opt-in for stanard COM 
    ports (the reliability of standard COM ports unknown).
Fixed display of fixed value bytes in CAN telemetry grid.

================================================================================
Version 4.02.39 - 29/11/17
================================================================================

#1866: Fixed handling of ieee floating point ECU values in scope view.
Scope view: use default view range for parameters for axis limits when available.
#1940: Fixed crash as a result of destroying a grid during its double-click 
       handler.
#1938: Fix regeression of display of fixed byte value comcodes (e.g. with 
    value 0x7F00) in Telemetry Setup grids.
Persist geometry of CAN Telemetry Setup dialog.
Persist geometry of Serial Telemetry Setup dialog.
#1964: Store prior application version number in registry/settings.
#1939: Remove preference for AutoStore warning as no longer used.
#1963: High-baud - only allow for log download by default and add META tag 
       in GIN to enable on normal comms.
    Note: High baud rate establishment now requires the GwBaudEx parameter 
	instead of GwBaud.
Ecu simulator: simulate high-baud mechanism for testing.
Persist window geometry for preferences dialog.
Fixed bug in all grid views where scrolling selection with keyboard off bottom 
   of grid may not make row visible.

================================================================================
Version 4.02.38 - 23/10/17
================================================================================

Fixed possible crash involving virtual potbox window & change of loaded ECU type.
Fixed possible crash resulting from invalid object axes.

================================================================================
Version 4.02.37 - 20/10/2017
================================================================================

#1549: Upload Firmware Wizard - Filter for *.gin file type for Re-install GIN 
       file browser.
#1910: Fixed missing min/max ticks on parameter grid.
#1909: PC log not decoding bits.
#1908: Calibration Convert: Tooth Control table should not be interpolated if 
       its size changes.
Added option to override conversion behaviour via attributes in the GIN file.
Fixed failure to detect secured status of EvoX ECU & subsequent failure to 
       connect.
#1921: Fixed concurrency error in a core library component that could lead to 
     crashes.

GEN Tuner: GEN128 support.
#1871: GENTuner Pro: Enable editing of PC logging list.

================================================================================
Version 4.02.36 - 08/09/2017
================================================================================

Fixed crash deleting tabs from tab group that is not currently selected via 
    tab windows dialog.
Display comms text messages in status window when comms monitor is closed.
#1888: Detect if application is being blocked by Windows Firewall.
#1901: Parameter selector for comcode options: typing name and pressing 'enter' 
       was not committing the selection.  Also fixed a few other keyboard
	   control issues in this area.
#1902: Fixed import of STS files that use truncated comcodes.
#1867: GWv4 DBC Export - Detect if dword, qword, floating point etc raw values 
       are aliased on the frame and export them.

================================================================================
Version 4.02.35 - 24/08/2017
================================================================================

ComCode options: Added ability to select specific bytes of the source.
#1355: SDLM integration (Serial Telemetry Data Logging / Monitoring).
#1820: SDLM integration: enable decoding of word / 24bit / dword / qword 
   parameters.
#1818: Log file name builder: added %serial%.
#1821: Fixed max logging time reported in Internal Logging Setup for GDI90.
#1633: Fix issues with large fonts:
  * Fixed sizing & rendering of tabs in Calibration Aspect dialog & removed
    wxFlatNotebook dependency.
  * Improved sizing of group selector on main tab strip.
  * Changed save/saveas/save new version/discard/cancel message box into a 
	task dialog - this also resolves issues with large fonts and this 
    originally excessively wide message box.
  * Fixed sizing & rendering of internally docked tab strips.
  * Fixed sizing & rendering of docking auto-hide strips.
  * Use small font on start page checkboxes.
  * Fixed vertical size of grid header views - e.g. conversion template builder.
  * Fixed sizing of virtual potbox and in some cases extremely wide window.
  * Fixed sizing of status bar widgets.
#1682: Save changes messagebox => task dialog (see #1633).
Fixed description of 'Close Serial Port' items in sequencer.
Fixed: Sequencer was not doing macro replacement on serial command/reply mask.
Fixed: Sequencer 'wait' was often not giving better than seconds resolution.
Sequencer: Added JS sequencer.clearTrace() - if trace gets full it slows down.
Flush log if the application crashes.
PCLogging export - provisional support for STF export of types larger than 16bit.
#1684: ECU logs: Generate BITSTRING sensor types for parameters with option lists.
Support BITSTRING sensor types in GLO format log files.

================================================================================
Version 4.02.34 - 23/06/2017
================================================================================

Read CoPro version in a bytewise manner for legacy workaround.
Avoid getting stuck if reading CoPro version fails for the first time.
Added runtime check for signals using event queue postage being destroyed in 
    threads other than the main thread.
Fixed occasional crash following closure of port preferences dialog due to 
    thread race.

================================================================================
Version 4.02.33 - 22/06/2017
================================================================================

Fixed problem setting ISP enable code following read of CoPro Version.
Fixed ISP of ECU simulator (due to incorrect serial number following reset).
Modified approach for dealing ad-hoc read commands.
Fixed autostore popup not turning on autostore when requested.

================================================================================
Version 4.02.32 - 16/06/2017
================================================================================

#1769: Restriction of ISP / CoPro programming to require that EM80/GDI80 02x00+
       is running at least CoPro version 00x35 to avoid incompatibility issues.
#1744: Add application logging to GWv4.
Added ability to edit ECU strings to ECU simulator.
Fixed issue where an ad-hoc read command would give bad data for a 5-byte 
   read.  Added a new generic protocol format to avoid breaking the semantics of
   the gemscom API as a result of these changes.

================================================================================
Version 4.02.31 - 12/05/2017
================================================================================

#1703 fixed: Editing label view text from context menu - invisible modal dialog.
#1706 fixed: Crash closing settings before async port enumeration completed.
#1668: Ethernet diagnostics.
Fixed issue with capture of process output streams.
Fixed crash when using log map with invalid axes.
Fixed issue with axis lookups on axes where multiple sites have the same value.
Defend against crash when aborting connection whilst programming checksums.
Defend against crash when aborting connection whilst inhibiting telemetry.
Defend against crash when closing application.
Defend against crash when loading sequencer view from saved tabs.
Defend against crash when saving calibration aspect with tab file.
Defend against crash when loading user log map if somehow gin is not loaded.
Display new license feature in license dialog.
#1675: Fixed build of re-branded version - adds support for software licenses.

================================================================================
Version 4.02.30 - 28/04/2017
================================================================================

Enable sequencer view in Map4000.
Added new license flag for serial number write.
Prevent crash when autostore popup occurs as a result of keyboard entry.
Made autostore popup less intrusive by making it non-modal, not taking keyboard 
   focus and positioning it at the bottom corner of the main window.

================================================================================
Version 4.02.29 - 07/04/2017
================================================================================

#1625: actually fixed.
Added 115200 to baud list in map4000.

================================================================================
Version 4.02.28 - 31/03/2017
================================================================================

#1625: Fixed: Map site cursor wraps to start of axis if input parameter value 
   is greater than the last axis cell value and the last 2 axis cells are equal 
   in value.
#1629: Do not display license error when displaying EHL dialog.
#1627: Added 'program' method to Pot view scripting interface.
Added access for "OMEX 961" and "B O O T " to MAP-4000.
#1342: Change the way Auto Store (AutoEE) is handled - warn if off when 
    modifying calibration.
Fixed wait for object sequencer items when used with parameters.
Fixed issue with timers used in sequencer that could lead to a shorter timeout 
   in a sequencer item being upset by a preceeding long timeout.
#1654: Fixed license activation 403 error due to a change in server policy.
Fixed crash if log file name is generated after gin is closed.
#1657: Fixed anomaly in Ethernet traffic when starting up connection.
Avoid re-opening ethernet port when connecting in some cases due to address change.
Added clear button for EHL.

================================================================================
Version 4.02.27 - 24/02/2017
================================================================================

#1538: CAN Rx Dialog - Remove Mask edit boxes and check boxes.
#1556: Remove option to display CAN IDs in left-justified format.
#1557: Added global option to display CAN IDs in either decimal or hex formats. 
#1593: Fixed: program serial dialog.
#1616: Fixed: Floating point displaying incorrectly in gauges.
#1341: Fixed: Inverted bit parameters do not display correctly in parameter list.
#1253: Fixed: Log Download: Auto file name format string should be persisted.
#1618: Fixed: Log Download: Auto filename should trim spaces from ecu name / version.

================================================================================
Version 4.02.26 - 10/02/2017
================================================================================

Added software based copy protection option (dongle free).
#1554,#1337: Support EHL version 0.02.
Added EHL calibration editing & passcode requirement to upload.
Fixed EHL write.
Sign installer with GEMS certificate to make it trusted when downloaded.
#965 - Generated code for Checkbox has misplaced } at end of onGetValue function.
#960 - store image view image data in the tab file itself.
DBC export - ensure that network names and sending nodes are valid DBC 
    identifiers.
DBC export - set 'null' receiving node for CAN signals.
DBC export - Export frame transmit rates.
#1336,#933: High baudrate establishment on capable ECUs / comms cables.

================================================================================
Version 4.02.24 - 26/08/2016
================================================================================

Fixed issue with 'dongle not enabled for this feature' popup at startup.
Store ECU serial number and application version in meta notes of downloaded ECU 
   logs.
Internal: Added generic KVP storage to user settings.

================================================================================
Version 4.02.23 - 29/07/2016
================================================================================

Engine History Log Feature.
Added fake file write handling to Ethernet ECU simulator for testing purposes.
Fixed crash if async port enumeration still in progress when closing port setup.
Performance optimizations.

================================================================================
Version 4.02.22 - 19/07/2016
================================================================================

Use Log Rate option value instead of log rate in log file for v0.6 log files 
  if available.  This is a workaround for firmware that does not report the 
  value and may not work if downloading a log from a secured ECU.

================================================================================
Version 4.02.21 - 27/06/2016
================================================================================

#952 - Take into account Log Rate in v0.06 log files [tentative fix] - Test data required.
#948 - [Embed scaling data in log files].
Changes to spinbox handling of enter key (changes from GDA).

================================================================================
Version 4.02.20 - 03 June 2016
================================================================================

Asynchronous port enumeration.  Prevents connection setup dialog from locking 
    up user interface, particularly with slow to respond devices attached.
Fixed excessive slowness when pressing 'cancel' on preferences dialog.

================================================================================
Version 4.02.19 - 27 May 2016
================================================================================

Fixed issue with update of original base map value in log map controller when 
   map is adjusted by the user.
#941: Checkbox on compare tab to close when a new comparison is done.
Define 'window' object in sequencer scripts.
Define 'view' object in sequencer scripts.
Define 'window' object in signal generator scripts.
Fixed crash building telemetry info when including parameters that are aliased 
with built-in ECU registers.

================================================================================
Version 4.02.18 - 01 April 2016
================================================================================

Fixed issue with some dialogs having their geometry restored to an off-screen 
   location when used via remote desktop.
Fixed crash following cancellation of a script followed by creation of a new 
   script context object.
Fixed issue with random initial baudrate for serial connections.

================================================================================
Version 4.02.17 - 25 March 2016
================================================================================

#902: State colours on map graph option.
#926: Display user scalars dependent options in descriptions view.
#927: Signal Generator - output to parameter / option etc.

Tentative fix for crash following ISP as seen in crash report.
Fixed issue with initiation of clear password request resulting in an 
    non-progressing progress box.
Improve UX when clearing cal due to secured ECU.
Added methods to internal ECU object and externally automated GWv4Application 
  for getting/setting the current connected baudrate to enable scripts that
  negotiate a higher ECU baudrate for e.g. faster log download.
Changed scriptable buttons to use async scripts.  Allows use of the 'sleep' 
   global function in button scripts.
Added scripting function to query if writes are pending to an ECU address.
Display dialog for cancelling long running async scripts and avoid issue with
  recursive yield if multiple long running scripts are executed concurrently.

================================================================================
Version 4.02.16 - 19 February 2016
================================================================================

Updated to boost v1.60.
Fixed possible freeze when loading signal generator view.
Update installer to include audio dll for signal generator to work.
When loading tab files at startup (double clicked in Windows), load the tabs 
   file after loading the last calibration etc as otherwise the tabs are 
   never loaded.
Sequencer: Fixed crash using undefined variables in macro expressions.
Sequencer: Modified buffering strategy for async serial ports to avoid missing
   responses when dealing with them in separated items.
Sequencer: CAN ports & commands.
Sequencer: Added dialog for serial port selection.
Disabled thumbnail on navigation popup (ctrl-tab) as this was causing focus
  changes and resulting in dismissal of the popup.
#930: Alpha sort of differences in file compare.
#932: CAN Telemetry DBC export - fixed network node so that setup can be loaded
    into Vector CANdb++.
Bind Gin/Ecu object to scripts exposed via the automation interface.
Added some documentation regarding script objects used in the Sequencer.
Fix build of some branded versions of v4.

================================================================================
Version 4.02.15 - 22 January 2016
================================================================================

Updated to v8 4.7.80.29.
Fixed bug in Xml parser for CDATA sections ending with ']' or '>'.
Preview of Sequencer View - Highly flexible automated command sequencing tool 
    for ECU testing and more.  
	Currently can execute scripted commands, adjust option/parameter values, 
	run external processes + batch files, delay execution,
	popup customizable dialogs.
	Custom variables can be get/set and can have aggregate/array structures.
	Macro processing in many fields to insert variable values.
	Flow control and grouping of items.
	Scriptable conditions for sequence item execution.

================================================================================
Version 4.02.14
================================================================================

New Feature: Signal Generator, outputs arbitrary waveforms from PC sound card,
   which can be used to simulate timing patterns etc.
Fixed handling of update UI events in a few places.  Was resulting in incorrect 
   enable/disable of menu items & toolbar buttons.
Fixed issue incrementing values in grids if the raw type is floating point.

================================================================================
Version 4.02.13 - 13 November 2015
================================================================================

Fixed setting of raw hex values in com code editors.
Performance enhancements.

================================================================================
Version 4.02.12 - 06 November 2015
================================================================================

Fixed display of autohide strips.
Fixed an error dealing with strings passed in through the automation interface.
PC logging via automation interface.
Basic execution of scripts within GWv4 via automation interface.
Made export of PC logging to STF asynchronous + added a progress dialog.
Fixed bug in change notification code that would cause continual reads of
   calibration values (e.g. AutoEE) to cause continual notifications.
Improved performance of Audit view due changes to update notifications.
Made some modifications to event handling that should generally improve 
   performance & reduce CPU usage.
Added COM interface documentation to the installer and example scripts.
   See the GEMS/GWv4/automation folder under your Documents folder following 
   installation.

================================================================================
Version 4.02.11 - 30 October 2015
================================================================================

Fixed incremental find on object picker lists.
Fixed flickering performance info on PC logging tab.
Partial implementation of COM automation interface.

================================================================================
Version 4.02.10 - 1 October 2015
================================================================================

Fixed issue with export+import of fixed byte values in CTS files.
Fixed issue entering negative numbers in option / parameter lists.
Improved keyboard navigation on option / parameter lists with arrow keys.
Modified build flags to generate richer debug information for crash report 
  post-mortems.
#696: Option/Parameter Grids: Make copy & paste context menu items operate on 
      the value editor, if shown.
Smooth / Fill functions - made undo operate on the entire operation.
Smooth / Fill functions - removed OK button as it was very easy to 
    double-apply the operation.
#920: Use toolbar for import/export instead of menu and move show info button 
      to the toolbar.
#746: CAN Telemetry: Warning if >1 CAN ID the same.
#747: CAN Telemetry: Warning if only partially uses extended ID's.
#695: CAN Telemetry info: display option list values if available.
#548: CTS import: Set byte count to 8 if file does not specify one.
#335: Fix keyboard TAB navigation in CAN telemetry and Serial telemetry dialogs.
#476: Confirm loss of changes when cancelling log playback configuration.
#820: Convert calibration - populate save dialog with file name.
#618: CAN RX setup, mask was always set to the value of the ID after editing.
#857: Fixed slow scrolling when using scrollbar buttons on table/map grids.
#294: Improve message if user has duplicate parameter mappings in log playback.

================================================================================
Version 4.02.09 - 17 September 2015
================================================================================

Fixed map site target and map slice not handling change to map axes (e.g. 
   switching between throttle and engine load).
Modified patch to wxWidgets to fix issue with painting combo boxes.
Resolved a couple of issues with sizing of axis headers on map/table grids.
Fixed issue with headers when switching orientation of table grid views.
Fixed function dialog when in 'advanced' mode.
#901: Added option to smooth function to 'lock' the corner values of the selection.
Modified the way that smoothing parameters are translated into filter coefficients.
#377: Preview of smooth & fill functions.
Fix possible crashes resulting from smooth/fill box being open and attached 
   view being destroyed.
Hide/show smooth/fill views if tab changed.
#622: GEMS staff option to create cal filled with FF.
#669: re-enabled dragging of list elements in parameter/option grids and 
      fixed issues with editor not opening when clicking on selected cells + 
	  not dragging.
#580: Option / parameter lists can now be dragged and merged into other lists.
Options/parameters may now be dragged out of lists to create a new selection 
    list.
Inhibit autoscroll of View Explorer when dragging items and positioned over the
   tabs area.
Removed Alpha Sort property for Option Select List and Parameter List.  This is
    due to confusing behaviour when inserting items into sorted lists.
	It is possible to permanently sort lists via the context menu.  Lists 
	that were previously sorted in tab files will be converted to permanently 
	sorted lists.
#918: Add selectable sorting to calibration convert unassigned lists.
#838: Serial telemetry setup: LSB column for ECUs that support it.
#832: Development workflow feature; If original source GIN file changed after 
    installing it, prompt to re-install the GIN file.
	This feature can be disabled in the general preferences.

================================================================================
Version 4.02.08 - 03 September 2015
================================================================================

Fixed #916: Import of LSB settings from CAN Telemetry Setup (.cts) files.
Added firmware debugging aid to descriptions view for finding original variable 
   names/file.
Fixed spelling of Celsius.
Store units in stf log files downloaded from ECUs.
Fixed taking screenshots of windows (required wxwidgets patch).
Adjusted algorithm for calculating decimal places to display on maps.  If the 
   derivative is > 1 but when divided by 0.5 gives an odd result then a single 
   decimal place will be displayed.
Fix applied to wxWidgets for issues taking window screenshots.
Fixed issue of scrollbars under axis header on map/table grids when taking 
   screenshots.
Fixed regression in log map controller which would result in large error values.
Added method of resetting weighting values in log maps.
Modified state information in log map controller to display error residual and
   change values.

================================================================================
Version 4.02.07 - 30 July 2015
================================================================================

Updated to Visual Studio 2013.
Updated to wxWidgets 3.0.2. 
Updated to boost 1.57.
Updated to CrashRpt 1.4.3.
Updated to v8 (JavaScript) version 3.30.10.  Major API change.
Updated portmidi version (no longer required pm_dll).
Updated to mesa 7.8.2.

Fixed issue with scope grid lines drawing outside of plot area.
Disabled support for piccolo telemetry until an updated SDK can be obtained.
Removed "Enabled" property for views.  If a view is disabled then it is not 
   possible to re-enable it.
Many fixes / changes due to wxWidgets update.
Fixed unusual behaviour when comparing a byte option with a commcode option.
Fixed crash saving colour scheme if folder does not already exist or if the 
   save fails.
Fixed some timebase issues with GLO format log playback / display.
Enabled opening of STF files in log playback that previously could not be 
   opened.
#813 Fixed: CAN RX dialog - labels showing input parameter values flickers.
#911 Fixed: multi-select in options grid was causing multiple inc/dec via +/- 
     keys.
#912 Added: multi-select in options grid - can now enter values to set all 
     selected items.
#910 Added: double click on item in basic port settings page will select it 
     and connect to it.
#913 Added: CAN message copy and paste in CAN telemetry setup.
Added incremental find to object selection popup dialogs (i.e. type to 
     search list of names).
#915 Fixed: enabling user scalars in cal compare was not rescaling source 
   values.
Changed toolbar and tab bar appearance to a more windows8/10 flat style.
Don't auto-close ecu progress dialog if an error results in failure of the 
  comms operation.  e.g. failing to send a new calibration to the wrong version 
  of ECU.
Tentative fix for re-requesting ecu strings if ecuinfo dialog is open during 
  copro firmware upgrade.

================================================================================
Version 4.02.06 - 09/07/15
================================================================================

Fixed memory/resource leak following log download / ISP.
Fixed problem with log download dialog not correctly closing and when re-shown,
  appearing to start here you last left off.
Modified button text on log download dialog.
Handle abort of log download better.

================================================================================
Version 4.02.05 - 19/06/15
================================================================================

Fix applied for issue with ethernet ECU (EM80) log download that could result
  in spikes in the data.
Fixed occasional repaint issue when switching sub module view in the Audit view.
Improved log download UI flow.  Also now does not appear to process the log 
   twice.

================================================================================
Version 4.02.04 - 11/06/15
================================================================================

Fixed handling of ECC in EM80 log downloads.
Fixed abort if downloading the log and the binary file is locked by another 
  application.

================================================================================
Version 4.02.03 - 29/05/15
================================================================================

Resolved some issues with timeouts and port resets for ethernet ECUs;
Fixed dealing with out of sequence responses from Ethernet ECUs.
Fixed handling of malformed reset packet number responses.
If recreating an ethernet port, use the old sequence number + and offset 
    rather than resetting to zero.
Do not recreate the ethernet port every time the ECU is offline.

================================================================================
Version 4.02.02 - 15/05/15
================================================================================

#895: Added temperature difference units:
   temperature_diff:dC
   temperature_diff:dF
   temperature_diff:dK
#837: CAN Telemetry window: add byte numbering next to each line.
Fixed error in processing of v0.06 log files when no data could be read from 
  the file due to incorrect log markers at every frame.  The error message will
  now say that there was zero run-time rather than saying that allocation of a 
  buffer larger than the file was requested and resulted in log processing 
  being stopped.
#897: Disable internal logging setup on ECUs that don't support it.
Fixed crash editing table/map value in conversion template builder.
Fixed issue with broken menu bars on child dialogs.
Switch meaning of interpolate rows/cols when map grid orientation is swapped, 
  also fixed this for map Y axis grids.
Fixed map trails on orientation swapped grids.
Fixed handling of additive checksums that are wider than a single byte.
Fixed problem where comms monitor could stop updating after comms port was 
  re-opened.
Detect changes to ethernet address and reconnect to device with the same serial
 number.
If a new unique broadcast occurs when ethernet ECU is offline (i.e. a new 
 serial # is seen) then pop up the ethernet ecu discovered toaster.
Only show ethernet toaster popup for Auto-IP assigned addresses and localhost.
Option to display ethernet toaster popup for LAN based ECUs (see general settings).
Show ECU name/version in port settings for ethernet ECUs and hide port number.
Added ability to change IP address and serial number in Ethernet ECU simulator.
Use localhost (127.0.0.1) by default in ethernet ECU simulator.
Fix applied for corruption during burst mode ethernet log downloads.
#886: Added checking of NO_LOG_DOWNLOAD_NRF_CHECK meta-flag from GIN file to 
  suppress not-running flag check for log download.
If port fails to open when connecting and hotplugging is disabled, say so on
  connect dialog rather than saying that GW is retrying.
Added double click to program action on Pot View.
Fixed detection of onProgramButton script function on Pot View (program button
   could be hidden when it shouldn't be).
Orientation options for map target view.
Track map grid orientation from target view setting.
#905: Implemented wait for "Stat Prog EE" following calibration write / clear / 
   store changes in ECU.
#903: Set state of map sites programmed with potbox even when change is 0.
#900: Add Serial number in Title bar.
Made group selector on tab bar have a slightly darker appearance to distinguish 
  it more from the other tabs as being special.
Tentative fix for map graph not repainting when toggling 'view session changes'.
#891: load/save position/size etc of open/save cal and tab dialogs.
Added option to disable asking for store changes in ECU.
Added fields to specify raw log/setup to the ecu simulator + download these 
  files during log download procedure (useful for testing).

================================================================================
Version 4.02.01 - 16 January 2015
================================================================================

#894 - Ctrl-Shift-Tab to pop up group menu on tabs bar.
Turn off dongle protection in simtek tuner build.

================================================================================
Version 4.02.00 - 08 January 2015
================================================================================

Include floating point / reciprocal flag in radio telemetry exported GIN files.

================================================================================
Version 4.01.58 - 27 November 2014
================================================================================

EM80 log download: 
   Reliability improvements - now using a thread to keep a read handler 
     constantly active on the network socket - now missing less packets.
   Fixed some issues with downloading logs from legacy EM80s (would not quite 
     get to the end and may have a corrupted log).
   Fixed issue downloading empty log from EM80.
Avoid overhead of updating progress bar with high speed log downloads.
Include formatter string in radio telemetry exported GIN files.

================================================================================
Version 4.01.57 - 20 November 2014
================================================================================

Changes to increase EM80 download speed:
1) Prevent use of rate throttling when downloading log.
2) Burst mode download.
Reset rate throttling value following load of tabs etc.

================================================================================
Version 4.01.56 - 14 November 2014
================================================================================

Updated compiler to SP1
Updated to latest 2.8 branch of wxWidgets (2.8.12).
#836: Add support for driverless keylock dongle - KL3

#882: New log download dialog (while waiting for log to download fill in notes).
ISP wizard - fixed issue where fin file name in wizard was not being populated
   on next run of ISP (convenient for development or commissioning of multiple 
   units).
Added scriptable checkbox.
Added 'enabled' property for scripted controls.
Display syntax errors in scripts.
Resolved issue connecting to EvoX 00V44 due to the way in which comcodes were 
  written to the logbuffer.
Asynchronously determine if folders have subfolders in filesystem tree views 
   and hide '+' sign in tree if they don't.
Added export of radio telemetry to CAN telemetry setup.

================================================================================
Version 4.01.55 - 09 October 2014
================================================================================

Fixed crash connecting to ECU.

================================================================================
Version 4.01.54 - 03 October 2014
================================================================================

Fixed crash in release build when adding audit view.
Changed appearance of back/forward/up buttons on Audit view.
Added tooltips to back/forward/up buttons.
Change cursor when hovering buttons on audit view.

================================================================================
Version 4.01.53 - 03 October 2014
================================================================================

New Feature: Node based Audit View.

Gemscom library: Fixed sign extension bug when deserializing signed integer 
  discriminated values.  Could result in unexpected large values being displayed 
  for some options/parameters etc.
#880: Don't allow firmware files without '.fin' extension to be selected for 
  firmware upload.
#880: Don't allow supposed 'fin' files to be uploaded that look like they are 
  GIN or emerald files.
Tentative fix for crash report that occurred when ethernet broadcast received
   and ecu object was destroyed.
Fix applied for comms getting stuck following ISP in some cases.
Fixed: If a view failed to load then all subsequent views in the same 
   container would also fail to load.
Pot View: Display value.
Added co-processor firmware upload feature for EM80.
Fixed: Import of CTS mesasages >= 10.

================================================================================
Version 4.01.52 - 27 June 2014
================================================================================

Internal log processing: Rather than fail, insert channels with unrecognised 
  comcodes in the output STF file with generic names & unity scalars.
Fixed bug converting GLO to STF that could result in only part of the data 
  being exported.

================================================================================
Version 4.01.51 - 18 June 2014
================================================================================

#93: Added object description view.
#874: Ethernet ECUs were not showing up in connection config in some conditions.
#873: If Ethernet ECU name is ERROR IPC, show ECU is in error in connection dialog.
Added bootloader ECU names to relevant branded builds.
Fixed issue with display of values in Log Map objects.

================================================================================
Version 4.01.50 - 06 June 2014
================================================================================

Comms: If duplicate reads of the same address are encountered in a block read,
   split the block read at that point to avoid reading lots of duplicate values
   with the same timestamp.  Reduces CPU load.

Added timeout adjustment value for ethernet comms.  Additionally implemented a
  basic scheme to avoid very short timeouts from locking up the computer.
  
================================================================================
Version 4.01.49 - 29 May 2014
================================================================================

#16, #864: Add knob/potbox control for use in tabs (Add|Other|Pot).
Support signed bitmasked values in GIN files.
Fixed bug converting PC logs to STF format.
Implemented Ethernet ECU download.
Enabled Ethernet ECU in main-line build.
Implemented smoother rate throttling of comms if PC can't keep up due to screen
   refresh time.
Added commsOpsPerSec property to Ecu script object for comms performance 
  analysis.
Updated internal logging dialog to support EM80 setup.
Internal logging dialog now works on its own set of data which is then applied 
to the ECU.
Added local undo/redo to internal logging setup dialog.
Added menu/toolbar to internal logging setup dialog.
Modified layout of internal logging setup dialog slightly.
Use task dialogs in internal logging setup instead of less intuitive message 
  boxes.
Modified rate picker in internal dialog to indicate direction it operates in.
Display 'Not Logged' in grey text instead on 0x0000 in logging setup.
Fixed crash if the new file wizard is used and the tab selection dialog is 
subsequently required.
Got rid of "You cannot drop files of type ''" message if restarted due to a 
  crash.
MAP4000: Default to ON for match calname + filename.
Fixed error in internal Var comparison function comparing signed with unsigned.  
(Fixes negative parameter indexing unsigned table axis).
Changed capitailization of some automatically created directories for 
  consistency.
MAP4000: auto create directories in installer.
Fixed issue with non-linear axes on some table graphs 
  (e.g. Brake Pressure Table on evoxacd 00v16).
Fixed subtle coding error in link to controller code.  Unlikely to have any 
   observable effect.
Fix for error in serialization of 'valid max' in GIN files prior to GIN version 
   3.30.
Fixed possible unhandled exception adding cal validators.
Improvements to algorithm for finding ecu name/version in FIN files.  Some 
   ecu names were not being detected.  Additionally, since some ECUs now have 
   bootloaders, if the bootloader GIN was already installed then this could 
   have be matched in preference.  Standard name addresses are now used to 
   further refine the choice.
Added topic about grid/graph trails to manual.
Added topic about Pot view to manual.
Added method of inserting write cache barriers for ecu instruction ordering.
Fixed possible access violation from crash report.
Fixed issue decrementing some options that are == 0 and are specified as having 
   an integer value but are in fact of higher resolution.

================================================================================
Version 4.01.48 - 14 January 2014.
================================================================================

TC82 access mod.
Fixed issue with comms notifications from FTDI ports.
Branded manual changes.
Tentative fix for crash report when closing.
Tentative fix for crash report during connect.
Fixed crash programming map sites with modifier parameters.
Changed potbox config to be stored on a per-ecu basis rather than in the tabs 
   file.
Upgraded to CrashRpt 1.4.2r1609.  Fixes HTTP crash reporting.
Fixed possible crash when installing GIN as part of ISP procedure.
Fixed crash if GIN is installed when ECU Simulator is ISP'd.

================================================================================
Version 4.01.47 - 07 January 2014
================================================================================

Fixed automated build of branded manual.
Fixed pot-box encoder assignment when GIN file changes and the pot box dialog 
  is displayed.
#855: ECU | Verify - grey out if not connected.
Added table aliases for change injectors algorithm:
  Crank Fuel Table  => Start Fuel Throttle Table
  Crank Pulse Table => Start Fuel Pulse Table
Fixed issue making last selected cell visible on map/table grids.
Fixed auto-scrolling on grids when dragging a selection (now uses a timer).
Fixed - Cancelling ISP wizard no longer leaves ISP disabled in menu.
Fixed loading of validation limits from older GIN archives - was causing
   the calibration checker (if displayed) to read all parameters from the ECU.

================================================================================
Version 4.01.46 - 31 January 2014
================================================================================

Omex build: don't display view explorer or properties window in default 
   workspace.
Omex build: auto-install all gins included by installer at program startup.
Fixed manual vendor/product strings for some branded builds.

================================================================================
Version 4.01.45 - 30 January 2014
================================================================================

Updated branded build default preferences/colours.

================================================================================
Version 4.01.44 - 23 January 2014
================================================================================

Display additional large/small real value increment properties for tables/maps.
Added potential fix for unreproducible docked tab dragging issue.
Added potential fix for a crash from crash report.
Fixed: Occasionally incorrect repainting of table grids when linked selection 
       changes and the view scrolls as a result.
Fixed: Configuring a scope that was loaded from a tabs file (including default 
       tabs) would reset the title of the view.
Added ability to configure font size/policy on a per-axis basis for grids.
Fixed increment/decrement with partial selections on maps/tables.
Fixed getRaw/setRaw in scripts (and potentially more generally).
Fixed possible crash when disposing button scripts.
Fixed branded build log export.
Fixed serial telemetry info dialog title.
Fixed gain of values in serial telemetry export (values were being 
   interpreted as 16bit when they are 8bit).

================================================================================
Version 4.01.43 - 03 January 2014
================================================================================

#851 - Prevent multiple Firmware upgrade windows.
#840 - ECU Upload Firmware: A more prominent warning at the beginning of the 
       process.
#833 - Fixed delete button in tab list window (layout|tabs/windows).
#719 - Use default values from GIN for unassigned values in calibration convert.
#796 - Fixed: Pressing HOME then MINUS in option editor on a positive number 
       would decrement the value AND add the sign.
Fixed: don't set option value to zero if conversion from text fails.
Fixed possible incorrect display of autostore state in status bar after 
   connecting to ECU.
Fixes to bar gauge.
Fixed issue with 'Erase Log' button in Internal Logging Setup dialog - if the
   Log Reset parameter was not displayed on a tab, then the value would not be 
   read back from the ECU and the button would only work once and possibly 
   unintentionally modify other bits at the same address.

#657 - [developer feature] Tick box to re-install .gin on Firmware update.
#780 - Reload GIN file always (reloads tabs) when reconnecting following ISP.

Addressed issue with font sizes on some controls due to something going awry 
  with default font size.  This property is now always stored in tab files even
  if it is not the default value.

================================================================================
Version 4.01.42 - 19 December 2013
================================================================================

Fixed crash when using CAN telemetry setup window.
Removed auto-store warning from branded build.
#854: Don't check indiviual bits when generating alias list tool tips.
Fixed incorrect cache invalidation of internal logging setup tool tips.

================================================================================
Version 4.01.41 - 13 December 2013
================================================================================

Interim Release for customer test.
Shiftec CAN port mods.  Implemented message filter.

================================================================================
Version 4.01.40 - 13 December 2013
================================================================================

Interim Release for customer test.

Fixed alpha sorting on parameter grid.
Fixed Var::typeFromEmerald_DS_TYPE - this was returning the incorrect sign for 
  the given DS_TYPE if it was big endian.
Fixes to GLO writing issues.
Added units config to branded build.
Added 'Stretch' property to button view.
Added 'App' object (global 'app' variable) to scripts for control of 
   application features.
Fixed a possible crash when destroying scriptable buttons.
Tentative fix for possible crashes following reset of the current GIN file in 
  use.
Added Shiftec CAN adaptor port type.
Added options to full screen mode, allowing various things to be hidden:
   * menu bar
   * tool bar
   * status bar
   * edge-docked windows
Implemented grouping in table/map menus when there are a large number of items
   to reduce problems encountered with the use of such menus.

================================================================================
Version 4.01.39 - 01 November 2013
================================================================================

Fix for map graphs sometimes being displayed completely black.
Fixed cursor position in table/map grids under some situations.
[crashreport] Fixed potential problem in convert wizard called from ISP wizard.
#852 - Fixed incorrect bar gauge value for non-bipolar values.

================================================================================
Version 4.01.38 - 25 October 2013
================================================================================

In response to crash report, added some further checks when creating openGL 
  views.
Branded build changes.

================================================================================
Version 4.01.37 - 18 October 2013
================================================================================

#708: Take into account custom user scalar overrides when comparing cals (for 
  example pulsewidth/duty cycle on the fuel map.
Fixed massive lock icon in group context menu.
Fixed checked background appearance for menu items.
Tentative fix applied for incorrectly sized checkboxes in grids.
Fixed an issue with scope axis min/max values.  Moving to a version after 
  4.01.30 would cause any negative values to become very large positive ones.
  If this has happened to your tabs, you should reset the limits in this version
  to fix them.  Moving to this version from 4.01.30 or earlier should now work 
  ok.
Resolved an issue with overlapping labels on scope y-axis.
Prevent scope axis labels from being drawn if they go off-screen.
Added ability to set bar gauge font size in points (to match scope).
Condensed Right-Click menus.
Separate Right-Click menu for the tabs bar.
Implemented possible workaround for scrollbar issue on table grids.
Modifications to branded builds.
Fixed bug setting slice number on map slice views.
  
================================================================================
Version 4.01.36 - 03 September 2013
================================================================================

Branded build configuration changes.

================================================================================
Version 4.01.35 - 19 September 2013
================================================================================

Fixed incorrect retrieval of cached string values on grids if the map/table
  data type is not a byte.
Fixed retrieval of cell state in grids when a cached string is available.
Fixed crash saving comms monitor output to a file.
Fixed crash during ISP procedure.
Fixed a window focus issue - clicking on e.g. the comms monitor would not 
   focus the window.
Fixed crash opening preferences for some builds.
Fixed an issue modifying properties of scope and tacho views.
When sorting files in file dialogs, sort date columns in descending order first
  rather than ascending order first as this is what people usually want.
Renamed 'Upload Calibration' menu option to 'Send Calibration'.
Renamed 'Download Calibration' menu option to 'Read Calibration'.
Changed the working of the various locking menu options for global layout lock,
  tab-specific layout locking and group specific layout locking.
Fixed strange resizing behaviour if using a stretchable layout and the tab has 
   scrollbars.
Remove 'Close All Tabs' menu option.
Removed option to add icon to quicklaunch in installer.

================================================================================
Version 4.01.34 - 22 Aug 2013
================================================================================

Bugfixes:
Fixed an issue with sign extension of signed raw values.
Fixed crash setting min/max property of scope views.
Fixed issue processing GLO files that was broken since version 4.01.30.
Fixed bug writing GLO files (GLO FAT corruption) that could occur when there
  are a lot of output streams.
Fixed Log Reset button in internal logging setup dialog.
Fixed decrement key on grids etc (broken since version 4.01.30).
Fixed Optimize Fuel Map function.
Implemented workaround for bug where scrollbars could be incorrectly calculated
  after creating a new grid (e.g. table/map).
Fixed sizing of windows to 1 pixel below their minimum size that would cause 
   the bottom inner border to disappear.
Fixed subtle window resizing issue where moving the right/bottom border to 
  the minimum size and then moving the top/left border would move that border 
  up/left by 1 pixel.
For parameters with negative scalars, the bar in parameter grids is now 
  displayed the other way around so that the bar goes from low->high as with 
  other parameters.
Fixed pop-up toaster window sizing and hyperlink positioning.
Fixed: don't update notes panel when selecting files in the SAVE calibration 
   file dialog.
#847: Save File Dialog: When opening a folder in the right window, if there was 
   a file with the same index as the folder selected in the previous view, it
   would be selected.
Fixed a slightly odd resizing behaviour on chromeless windows (i.e. windows with
   no title bar or border, being resized from the right to be smaller than is 
   allowed).
Fixed some issues with user scalars using divided multipler/offset options.
   
Features:
Ethernet comms (GEMS internal use only, currently).
Ethernet ECU simulator (GEMS internal use only, currently).
Ethernet ECU autodetection (GEMS internal use only, currently).
Converting GLO to STF will now use the hard disk if memory usage gets high.
Added text alignment properties to Label View.
Added bold property to Label View.
Added prefix/postfix text options to Number View.

Optimizations:
Various optimizations/caching when handling parameters/axes/userscalars etc.
Caching of option user scalar option values for faster value scaling in the 
  general case.
Pre-calculation of raw->real and real->raw conversion chain for options/
  parameters/tables etc to avoid lots of unnecessary checks & branches.  
  The real/raw conversion code is frequently executed and is now over 
  2x as fast on average.
Grid rendering optimizations:
  caching of string values
  caching of state values
  more optimal cell colour calculation
  brush/pen recycling

Notes:
Updated to boost version 1.54.
Added more extensive unit tests for real/raw value scaling.

================================================================================
Version 4.01.33 - 20 June 2013
================================================================================

Fixed: Changing maximum value on tacho would sometimes not work.
Fixed problem incrementing/decrementing raw values that have a mask with >1 bit.
Fixed error with serialization of limit values leading to lots of items in the 
  calibration checker and major performance loss if calibration checker panel 
  displayed.
#842: Removed 56000 Baud option.
#843: Fixed crash opening internal logging setup dialog.

================================================================================
Version 4.01.32 - 23 May 2013
================================================================================

Fixed error in GIN serialization affecting GINS from version 2.28+.

================================================================================
Version 4.01.31 - 17 May 2013
================================================================================

Fail ISP if ECU returns an invalid control character.
24/32/64 bit raw ECU value support.
float/double raw ECU value support.
This is a major change to the inner workings of the software and could have 
  some side effects.

================================================================================
Version 4.01.30 - 14 March 2013
================================================================================

Always update calibration file checksum when uploading or saving.
Always write calibration checksum with the exact address of the checksum.  This
  will resolve an issue on many ECUs that will not otherwise write the 
  calibration data to EEPROM following a write unless the checksum is 
  word-aligned.
When uploading firmware and a GIN file is required to be installed, following 
   install of the correct GIN, the wizard now indicates that the GIN is now 
   installed.

================================================================================
Version 4.01.29 - 28 Feb 2013
================================================================================

Fixed crash if another operation such as 'verify' is selected from the menu 
  whilst a connection is part-way through being established.

Correct telemetry info scaling equation offset values.
Log processing: take into account user scalars/sign for bitmasked values.

================================================================================
Version 4.01.28 - 01 Feb 1023
================================================================================

Updated v8 JavaScript engine to version 3.16.1.
Fixed extended protocol reads of 256 bytes or more.
Implemented improved display of internal logging setup for ECUs that have v0.06
log files.
Made some modifications to CTS file format.
Modified CTS export.
Implemented DBC export from CAN telemetry setup.
Added "CTele? M?? Disable" to CAN telemetry setup (CTS) dialog.
Added "CTele? M?? Rate" to CAN telemetry setup dialog. 
   "CTele? Rate?" was available but inconsistent.
Adjusted sizes of CTS and STS dialogs.
Display LSB selector column in CTS dialog.
Added HAS_SERIAL_TELE_FIXED_VALS and HAS_CAN_TELE_FIXED_VALS
Added method of entering fixed values in CAN telemetry setup.
Display bitmask on parameters from comcode selector.

================================================================================
Version 4.01.27 - 03/01/2012
================================================================================

Internal logging setup: display channels and rates correctly for ECUs that 
  have 'linear' internal log format.
  
Add some additional info to the clear security message to say that the ECU may 
  require power cycling.
  
Implemented Gemscom connection over CAN (using PCAN hardware).

Fixed: When tabs are cleared, reset the selected tab group name.
Ensure that the first default tab is selected when tabs are reset.

================================================================================
Version 4.01.26 - 13/12/2012
================================================================================

Enable direct FTDI comms ports in branded builds.

================================================================================
Version 4.01.25 - 01/11/2012
================================================================================

#18: Multiple traces on Scope view, added scope configuration dialog.
Added option to draw scope values from the right hand side of the scope and 
  scroll the trace as new data is added.
#827: Fixed axis gauge parameter not being re-bound when dynamic table axis 
  changed.
#824: Option to display modified map/table/option values in BOLD text.
Fixed problem reading tab (gxt) files in some cases due to failure to convert 
  the character set used by the file.  Applies to all archives.
If writing ECU security fails, retest rather than disconnecting.
Removed unused scope 'buffer size' property.
Resolved issue in some branded builds loading ftdi driver stub dll when 
  not included in install (or required) and there is an incompatible version 
  installed in system32.
Fixed bug causing incorrect addressing when using option-list dropdown boxes 
   on table grids.  This bug was due to some low level code that could have had
   more widespread problems.
Fixed bug when using option-list dropdown boxes in table/map grids that caused 
   the dropdown box to be populated with the text from the first cell rather 
   than the selected cell.
Fixed crash exporting serial telemetry sts file with hex values in the list.
Don't display cal name in title bar for builds that don't have it enabled.
Log processor - add guard against huge allocations due to incorrect run-time 
  calculation.
Fixed processing of v0.06 internal log files.

================================================================================
Version 4.01.24 - 05 October 2012
================================================================================

Modification to remove index based handling of tabs when saving current tab.
  Also fixes saving of tabs in aspect files if the tab is in a group.
Fixed some issues moving tabs using windows/manage tabs dialog.
Made calibration aspect dialog non-modal.
#825: Option to build calibration aspect from calibration comparison.
Fixed erroneous dongle message.
Implemented v0.06 internal log format processing.

================================================================================
Version 4.01.23 - 27 September 2012
================================================================================

#22: Tab groups.
Implemented new tab control with better visual feedback when moving tabs.
Added ability to pick tab icon from the new tab dialog.
Fixed some errors drawing tab thumbnails in ctrl-tab popup view.
Added keyboard shortcuts for switching between tab groups by index.
Added menus for tab and group switching for discoverability.
Implemented drag/drop of tabs and tab groups in windows list window.
Implemented autoscroll when dragging/dropping in windows list.
#63: Auto-scroll in 'view explorer' tree when dragging items.
#807: Gin file for demo setup is not installed on first install giving error 
    message on very first start.
Added scripting to NumberView control.
Added scripting to Label control.
Added getString and setString functions to object script bindings.
Changed label property Label.Label to Appearance.Text.
Implemented visibility flag for properties in grids.
Added delete key handling when editing group views with borderless windows.
Added more icons for use by tabs.
Added check for corrupted strings (in excess of 128MB length) in archiver.  
  Avoids crash when loading corrupted GIN files in some cases.

================================================================================
Version 4.01.22 - 31 August 2012
================================================================================

Fixed some potential crashes arising from window modality when errors are issued
  by the ISP wizard and closed after the ISP wizard is closed.

Fixed crash opening ECU connection setup on some builds.

#798 Fixed: Switching to a tab with a map and trails enabled can show an 
            erroneous site in the trail history.
            
Updated branded build tab files.
            
================================================================================
Version 4.01.21 - 03 August 2012
================================================================================

Changed "Save Calibration Aspect..." to "Create Calibration Aspect...".
Moved Open and Create calibration aspect menu items in the file menu so that 
  they are together.
Added ability to generate aspect files based upon the items on the current tab.
Added ability to store the current tab layout in aspect files and load it when 
  applying an aspect file.
Changed file dialog for aspect files to the same one used for calibrations
  so that notes may be specified and viewed.
Set/Select state in map/table menus now have user-assignable keyboard shortcuts.
Added option to change the opacity of grid selections.  
  Selection opacity now defaults to 0.75 rather than fully opaque.
Fixed a few bugs in dial editors for real value properties (range constraints).

================================================================================
Version 4.01.20 - 02 August 2012
================================================================================

#803: Map grid does not display gradient correctly unless graph is also shown.
Fixed some issues with empty calibrations.
Implemented UTF8 encoding in xml archives (allows the use of unicode in tabs).
Added Parameter Freeze.
Added Parameter Hold.
Added Maths Quick Keys.
Added Option Quick Keys.
Added Selection Quick Keys.
Arbitrary COM port baudrate selection for testing.
Firmware upgrade requests for branded build.

================================================================================
Version 4.01.19 - 21 May 2012
================================================================================

Updated to Emerald version 4.28.
Use UTF-8 for calibration notes - allows unicode characters to be used in 
  calibration notes.
Flag PC log exported to STF format as ECU logs with the ECU name/version.
Fixed potential stack corruption CAN telemetry import/export.
Moved all code to use Emerald4 rather than the old emerald dll.

================================================================================
Version 4.01.18 - 15 May 2012
================================================================================

#801: Fixed some OpenGL rendering issues on 3D maps.  
      Fixes rendering on Intel GMA 3100 graphics.
Accelerated OpenGL map rendering no longer does pixel readback when DWM 
   (Windows Aero) is NOT enabled.  This improves performance on non-aero systems.
   When Aero is enabled you will otherwise get severe flickering when resizing
   windows.  This workaround can be disabled in the application preferences.
Slightly reduced batch count when rendering maps.
Fixed toggling of some on/off options.
Scripting: Fixed critical bug that could cause crashes. 
Scripting: Fixed getRaw() and getReal() so that you do not have to specify axes.
   (would result in 'Invalid Object' errors).
Fixed: expanding selection left on grid (shift-left arrow) would wrap.
Fixed slight map grid rendering issue when selection changed and grid scrolls.

================================================================================
Version 4.01.17 - 01 May 2012
================================================================================

Added PC logging to a branded build.
#794: Double clicking EE status pane now programs the checksum.
Removed requirement for scripts to define axes for setRaw and setReal calls.
Removed power cycle request at end of programming serial number.
Performance enhancement to function objects.
Fixed text rendering on 3d maps in non-accelerated 3d mode.
3D map: draw wireframe in a single batch. (performance enhancement).
Updated to v8 scripting engine to version 3.10.7.

================================================================================
Version 4.01.16 - 03 April 2012
================================================================================

Fixed bug in FTR_ACK handling.

================================================================================
Version 4.01.15 - 03 April 2012
================================================================================

Change the way FTR_ACK works.

================================================================================
Version 4.01.14 - 03 April 2012
================================================================================

Implemented FTR_ACK, added to ECU simulator for testing purposes.
Updated to v8 scripting engine to version 3.9.24.7.

================================================================================
Version 4.01.13 - 27 March 2012
================================================================================

#782: Changed scripting engine to use Google v8.  
   The engine is of higher performance compared to the old one.
   It should resolve some issues with garbage collection slowing down the 
   application at some points.
Added new script error window with 'goto error' (displays script editor at the 
   position of the error).
#793: Improve feature upgrade dialog.

================================================================================
Version 4.01.12 - 09 March 2012
================================================================================

Support GIN file version 3.29.
#612: Handle extended CAN ID's in CAN Telemetry.
Fixed extended CAN ID's in CAN RX setup.
Fixed potential crash when closing calibration file browser with the tree view 
  shown.
Don't serialize function objects / user log maps if disabled in branded build.
Fixed 'Manage User Objects' dialog (list was empty).

#792:
Remove duplicate FxObject and UserLogMap instances resulting from loading of 
  tabs.  This is a particular issue when loading tabs into other tabs files
  and can escalate to a situation where the user interface takes a long time 
  to open and close tabs files (slow to open cals, connect or close the app).
Lazy instantiation of FxObject script object (prevents JS garbage collection of 
  duplicate objects when serializing user objects.

Remember user selection in install gin dialog for manual install.
Use Axis table formatting if the axis uses a table as an axis.
Use user scalar formatting for non-table axes.
Axes may now specify value formatters for gin versions 3.29+.
User scalars may now specify value formatters for gin versions 3.29+.
Fix font size on FxObject grids.
SA BOOST support.

Changed terminology of 'Default Tabs' to 'Cached Tabs' when referring to 
automatically saved tabs that have been previously been viewed, rather than 
those that the user has manually saved - it is more descriptive of the concept.
#688: Revert to cached tabs menu option.
Added menu option to delete the currently cached tabs, since user management 
  these files is difficult.
  
Prevent changes to FxObject scripts from making the calibration appear modified.
Added display of current time position on scope view.
Compare commcode options by raw value if they are not assigned to parameters.

================================================================================
Version 4.01.11 - 01 March 2012
================================================================================

Branded build configuration changes.
Fixed potential crash using arrow keys on map graph if the keyboard focus was
  somehow moved to an unexpected control (rare).
Fixed erroneous handling of home/end keys when setting selections on 3D maps.
Fixed bug that prevented log download from secure ECUs that allow it.
Password dialog is now customized based upon the reason for connecting (e.g. 
  it does not offer 'clear' if downloading a log file).
Added download of data from specified unsecure areas of the gin when secured.
Display empty map/table grid cells if containing secure data (when ECU secured).
Fix for bug in xml parser.

================================================================================
Version 4.01.10 - 23 Feb 2012
================================================================================

Fixed object finder.  Caused ISP enable code not to be found when uploading 
  firmware.

================================================================================
Version 4.01.09 - 22 Feb 2012
================================================================================

Support GIN file version 3.28.
Fixed memory leak in file browser if the folder tree view is used.
Fixed crash following a change to the loaded GIN file.
Fixed crash following drag/drop over a tab that causes a reload of the tabs.
Fixed some bizarre number formatting when decimal places specified on axes.
Auto decimal places on maps/tables now gives a consistent number of decimal 
   places on all cells.
Modified auto font size algorithm on maps/tables so that the size is consistent
   regardless of the magnitude of the values in the cells (now based upon 
   maximum range).
Added early-out optimization for auto font size calculation now possible due to 
   modified font size fitting algorithm.
#773: Support Table and Map objects in RAM.
#790: Decimal places property was not stored for table based map/table axes 
      in the tabs archive.
#791: Dynamic Table/Parameter names based upon an option.
#727: CAN Telemetry: Show Info: Fixed gain column.
#541: Virtual potbox: don't show blank form when no modifiers available.
Added workaround for long-standing issue with running timer and exit of modal 
	dialog event loops.  Could cause a crash when pressing a button on e.g. a 
	parameter list item selector if it had already been used but appeared to 
	fail to add anything to the list (typically when under high CPU load).
Allow trimmed file extensions in cal file filters 
    e.g. "evox.00v01.cal" as well as "evox    .00v01.cal".
    We may move to this format by default one day, so it is handy to have the 
    support for it now for backwards compatibilty in the future.
    Additionally, some email clients strip spaces from file extensions in this 
    way, leading to confusion.
Display items with raw codes in CAN telemetry info.
Added option for branded builds to also see ".cal" files in the cal browser.
Branded dongle check now offers dongle update.
Fixed help files not being found in branded builds.
Added optimization to Ecu Simulator.
Added a couple of optimizations to some commonly used code.
Applied some optimizations to some string handling routines.
Optimized painting of table/map grids.
Added some optimizations to painting of parameter grids.
Optimizations for getting string values for options/maps etc (less allocations).
Made axis size calculation stable for map grids when auto stretch axes enabled.
Fixed unstable parameter/option grid auto font size calculation.
Optimized parsing of archives.  Should result in slightly faster tab loading.
Added a couple of optimizations to writing of archives.
Don't update real cache for all data models if they are not in use.  Reduces
  tab load time significantly when there are unused function objects (scripted).
Optimized lookup of objects in the Gin by name (orders of magnitude faster).
Many archives are now written in a slightly more compact format that is faster 
  to write and parse.
Fixed a possible crash accessing zero length ECU strings in old gin files.
Text on 3D maps is now drawn in a single batch to improve rendering speed now 
  that hardware accelerated rendering is used.  This also means that the 
  entire text rendering system for 3d views has changed and fonts are also 
  antialiased.
Fixed a 3d map rendering issue with non-accelerated renderer.
Fixed crash converting glo files to stf when converted source channels are 
  empty.
Default to showing '(All)' versions in the tabs file browser.
Workaround for PCs that don't support high resolution timers.
Reduced log playback clock rate as it was hammering the CPU.

================================================================================
Version 4.01.08 - 31 Jan 2012
================================================================================

Fixed crash in Cal/Tab file browsers.

================================================================================
Version 4.01.07 - 27 Jan 2012
================================================================================

Supports GIN file version 3.27.

Crash report: Tentative fix for when connecting to an ECU after loading GIN file.
ISP: Change baudrate after upload of FIN file, if required.
Fixed crash when constructing JS Gin object (due to JS garbage collector).
Setup new branded build.
Fixed a couple of issues with path handling in the calibration an tab file 
  browsers that could lead to unusual empty paths showing up in the address bar.
Convert cal: same ECU type as source cal now highlighted automatically for 
   manual convert to save mouse clicks in the most common case.
Convert cal: double click of version in manual convert selection goes to the 
   next page in the wizard.
Update ECU simulator display from timer.
Added parameter scripts feature to ECU simulator.
Removed bias value from multiplicative map modifiers when programming map sites.
Scripting: replaced Array objects used to hold maps/options/tables etc in the 
  'gin' object with EcuItemCollection objects. 
  This drastically reduces the cost of instatiating Gin objects in the script 
  context and also reduces the performance hit associated with running the 
  JS garbage collector.
Close views panel config dialog if Gin file closed to prevent later crashes.
#784: Store/restore raw comcodes in cts files in addition to parameter names.
Fixed bug in change detection for object models that could lead to a high 
  number of false-positives.
#785: Dynamic User Scalar Units.
#786: Dynamic axis tables/parameters for tables and maps.
Implemented hidden items (as specified in 3.27 gin files).
Potential for infinte loops in a couple of places ShellPath should now 
  generate a crash report rather than hang.  
  There has been a situation out in the field where the cal browser hangs - 
  perhaps this will help identify the cause.
Implemented HTTP crash report server, since existing SMTP method appears to 
   fail on many machines.
Fix crash in internal logging setup dialog if the GIN file does not define 
  the correct number of log codes.
#776: Loading in a tabs layout, parameter list locks are not remembered.

================================================================================
Version 4.01.06 - 20 Dec 2011
================================================================================

Fixed major handle leak in map/table grids.
Fix possible crash due to drawing scope with a small size.
Added property to draw scope with no axes.
Draw scope with no axes when it is small.
Fixed issue with item selector in ecu simulator not being updated.
Added oscillators to ECU simulator.
Ecu simulator now remembers parameter setup and calibration data.
Infinite trails setting was not stored correctly in tabs archives.
Added drop-down menu to trails tool in grid/graph toolbars.
#350: Should have min and max zoom sizes for 3D maps.
Added switch between rotation mode and selection mode on map graph toolbar.
Added action to allow custom shortcut to toggle rotation mode.

================================================================================
Version 4.01.05 - 13 Dec 2011
================================================================================

Trails on map graph on wireframe rather than fill.
Ignore invalid blocks in v0.4 log files.
Improved comms performance (at the expense of timestamp accuracy).
Further optimizations to comms.
Optimized painting of cursor on map grid.
Cached user scalar pointer optimization.
Removed unnecessary gin check when reading values from ECU object.
Optimizations applied for accessing calibration memory.
Parse 'CTele1 Extended01' as equivalent to 'CTele1 id1 ext'.
Avoid axis lookups on 3d graphs when follow ecu is off.
3D Map: Fixed getting stuck rotating the when ctrl released before mouse button.
Made hardware accelerated map rendering work.
Made hardware/software 3d rendering an option in the installer.
Use a single OpenGL context across all 3D map renderers.
Use 1D textures where appropriate to avoid issues on some gfx hardware that 
   require square 2D textures.
Make rendering trails on the wireframe/fill of 3d graphs selectable.
#772: Failed command - address is actually in decimal even though it is 
      displayed as a hex number.
Added label view.
Fixed some focus issues with borderless windows.
Make individual tabs have a lockable layout.
Scripts can now find buttons and labels on the current tab.
Scripts can now change the text of buttons and labels.
Made it possible to group a layout into a sub-window (like a dash in GWv3, but 
   any views can go in there).
Fixed some problems with the selection overlay not tracking the movement of the 
  parent window.
Views may also specify an ID that can be used to find them, not just the title.
Added findWindowByID js function.
Added Number Edit view.
#515: fixed a lock-up bug in 'find' function when using a filter script.
Fix drag/drop of files from Thunderbird 3 email client.
When pasting components, select them.
Added ability to set tooltips on views.
Fixed some issues unlocking security on multi-command capable ECUs.
#489: Detect if ECU becomes secured whilst online.
Performance optimization to XML archiver.
Defer construction of gin/ecu in button scripts to speed tab serialization.
Defer construction of gin/ecu in function object scripts.
Fixed potential crash post-ISP when no default tabs set up.
Improvements to Auto ISP procedure (ISP from package install).
#775: Error EE Checksum indicator in status bar.
Adjusted statusbar layout slightly.
Updated to boost 1.48.
Implemented 'linear' internal log file format processing for TC90.
Made reset map trails on 3d maps work.
#71: Make map graph controls hide-able.
#72: Add control strip to map/table grid.
Tentative fix involving sorted gin item models [from several crash reports].
Added large text overlay for percent change with RMB on map graph.
Show soft selection when map grid is in state text colour mode.

================================================================================
Version 4.01.04 - 18 Aug 2011
================================================================================

Fix crash when downloading an internal log with no calibration open.
Use correct temporary file name for log download if not yet connected to ECU.
Abort log download procedure if wizard is closed using the 'X' button.
When clearing calibration with default values, calculate the checksum of the 
empty data.
Fixed parameter limits.
#777: Keyboard shortcuts: some shortcuts are not remembered between sessions.

================================================================================
Version 4.01.03 - 13 Sept 2011
================================================================================

Fixed crash opening view explorer configuration on some builds.
Fixed user folder handling problem in some builds.
Fixed an issue with keyboard shortcut conflict checks.
Tentative fix for crash populating parameter limits dialog (from crash report).
Tentative fix involving object selector popup & categories(from crash report).
Tentative fix for crash opening potbox config.
#734, #758.
#697: Implemented serial number programming.
#761: Fixed: Setting map grid to follow mode freezes parameter updates.
Optimization to update of partial selections when variance==0.
Optimized a few commonly executed sections of code.
#765: Dialog to display values of serial number and other ECU strings.
#766: Zoom keys on map graph should be configurable.
      Made zoom out key 'A' / 'Shift-A' because previous key 'X' was in conflict 
      with interpolate-X.
      Adjusted keyboard zoom resolution slightly for finer control and more 
          useful coarse zoom level.
#769: If an option write fails, read from the ECU and restore the calibration 
	  state.
#735: Toggle coarse/fine mode for edits to maps.
#759: Position indicator disappears if moving selection with keyboard on 3d map.
Fixed issues with position indicator disappearing on 3d map when setting 
    selection from a map grid.
Ctrl-HOME/Ctrl-END now move to home/end in the Y axis of map views.    
#762: If grid axis selected, 'Switch graph/grid' menu item was disabled.

================================================================================
Version 4.01.01 - 11 Aug 2011
================================================================================

#757 - Does not have CAN telemetry menu enabled for any ECU types.

================================================================================
Version 4.01.00 - 10 Aug 2011
================================================================================

User node in view explorer is now saved under a different entry in the tabs 
  archive. This is to prevent tabs files containing user items from crashing 
  older GWv4 versions.  It does mean that any user views saved with this 
  version onwards will not be displayed on older versions of GWv4.
#54: User defined log maps.
#733: Internal log download: take into account scaling options when calculating 
   min/max values for the output scaling sensors.
Prevent invalid log_start in downloaded internal logs from causing allocation 
  failure and aborting the application. 
Fixed some issues restoring shortcut keys since 'all' view added to shortcuts.
Shortcuts: moved items from 'layout' to 'view' that were in the wrong place.
Added 'User Objects' menu to 'View' menu for managing function objects and 
  user log maps.
Fix editing of FxObject's when it has a setRaw function.
Update FxObject values in response to changes elsewhere in the calibration.
Fixed some errors in constructing scripting wrappers, leading to undefined 
  properties.
Function objects can now define realFromRaw and rawFromReal.
Function objects can now define getMinRaw and getMaxRaw.
#656: Generic incremental search algorithm for grids modified so that:
  a) Pressing the same letter multiple times cycles through values starting 
     with the same letter.
  b) Incremental search starts from the start of the current selection.
Manual GIN installation: remember last gin file path for the current session
  as an aid to firmware development.
#645: Should not be able to delete root nodes from view explorer.
View explorer: drag and drop incorrect when view scrolled.
View Explorer: drag/drop of items in user folder now moves rather than copies.
View Explorer: "add to current tab" option.
View Explorer: group items with add to current/new tab options.
View Explorer: user parameter/option items were not storing object reference 
               in the tabs file, so would create empty views.
View Explorer: can now drag folders into the tabs area.
View Explorer: Prevent dragging of parent items into child items.
View Explorer: Delete multiple items now works.
View Explorer: Many items are now lazy-created to reduce load times.
View Explorer: Edit function-object/user-log-map from right click menu.
Just output warnings when objects not found during load of the views model.
Avoid crash if potbox configuration dialog displayed with an empty session.
Avoid crash if potbox configuration dialog if item selected with no port selected.

#563: Added check box to compare window to configure user scalar policy.
      More granular control is still available via the properties window.
#732: Extra columns in compare (e.g. % difference) are not sorted correctly.
Prevent crash trying to set limits on an empty entry in the parameter list.
Space bar to select nearest site now works in map graph as well as grid.
Ecu simulator now less costly to instantiate.
#739: Change 3d map site cursor again.
Object name property added to table/map views - allows the user to find out 
  what object is being referenced by the view as it may not be consistent 
  with the view title if the tabs were converted from a different version
  of ecu.
Implemented storage of user log map data in the calibration file.
Show menu bar and status bar in fullscreen mode.
#738: Add reset option [R] to hold mode dialog.
General: Grids: If dragging a selection's bounds, allow single items to be 
    selected.
#644: Make View Explorer more configurable, like menus in GWv3.
UUID search for user objects to avoid issues with lazy-loaded tabs after a 
  user object name has been changed.
Made keyboard shortcut to select nearest table/map site configurable.
Implemented 'select nearest site' on table graph views.
Added option to auto-popup status window to its context menu.
#744: Tabs window list dialog.
Smooth dialog - change default to have 'on selection' checked.
Change default shortcut for hold mode to 'H' rather than Alt-H.
Modified hold mode dialog to use a generic quick keys dialog.
#736: Added Maths Quick Keys dialog.
#742: Scroll map grid to make selection visible when changed.
Change scroll step on map grid to avoid ugly areas when scrolled fully across.
Improved error message when ISP fails due to missing ISP Enable Code.
#731: Piccolo telemetry does not update view anymore.
Refactored grid trail handling.
#714: Map trails on 3d view.
Use wireframe colour when drawing thick selection lines.
#665: 3D Maps: Percent change by dragging right mouse button.
Changed name of 'Fill' function to 'Sparse Fill' as it is more obvious as to 
   the function of the algorithm.
Changed Sparse Fill frame to a dialog and made the dialog accept when pressing 
  Enter key.  Also now populates fill algorithm.
Changed Smooth frame to a dialog with ok/cancel buttons.
Added copy-fill feature for tables/maps.
Improved COMOK efficiency in ECU simulator.
Comms Monitor: Improve timestamp->string efficiency.
Comms Monitor: Refresh view in response to data updates via timer only.
#600: Function dialog: make "Apply to selection" checked by default.
#745: Function editor now displays a 'simple' view by default for quicker edits.
3D Map: Display crosshair at site selection cursor.
3D Map: Do not display hovered mouse position value, only show selection cursor 
        value.
3D Map: Only draw 'shadow' when in 'Fill' mode.
3D Map: Antialias shadow rendering.
3D Map: Removed 'Projection' text.
#728: Gradient legend on 3d map graphs incorrect when an overlay is used.
Fixed 'clear' button in keyboard shortcuts dialog.
Display shortcut keys in upper case in shortcuts dialog.
Changed "Toggle Follow ECU [Hard]" shortcut to 'L' rather than Ctrl-E.
Added 'Toggle Follow' and 'Select Site At Cursor' actions to Follow ECU 
  context menus to make the shortcut keys more discoverable.
Added options quick keys (currently allows control of trails).
Trails now default to infinite time.
Reduced View Explorer notifications when loading templates (improves speed).
Moved fuel map functions to a sub menu in fuel map context menu.
Grid orientation would not be stored in tabs file if all flip options disabled.
#741:  Axis flip options for map graphs (Orientation properties).
#750: Setting flip of Y axis on map grid messes up width of Y axis.
#748: Fixed an issue where selector button clicked while waiting for 
      parameters to be added to a parameter list would crash.
#751: Fixed: Adding several parameters at once is slow.
#752: Fixed: Deleting a large number or parameters from a list is slow.
Optimized creation of item selector in parameter/option lists.
Optimized creation of popup dialog for item selectors.
Optimized lookup of bitmap resources to generally speed up tab loading.
Optimized Telemetry/internal logging parsers by reducing string allocations.
#754: Calibration Name: stored setting for the checkbox not updated when 
   creating the dialog.
#749: 'Places' panel in cal/tab file browsers.
#756: Range mode is now specific to the underlying object of a view - changing 
   the mode will affect the gradient and drawing range on all views.
   This change will break old tab files slightly that had ranges configured 
   for specific views. 
#427: Range mode for gradient now selectable for map/table grids.
#33: Added basic stretchable layouts (disabled by default, can be enabled per-tab).
#57: Display value of cells on map grids with tool tips.
Min/Max ticks on parameter grids can be enabled/disabled.
Added shortcut hint to tab tool tips.
Fix potential crash closing the application when the help window is open.

================================================================================
Version 4.0.52 - 28/06/2011
================================================================================

Fixed crash often occurring after log download on ECUs with GIN files that have 
   value formatters defined.
#724: Thick lines option around selected sites on 3d maps.
      Cursor cross option on 3d maps.
Make expandable min/max on parameter grids optional.  Defaults to OFF.
#725: Min/Max parameter hold mode.
Added min/max telltale ticks on parameter grid.
Tentative fix for crash when closing CAN RX dialog whilst online.
Tentative fix for blue screen when using ATEN adaptor with RTS pulse option off.
Numer/Tacho/Bar gauges are now movable by dragging from anywhere in the window.

================================================================================
Version 4.0.51 - 22/06/2011
================================================================================

Could not set LogMap target grid values.
Store show/hide state of title bar and border in tabs archives.
Added "Select Window" item to layout sub menu of view windows.
Use tabs area background colour as thin border if thick border is hidden 
   unless focused.
Click in blank area of tabs to blur focus on view windows.
Fix some issues setting colours and gradients from the properties editor.
Resize/move handles for borderless windows.

================================================================================
Version 4.0.50 - 15/06/11
================================================================================

Colour picker now uses a tabbed dialog box for selecting colours (apart 
  from autocompletion drop-down).
Gradient picker now uses a tabbed dialog box for selecting gradients.
#711: Parameter min/max display.
#199: Indicator that PC logging is active.
#721: PC Logging: display time logged.
#126: Tacho background should be part of the colour scheme not always black.
#472: Tacho: Configurable red-line area.
Now using a modified version of the GDA tacho.  
 Adds nicer rendering and config dialog.  Also adds global inherited properties.
  
================================================================================
Version 4.0.49 - 02/06/2011
================================================================================

Use new crash reporter.

================================================================================
Version 4.0.48 - 31/05/2011
================================================================================

Fix crash when 'Auto font size in Grids' is off.

================================================================================
Version 4.0.47 - 26/05/2011
================================================================================

Fix problem with splitter sash in file dialogs when folders hidden.
Fix address bar problem on Windows XP where the last folder would be incorrect
  when first showing a file dialog.
#717: When trail mode on for a map, rest of application very slow to redraw.
   Tentative fix - trigger repaint from UI update timer.
#716: Key Mode Shortcuts: Warning for unusable keys.
Fixed crash using OS file dialog from calibration file dialog.
#712: Menu to set calibration state of options.
#715: Option to disable auto creation/popup of status window.

================================================================================
Version 4.0.46 - 24/05/2011
================================================================================

Fixed setting up of parameter limits for single entries.
Improved handling of multiple parameter limits in limits dialog.
Automatically enable limits when value has been modified.
#650: Set limits for parameters from properties grid.
#475: Re-evaluate alarms on bar/number gauge after changing alarm limits.
#643: Axes on scope control.
#208: Units on scope.
Fixed problems relating to the removal of scripted maps/tables.
Fixed a few bugs that could cause crashes when editing properties.
Use default view range that can be defined in gin file in parameter views.
#713: Copy/Paste menu item of tables/maps should use axis if selected.
Fixed issue with ecu simulator locking up UI.
Disabled action shortcuts could still be active.
#26: Key Mode.
Prevent the status bar from showing across the screen at startup when maximised.
'All' group in keyboard shortcuts config.
Added sorting with header click to keyboard shortcuts dialog.
#566: Infinite time map/table trails, with manual user delete.
Fixed keypress translation filter (some shortcuts were not working when the 
   keyboard was focused in a text edit).
#710: Parameter freeze feature.
Folder tree in file browsers would not change the current folder when selected.
Tentative performance enhancement to shell access.

================================================================================
Version 4.0.45 - Built on 13/05/2011
================================================================================

#609 - Packages (similar to GTZ files in GWv3).  
       Can create packages containing firmware upgrades, gin files, 
       conversion templates, tab buttons, default tabs and colour schemes.
       It is also possible to create packages that backup all user settings.
#692: Tab Buttons (user tab files may be loaded from configurable toolbar buttons).
Added user selectable tab icons.
New conversion templates now include encrypted gin files so that they work on 
   systems that are using customer gin files.
Fixed a couple of errors in conversion templates that could lead to raw 
   assignments being ignored.
Fixed #670.
#671 - Setting keyboard shortcut for 'Show Raw Values' does not work.
#531 - Slice object has no minimum size.
left window borders beyond minimum window size = new Could resize top(options_page_);
Sizes less than view minimum size loaded from tabs archives are now fixed up.
#565 - Implement 'View Session changes' feature from GWv3.
Fixed LogMap handling.
#673 - Option to only download scaling options/view parameters when secured.
#675 - Select site on table graph when clicked on line.
Fixed abort button on progress dialog under some circumstances.
Fix duty cycle/pulsewidth scaling when the fuel maps is already scaled in ms.
#691.
#683: CAN Rx setup: does not display id's in 11/29bit if setting restored when 
	  first displaying the dialog.
#687: Load tabs should save as default.
Added additional error information to final ISP wizard page, should the 
operation fail at any step.
#679: Use combobox instead of tree in calibration file dialog.
#704: CAN Telemetry - set Auto Byte Count from no to Yes - Byte count is 
     updated appropriately in GW & cal but does not get programmed into the ECU.
Fixed a potential re-entrancy issue in ECU writes.
#703: Fixed issue calculating y-axis range on map slice graph view.
#705: Sometimes entering option values do not get accepted.
#694: Firmware Upload: cal for upload should not be for a different ECU type.
#620: Honour disabling of not running check in ISP.
#668: Sphere around 3d map cursor.
#706: Parameter grid: Set limits on multiple selection not working.
Don't offer to store changes in ECU if feature not compiled in or GIN does not 
   specify PCTL.
Added a little more information in the manual about scripting.

================================================================================
Version 4.0.44 - Built on 25/03/2011
================================================================================

Fixed an issue resulting in comms stalling (noticed prior to ISP on a slow machine).

Auto stretching of axes on map/table grids to match the cell size of axes 
    to that of the main grid.
#457: Reinstate 'M' key (GWv3) for showing context menu on maps etc. [Configurable].
#501: Remember CAN bus set-up option for 11/29 or 16/32.
#529: Keyboard shortcuts for actions in object context menus (e.g. map grid).
#542: Add configurable hotkeys to enable/disable follow-ecu modes.
#557: Compare: erratic movement of selection when sorted & items copied.
#586: Multithreaded retrieval of file list in calibration dialog.
#597: Telemetry setups: gain should never be 8x1 in info display.
#598: Limits disappear from parameter list when a new parameter is selected 
	  using the pop-up dialog.
#634: Add 'Home' and 'End' key functionality to table/map grids.
#636: Edit parameter value when offline not reflected after editor closed.
#637: User selectable decimal places precision on tables and maps.
#638: Text doesn't fit perfectly in cells on some tables/maps.
#639: Selectable horizontal text alignment on map/table grids.
      Vertical center text alignment on map/table grids.
#635: Option to discard changes to tabs layout.
Added width and height properties for windows on tabs.
Basic implementation of scriptable button view object.
Fixed update of properties grid values after editing.

Removed 'Save Current Tab' menu item as it is generally confusing.  This feature 
is still available by checking 'save current tab' in the save tabs dialog.

#640: 'non-linear' mode for table graph axis [+by default].
#641: Changing value in property grid: grid doesn't update when editor closed.
#642: Percentage change: option for additive/absolute change.
#646: Aspect files import - show option values being imported in the list.
#647: Open aspect file - use check-list grid rather than the two list approach.
Added warnings when inmporting aspect files and there are values that do not 
convert across.
#655: tentative - prevent recursive crash report generation.
#663: Fixed view pulsewidth/duty cycle on fuel map.
#660: Show units of table on y axis of graph.
#581: Can't discard calibration before convert wizard runs.
#654: Remove email feature from crash report.
#667: Default 3d maps to non-linear axes.
      Display warning on 3d maps that do not have monotonic axes.
#669: New handling that enables drag/drop in parameter list is annoying. 
      Feature disabled until a better way of handling it is found.
Fixed some issues with keyboard shortcut schemes.
Renamed "Selection Range" property to "Soft Selection Range".

Implemented use of small_inc and large_inc attributes for gin file objects to 
allow GIN file to define default increment amounts for options, tables and maps.

Added 'tiny' increment keyboard handling - holding CTRL when using +/- will 
increment an object by single raw increments, so setting a small increment that 
is greater than 1 does not lose the ability to croll values by single raw units.

Fixed potential crash when displaying serial telemetry info.

Added more configurable colours.
Added "State Text" colour mode for grids (similar mode to GWv3).

Grid axis menus are now sub menus of the main grid to avoid confusion.

Keyboard handling when using table/map grids adjusted slightly so that the 
selection returns to a single selected item when the arrow keys are used, which
prevents you being locked into an axis and also feels more natural.
The old method of moving the same selection shape is possible by holding the 
ctrl key.

================================================================================
Version 4.0.43 - Built on 04 February 2011
================================================================================

Fixed log marker handling in loop logs.

================================================================================
Version 4.0.42 - Built on 27 January 2011
================================================================================

Implemented v0.05 log binary support.

Fix to branded build.

================================================================================
Version 4.0.41 - Built on 19 January 2011
================================================================================

#632 - Loading keyboard short-cuts does not clear items that need to be cleared.
#500 - Add supported gin file version to about box.
#535 - After ISP of a different version, tabs do not get loaded.
#606 - Parameters grid cell does not resize when font size manually set.
Auto-resize of font in parameter/option grids no longer takes the value column 
  into account to avoid issues.
#556 - autocomplete match should select closest choice in comcode selector.
#579 - Check for store changes with reconnect.
#520 - Scrub log playback when not playing.

Implemented drag/drop of options/parameters between lists.

Made disabling of RTS pulse of COM port optional.  By default it is enabled 
  again as in some cases it causes driver instability (but can improve 
  performance considerably when switched off).

Changes to branded build.

Fix icon association in installer for aspect files.
Fixed log playback.

================================================================================
Version 4.0.40 - Built on 10 December 2010
================================================================================

Updated to latest gemscom (removes pulsed rts on com port).
Added some performance enhancement to comms.
Removed comms performance window.
Fixed issue in log map controller that could potentially have lead to crashes 
or undefined behaviour.

================================================================================
Version 4.0.39 - Built on 09 December 2010
================================================================================

Fix for crash in configure outputs when reconnecting.
#629 - Fixed tab strip colours.  The colours are now configurable.
Workspace colour now configurable.

================================================================================
Version 4.0.38 - Built on 17 November 2010
================================================================================

Added branded build details.

Prevent crash if no items are selected to load from an aspect file.

#593 - Fixed: Always prompts for a dongle on startup.
#626 - Add inches of mercury unit.
Added unlockable mode for lists.
Only enable menu items for modifying parameters if the selection is editable 
(e.g. fuel mod).
#627.
Fixed bug in comms response length calculation for writes on non-extended protocol.
User defined units enabled in GWv4 build.
Updated to latest gemscom lib.
Fixed a number of unsafe pointer conversions.

================================================================================
Version 4.0.37 - Built on 07 October 2010
================================================================================

Fixed spelling mistake in manual + added more detail on the meaning of 
'bipolar' scaling.

Fixed 'Calibration Name' menu item.

================================================================================
Version 4.0.36 - Built on 05 October 2010
================================================================================

Updated Manual to include PotBox details.

================================================================================
Version 4.0.35 - Built on 21 September 2010
================================================================================

Fixed bug in emerald4 that was leading to corrupted calibrations if the GIN 
file contained log maps.
Updated to Emerald 4.11.
Fixed a slight issue with name/version restriction in file browser.

================================================================================
Version 4.0.34 - Built on 17 September 2010
================================================================================

#530 - After download log, option to open in GEMS Data-analysis 
 (requires GDA beta 0.00.41+).
#616 - Dedicated pot box config + remember assignments.

Don't select autocomplete item in option/parameter selector if the text has 
been deleted from the edit control.

================================================================================
Version 4.0.33 - Built on 14 September 2010
================================================================================

Fixed v0.03 log processing.
#592 - Internal logging: If same channel used >1 time, multiple emerald data 
       sources are created with the same name.

#605 - Upload Firmware: Warning message about unplugging coils/injectors etc.
Upload firmware: warning if ECU name is different to that in the FIN.
       
Fixed crashes pertaining to configure outputs dialog after gin file has been 
reloaded.

#607 - Potbox: Does not work after first linking.
Improved initialization procedure for potbox.
Number potbox encoders from 1 to 4.

Added new build configurations.

Handle MSB gain in internal data logs.

#528 - Handle loop logging in ProcessLog.

================================================================================
Version 4.0.32 - Built on 12 August 2010
================================================================================

Altering STF output path in export STF from PC logging window can't be opened in
DLOG due to incomplete path.

#601 - Implemented extended log file processing (0.03).
#602 - Dynamic table axis parameters from comcode / option list.

Fixed view->automapping menu.

Fix crash writing a parameter to a multiregion cal where it is the next 
address after the end of an NVM region.
#595 - keyboard can edit non-writable parameters.

================================================================================
Version 4.0.31 - Built on 29 July 2010
================================================================================

If comparing/converting calibrations that use GIN files of the same version,
comcode options should be treated as raw values rather than using name lookup.

================================================================================
Version 4.0.30 - Built on 29 July 2010
================================================================================

Added write stress test.
Fixed program checksum operation when using extended protocol.

================================================================================
Version 4.0.29 - Built on 28 July 2010
================================================================================

Implemented multi-region cal handling.

Gin file v3.25 support.

================================================================================
Version 4.0.28 - Built on 21 July 2010
================================================================================

Fixed multi command write size restriction.
Fix registry access on Windows Vista/7 or limited access accounts.
Brandable build mods (configurable cal extension).

================================================================================
Version 4.0.27 - Built on 20 July 2010
================================================================================

#591 - Verification tab name mis-spelt.

Brandable build mods.

================================================================================
Version 4.0.26 - Built on 20 July 2010
================================================================================

Modified checksum calculation used by extended comms protocol.

================================================================================
Version 4.0.25 - Built on 08 July 2010
================================================================================

#589 - F5 key should refresh custom file browser.
Added copy HTML and save HTML options to can telemetry info.

Fixed an issue with docked window minimum sizes in splitters.

Added predefined default tabs to gin install that are now picked up by GWv4
if no tabs have been defined for a particular name/version of ECU.

================================================================================
Version 4.0.24 - Built on 17 June 2010
================================================================================

CRITICAL: Fixed an error in comms processing that could lead to errors in 
downloaded log files.

#582 - ECU Internal Logging setup list changes do not clear log.
#554 - Can't enter binary as string into options e.g. 0b001010.
#512 - Prevent addition of multiple file extensions when known extensions 
  hidden in shell settings.
#509 - Loading a default tabs file should not use its path when subsequently 
  saving.
#555 - Text should be selected in comcode editor of grid in telemetry setup.
#504 - Add option to make the increment value in object view properties modify 
  the real value rather than the raw value.
#510 - Log Map Target inc/dec does not update view.
#511 - Spin button on some options does not change value.
#562 - Add enough space to default size for scrollbar on wide tables.
#544 - Creating new folder in custom file view does not update list of files.
#494 - Property grid keyboard improvements:
  Enter closes the current editor and allow keyboard navigation.
  Tab key tabs into/out of editor.
  Tab navigation now works in preferences dialog.

Prevent HeaderView from blocking tab navigation events.
Improved keyboard navigation in initial user scalar config dialog box.
Fixed tab traversal of units config dialog.

Fixed potential crash in unit selector control.

================================================================================
Version 4.0.23 - 09 June 2010
================================================================================

Changed installer to use separate GIN setup exe.

Fixed crash when running in Windows Classic mode.

Fixed missing 'Clear Calibration' menu item.

================================================================================
Version 4.0.22 - 27 May 2010
================================================================================

Fix issue with interpretation of protocols in legacy gin files - if connections
were defined then they do not use the default protocol and therefore WORDWRITES
stops working. (#584)

When creating a new unit, the base units should be used as a source, rather than
the selected unit.

Make units editable.

================================================================================
Version 4.0.21 - 26 May 2010
================================================================================

Gin File version 3.24.

Handling of user selectable units has changed significantly in this release. 
Any existing unit configurations will no longer be valid and units will require 
reconfiguration.  This is a small amount of initial pain for a much simpler 
system in the long run.

#499 - Implemented extended protocol.
Added some additional pointer checks.
Added tooltip to display gin file location in GIN selector dialog.
Add aliases to comms monitor.
Added extended protocol to ECU simulator.
Added toggle fullscreen mode.

#558 - Improve sizing behaviour of object selector dialogs.
Make categories tree display optional in object selectors.  
Improved default size of object selectors.
Store size of object selector in settings archive so that it is restored.

#343 - User interface lock.

#575 - If a new base unit is selected for a user scalar, the units are not
displayed in the main UI.
#574 - kg/min wrong in Units/Scaling conversion.
#551 - Make user units more user friendly.

Added MIDI control option in Link To Controller.

================================================================================
Version 4.0.20 - Built on 22 March 2010
================================================================================

#402 - Warning when converting calibrations using customer gin files.
#487 - Adding Function Object serialization issues.
#485 - Improve handling when region data has changed size.
#561 - Handle invalid log maps better when loading calibrations.

Access to ECU object is now provided from 'Function...' when applied to objects.
Allows the values of other objects to be used when running a script.

================================================================================
Version 4.0.19 - Built on 24 February 2010
================================================================================

Fix out-by-one error in output config summary.

Fix up outputs using an option list reference from the gin file.

================================================================================
Version 4.0.18 - Built on 24 February 2010
================================================================================

Ticket #434 - Configure Outputs as in AEMPro.

Fix potential divide by zero in log playback view if channels have no 
logged data.

Changed error message to a warning in the status panel when a comparison tab 
cannot find a calibration whilst restoring from a tabs file.  Also improved
message details.

================================================================================
Version 4.0.17 - Built on 09 February 2010
================================================================================

Use self-throttling timer from Data Analysis.  Should improve performance in 
many cases.

Modified option list handling slightly to fix an issue with the EM90 
CAN telemetry setup (Bit Rate option).

Ticket #537 - User unit scaling error with inverted base conversion.

Update to latest gems library.

================================================================================
Version 4.0.16 - Built on 13 January 2010
================================================================================

Ticket #545 - Mouse wheel pot box mode.
The mouse wheel can now be used like a pot box from the virtual pot box window.

Fixed some issues opening the pot box device.

================================================================================
Version 4.0.15 - Built on 10 December 2009
================================================================================

Tentative fix for a crash following entering of multiple site values using the 
popup value entry window.

================================================================================
Version 4.0.14 - Built on 08 December 2009
================================================================================

Ticket #536 - Implement HID USB connectivity.

Ticket #538 - "Set Rate" on Connecting... progress box should save the settings.

Ticket #513 - Map grid - space bar select cell nearest current ECU site.

Tentative fix for user interface slowdown when online.

Added info about "cannot open port" message to help file.

Added notes about installing drivers to help file.

Added timer to status bar progress indicator so that it only hides after a 
delay to avoid flicker.

Ticket #532 - Logging->Download Internal Log->Click Next - if dongle not 
enabled for GW -> Crash.

Implemented Rotary Encoder handling with GSB device.

Implemented Link to Controller dialog box.

Remove dependency on portmidi as this was only used for demo purposes.  
We now have the GSB potbox, which replaces this functionality.

Updated build to use common settings (vsprops).

Avoid crash after ISP of a libusb device (or closing it after device removal).

================================================================================
Version 4.0.13 - Built on 14 October 2009
================================================================================

Fixed an issue with the ATEN USB-serial adapter under Vista (getting spurious
framing / parity errors).  Could result in comms flashing online/offline.

Fixed a problem when using a direct FTDI connection to the ECU which could also
result in comms flashing online/offline.

Adjusted comms timeout handling.

Put errors/messages in the comms monitor window in addition to the status 
window.  Port specific comms errors are also timestamped.

Prevent unnecessary repeated checking of ISPEN in already in the desired state.

Ticket #527 - Fixed auto-detect baud rate.

Ticket #514 - Hide 'find' menu option unless user has GEMS dongle.

Ticket #497 - Uploading new cal needs to repaint selected option lists.

Ticket #517 - Reworked cell locking.  Original method was causing problems when
using automapping in conjunction with calibrated site locking because the 
automapping would set cells to the calibrated state.
Cells now have a locked property that is (largely) separate from  the state.
Locked cells are now highlighted with a red border.
The site cursor now uses a green border instead of read by default to avoid 
confusion.

Site cursor is now configurable.

Added menu items to select cells with different site states.

Added sub menu to enable the setting of more site states.

State colours are now displayed in context menus.

Site locking now works on log maps in addition to regular maps.

Ticket #522 - After download internal log, option to open in log-playback.

Remember "Open in DLOG" choice in log download wizard.

Ticket #359 - Disable 'back' button when downloading internal log.

Ticket #483 - Auto naming of internal logs.

Ticket #503 - Initial increment on 16bit numbers should be 1 and 16 raw units.

Ticket #506 - Integer map values do not increment when increment is fractional.

Added shortcut to switch between grid and graph (Ctrl-G).

Ticket #518 - Display parameter value of map cell for current slice.

Fixed problem with "Follow ECU" tracking slice incorrectly.

Ticket #186 - Table grid - If you are editing a value in the axis, the control 
will not come out of edit mode when the grid loses focus.

Fixed GSB initialization.

================================================================================
Version 4.0.12 - Built on 29 July 2009
================================================================================

Ticket #491 
Arrow keys broken in object selector.

Starting to type in name cell without an editor on grids starts 
select/suggestion.

Ticket #490 
Log Reset Button Issue.

Ticket #451
Object Selector: Accept tab key as a selection + move to next column.

================================================================================
Version 4.0.11 - Built on 23 July 2009
================================================================================

Fixed problem processing internal log where bitmasked values are aliased with 
16-bit quantities.  The values would end up with 8-bit gain and the msb/lsb's 
would appear interleaved in DLOG.

================================================================================
Version 4.0.10 - Built on 20 July 2009
================================================================================

Implemented new version of 14bit comms protocol.

Fixed:  If ACD goes offline, it would not be re-awoken from telemetry stream 
mode.

================================================================================
Version 4.0.9 - Built on 17 July 2009
================================================================================

Fixed connection problem with ACD.  Disabled the extended protocol which is 
not yet used until a better resolution can be found.

Ticket #481: Table looses focus after entering multiple values values.

Ticket #463: Typing value into options grid when online and no editor goes wrong.

Ticket #455: Use ordinary combo box for option lists.

Ticket #451: Tab key now tabs away from parameter option selectors in grids.

Ticket #479: Fix title bar flicker when connecting etc.

Ticket #486: Default password option.

Ticket #482: Open Cal Dialog: After double clicking to open a folder in the 
right hand pane, the focus goes to the folder shortcuts dropdown box.

Ticket #478: General thread safety concern.

Ticket #469: Dialog informing user that there are no differences after verify 
halts comms until dialog is dismissed.

Double click on autostore indicator in status bar to toggle.

Fixed log processing - user scalar options were not being used.

Improved robustness of logmap data serialization.

When processing internal log files / PC logs, only insert the markers in to 
STF files once rather than on a per-channel basis.  This drastically improves
performance when there are a lot of markers.

If log download fails or is cancelled, offer to process the partially 
downloaded log.

Fix possible crash getting parameter pointer from an axis when its table has 
been removed.

Added options for streaming directly to a text file from the comms monitor.

Always display sub-folders in cal/tab file dialogs.

================================================================================
Version 4.0.8 - 03 July 2009
================================================================================

Fixed multi commands on libusb for X25 to improve data rate.
May also solve an issue where comms status flickers offline.

Changed installer to add additional gins, cals and tabs to CD install.
Changed installer to make it possible to include nx14/x25 drivers on CD install.

================================================================================
Version 4.0.7 - 22 June 2009
================================================================================

Fixed issue with accelerator (shortcut) keys.  With the keyboard set to US, it
was possible for unassigned keys to invoke actions (e.g. 'new calibration').

Fixed issue in save tabs dialog where if a root directory is given as the save
file name you could not save the file.

Updated Emerald4 dll due to issue with thread local storage (occasionally was
causing failure when opening workspace with a log playback window open).

Ticket #461:
Added d2xx dll to installer as this could cause problems on systems with 
ftdi drivers already installed for a different version.

================================================================================
Version 4.0.6 - 11 June 2009
================================================================================

Fixed possible crash if the property grid is closed with an editor selected
and then the user uses the 'page down' key in a parameter grid.

Tentative fix for crash report received 2009-06-02.

Added incremental search to grids in conversion template builder.

Added column sorting to conversion template builder.

Center conversion template builder dialog on parent.

================================================================================
Version 4.0.5 - 26 May 2009
================================================================================

Updated Emerald4 dll due to problems with thread local storage.

Ticket #460 - PC logging should be available with write enabled dongle.

Ticket #456 - Have to detect dongle after dongle update, for changes to 
			  come into effect.

Ticket #464 - Save comms monitor trace as txt or html.

Ticket #454 - Need 57600 in set baud dialog. 
Also inconsistent with bauds in port config setup page.

Ticket #465 - Crashes trying to create directory on non existant drive.

Ticket #449 - Some parameters in lists do not display the bar when imported 
from gwv3.  [due to limits not being converted from raw->real].

Ticket #450 - Resizing of units column in option and parameter lists resizes 
value column instead.

Ticket #430 - Tab key should also tab between rows on param/option grids.

Ticket #452 - Tabbing into the middle column in option selection list and 
parameter list, does not let you tab out again.

Ticket #459 - Trail mode menu incorrect (enabled AND disabled are ticked).

Ticket #453 - GWv3 template import: windows can get negative x/y positions.

Ticket #438 - Scrollbar on tab file browser does not scroll all the way to 
the bottom of the list initially.

Incorporated fixes to action classes in gems lib.

Made some tentative fixes for crash reports:
Possible crash when dismissing "Set Value" popup.
Possible crash passing empty data to comms monitor.
Possible crash moving cells in param/option grids.

================================================================================
Version 4.0.4 - 08 May 2009
================================================================================

Updated Installer so that regressive installs are possible from now on.
Also moved emerald and emerald4 dll installs from system32 to the app dir.

Ticket #435 - Save Current Tab - Initial path incorrect.

Ticket #437 - Don't add file extension on load if file already exists.

Ticket #436 - Allow wildcard entry in cal/tab browsers (e.g. use *.* to set 
			  user file extension filter).
			  
Ticket #433 - Make it clearer that modifying an Offline ECU is not programming 
			  it.
			  Added 'toaster' box to describe warning.  Also flash 'offline'
			  status to attract user attention.
			  
Ticket #278 - Padlock on caption bar of option/parameter lists to lock/unlock 
              the view.
              
Ticket #439 - Units not visible on table grid.

Ticket #417 - Expanding item in object selector dialog - make as many 
			  children visible as possible.
			  
Ticket #442 - Retain expansion state in properties grid when switching view.

Ticket #443 - Grey out parameter values in grid if offline.

Ticket #444 - Grey out parameter values in number view if offline.

Ticket #445 - Grey out parameter values in bar view if offline.

Ticket #432 - Add end of block marker value to markers in log files.

Ticket #167 - PC Logging - Log start should not be available when off-line.

Ticket #446 - Add 'function' menu option for options and writable parameters.

Ticket #448 - Add absolute and percentage change options to option/param grids.

Ticket #306 - Change baudrate - Double click on an item to accept the dialog.

Ticket #316 - Serial and CAN telemetry dialogs can be set to a very tiny size.

Fixed endian issue in log processing leading to parameters not being found.

Fixed some possible uncaught exceptions in calibration load handling.

Fixed small/large increment properties on map and table grids.

Only have 'link to controller' menu for the knob bit of a knob edit.  
Currently it is only of much use for development and demo purposes.

================================================================================
Version 4.0.3 - 1 May 09
================================================================================

Ported emerald dll and created Emerald4.dll.  This now allows sessions to 
be safely created by different threads.

Ticket #400 - Progress indicator and cancel option for log processor.
Log processing now runs in another thread.

Ticket #17  - Run "Find matching Cal" an another thread.

Ticket #420 - Tables / maps / options / parameters top level menus.
Reworked layout and view menus - parameters/options etc menus are sub menus 
of the view menu, to avoid top-level clutter.

Ticket #423 - Change 'convert' button to 'copy' in compare tabs.

Ticket #422 - Select new file to compare directly from compare tab.

Ticket #218 - Calibration Comparison Wizard has superfluous last page.

Ticket #398 - Map trails selectable from context menu.

Ticket #397 - More related views on right click menu of (e.g. maps).

Ticket #418 - Range mode on table graph not serialized.

Ticket #424 - Minor grid lines on table graph.

Ticket #166 - 'Cut' option in context menu of map grid view makes no sense.

Ticket #421 - Resize number in number gauge if too long.

Ticket #426 - Change colour scaling range when z-axis range is changed on a 
              3d map.
              
Ticket #416 - Table axis user scalar issue (X25 - boost fuel trim).

Ticket #191 - Tentative: Resizing main window when log playback window 
			  shown and is fixed, is very slow.  
			  Added Multiple 'mip map' levels for peak data.
			  The log file and peak data are now loaded in a secondary thread.
			  
Ticket #90  - Add colour properties to individual maps.

Ticket #73  - Colouring options on grid axis grids.

Ticket #375 - Import/Export calibration subset ("Calibration Aspects").

Added 'Quick Compare' menu option that allows you to do a compare directly 
without a wizard.

Changes "Views" panel name to "View Explorer".

Changed "The Log List appears to be valid" to "The Log List is valid".

Log Playback: Peak data is now stored in a more compact form to reduce memory 
usage.

Made CTele parser accept bit ranges where the values have 1 or 2 digits rather 
than explicity having 2 digits:
CTele1 ID01 b15-0  is now accepted where
CTele1 ID01 b15-00 whould only have been accepted before.

Selecting "Default" in colour pickers now works.

Fixed crash restoring cal/template after crash on previous run.

================================================================================
Version 4.0.2
================================================================================

Ticket #27  - CAN RX setup.

Ticket #391 - Cal Name Implementation.

Ticket #370 - Optimize tab loading.
			  Windows within tabs are now only instantiated when the tab is 
			  displayed (or thumbnail is required by ctrl-tab).
			  Applied a number of optimizations to the xml parser and 
			  the xml archiver.
			  This reduces load time on the advanced evo x template from 7.5
			  seconds to 0.4 seconds.
			  
Ticket #395 - Opening cal from chrome displayed startup box.

Ticket #401 - Copy view as bitmap from context menu.

Ticket #392 - Update Rate property on Number, Bar and Tacho gauges.

Ticket #382 - At end of ISP, ecu is disconnected and progress gets stuck.

Ticket #383 - Improve algorithm for finding name in FIN.

Ticket #369 - Quick Jump between tables / maps / gauges (via button in caption).

Ticket #403 - Close selection option in tab area.

Ticket #28  - Copy/Paste between tabs.

Ticket #29  - Resize selection in tab area.

Ticket #280 - Un-optimize fuel map.

Ticket #405 - Balloon tips remain on top when switching to another application.

Ticket #408.

Ticket #376 - Create backup of cal and template if application crashes.

Ticket #372 - Grouping in views tree.
Also added split option to split the view into two parts - the second part 
showing the children of the items in the first grid.

Ticket #412 - Add a set value item to map / table context menu.

Ticket #413 - Duplicate data listener exception in parameters grid.

Ticket #411 - Tabs file extension filtering not working correctly for X25.

Ticket #11 &
Ticket #409 - Save tabs - remember last file name.

Ticket #347 - Option list: can not delete an inserted row.

Ticket #404 - Mouse wheel doesn't work on object selector suggestion popup.

Ticket #371 - Drop options/parameters into existing options list.

Ticket #393 - Alarm range on number gauge.

Ticket #394 - Alarm Range on bar gauge.

Ticket #410 - Many grids do not display correctly with large fonts.

Ticket #233 - Bar gauge with value on it.

Ticket #219 - Would be nice to be able to build an option or parameter list 
              by mult selecting in the view area.

Ticket #414 - Make calibration icon different to application icon.

Ticket #406 - Make installer buildable from the raid.

Prevent some window rollover effects from capturing the mouse and cancelling
popup windows.

Selection overlay would remain when switching between tabs.

Move port retry code back into ProtocolHandler due to it making the UI 
unusable.

Fixed error when destroying ProtocolHandler under some circumstances.

Added tool tips to buttons in docked window caption bars.

PageDn from selected parameter/option now updates selector box to last 
selection if you did not have the selector open already.

Selecting 'open tab' from the menu defaults to the 'browse' tab of the 
dialog.

Changed cancel button caption on the tab browser that displays when user 
connects/loads a cal for an ecu without a default template.

Fixed mouse cursor type occasionally getting stuck on grids.

================================================================================
Version 4.0.1 - 27/03/09
================================================================================

Ticket #367 - Tooltip in view grid to show option values.

Ticket #379 - Add keyboard search controller to views tree.

Ticket #156 - Take masks into account when displaying undo history.

Ticket #303 - Refactor cal/tab dialogs.  Now also using nicer toolbar.

Ticket #352 - Using absolute path to a file in cal browser did not work.

Ticket #384 - Conversion Template Builder.

Ticket #387 - Crash report - tentative fix.

Ticket #388 - Description of bytes in can telemetry.

Ticket #374 - Crash opening tabs file from explorer.

Ticket #385 - Reinstated +/- keys for incrementing/decrementing values.
			  This has required reworking keyboard handling significantly on
			  grids.  They should now be much better with the keyboard now.
			  This does not extend to property grids yet.
			  
Ticket #390 - Map / Table grid focus issue;

Added keyboard navigation between grids and their axes.

NX14 Driver reload if connection lost due to noise (experimental).

Fixed potential crash delivering messages to log map handler.

Cleaned up unguarded signal connections.

================================================================================
Version 4.0.0 - 23/03/09
================================================================================
Alpha 58 - 23/03/09
================================================================================

Ticket #365 - Thumbnail on factory tabs is wrong (was due to sorting order).

Ticket #366 - Factory tabs folder is not cleared by installer.

Added feature to ctrl-shift-pgup/pgdown through maps and tables (similar to the
feature already in GWv3).

================================================================================
Alpha 57 - 20/03/09
================================================================================

Ticket #357 - Add file name to factory tabs.

Ticket #354 - 'Default Tabs' should be renamed to 'Last Viewed' or 'Last View'.

Ticket #340 - Calibration Compare column sorting improvements.

Ticket #362 - Load a tab with no calibration open -> crash.
Put checks in to prevent the crash.
Also disable layout menu items if there is no calibration.
Disable layout menu items when the current tab is not a workpage 
(e.g. pc logging).

Ticket #360 - Logging | Process raw internal log - if no calibration open 
get a "You must open an appropriate calibration" error. 
Why not just disable the menu item if no calibration open.

Ticket #358 - File | Save As, Save New Version and Close Calibration should 
be disabled if no calibration open

Put serialization warnings in the ECU status window.

Added thread condition variable for performing waits in ProtocolHandler.

Now using timeout on synchronous cross-thread signals to avoid the possibility
of total deadlock.


================================================================================
Alpha 56 - 19/03/09
================================================================================

Ticket #349 - GWv4 uses 50% of CPU when inactive.

Ticket #348 - Renaming files in cal/tab browser fails.

Ticket #346 - If are not default tabs then option button should be greyed out.

================================================================================
Alpha 55 - 18/03/09
================================================================================

Ticket #329 - Error reading Log Playback channel config archive if there are 
			  missing channels (end up with duplicates in blank slots).

Ticket #333 - Open Matching Calibration dialog - when scanning, Setup and OK 
			  buttons should be greyed out but cancel button should work - 
			  currently only cancels when scan has finished.
			  
Ticket #334 - Status window - can drag to zero size which stops auto show 
			  working.
			  
Ticket #332 - If no default tabs available, display factory tabs page.	

Ticket #336 - Connect Dialog - Selecting ECU | Disconnect should close 
			  the dialog.
			  
Ticket #337 - Store changes in ECU menu item should only be enabled after a 
			  succesful connection. 
			  Currently enabled immediately you do an ECU | Connect.
			  
Ticket #338 - ECU | Security | Set/ Clear password should not be enabled when 
			  disconnected. 
			  Could we disable these also when an ECU does not support 
			  passwords?
			  
Ticket #339 - Changing alpha sorting on options full list should move current 
			  selection into view.

Ticket #341 - Calibration Compare - units in first column should not be shown 
			  if it is an axis table.

Ticket #330 - InvalidCTeleSetup exceptions (fails unit test).

Now drawing log playback cursor with a thicker XOR'ed line.

Refresh toolbar when enable state changes.

Put more robust bounds checks in setting of map/table values.

Improved crash reporting.

================================================================================
Alpha 54 - 16/03/09
================================================================================

Ticket #304 - Port Preferences COM Port dialog - Port name and baudrate are 
			  editable - you can type in what you like!
			  
Ticket #307 - Connect dialog currently has GWv4 as title - would be better 
			  titled "ECU Connection" or similar.

Ticket #308 - Aborting connect etc requires second button click to close dialog.

Ticket #319 - Crash in Units config.

Ticket #322 - Unit scalars without a base unit should be able to be set up 
			  with a base conversion on a per-ECU basis.
			  
Ticket #325 - Should not be able to enter non unique names in unit conversions 
			  setup.
			  
Ticket #326 - Setup Unit Conversions button should be disabled when there is 
			  no selection.
			  
Ticket #139 - A dropdown list for selecting a based on unit when creating a 
              new unit/scalar.
              
Ticket #327 - After viewing Show Info in can tele setup, closing the setup 
			  window makes the app redraw (flashes).
			  
Ticket #320 - Comparison window - when first shown, select the first item in 
			  the comparison list by default.
			  
Ticket #311 - Log Transport - browse directory should default to last used 
			  directory for saving (eg PC logging or log download).

Ticket #324 - CAN Telemetry setup - recreate editor when changing message.

Ticket #321 - Signed parameter display - show zero at center of bar by default.

Ticket #318 - Cancelling comms operation shows auto store dialog if calibration 
			  open and ECU has not been identified.
			  
Ticket #312 - Clicking in the path for log-transport does not release focus.

Ticket #328 - Map does not restrict axis based on site count in GIN.

Ticket #315 - Prompt save calibration before convert.

Added validator to property editors handling real numbers.

Display items with invalid conversions with a red background.

Handle exceptions when importing GWv3 gin setup.

Ticket #313 - Display units on number gauge by default.

Updated batch for gin install script.

Destroy preferences dialog if closed.

================================================================================
Alpha 53 - 12/03/09
================================================================================

Modifications to log maps were not flagging the calibration as modified.

Pressing 'Import' on internal logging setup dialog could cause comms monitor 
to be shown due to log reset message being written to monitor window.

Don't insert duplicate entries in PC logging tab (unless user specificly does).

Parameters of nested dependencies were not being added to PC logging.

Adding parameters to PC logging whilst already running were not added to the 
log under some conditions.

Added recent files menu dropdown to open calibration toolbar button.

Fixed issue whereby double clicking item in an options option list dropdown
could make a range selection in the underlying grid.

Refactored Log Playback Parameter Mappings and lane config into one dialog.
Lane config is now modeless and updates the view as you change it.

File browse edit was emitting file selected signal twice.

Added option to open downloaded log in DLOG.

Colour gradient on horizontal zoomable scrollbar was in the wrong direction.

================================================================================
Alpha 52 - 11/03/09
================================================================================

Ticket #299 - Alpha sort for ecu type in browse tab or calibration is incorrect.

Ticket #300 - If you click play on log transport and you have no parameter 
			  mappings, warning shows, but transport buttons are still set 
			  to play when it is actually stopped.

Fixed a possible crash in comms thread.

Added filtering to comms trace pane.

If read of checksums fails, connect procedure would get stuck polling the 
device and could not be aborted.

Message when setting password was incorrect.  Changed the message and added
a password confirmation box.

Disable set/clear password menu items when ECU is not securable.

Set maximum character count for password box.

Changed:
"Are you sure you want to delete the current tab?"
to
"Are you sure you want to close the current tab?"

Added option to use default values when clearing calibration.

Enable / disable ECU simulator if it is not selected as the port.

Fixed icons on togglable menu items.

Update main progress dialog label instantly.

================================================================================
Alpha 51 - 10/03/09
================================================================================

Ticket #295 - Parameter/Option list font size property problems.

Ticket #297 - Browsing for tabs for first time (i.e. after new cal, or 
			  install ecu) can not select 'All' in ecu name or version.

Ticket #298 - After ungrouping lists grey bar where tabs were is left at the 
				bottom of the list.

Ticket #296 - DA97 crash gw when trying to view a map.

It is now possible to have maps/tables in volatile memory areas, with live 
updates.

Readonly maps could be edited under some circumstances.

Added demo cals on raid to install.

Made Log Maps editable.

Added property for playback rate to log transport.

Prevent views panel updating whilst restoring expansion state.

Prevent flicker on the top level window title bar when updating menus.

Moved demo cals to "my documents\calibrations\demo".

Set correct type name for Object class in function scripts.

Update Real cache of meta object model before executing script.

Fixed bug in rescale fuel map.

================================================================================
Alpha 50 - 05/03/09
================================================================================

Ticket #284 - Click open when no tabs file selected in tabs browser causes 
			 'loading' page to come to the front and black the app.

Ticket #285 - When saving tabs file, if no files are in the right pane then 
			  get error message.

Ticket #287 - Docking Log Transport top or bottom results in very small window.

Ticket #286 - Tab preview when browsing for tabs is black.

Ticket #288 - If trying to connect with out dongle, says invalid com port. 
			  Only happens first time of session.
			  
Ticket #292 - Grouping problem which crashes v4.

Ticket #293 - Log Mapping - setting the map values manually does not update 
			  cache so automapping can write incorrect values.

Fixed problems selecting items in the tab/cal browser due to drag drop handling.

Fixed potential crash due to dangling pointer from Installed ECU panel.

Fixed memory leak in shell tree control when refreshing the tree.

Display name of port being opened in retrying message of connection dialog.

Check if LibUSB and FTDI are available in basic port settings panel and don't
attempt to enumerate them if not available to avoid crashing.

Added better indication of selected port to basic port settings page.

Fixed funny size of the weight damping box in the log map controller view.

Added checks for duplicate entries in log playback parameter mappings.
The user is warned if there are any anomalies.

Delete key was not working in notes view.

================================================================================
Alpha 49 - 04/03/09
================================================================================

Ticket #276 - Log Playback window - gets slower every time you open it again.

Ticket #277 - New grid objects (map & tables) are created to small, i.e. with 
			  scroll bars showing.

Ticket #184 - CalBrowser: ECU Directories Mode - make possible to have only 
			  ecu names not versions.

Ticket #10  - Docking position / space allocation could be improved.

Ticket #243 - Crash after ISP on x25 usb connection.

Ticket #270 - After Comms Drop out attempt to set the inhibit telemetry value 
			  to isp enable code.
			  
Ticket #279 - Map position box not displayed when offline and playing back log.

Ticket #189 - Auto Baud Rate.
Features have been added to the connection dialog as a partial implementation 
of Ticket #6.

Ticket #281 - Setting value in pulsewidth view with an LD0MPC value doesn't 
			  give expected result.
			  
Ticket #282 - Fuel map scaling mode is not stored in the template.

Ticket #266 - Global setting for auto scaling on grids.
			  
Fixed display issues om fuel map graph when viewed in pulsewidth/duty cycle 
mode.

Tentative fix for PC logging bug where no data gets recorded and ECU info 
is empty. (Ticket #252).

Made regular flush to disk of PC logging work correctly.

Fixed possible access violation in PCLoggingReaderStream.

Fixed potentially incorrect display of data in log playback window when 
showing glo format files at the beginning or end of the trace.  
This was particularly problematic where files contained log channels that did 
not start at zero time.  No values are displayed in such areas now.

Implemented 'basic' page for port setup.

Added file associations to installer.

Changed colour scheme file extension from xml to gcs.

Changed "Installing GIN File" to "Installing ECU Definition (GIN) File".

Fixed some problems with internal logging setup on Subaru96 where Log Rate 
option is not defined.

================================================================================
Alpha 48 - 25/02/09
================================================================================

Ticket #234 - Special GIN install mode with absolute paths.

Ticket #236 - Scrollbar in property grid description if required.

Ticket #239 - Failures after saving a calibration to program files under Vista.

Ticket #235 - Add option in ISP wizard to skip requirement for having a GIN 
              based on name in FIN.

Ticket #242 - Make autohide instant when a pane loses focus.

Ticket #243 - Crash after ISP of X25 with USB connection.

Ticket #241	- Cant see checkboxes on Start Page on XP with themes disabled.

Ticket #245 - Shortcut key for options selection list.

Ticket #248 - Race condition in PortBase::notify.

Ticket #207 - Evo X - cannot always immediately connect without using 
			  'refresh' in connection setup.
			  
Ticket #250 - When displaying comms monitor for the first time it instantly 
			  hides.		  
			  
Ticket #65  - Auto font size option for grids.

Ticket #254 - Start page sometimes fails getting dates and aborts GW.
			  
Ticket #256 - 'In System Programming' Wizard should be named 'Upload Firmware' 
			 wizard as per the menu item.

Ticket #255 - Axis Header sizes are not remembered.

Ticket #253 - Problem with two folder favourites with the same name.

Ticket #42  - Import gin/cal settings from Gwv3.

Ticket #259 - Save Tabs dialog gets extension wrong.

Ticket #260 - Some combo boxes cannot be scrolled.

Ticket #261 - GW crashes when the tab key is pressed whilst in the undo 
			  history window.
			  
Ticket #262 - Sometimes options do not update when undoing.

Ticket #257 - Notes view scrolls to bottom.

Ticket #264 - Expanding the tree view in Open Calibrations dialog requires a 
			  double click.

Ticket #265 - Make tab icons larger in tabs browser.

Ticket #263 - After changing ECU type from that opened when GW is started, 
              opening then clicking in the Units setup, crashes GWv4.

Added 'OS Dialog' button to CalBrowser.

Fixed slight scaling issue on Load axis of Exo X 00X21 Fuel map.  
User scalar was being applied twice even though this was not represented by 
the string value.  Second application of user scalar removed for now.

Improved hotplugging on EvoX.

Fixed crash when trying to edit values on table graphs with no selection.

Show start page once splash screen has been destroyed.

Favourites in tab/cal browsers can now be given a user defined name.

Tab "Scroll Left" button is now on the left of the tab strip.

New look to tab control buttons.

Added Tool Tips to tab buttons.

Fixed problem with ECU simulator when creating from a thread other than the 
main thread.

Fixed crash inserting rows in pc logging grid.

Fix issue displaying log files with a total time of zero.

Fixed issue with times supplied to pc logging going in reverse.  This can happen
when doing log playback at the same time as being connected, which should really
be prevented but there may be real world situations where this occurs.

Fixed issue on table position lookup with a non-zero value in site zero but a 
zero parameter.

================================================================================
Alpha 47 - 19/02/09
================================================================================

Ticket #196 - Changing units does not update grid axes.

Ticket #214 - Recent Files list is reset to Demo every time GWv4 is started.

Ticket #212 - Change 'Recent Files' to 'Open Recent' and move below 'Open'.
Also changed 'close' item to 'Close Calibration'.

Ticket #217 - Added an additional time constraint to the beginning of drag 
              operations to avoid spurious drags when clicking items.

Ticket #211 - Lambda symbol not drawn correctly on tacho controls.

Ticket #220 - CAN telemetry was only enabled if Serial telemetry existed.

Ticket #173 - Sometimes get an exception where the Gateway is already open 
			  when connecting.
			  
Ticket #222 - Selecting multiple options in the options list: 
			  make last selected item visible.
			  
Ticket #215 - Added 'Insert' option to context menu for option and parameter 
			  grids.
			  
Ticket #221 - Disappearing view menu.

Ticket #228 - Hide views pane if it is in the AutoHide state and user has 
			  added an item.
			  
Ticket #216 - New Tabs Insert Between Function.  
			  This is a check box on the new tab dialog box.
			  			  			  
Ticket #232 - Status bar: Progress bar doesn't hide at 100%.

Ticket #119 - Occasional crash when using combo box in compare columns frame.

Ticket #190 - Change 'Program Checksum' to 'Store Changes in ECU', and 
			  'Auto EE' to 'Auto Store'.
			  
Added menu option to toggle "Auto Store".
Added "Auto Store" status bar indicator.

Ticket #195 - Clear Calibration menu option.

================================================================================
Alpha 46 - 16/02/09
================================================================================
	
Ticket #193 - Secure calibration issues on EM36.  Null password is now tried 
			  as part of the security checking procedure.
			  
Ticket #31  - Start Page.

Ticket #201 - VSS in internal ECU logging should be road speed.

Ticket #206 - Changing the 'Tables' property for the Views window crashes GW.

Ticket #140 - Add demo cal and gin to installer.

Ticket #203 - The Folder icons in the right hand pane are missing in the tabs 
			  and calibrations browsers.
			  
Ticket #202 - Icon used for 'Rewind Log Playback' in the menu, is different to 
			  the one used in the log playback window.
			  
Ticket #198 - Issue saving/loading files to/from the desktop.

Ticket #181 - Map site target should display a different colour when in an 
              editable position.

================================================================================
Alpha 45 - 11/02/2009
================================================================================
			 
Ticket #170 - Should not be able to upload calibration when engine running.

Ticket #160 - Ctrl+N does not add a new tab.  
			  Conflicted with Ctrl-N for 'Calibration Notes'.
			  Changed to Ctrl-B.
			  
Ticket #175 - If calibration notes is selected from the menu and it it open 
              but not shown in the workspace it is not focused or expanded.

Ticket #165 - Internal Logging - Validate List button - Clicking Yes in the 
			  "Attempt to Fix" box doesn't do anything.
			  
Ticket #169 - Remember Firmware upload settings (only for application run).
			  
Ticket #174 - Put version number in help file automatically.	 

Ticket #158 - Poor performance of cal browser with lots of files in folder.
			  Optimized code in some areas to improve speed.
			  
Ticket #49  - Refactor EcuTransaction and move to gemscom namespace with 
			  mediator interface.
			  
Ticket #183 - Fix flicker in option/parameter editor.
			  
Ticket #161 - Colour gradient for horizontal bar gauge is in the wrong 
			  direction.
			  
Ticket #124 - CAN Telemetry info should not be available if ECU does not 
              support it.		
              
Ticket #176 - Tabbed telemetry channels.

Ticket #172 - Improve handling when writing a value that can't be written.

Ticket #164 - Object select dialog can be resize to zero height and small width.
			  
Ticket #162 - Min size of Bar Gauge.

Ticket #187 - Changed the default tacho font size to 12.
			  
Ticket #15  - Remember category selection in Object Select dialog.

Ticket #180 - When on follow ECU map slice display the incorrect axis for its 
              current position.
        
Ticket #182 - When editing map slice using [ ] it does not edit the selected 
			  site when on follow ECU.
			  
Ticket #163 - Internal logging setup log rate - added spin box.

Ticket #21  - PageUp/PageDn issue with scrollbar on table graph selected.

Ticket #12  - Tab key does not correctly tab through controls in smooth and 
			  fill dialogs.
			  
Ticket #159 - Offser option in initial tab selection window to only show one 
			  ecu type.
			  
Ticket #81  - Check if program checksum is required by user when closing / 
			  disconnecting.

Status bar now uses a green colour when online.

Initial tab selection dialog now has a 'browser' tab.

Arrow keys on selection of grid with swapped axes did not move in the 
correct direction.

Table Graph: Only allow selection if offline or the selection is not following 
the ECU.

Implemented undo menu enable/disable.
Implemented save menu enable/disable.
			  
Wizards were not being destroyed after they were closed (resource leak).

Fixed a memory leak in file browser code.

Added grid lines to can and serial telemetry setup dialogs.

Fixed potential crash with stream grids used in serial/can telemetry setup.

Fixed serialization of table/map grid orientation.

Position box on table/map grids was not taking into account inverted axes.

Added Play/Pause/Stop to menu of media ctrl.

Prevent possible infinite loop/crash if closing application before closing 
internal logging frame.

Added tool tip to programable parameter editor on the program button.
			  
Specify threadsafe flag for xml parser.

================================================================================
Alpha 44 - 03/02/2009
================================================================================

Ticket #157 - Using the find feature crashes GW.

Ticket #150 - Move to Subversion source control.

Ticket #171 - Connect dialog shows up twice.

================================================================================
Alpha 43 - 28/01/2009
================================================================================

Ticket #2 - Don't delete original xml archive if serialization fails.

Ticket #134 - Table graph position indicator is clipped at high values.

Ticket #136 - Opening log play back stops log play back if is already open.

Ticket #41 - Define an attribute in GIN files that can be used to make tables 
use inverted axis lookup.
Attribute used is 'invert_lookup'.
i.e. [Table,...][ATTRIBUTES,invert_lookup]

Ticket #141 - Cannot copy text from telemetry info page.
			  Was actually possible.  
			  Added a context menu option to make it more explicit.

Ticket #137 - Keyboard shortcuts for start/stop of log playback.

Ticket #133 - Marker for the zero point in a bi-polar bar gauge.

Ticket #131 - Setting a multiplier for the Bar Gauge does not do anything.
			  (removed the property).
			  
Ticket #132 - First time GW is started file path in log transport is not 
			  displayed fully.  Insertion point is no longer set to the end 
			  of the control after setting the text.
			  
Ticket #144 - Selecting New Tab from the Layout Menu does not focus the tab 
			  when it has been created.
			  
Ticket #38 - Option to add all parameters on a given tab to PC logging, 
			 not just param view.
			 
Ticket #146 - When opening a folder in the right hand pane of the tab or cal 
			  browser the left pane does some weird stuff.
			  
Ticket #147 - A balloon type tip that shows when you first enter an option 
			  box or press +/- when on a map to indicate these have 
			  changed to [ ].
			  
Ticket #135 - Keyboard shortcut is not displayed in the setup window if it
              does not have a modifier.
			  
Ticket #9   - Drag/Drop support in Cal / Tab file browsers.

Ticket #149 - Fixed Map Site Target.

Ticket #148 - Auto install from last / gwv3 gin folders.

Ticket #145 - Virtual potbox now responds correctly to change of GIN.

Ticket #142 - Upload calibration toolbutton now has dropdown for recent cals.

Ticket #5   - Fixed unit test failure (failure due to rounding).

Ticket #43  - Help file integration (added to app and installer).  

Ticket #153 - When ALT key is down on Table Graph, display pencil cursor.

Ticket #152 - Improvements to table graph editing (can edit individual points 
			  without ALT key when the mouse is close to the line).

Ticket #154 - Scaling issue on map graph.
			  
Ticket #155 - Zooming table graph hangs GW.

Font size and major tick count now works on bar view.

Fixed Ctrl-N shortcut for 'new tab'.

Fixed race condition in comms transport.

Changed timer handling to avoid constantly hitting the heap.

================================================================================
Alpha 42 - 21/01/2009
================================================================================

Ticket #114: Multiple selection in compare feature (in left hand list) - allows
the conversion of e.g. several tables in one go.
Also the enable state of the conversion buttons is now set based upon whether 
those operations are possible.

Ticket #118: If hidden, Log Playback window does not expand if selected from 
the menu.

Ticket #121 - UpDown selector on map slice keeps increasing the slice past 
the actual number of slices.

Ticket #122 - Clicking 'add' in Units, creates a new line but does not focus it.

Ticket #113 - Shortcut for PC logging start and stop.

Ticket #120 - Got rid of pause state in PC logging.  This is now handled by 
the stop button.

Ticket #14 - Error window from archiver displays on incorrect monitor.

Ticket #98 - Problem clicking on view that is not entirely visible.

Ticket #34 - Hide progress bar in status bar if there are no active operations.

Ticket #8 - Title bar gradient of windows are sometimes incorrect on a new 
installation.

Ticket #125 - Text labels on tacho dissapear when some numbers for major 
ticks is set.

Ticket #99 - Consolidate toolbar icons for view creation into a dropdown 
tool button list.
This implicity required changing toolbar implementation, which has resulted 
in a toolbar with a nicer look and feel.

Ticket #127 - Selecting multiple windows (rubber band select) and clicking 
free area to deselect is broken.

Ticket #128 - Dots after menu items which open a window are missing.

Ticket #123 - Browse for tabs, setting filter to all and all does not show 
all tab.

Ticket #129 - Suggest a warning before actioning 'Close all tabs'.

Ticket #130 - Ctrl+T is set to both new tab and open virtual pot box.  
              New tab is now Ctrl+N.

Added a couple more stock gradients.

Refactored some code.

Fixed: Export PC log to STF whould display an error if user cancelled file 
dialog.

Rearranged 'add' menus.

================================================================================
Alpha 41 - 19/01/2008
================================================================================

Fixed: Could not see calibration files in browser.

================================================================================
Alpha 40 - 19/01/2008
================================================================================

Fixed a stability issue.

Changed minimum size of slice number control so that you can see the edit box 
since changing knob edits to also have a spin button.

Fixed radio buttons in fill dialog.

Added a couple of optimizations to PC Logging.

Added queue size performance indicator to PC logging.

Fixed issue in timestamp adjustment that could lead to incorrect times with 
back-logged data (and cause writing to the log file to be not only incorrect
but incredibly slow due to sectorization).  Generally observed when PC logging
of data played back via the log transport.

It is now possible to add parameters to PC logging when it is already 
recording.

Changed unit config dialog 'import/export' buttons to 'load/save'.

Fixed problem with non-negative offset in bar view.

Sorted out a couple of initial folder issues in tab/cal browsers.

Fixed possibility of undefined offset value from axis lookup algorithm.

Resolved flickering of tabs when saving templates.

Improved startup performance slightly.

Delete menu option on option and parameter lists fixed when editor is shown.

Fixed 'scalar' field of telemetry info when option scalar is zero.
Fixed 'scalar' field of telemetry info when user scalar has a chained scalar.
CAN telemetry info now displays channel name if it is defined in the GIN.
CAN telemetry info now displays empty fields in messages.
CAN telemetry info now displays aliases.

Made some subtle changes to property grid: category children are no longer 
indented.  Additionally, the button area is shaded like the .net control.

Fixed a benign error that was appearing in the application log when displaying 
some forms of message box.

Prevent multiple instances of the same ecu appearing in installed ECU panel 
when updating (e.g. post install/uninstall).

Improved calibration conversion automatic save file name generation.

Conversion wizard now prompts before creating output directory. 
Also prompts about overwriting existing files.

Tacho:
Addressed a labelling issue on tacho controls.
Label normally used for units in tacho control is now customizable via 
properties.
Added minor ticks property.
Major ticks is now explicit rather than a hint.  For implicit tick count, 
use a major tick value of 0.
Integer quantities do not display floating point labels, as they tend to 
be non-sensical.

Default tab selection page: 
Made factory default thumbnails smaller.
Made splitter gravitate towards top of the dialog when resizing and made 
factory defaults area smaller, since there are commonly more user defaults 
available.
Made user default display names have a new line in the label between the name 
and the version (looks much better).
Automatically select the default tab that is a close match to the required ecu.

Clicking in a blank area inside a tab will now re-focus the last focused 
sub-window.

Handling for hotplugging of USB devices is now optional (see the port settings 
configuration).  Some drivers cause problems (and can crash) but in some 
cases it is useful.  The crash issues really need to be addressed properly, but
for now it is optional so that users have a workaround if there are problems.
Hotplugging code has improved slightly - busses are not re-enumerated if there 
are not any comms errors on the bus, which avoids crash problems in most cases 
and prevents stalling of comms when non-related devices are hotplugged.

Ticket #13: Implemented "Find Matching Cal" feature.

Implemented auto Find Calibration once connected (if enabled in the port 
settings).

Ticket #100: Modify right click menu and main menu due to large number of 
'add commands', which have now been put into an 'Add' sub menu.

Ticket #35: Change 'value' to 'v' in function editor.  Rather than add info 
label about variables, a grid has been used to outline all variables.

Added some default templates to the installer, fetched from \\gemsraid.

================================================================================
Alpha 39 - 05 January 2009
================================================================================

Disabled hot-plugging of devices for the time being due to occasional crashes.

Changed visual styling of map grid site position box.

Map/Table axes are now extrapolated when looking up their parameter value at 
the ends.  This gives a little tolerance when programming sites at the end of
an axis.

Fixed drawing error introduced into map site target view due to refactoring.

Changed rendering of tab strips for windows that are docked inside one another
to make it more obvious which one is selected and look less like one string 
of text.

Added spin buttons to knob editors.

Added 'save current tab only' option to tab browser dialog.

Removed now unneccesary items in layout menu.

Fixed potential crash in tab file browser.

Context menu in blank area in tab/cal browser windows improved.

Copy/paste of multiple items in cal/tab browser now works.

Opening a LibUSB port for the first time was not always working.

================================================================================
Alpha 38 - 19 December 2008
================================================================================

Implemented tab browser dialog.

Implemented initial tab setup dialog when there is currently no default for a 
given ECU.

Implemented add/remove functionality for colour schemes.

Implemented load/save of views tree expansion state.

Added some colour schemes to the installer.

Added category filtering to object selector dialog.

Added cancel button to object selector dialog.

Put switch grid/graph context menu item at the top of context menus.

Default range mode is now set to 'fixed'.  For auto scaling, user must select 
it.

'lock sites with calibrated state' moved from tool bar to context menu on 
suitable items.

Added context menu item to parameter grid so that the parameters can be added 
to PC logging.

PC Logging - added '%date%', '%time%' and '%datetime%' formatters.

Table graph now clips out of range values.

Sorted out some problems with horizontal bar gauges.

Linked selection was not working on views that are docked inside one another.

Added support for serializing bitmap data within xml based archives as base64.

Did a bit of refactoring.

Fixed default expansion state on views tree.

================================================================================
Alpha 37 - 10 December 2008
================================================================================

Implemented user defined units selection / configuration.

Added corner control to map grids that displays its units.

Switch to grid from map graph was not focusing the window.

CalBrowser: Default is now to show subfolders in files pane.

Changing the ID style now updates the CAN ID view straight away.

Calibration checker is now docked into the workspace by default.

Fixed potential divide by zero in fuel map optimization function.

Resize injectors now displays on the correct monitor with a multi-monitor setup.

Ctrl-L accelerator key added for options full list (Ctrl-O is standard for 'open').
Ctrl-P accelerator key added for parameters.
Ctrl-T accelerator key added for trim control.
Ctrl-N accelerator key added for calibration notes.

Fixed bug with minimum height and size calculation when caption is not shown.
Notes view now has a smaller minimum height as a result.

Context menu for bitmap control now displays the default menu.

Ability to add image view was missing from layout menus.

Fixed an issue with mouse handling and capture in map graph window (could get 
selections occuring hen double clicking in a file window that was over a
map graph, among other problems).

Enabled ellipsis text on property grid.

Implemented View Range handling for Table Graphs.
Partially implemented View Range handling for Map Graphs.

================================================================================
Alpha 36 - 03 December 2008
================================================================================

Implemented Ctrl-TAB for switching between windows.  Brings up a popup frame
that lists all windows that can be focused, with a thumbnail hint.

Added ctrl-number shortcuts for rapid switching between tabs.

Delegated duplicated code for generating views in the main frame into the 
document area's code.

Multiple map or table derived views can be added at once via the toolbar buttons 
or the menus by selecting multiple items in the popup selector.  Same goes for
parameter based windows such as tachos and bars.

Option list, Parameter windows and notes views are now automatically positioned.

Option list and parameter grids now focus to an object selector when initially 
created and focused.

Parameter value editor now updates when the parameter changes, unless the user 
has started to edit the value.

Calibration Checker window now works for parameters.
Calibration Checker can now be configured to only display out of range values.
Calibration Checker can now be configured to pop up if a value becomes invalid.

Autohide timeout increased.

If autohide frame is already visible and requested to be displayed again for the 
same window, it is not re-animated but the timout is extended.

Fixed breakage to combo controls that prevented use of the scrollbar.

When focusing object selector in e.g. options grid, the text edit is focused 
rather than the previously focused control (which could have been the button).
Makes usage more fluid.

Made splash screen work if user only has 16bit display depth set up.

Got rid of border on splash frame in some circumstances.

Modified About Box text slightly.

Improved multi-select in tab area:
Ctrl-Click on windows that are selected with 'rubber band' select in the tab 
area causes them to be individually deselected.
Ctrl-Click on window border or caption bar will add it to the selection.

Parameter and option list grids now support text on the clipboard when copying
or pasting.  This means that you can copy tab/comma/newline separated values
from text documents and paste them into parameter / option grids.  If the names
exist, they will be placed in the list.

Window position is no longer stored in the archive if the application is closed
when minimized.  This prevents it opening again with a silly size.

Added ellipsis test algorithm to option and parameter grids (appends '...' to 
text that does not fit in the grid cell).

Fixed scroll wheel in object selector on parameter and option grids.

Fixed selection of expanding items in object selector.  Also fixes incremental 
find when in grouped mode.

If file does not exist when opening calibration, a warning box is displayed.
The message also no longer has a question mark, since the only option to the 
user is 'Ok'.

Recent files are loaded before attempting to restore previous file, so that 
should the restore fail, the user does not end up with an empty list.

Added numbering of tabs as a hint to the new Ctrl-Number keyboard shortcuts for
jumping between tabs.

Tabs no longer change width when the selected tab changes (due to change of 
font).

Made sure that partially visible tabs are still drawn so as to give a better 
indication that the tabs do not fit in the view.

Added Left/Right tab buttons.

Modified the appearance of tabs a little.

Focus is now given to the property grid after it has been selected from a views
context menu.

Fixed a few other focus handling issues.

Page up and Page down keys now change the current row in the property grid.

The editor in the proprty grid is now destroyed when the grid loses focus.

Shift and arrows on all appropriate grids now expand the selection.

Fixed issue where grids taht do not require drag and drop of the selection were
blocking drag-select if the user clicked on an already selected item.

ComboBox popup is now dismissed on mouse up.  Fixes an issue where clicking 
items in a dropdown box on a grid changes the grid selection underneath.

Maximum values on the log transport traces were not handled correctly and 
were actually being processed as minimums, leading to visually incorrect 
results.

Added a drawing optimization for large-ish logs in Log Transport.  
Could do with further optimizations to support huge log files.  At present, 
it is likely that really large files will cause significant memory overhead - 
a 4Gb log file is likely to require 100Mb of memory just for the peak 
information (1/48th).

================================================================================
Alpha 35 - 25 November 2008
================================================================================

Object model for option/parameter grids is now shared to reduce the expense 
of creating the underlying model multiple times.  This should reduce the
time it takes to load some tab layouts.

No longer creating item editor every time a grid is instantiated.  In many cases
the editor was being destroyed again anyway.

Applied a couple of other small optimizations to tab loading code.

Time taken to load the tabs is now displayed in the status window.

Made loading overlay optional in the user setings.

Window position is now remembered.

Changed 'Workspace' menu to 'View' menu, as it feels more natural.

Added context menu to map grid/graph and table grid/graph to switch to the 
opposite type of view.

Disabled gin installation watcher for the time being.

================================================================================
Alpha 34 - 24 November 2008
================================================================================

Added a menu option for processing a raw internal log directly.

Fixed error in log rate in STF files for slow channels.

Copy and Paste now also supports tab-separated values.  This allows copy/paste
between maps in GW and programs such as Excel and OpenOffice.

Pasting into a grid with only one cell selected and no partial selection pastes 
with the dimensions of the original data on the clipboard.

Fixed some issues with the Map Slice view (hang when displaying, slice also not
selectable until an edit made).

Fixed a rare crash when closing map grids.

================================================================================
Alpha 33 - 20 November 2008
================================================================================

Updated to wxWidgets 2.8.9.

Updated GIN file version to v3.23.

Improved tacho control styling.  Added minor tick marks.

Changing the channel selected in the CAN telemetry setup dialog was not 
updating the message bytes grid.

Added 'Close' button to serial telemetry and can telemetry dialogs.

Right aligned text in number view and vertically centered the text better.
Added a property to enable display of the values units.

Implemented Log Playback.

Implemented Log View in log transport window.

Implemented new zooming scroll bar for log view.

Factored out generally useful drag handler code into gems lib.

Fixed error in generated name of table graph views.

Axis values would not display in floating point if using fixed steps.  Also 
modified string conversion to give the most concise result.

CalBrowser: Set the focus to the filename editor after dialog creation.  
Means that save filenames can be entered directly without additional mouse 
usage.

Set a default file name for the convert calibration save file name (based on 
the source file name).

Got rid of some now redundant code for file history handling.

Fixed situation where cal file picker control could allow filenames with no 
file extension.

Fixed error message in CalBrowser: "Couldn't retrieve information 
about list item -1".

CalBrowser now refreshes after context menu invoked.

Added 'new folder' context menu item in file list.
Added 'new folder' tool button to CalBrowser.

Implemented removeFavourite in CalBrowser.

CalBrowser: if a folder is being viewed and it has a favourite, then the 
relevant item is selected in the favourites combo box.

Numpad minus key now enters a minus in option editors when the text edit is 
blank as does the normal minus key, rather than decrementing the value.

Fixed xml parser - text that contained extended unicode characters would break
serialization.

Modified serialization code to use child iterator rather than assuming that 
the state is held in the archive.

Reduced flicker on title bar when opening new calibrations.

If item grid is locked and user tries to delete, the operation is now blocked 
unless the user requests that the view is unlocked.

If item grid is locked, the last row normally used for inserting new items is no
longer displayed.

Opening GW with a file as a parameter is now the same as dropping the file on 
the UI.

GXT files (tabs) can now be dropped onto GW.

CAN channels can now be named using the new features in version 3.23 GIN files.

Bar view is now bipolar if the parameter it represents is bipolar.

Fixed possibility of getting a really narrow colour combo box drop down.

It was possible to move/resize the window underneath a colour combo popup 
without it being dismissed, leaving the drop down window in the same position.

Solved a slight numerical problem in partial adjustment of maps and tables.  
Incrementing / decrementing partial selections is now smoother over successive 
adjustments.

Fixed an occasional crash that could occur when closing map/table grids.

Remember window position if not maximized.

================================================================================
Alpha 32 - 30 October 2008
================================================================================

Made the 'Send To' menu work in the new calibration browser.

Added version number to splash screen.

Added 'Notes' view for use in tabs (effectively same as template notes in v3).

Added Calibration Notes editor.

Made Ctrl-Backspace delete previous word in text edit controls.

Changed icon for selected list of options.

Changed icon for map slice.

Made map site target selectable from menu and toolbar.

Update properties in CAN telemetry setup when channel number is changed.
This fixes an issue whereby the bit rate property would not be pointing at the
correct option leading to total confusion.

Implemented log map and template notes import from v3 templates.

Fixed a slight issue with the initial 'autohide' size when hiding docked 
windows.  It should now feel more natural.

Removed some unused images/icons to reduce bloat in the final exe.

Got rid of bitmap in 'install gin' wizard.  This is now more consistent across
all wizards.  Also reduces bloat a little.

Changed the about box image.

Fixed situation where 'state and gradient' mode is selected as the default mode
for grids in the preferences, but is not manifest in the UI.

Refactored piccolo telemetry handler slightly in preparation for log playback 
and sdlm implementation.

Enumerating com ports could take some trime due to a delay-loaded dll.  This 
is now loaded explicitly so that it does not reload for each check.  Should
improve performance on some systems.

CalBrowser: Filter would not be set correctly when uploading a cal that 
requires a specific ecu type.

Fixed issue whereby you could not connect to a secured ECU that does not define 
SECSTAT.

Fixed file extension issues when user has explorer set up to hide extensions of
known file types.

Fixed automatic navigation to special folders in calbrowser in Windows Vista.

Bar View did not update when its parameters' dependent object(s) had been
modified.

================================================================================
Alpha 31 - 24 October 2008
================================================================================

Fixed crash in calibration browser in release build.

Fixed fade out of loading overlay.

================================================================================
Alpha 30 - 24 October 2008
================================================================================

Set the focus to the selection overlay once a 'rubber band' selection has 
been completed.

Use HAND markers rather than POWER markers in exported log files.

Added Piccolo support.

Tab area is now overlayed with a 'loading' frame to prevent it looking odd when
template windows are created.

Reduced flickering due to a slew of refocus messages when switching between 
parameter or option grids where the selector control is also focused.

Hide selection on option and parameter grids when not focused.

Added splash screen.

Added new calibration selector dialog, replacing the system file dialog.

Made it possible to drop link files.  This also means it is possible to install
gin files via shell links.  Should solve RSA's problem of referencing gin files
on another disk.

Fixed security unlocking issue for ECU's locked with GWv3.

Fixed problem with dock hints showing in the wrong position.

Could not connect to ECUs that don't define COMOK.

================================================================================
Alpha 29 - 10 October 2008
================================================================================

Changed serial port enumeration code to get round issue with some modem drivers 
that causes a blue screen or that try to connect to devices and hang.

Turned off backface culling of 3d view.

Custom user scalars for pulsewidth and duty cycle on fuel maps now declare 
their option dependencies so that the scaling updates when LD0MPC or MSPB 
change.  Additionally, the scaling is declared as being non-uniform so that 
the minimum and maximum can be calculated correctly.

Added additional PreTranslateMessage filters to combobox and textedit.  
These prevent (e.g) 'del' shortcut keys from overriding 'delete' in the 
text control.

Fixed annoying issue where text is scrolled in a combobox when it doesn't 
need to be after creation with a minimum size smaller than the default.

Put a longer wait in hotplug code for ftdi port.  This may still need a bit
of work to get it functioning correctly.

Fixed crash opening non-existent GSB port (Now returns an error stating that 
the port is invalid).

Fixed inverted setting of selection on map grids.  Now also handles setting 
of soft selections.

Refactored keyboard handling code for grids and other model view types.

Now using a common set value dialog for map graphs, table graphs and grids.

Numpad +/- now increments/decrements option editors.

Fix z-order issue with dock-inside HUD hints.

Implemented 'rubber band' select of multiple windows in tabs.

Multiple selected windows may now be dragged together.

Fixed issue where saving a template with the view scrolled would set negative 
logical positions for the child components.  This would result in the template
being loaded back in with components in inaccessible areas and incorrect 
scrollbars.

Fixed some situations where focusing the properties grid would display 
properties for the properties grid itself (which is never wanted).

Tab labels on internally docked windows are now updated when the window title 
is changed via its properties.

Made windows renamable from the context menu.

Moved interpolate sub-menu items into the main context menu for easier 
access since it is so commonly used.
Don't offer 'interpolate rows' and 'interpolate cols' for objects with a single
axis (i.e. table grids, table graphs, map slices) - 'interpolate' is sufficient.

Moved "Show Title" and "Show Border" to layout sub-menu.

Fixed crash when setting linked selection on a map slice under some 
circumstances.

Update map slice selection when changing slice axis or slice number.

Added "Use Raw Conversion" checkbox to compare tab.  This causes the raw value 
for a given object to be copied rather than trying to try to do the most 
appropriate conversion based on the object type (e.g. if the object uses an 
option list, it normally tries to convert by using a name match).

Added "Auto Refresh" option to compare tab.

Added Map Site Target View.

Update Virtual Pot Box control when session changes.

Added "Percent Change" and "Absolute Change" to context menu for objects such
as maps and tables.

Fix spelling mistake in the safety warning option preference description.

Numpad number keys now work in maps / tables etc.

Fixed drag-select on map slice / table graph.

Made shift and arrow keys work in map slice and table graph.

Made shift-arrow select work in map graph.

Fixed zoom keys in map graph.

Added a power curve to the selection opacity on map graphs to make 
the visible partial selection closer to the modification radius.

================================================================================
Alpha 28
================================================================================

BREAKING CHANGE:
XML serialization was incorrect.  Character data now has entities for 
cr/lf/tab/nbsp.  Consecutive spaces are now stripped.  This should fix the 
recent files list, but it breaks reading existing GIN installation files.  
GIN files will be automatically re-installed, so this should not be a huge 
issue.  
Strings in other XML based archives may also be incorrect.  This change will 
need to be folded back into ginmake, but for the time being GIN files will
be auto-installed by GW if there are any spaces in the name.  
Unfortunately it is not straightforward to make this change backwards 
compatible.

Fixed conversion of PC logs with 8 bit values to STF (was getting zeros 
interleaved with the actual data).

Bar Gauge: Flip aspect ratio when changing orientation property.

PC Logging: use default log folder if it has not been set yet.

Fix layout issue when error message from calculating free disk space has 
carriage returns / line feeds in it.

Fixed crash when setting linked selection on a map grid with inverted axis 
orientations.

Implemented Map Slice views.

Made it possible to dock work page windows inside one another.

Type name was not always used in title of views -
e.g. "Fuel Graph" as opposed to "Fuel Map Graph".  It depended on how the 
view was created.  The offending code has been refactored to use a common code 
path.

Center auto install gin file dialog of top level window.

Implemented Log Map Controller.

Implemented Log Map Target.

Implemented Auto Mapping.

================================================================================
Alpha 27
================================================================================

BREAKING CHANGE:
File extension suffix for tab files now changed from 'xml' to 'gxt' (stands for 
"Gems Xml Template").  Your tab files will no longer show up by default in the 
tab selection dialog.
To get round this, select 'xml files' from the filter box.
The reason for this change is so that we will be able to set a file association
so that template files can be given an icon/drag'n'dropped etc.
Also, tab files now use the ecu name and version as part of the file extension.
The name and version have trailing spaces trimmed off.

Recent file list is now stored in an XML settings file.  This will mean 
that your recent file list will be cleared.

Tab files are now filtered based on ECU type in the file dialogs.

Changed naming of menu items in Layout menu slighty to clarify.

"Views" menu changed to "Workspace" to avoid ambiguity with "Views" panel.

Reset Workspace menu item moved to the Workspace menu.

Multiple tab files may now be selected when opening tabs.

Multiple GWv3 templates may now be imported in one go.

When importing GWv3 templates, the name of the file is used as the tab caption
if there isn't a name stored in the template.

Parameter reads are now disabled for windows in hidden tabs.  

Improve gradient key on maps (avoid gap between border and gradient).

MESA libary updated to version 7.0.4.

OpenGL is now explicilty only using software rendering.  The view is drawn
to a DIB and blitted to the window.  This resolves the issue with trails being
left on the screen when dragging windows in a way that requires a repaint of 
3d map views.

Axis grid header now correctly removes parameter listeners when destroyed.

Custom message dialogs - if a null parent is used, always use top level window 
as the parameter so that the dialog box displays on the correct screen of a
multi-display PC.

XML entities were not being unescaped when reading from archives.  This was 
causing the parameter "Stat Sync'd" not to reload from templates for example.

Fixed GWv3 template import in release build.  It appears that the excessive use
of stack based arrays in the old template code caused problems with the 
exception epilog code generation by the compiler resulting in the emerald session
being prematurely ended before completing and thrwoing an exception. 
The cleanup of the emerald dll was then also throwing an exception resulting 
in an abnormal program termination.

Fixed infinite loop in drawing code for Bar Gauge control when the size is too 
small.

Fixed error when stretching Bar Gauge in one direction only.

Bar Gauge may now be set as a horizontal or vertical bar.

Colour picker now initializes the custom colour dialog with the currently 
selected colour rather than black.

Fixed tab highlight becoming stuck on auto hide tab strip.

Zoom was not being stored for maps in templates.

Updated menus to use generic actions.

Added some items to the tool bar.

Added 'add' functions to the layout menu.

Implemented auto placement for items added through the menu.

If GW crashes whilst opening a calibration at startup, it should now open up
with a blank workspace the next time GW is launched.

Position Pick Parameter/Map/Table box near the mouse when it is opened to 
reduce mouse movement required by the user.

When a grid is not focused, set its default selection colour to one merged 
with the background colour (this includes list boxes).

"Delete Tab" changed to "Close Tab" in context menu.

Implemented keyboard action configuration (keyboard shortcuts).

Implemented action scheme configuration.

Apply button in preferences dialog is now only enabled after a change has been 
made.

Only display FTDI and LIBUSB settings pages if the drivers are installed.
(The DLL's for these are now delay-loaded).

Keyboard rotation made to feel more natural.  Arc-rotation is still used 
for the mouse where it is more appropriate.
Ctrl-Left/Ctrl-Right rotates through the Z axis of the map object.
Ctrl-Up/Ctrl-Down rotates through the X axis of the viewport.
(shift is used in conjunction with Ctrl for larger steps).

Multi-Select now possible in object picker for Option Selection Lists and 
Parameter Lists.  And any other GinItemGrid derivatives.

3D Map was unneccesarially updating when online and the axis positions had 
not changed (slowing the UI down).

Calibration comparison wizard:
Changed labels on the first page to be more obvious to the user.
Added a 'finished' page.
Profile selection page is no longer displayed if the source and destination 
calibrations do not have any profiles (hence the 'finished' page).

Added 'View Raw' option to map and table grids.

User scalars are no longer loaded from calibration files.  
Loading of user scalars lead to a bit of confusion where trhe scaling 
represented by the gin file was not represented by the values seen in the UI.
Scaling is going to be done differently in v4 to v3, so it seems reasonable 
to remove this.  The current scaling will still be stored in the cal.  Perhaps
in the future it will be possible to load the information intop temporary 
scalars so that you can view the calibration with the scalingf that the user had
selected.

Suggestions are now in sorted order for the object picker.

Implemented PC Logging Back-End.

Implemented conversion of PC Log to 'stf' file for DLOG.

Implemented Launch of DLog.

Implented UI for PC Logging.

Applied a workaround for button edit controls (e.g. file picker / dir picker) 
where the text is scrolled out of view even when there is plenty of space.

Implemented new Splitter control to replace wxSplitterWindow which was causing
problems with the layout of the properties window (it would sometimes 
incorrectly size the description panel).

Prevent flicker due to update of menyus and toolbars when executing an 
accelerator when none of the actions have changed.

Changed default caption gradient colours.

Fixed some dialog boxes displaying on the incorrect monitor of a dual monitor
setup.

Changed icons for:
Upload firmware
Number Gauge
Download Internal Log
PC Logging
Upload Current Calibration
Upload New Calibration
Download Calibration
Verify Calibration
Save New Version

================================================================================
Alpha 26
================================================================================

Started re-organizing menu structure slightly (still more work to be done on 
this).

Fixed COMOK checking on AEM25.

Fixed ISP (was erroneously reporting that ISP had failed).

Pageup/down in grids now selects all text in the object selector control.

Fixed dongle not found warning with comms monitor frame.

Updated ECU simulator to use the same parameter grid as the main application.

Fixed focus issue when leaving the ecu simulator window with a value editor 
focused.

Wrapping width fixed on custom message dialogs (avoids rediculously wide 
message dialogs).

Button Alignment improved on custom message dialogs.

GIN files can now be dropped onto work pages.

Implemented verify calibration.

Avoid situation where ECU cannot be connected because COMOK is not accessible 
when secured.

Offer option to clear the secure calibration from the password dialog box.

Added PulseWidth and DutyCycle view modes for the fuel map.

3D repaint optimization didn't work very well in some situations so it has 
been removed.

Partially implemented import of GWv3 templates.

Forward context menu event from window title bar and borders to the inner 
window for view windows.

================================================================================
Alpha 25
================================================================================

Only display editor in parameter and option grids when the window is focused.

ParameterTables now work without having to dial up all the parameters it uses 
in a parameter list.

Propogate updates to parameter grids when offline.

Added a couple of optimizations to model updates in response to changes to 
the calibration and parameters.

Prevent crash when cancelling 'new calibration' wizard with an ECU group 
selected.

Add warning message if user attempts to add a large number of views with
"Open in new Tab".

Made it possible to cancel opening items in a new tab whilst the layout
algorithm is running.

Sorting and Grouping state is now remembered for the object selection dialog.

Fixed tab navigation from grid controls.

Fixed error in LOGTBL handling, wich could lead to spurious values popping up
in some parameters (the command byte was interpreted as parameter data!).

Force COMOK check when LOGTBL is invalidated.
Reset r/w handler when LOGTBL invalidated and check sequence number when 
as a guard against stale responses.

Fixed an issue with fast cal transfer where it was adding an additional 
termination byte at the end of the transfer (causing errors).

Prevent comms getting stuck if ECU does not have COMOK.

Workspace file format changed slightly and code has not been added to make 
the change backwards compatible (due to app still being Alpha).  
This will mean that any current workspace layouts will be lost.  This only 
applies to the layout of windows docked around the edge of the main window and
not any tab layouts.

Implemented Virtual PotBox (Trim Control)

Made it possible to add maps, tables, parameters and options via the context 
menu.

Made repaint of unmodified map graph windows much faster - reduces 'trails' 
across windows when moving them.

================================================================================
Alpha 24
================================================================================

Connecting to the ECU will now explicitly disconnect if already connected 
before reconnecting.

When the Gin can't be found when connecting and the user is prompted to run
the Install ECU wizard, the wizard now actually runs.

Added context menu items for main layout to sub menu of view context menus.

Added title to context menus.

Re-arranged views tree.

Implemented Alt+Arrows for copy+move+paste selection on map/table grids.

Device arrival/removal would incorrectly detect that a serial port was removed.

Reconnecting to a port due to hot-plugging would not reconnect the comms 
monitoring interface, resulting in the comms trace halting.

Automatically select all text in the object selector box of option / parameter 
windows when displaying it / changing the current cell.

Category folders can now be added into a new tab in one go.

Implemented genetic algorithm for window layout.

Placing items on a work page will now snap its width to the grid.

Load tab(s) menu item was not always working.

If all tabs are closed by the user, an 'Untitled' tab will be added so that 
there is always a tab area to place items into (would otherwise be very 
confusing to the user).

'del' is no longer an accelerator key (it was causing problems when used in 
editors of option and parameter lists).

Navigation of option/parameter lists improved (tab and shift-tab can move 
between columns).  Also alt and arrows can be used for navigation.

Double clicking an item in the views window no longer adds it to the 
current tab if it has children.

If an ecu transaction caused a connect transaction to run (e.g. user selected
'upload calibration' whilst offline), the ECU is now disconnected if the 
transaction fails.  If it succeeds, the ECU remains online.  
If the ecu was already connected then the ecu remains online.

Multiple change events resulting from continuous edits on a knob editor of
e.g. an option or parameter are compressed ionto one single undo entry.

================================================================================
Alpha 23
================================================================================

Filename can now be specified when saving a single tab.

Single (or multiple) tabs may now be loaded into the current layout.

Centre Rename Tab dialog on its parent window.

Now using InnoSetup based installer.

Implemented minimum column size for grid views (e.g. parameters / options), 
to prevent the columns from being resized to zero width.

Display grid/graph menu option in views panel was broken.

ECU

Overview

ECUs can be monitored and calibrated in real-time by connecting the ECU to the PC.

GWv4 supports both GEMS ECUs and ASAM Standard XCP based ECUs on a variety of transport layers including RS232, USB, CAN and Ethernet.

This chapter details the ECU connection process.

Please be aware that GEMS has two types of ECU, a standard, and a Simulink/Matlab enabled ECU (the EM80-M). Some of the processes for the EM80-M are slightly different, and you will find these details highlighted in the relevant places, e.g. ECU Internal Logging and EM80-M Internal logging have separate sections in this manual.

Subsections of ECU

ECU Definition Files

Overview

ECU Definition Files describe the memory layout of the ECU so that GWv4 can present the information stored in the ECU in a logical way and display/edit values using physical units such as Celsius or Fahrenheit rather then the internal representation used by the ECU.

Before you can connect to an ECU or edit Calibration Files, an ECU Definition File for the ECU will therefore need to be installed into GWv4.

Installation

There are a few ways to install ECU Definition Files:

  1. Drag & Drop your ECU Definition file onto GWv4 to install it.
  2. Open a Calibration or attempt to connect to an ECU. GWv4 will guide you through the process of locating an ECU definition file.
  3. Use the ECU Installations dialog. From the main menu go to Installations... and click the ‘Install…’ button.

The installation process archives ECU Definition files to an installation folder in the ProgramData folder in the EcuDef format.

ECU Definition File Formats

  • GIN (*.gin) - GEMS Proprietary ECU Definition file.
  • A2L (*.a2l) - ASAM Standard ECU Definition file. Requires an XCP License. A2L files have the file extension “.a2l”.
  • EcuDef (*.ecudef)- Compressed archive that, amongst other things, contains either a GIN file or an A2L file. EcuDef files take up considerably less disk space than GIN or A2L files. EcuDef files can also contain other supporting files.
Tip

If you do not have an ECU Definition file for your ECU, in most cases you can download them (gems.co.uk/downloads). Alternatively, contact GEMS.

ECU Connection

Working on tractive systems (which includes but is not limited to engine(s), motor(s), inverter(s), high voltage battery packs and high voltage cables) requires special experience and training.

Incorrect installation or use of GEMS Electronic Control units (ECUs) or software may lead to electrical / mechanical damage, injury or even death. As such, installation must only be performed by users with experience with electronic control systems and a competence of Windows based computer software.

All accompanying documentation must be read thoroughly before installation is attempted.

If you are in any doubts regarding the fitting and use of this product, please contact your reseller or GEMS directly at tech.support@gems.co.uk

General Engine Management Systems (GEMS) Ltd shall not be held responsible for any mechanical or electrical damage or personal injury occurring whilst using this product. Neither shall GEMS be held responsible for damage, injury or death caused by the misuse, misunderstanding or miscalibration of this product.

Overview

Connecting the PC to the ECU using a communications link is referred to as ‘going online’. Once online, calibration data is automatically downloaded from the ECU if necessary and channel data can be viewed. Some GWv4 functions, such as PC logging and auto mapping, can only be used when online.

If you are connecting to an ECU for the first time then you will need to adjust your connection settings. USB and Ethernet ECUs may be automatically detected and a notification will pop up in the bottom-right of the application window. This notification will contain a link to connect to the product and will automatically configure your communications settings.

If your ECU uses a different connection port from the previous port used (e.g. you are connecting via a direct USB connection instead of a serial cable) then you will also need to adjust your connection settings.

If you are having connection problems not covered by this topic, see Connection Troubleshooting.

Establishing a Connection

  • Connect the communications cable between the PC and the ECU.
  • Check that the correct port is selected in Connection Settings.
  • Click Connect Icon on the tool bar or select ConnectShift+F7 from the main menu.

Alternatively you can choose to upload a calibration which will connect to the ECU then upload the calibration to it. To do this, select Send Calibration to ECU... or Send Current Calibration from the main menu.

If you choose just to connect, the calibration that is stored in the ECU will be downloaded and displayed.

For ECUs using serial connections that support Telemetry Stream mode, generally it is best to click on ConnectShift+F7 before supplying power to the ECU to avoid connection failures due to the ECU entering telemetry mode.

If you are connecting to your ECU using a serial connection, GWv4 can detect the Baud Rate by clicking on the ‘Detect Rate’ button. If you know the baud rate for your ECU then you can use “Set Rate” to configure it manually.

When you are online this will be displayed in the status bar at the bottom right of the GWv4 application window.

You will notice that when GWv4 is connecting the ECU Status window will be shown. This will show information about communication operations that are being performed between the PC and the ECU. This can be useful for diagnosing connection problems.

Once connected, GWv4 will load the ECU definition file for the connected ECU.

If an GIN file has not yet been installed for your ECU then a search will be performed.

This will search the GWv4 definitions folder for any ECU Definition files shipped with GWv4.

If a suitable ECU Definition file cannot be found then you will be offered to walk through the process of installing one. ECU Definition files can be downloaded from the GEMS website.

Connection Problems

If you are having problems connecting to your ECU, see Connection Troubleshooting.

ECU Definition Extension Files

Overview

ECU Definition Extension (EDX) Files augment ECU Definition Files with additional information that may not be possible to describe in the ECU Definition File itself.

For example, some features such as the ECU pinout / connector diagram is not possible to express in a standard A2L file. There may be other features that are not easy to add to A2L files if they are being generated from a tool.

Format

ECU Definition Extension Files have the file extension “gemsedx”. They are in an extended JSON (structured text) format that can be easily read and edited by humans, checked into source control tools and easily compared.

Installation

For ECU definition file authors with access to the ‘ginpkg’ tool, EDX files may be embedded in an ECU Definition File archive for automatic loading and installation.

Default EDX files may also be installed on disk in either the %PROGRAMDATA%/GEMS/GWv4/edx or %APPDATA%/GEMS/GWv4/edx directories. The edx file should be given the same name as the ECU, with or without the version as it appears in the ECU Installations dialog, accessible via the action Installations....

e.g. possible file names:

  • %PROGRAMDATA%/GEMS/GWv4/edx/DEMO.gemsedx
  • %APPDATA%/GEMS/GWv4/edx/DEMO-01X01.gemsedx

EDX files will only be loaded from these locations if the ECU Definition File does not already embed one.

Only 1 EDX file will be loaded from disk, in order of preference:

  1. %APPDATA%, with full version name (e.g. DEMO-01X01)
  2. %APPDATA%, name without version (e.g. DEMO)
  3. %PROGRAMDATA%, with full version name (e.g. DEMO-01X01)
  4. %PROGRAMDATA%, name without version (e.g. DEMO)

Inheritance

ECU Definition Files may embed multiple EDX files, which will be loaded in the order they are embedded. This allows for a base EDX file to be embedded in a common ECU Definition File, with additional EDX files for specific variants or versions. EDX files will be merged based upon elements with unique keys or appended to existing lists.

If EDX files are embedded into the calibration file, they will be loaded in the order they are embedded, after any EDX files embedded in the ECU Definition File or from disk default. This allows calibrations files to override things like wire colours for connector pins on the pinout diagram.

Embedding EDX Files in the Calibration File

EDX files may be embedded / removed / re-prioritized in the calibration file, using the ECU Definition Extensions… action:

ECU Definition Extensions Manager ECU Definition Extensions Manager

Name Pattern Matching

For some elements in the EDX file, name pattern matching is possible (e.g. to identify options that are an output pin number and should offer an alternative selector in the application UI).

Possible Wildcard patterns:

  • $N: any decimal number of any length.
  • $*: 0 or more characters of any length.
  • $+: 1 or more characters of any length.
  • $?: any single character.
  • $$: match a literal ‘$’.

Name matching is case insensitive and will also check ‘old names’ if they are present in the ECU Definition File; some items may be renamed in new versions of the ECU Definition File, with a record of their prior name.

Note also that for items that are matched for things like output pin numbers, any aliased items will also be considered a match.

For example, the option option iconOut Oil Feed 1 may be aliased with the option option iconOil Feed 1 Out. If the EDX file contains a rule that matches option iconOut Oil Feed 1, then option iconOil Feed 1 Out would also be matched.

Using wildcard matches simplifies maintenance of EDX files when the ECU Definition File is updated if naming conventions are consistent.

Name pattern exclusions are also possible. For example, consider the following:

{
    // This clause will match all options starting with the string "Out ", 
    // followed by any sequence of characters.  
    //
    // For this ECU, this would also match PWM module outputs (which are NOT output pin numbers).
    // These items are excluded by the "out_pin_options_exclude" clause below.
    "out_pin_options": [
        "Out $*", 
    ],
    // Exclude specific PWM module outputs that are not output pin numbers but would
    // otherwise match the "Out $*" clause above:
    "out_pin_options_exclude": [
        "Out $* PWM",
        "Out $* PWM$N", // e.g. exclude Out Idle PWM1
        "Out $* PWM#$N", // e.g. exclude Out VVC#1 PWM#1
    ],
}

Formulas

Formulas can be used in a number of places. These follow A2L formula rules with some additional extensions.

A2L formulas closely follow C expressions and use the same operator precedence.

<% vendor %> Extensions

Extension Purpose
Relational operators ( ==, !=, <, <=, >, >= ) Compare two values, resulting in 0 or 1.
Ternary operator a ? b : c If ‘a’ is true the ‘b’ is executed, otherwise ‘c’ is executed.
arg(i) function Selects input argument ‘i’ (zero based) from input arguents list. Can be used for selectors.
option(name) function Select an option object by name.
table(name) function Select a table object by name.
map(name) function Select a map object by name.
channel(name) function Select a channel object by name.

Example EDX File

In future a JSON schema will be developed for easier editing in tools that support JSON schema validation.

For the time being, the following is an example EDX file that describes a connector with multiple sections, each with multiple pins, some of which have specific functions and conditions for use.

There are also some examples of wire colours and patterns that may be used in the connector diagram.

Also, output pins / switch inputs / A2Ds etc may be identified.

Note that an extended (JSONX) format is used so that comments are allowed and additionally some relaxations to the strict JSON format are allowed (e.g. trailing commas / missing commas, unquoted keys etc).

For the purpose of integration with external tools it is generally recommended to stick to strict JSON format where possible.

Editors such as Visual Studio Code can be extended to support the ‘jsonc’ format (JSON with comments) which is a good compromise.

// Comments may be included in EDX files.
{
    "ecu_family": [
        "DEMO"
    ],

    // Default shape / size for pins in the connector diagram:
    "default_pin": {
        "shape": "circle",
        "size": [2,2]
    },

    // Describe the ECU connectors and any predefined functions.
    "connectors": [
        {
            "id": "AB",
            "part": "6437288-3",
            "comment": "Mates with: 3-1437290-7 (26P), 4-1437290-0 (34P)",
            "pos": [50, 0],
            "size": [75, 24.6],
            "sections": [
                {
                    "id": "A",
                    "pos": [0, 0],
                    "pin_offset": [6.2, 6.2],
                    "size": [38.4, 24.6],
                    "diagram": [
                        {
                            "shape": "round_rect",
                            "radius": 2,
                            "pos": [5, 5],
                            "size": [28.4, 14.6],
                        },
                        {
                            "shape": "round_rect",
                            "radius": 6,
                            "pos": [1, 1],
                            "size": [36.4, 22.6],
                        },
                        {
                            "shape": "round_rect",
                            "radius": 7,
                            "pos": [0, 0],
                            "size": [38.4, 24.6],
                        },
                    ],
                    "pins": [
                        // row 1, 9 pins, pitch 3mm
                        {
                            "id": "A1",
                            "func": "BRGB2",
                            "dir": "O", // I / O / IO
                            "out_pin": 9,
                            "pwm": 2,
                            "throttle": 2,
                            "pos": [0, 0], // x,y position on connector diagram
                            "wire": {
                                "colour": ["#FF0000","#00DD00"], // Colour(s) of the wire, some may be striped with multiple colours.  Could be a single colour with no array.
                                "width": [1, 1], // Width of the stripes (optional)
                                "pattern": "D", // D: diagonal, T: transverse, L: longitudinal (optional)
                                "text": "Red/Green"
                            },
                            "comment": "Act Throttle 2",
                            "used_if": [ // Conditions that lead to this output being used (overrides / conflicts with use of out_pin)
                                {
                                    "func": "Act Throttle 2",
                                    "expr": "option('BridgeB Enable') && option('Act Throttle 2') && !option('Act T 2 No Drive')",
                                }
                            ]
                        },
                        {
                            "id": "A2",
                            "func": "BRGB1",
                            "dir": "O", // I / O / IO
                            "out_pin": 8,
                            "pwm": 1,
                            "throttle": 2,
                            "pos": [3, 0], // x,y position on connector diagram
                            "wire": {
                                "colour": ["#00DD00","#3333DD"], // Colour(s) of the wire, some may be striped with multiple colours.  Could be a single colour with no array.
                                "width": [1, 1], // Width of the stripes (optional)
                                "pattern": "T", // D: diagonal, T: transverse, L: longitudinal (optional)
                                "text": "Green/Blue"
                            },
                            "comment": "Act Throttle 2",
                            "used_if": [
                                {
                                    "func": "Act Throttle 2",
                                    "expr": "option('BridgeB Enable') && option('Act Throttle 2') && !option('Act T 2 No Drive')",
                                }
                            ]
                        },
                        {
                            "id": "A3",
                            "func": "IGSWT",
                            "a2d": 13,
                            "pos": [6, 0],
                            "comment": "5V to turn on MAIN RELAY",
                            "wire": {
                                "colour": ["#FFFFFF","#000000"], // Colour(s) of the wire, some may be striped with multiple colours.  Could be a single colour with no array.
                                "width": [1, 1], // Width of the stripes (optional)
                                "pattern": "line", // D: diagonal, T: transverse, L: longitudinal, line (optional)
                                "text": "White/Black"
                            },
                        },
                        {
                            "id": "A4",
                            "func": "Fuel8",
                            "out_pin": 24,
                            "pos": [9, 0],
                            "comment": "Fuel Injector 8",
                            "used_if": [
                                {
                                    "func": "Fuel 8",
                                    "expr": "option('Fuel 8')"
                                }
                            ]
                            "wire": {
                                "colour": ["#FF7F00","#000000"], // Colour(s) of the wire, some may be striped with multiple colours.  Could be a single colour with no array.
                                "width": [1, 1], // Width of the stripes (optional)
                                "pattern": "L", // D: diagonal, T: transverse, L: longitudinal (optional)
                                "text": "Orange/Black"
                            },
                        },
                        {
                            "id": "A5",
                            "func": "Fuel7",
                            "out_pin": 25,
                            "pos": [12, 0],
                            "comment": "Fuel Injector 7",
                            "used_if": [
                                {
                                    "func": "Fuel 7",
                                    "expr": "option('Fuel 7')"
                                }
                            ]
                        },
                        {
                            "id": "A6",
                            "func": "Fuel6",
                            "out_pin": 26,
                            "pos": [15, 0],
                            "comment": "Fuel Injector 6",
                            "used_if": [
                                {
                                    "func": "Fuel 6",
                                    "expr": "option('Fuel 6')"
                                }
                            ]
                        },
                        {
                            "id": "A7",
                            "func": "Fuel5",
                            "out_pin": 27,
                            "pos": [18, 0],
                            "comment": "Fuel Injector 5",
                            "used_if": [
                                {
                                    "func": "Fuel 5",
                                    "expr": "option('Fuel 5')"
                                }
                            ]
                        },
                        {
                            "id": "A8",
                            "func": "Fuel4",
                            "out_pin": 28,
                            "pos": [21, 0],
                            "comment": "Fuel Injector 4",
                            "used_if": [
                                {
                                    "func": "Fuel 4",
                                    "expr": "option('Fuel 4')"
                                }
                            ]
                        },
                        {
                            "id": "A9",
                            "func": "Fuel3",
                            "out_pin": 29,
                            "pos": [24, 0],
                            "comment": "Fuel Injector 3",
                            "used_if": [
                                {
                                    "func": "Fuel 3",
                                    "expr": "option('Fuel 3')"
                                }
                            ]
                        },
                        // Row 2, 8 pins
                        {
                            "id": "A10",
                            "func": "PWR",
                            "a2d": 14,
                            "pos": [1.5, 3.2],
                            "comment": "1st Power IN",
                        },
                        {
                            "id": "A11",
                            "func": "12VOUT",
                            "pos": [4.5, 3.2],
                            "comment": "12V Battery 100mA sensor supply"
                        },
                        {
                            "id": "A12",
                            "func": "IGN1",
                            "out_pin": 56,
                            "mux": "IGMUX11", // Multiplexor (used for ignition mux)
                            "pos": [7.5, 3.2],
                            "comment": "CoilA IGN1&3 TTL ignition multiplex",
                            "used_if": [ 
                                {
                                    "func": "Ign 1",
                                    "expr": "option('Ign 1')"
                                }
                            ]
                        },
                        {
                            "id": "A13",
                            "func": "IGN4",
                            "out_pin": 58,
                            "mux": "IGMUX21",
                            "pos": [10.5, 3.2],
                            "comment": "CoilB IGN2&4 TTL ignition multiplex",
                            "used_if": [ 
                                {
                                    "func": "Ign 4",
                                    "expr": "option('Ign 4')"
                                }
                            ]
                        },
                        {
                            "id": "A14",
                            "func": "IGN3",
                            "out_pin": 57,
                            "mux": "IGMUX12",
                            "pos": [13.5, 3.2],
                            "comment": "CoilA IGN1&3 TTL ignition multiplex",
                            "used_if": [
                                {
                                    "func": "Ign 3",
                                    "expr": "option('Ign 3')"
                                }
                            ]
                        },
                        {
                            "id": "A15",
                            "func": "IGN2",
                            "out_pin": 59,
                            "mux": "IGMUX22",
                            "pos": [16.5, 3.2],
                            "comment": "CoilB IGN2&4 TTL ignition multiplex",
                            "used_if": [
                                {
                                    "func": "Ign 2",
                                    "expr": "option('Ign 2')"
                                }
                            ]
                        },
                        {
                            "id": "A16",
                            "func": "IGN5",
                            "out_pin": 3,
                            "pos": [19.5, 3.2],
                            "comment": "TTL",
                            "used_if": [
                                {
                                    "func": "Ign 5",                                    
                                    "expr": "option('Ign 5')"
                                }
                            ]
                        },
                        {
                            "id": "A17",
                            "func": "IGN6",
                            "out_pin": 4,
                            "pos": [22.5, 3.2],
                            "comment": "TTL",
                            "used_if": [
                                {
                                    "func": "Ign 6",
                                    "expr": "option('Ign 6')"
                                }
                            ]
                        },
                        // Row 3, 8 pins
                        {
                            "id": "A18",
                            "func": "PWR2",
                            "a2d": 14,
                            "pos": [1.5, 7],
                            "comment": "2nd Power IN",                    
                        },
                        {
                            "id": "A19",
                            "func": "Crank",
                            "timer": 1,
                            "pos": [4.5, 7],
                            "pullup": "option('T1 Pull-Up') ? 1000 : 0",
                            "comment": "VR Filter"
                        },                
                        {
                            "id": "A20",
                            "func": "Cam",
                            "timer": 2,
                            "swt": 32,
                            "pos": [7.5, 7],
                            "pullup": "option('T2 Pull-Up') ? 1000 : 0",
                            "comment": "VR Filter"
                        },
                        {
                            "id": "A21",
                            "func": "T3",
                            "timer": 3,
                            "swt": 25,
                            "pos": [10.5, 7],
                            "pullup": "option('T3 Pull-Up') ? 1000 : 0",
                            "comment": "VR"
                        },
                        {
                            "id": "A22",
                            "func": "T4",
                            "timer": 4,
                            "swt": 26,
                            "pos": [13.5, 7],
                            "pullup": "option('T4 Pull-Up') ? 1000 : 0",
                            "comment": "VR"
                        },
                        {
                            "id": "A23",
                            "func": "T5",
                            "timer": 5,
                            "swt": 27,
                            "pos": [16.5, 7],
                            "pullup": "4700",
                        },
                        {
                            "id": "A24",
                            "func": "T7",
                            "timer": 7,
                            "swt": 29,
                            "pos": [19.5, 7],
                            "pullup": "4700",
                            "comment": "Logic only"
                        },
                        {
                            "id": "A25",
                            "func": "T8",
                            "timer": 8,
                            "swt": 30,
                            "pos": [22.5, 7],
                            "pullup": "4700",
                            "comment": "Logic only"
                        },
                        // row 4, 9 pins RTL, pitch 3mm
                        {
                            "id": "A26",
                            "func": "PGND2",
                            "pos": [0, 10.2],
                        },
                        {
                            "id": "A27",
                            "func": "CAN2L",
                            "pos": [3, 10.2],
                            "comment": "8TX",
                        },
                        {
                            "id": "A28",
                            "func": "CAN2H",
                            "pos": [6, 10.2],
                            "comment": "8TX",
                        },
                        {
                            "id": "A29",
                            "func": "TX",
                            "pos": [9, 10.2],
                            "comment": "Serial Comms Transmit (TTL)",
                        },
                        {
                            "id": "A30",
                            "func": "S5V2",
                            "pos": [12, 10.2],
                            "comment": "5V 100mA",
                        },
                        {
                            "id": "A31",
                            "func": "RX",
                            "pos": [15, 10.2],
                            "comment": "Serial Comms Receive (TTL)",
                        },
                        {
                            "id": "A32",
                            "func": "T9",
                            "timer": 9,
                            "swt": 9,
                            "pos": [18, 10.2],
                            "pullup": "4700",
                            "comment": "Logic only"
                        },
                        {
                            "id": "A33",
                            "func": "T10",
                            "timer": 10,
                            "swt": 10,
                            "pos": [21, 10.2],
                            "pullup": "4700",
                            "comment": "Logic only"
                        },
                        {
                            "id": "A34",
                            "func": "TGND",
                            "pos": [24, 10.2],
                            "comment": "signal 100mA"
                        },
                    ]
                },
                {
                    "id": "B",        
                    "pos": [40, 0],     
                    "pin_offset": [6.2, 6.2],
                    "size": [32.4, 24.6],
                    "diagram": [
                        {
                            "shape": "round_rect",
                            "radius": 2,
                            "pos": [5, 5],
                            "size": [22.4, 14.6],
                        },
                        {
                            "shape": "round_rect",
                            "radius": 6,
                            "pos": [1, 1],
                            "size": [30.4, 22.6],
                        },
                        {
                            "shape": "round_rect",
                            "radius": 7,
                            "pos": [0, 0],
                            "size": [32.4, 24.6],
                        },
                    ],        
                    // 26 pin connector 7,6,6,7
                    "pins":[
                        // Row 1, 7 pins
                        {
                            "id": "B1",
                            "func": "Fuel2",
                            "out_pin": 30,
                            "pos": [18, 0],
                            "comment": "Fuel Injector 2",
                            "used_if": [
                                {
                                    "func": "Fuel 2",
                                    "expr": "option('Fuel 2')"
                                }
                            ]
                        },
                        {
                            "id": "B2",
                            "func": "Fuel1",
                            "out_pin": 31,
                            "pos": [15, 0],
                            "comment": "Fuel Injector 1",
                            "used_if": [
                                {
                                    "func": "Fuel 1",
                                    "expr": "option('Fuel 1')"
                                }
                            ]
                        },
                        {
                            "id": "B3",
                            "func": "PWM3",                    
                            "pwm": 3,
                            "out_pin": 10,
                            "pos": [12, 0],
                        },
                        {
                            "id": "B4",
                            "func": "PWM4",
                            "pwm": 4,
                            "out_pin": 11,
                            "pos": [9, 0],                    
                        },
                        {
                            "id": "B5",
                            "func": "PWM7",
                            "pwm": 7,
                            "out_pin": 14,
                            "pos": [6, 0],
                        },
                        {
                            "id": "B6",
                            "func": "PWM8",
                            "pwm": 8,
                            "out_pin": 15,
                            "pos": [3, 0],
                        },
                        {
                            "id": "B7",
                            "func": "MAINRLY",
                            "pos": [0, 0],
                            "comment": "(IGNSWT)",
                        },
                        // Row 2, 6 pins
                        {
                            "id": "B8",
                            "func": "IGN7",
                            "out_pin": 5,
                            "pos": [16.5, 3.2],
                            "comment": "TTL",
                            "used_if": [
                                {
                                    "func": "Ign 7",
                                    "expr": "option('Ign 7')"
                                }
                            ]
                        },
                        {
                            "id": "B9",
                            "func": "IGN8",
                            "out_pin": 6,
                            "pos": [13.5, 3.2],
                            "comment": "TTL",
                            "used_if": [
                                {
                                    "func": "Ign 8",
                                    "expr": "option('Ign 8')"
                                }
                            ]
                        },
                        {
                            "id": "B10",
                            "func": "ACTTP1",
                            "a2d": 10,
                            "swt": 51,
                            "pos": [10.5, 3.2],
                            "pullup": "47000",
                            "comment": "Act Throttle 1 position 1st",
                            "channels":[
                                "Act T1 raw",
                                "Analog 10"
                            ],
                            "used_if": [
                                {
                                    "option": "Act T1 Active"
                                }
                            ]
                        },
                        {
                            "id": "B11",
                            "func": "ACTTP2",
                            "a2d": 9,
                            "swt": 50,
                            "pos": [7.5, 3.2],
                            "pullup": "47000",
                            "comment": "Act Throttle 1 position 2nd",
                            "channels":[
                                "Act T2 raw",
                                "Analog 09"
                            ],
                            "used_if": [
                                {
                                    "option": "Act T2 Active"
                                }
                            ]
                        },
                        {
                            "id": "B12",
                            "func": "ACTTP3",
                            "a2d": 18,
                            "swt": 59,
                            "pos": [4.5, 3.2],
                            "pullup": "47000",
                            "comment": "Act Throttle 2 position 1st",
                            "channels":[
                                "Act T3 raw",
                                "Analog 18"
                            ],
                            "used_if": [
                                {
                                    // Alternative to using an expression + a function name.
                                    "option": "Act T3 Active"
                                }
                            ]
                        },
                        {
                            "id": "B13",
                            "func": "ACTTP4",
                            "a2d": 19,
                            "swt": 60,
                            "pos": [1.5, 3.2],
                            "pullup": "47000",
                            "comment": "Act Throttle 2 position 2nd",
                            "channels":[
                                "Act T4 raw",
                                "Analog 19"
                            ],
                            "used_if": [
                                {
                                    "option": "Act T4 Active"
                                }
                            ]
                        },
                        // 3rd row, 6 pins
                        {
                            "id": "B14",
                            "func": "OXHEATB",
                            "out_pin": 33,
                            "pos": [16.5, 7],
                            "comment": "Lambda Sensor Heater B (white to gray)",
                        },
                        {
                            "id": "B15",
                            "func": "AGND2",
                            "pos": [13.5, 7],
                            "comment": "signal 100mA",
                        },
                        {
                            "id": "B16",
                            "func": "OXB1",
                            "pos": [10.5, 7],
                            "comment": "Yellow VM",
                        },
                        {
                            "id": "B17",
                            "func": "OXB2",
                            "a2d": 23,
                            "pos": [7.5, 7],
                            "comment": "Lambda, red APE IP",
                        },
                        {
                            "id": "B18",
                            "func": "OXB3",
                            "a2d": 20,
                            "pos": [4.5, 7],
                            "comment": "Ri, black UN RE",
                        },
                        {
                            "id": "B19",
                            "func": "OXB4",
                            "pos": [1.5, 7],
                            "comment": "Violet IA trim resistor",
                        },
                        // Row4, 7 pins
                        {
                            "id": "B20",
                            "func": "AGND3",
                            "pos": [18, 10.2],
                            "comment": "2R6",
                        },
                        {
                            "id": "B21",
                            "func": "S5V3",
                            "pos": [15, 10.2],
                            "comment": "5V 100mA",
                        },
                        {
                            "id": "B22",
                            "func": "T11",
                            "timer": 11,
                            "swt": 11,
                            "pos": [12, 10.2],
                            "pullup": "4700",
                            "comment": "Logic only"
                        },
                        {
                            "id": "B23",
                            "func": "T12",
                            "timer": 12,
                            "swt": 12,
                            "pos": [9, 10.2],
                            "pullup": "4700",
                            "comment": "Logic only"
                        },
                        {
                            "id": "B24",
                            "func": "KNOCKN",
                            "swt": 43,
                            "a2d": 2,
                            "pos": [6, 10.2],
                        },
                        {
                            "id": "B25",
                            "func": "KNOCKP",
                            "a2d": 2,
                            "pos": [3, 10.2],
                        },
                        {
                            "id": "B26",
                            "func": "PGND",
                            "pos": [0, 10.2],
                        }
                    ]
                }
            ]
        },
        {
            "id": "C",
            "part": "6437288-2",
            "comment": "Mates with: 4-1437290-1",
            "pos": [0, 0],
            "size": [38.4, 24.6],
            "sections": [
                {
                    "id": "C",
                    "pos": [0, 0],
                    "pin_offset": [6.2, 6.2],
                    "size": [38.4, 24.6],
                    "diagram": [
                        {
                            "shape": "round_rect",
                            "radius": 2,
                            "pos": [5, 5],
                            "size": [28.4, 14.6],
                        },
                        {
                            "shape": "round_rect",
                            "radius": 6,
                            "pos": [1, 1],
                            "size": [36.4, 22.6],
                        },
                        {
                            "shape": "round_rect",
                            "radius": 7,
                            "pos": [0, 0],
                            "size": [38.4, 24.6],
                        },
                    ],         
                    "pins":[
                        // row 1, 9 pins RTL, pitch 3mm
                        {
                            "id": "C1",
                            "func": "PWM10",
                            "pwm": 10,
                            "out_pin": 17,
                            "pos": [0, 0],
                            "comment": "No recirculation diode",
                        },
                        {
                            "id": "C2",
                            "func": "PWM11",
                            "pwm": 11,
                            "out_pin": 18,
                            "pos": [3, 0],
                            "comment": "No recirculation diode",
                        },
                        {
                            "id": "C3",
                            "func": "PWM12",
                            "pwm": 12,
                            "out_pin": 19,
                            "pos": [6, 0],
                            "comment": "No recirculation diode",
                        },
                        {
                            "id": "C4",
                            "func": "PWM13",
                            "pwm": 13,
                            "out_pin": 20,
                            "pos": [9, 0],                    
                        },
                        {
                            "id": "C5",
                            "func": "PWM14",
                            "pwm": 14,
                            "out_pin": 21,
                            "pos": [12, 0],
                        },
                        {
                            "id": "C6",
                            "func": "PWM15",
                            "pwm": 15,
                            "out_pin": 22,
                            "pos": [15, 0],
                        },
                        {
                            "id": "C7",
                            "func": "PWM16",
                            "pwm": 16,
                            "out_pin": 23,
                            "pos": [18, 0],                    
                        },
                        {
                            "id": "C8",
                            "func": "BRGA1",
                            "out_pin": 12,
                            "pwm": 5,
                            "throttle": 2,
                            "pos": [21, 0],
                            "comment": "Act Throttle 1",
                            "used_if": [ 
                                {
                                    "func": "Act Throttle 1",
                                    "expr": "option('BridgeA Enable') && option('Act Throttle 1') && !option('Act T 1 No Drive')",
                                }
                            ]
                        },
                        {
                            "id": "C9",
                            "func": "BRGA2",
                            "out_pin": 13,
                            "pwm": 6,
                            "throttle": 2,
                            "pos": [24, 0],
                            "comment": "Act Throttle 1",
                            "used_if": [
                                {
                                    "func": "Act Throttle 1",
                                    "expr": "option('BridgeA Enable') && option('Act Throttle 1') && !option('Act T 1 No Drive')",
                                }
                            ]
                        },
                        // row2, 8 pins, offset 1.5mm
                        {
                            "id": "C10",
                            "func": "PWM9",
                            "out_pin": 16,
                            "pwm": 9,
                            "pos": [1.5, 3.2],
                            "comment": "No recirculation diode",
                        },
                        {
                            "id": "C11",
                            "func": "ACCEL1",
                            "a2d": 7,
                            "swt": 48,
                            "pullup": 47000,
                            "pos": [4.5, 3.2],
                            "comment": "Pedal Position 1",
                            "used_if": [
                                {
                                    "option": "Pedal1 Active",
                                }
                            ]
                        },
                        {
                            "id": "C12",
                            "func": "ACCEL2",
                            "a2d": 6,
                            "swt": 47,
                            "pullup": 47000,
                            "pos": [7.5, 3.2],
                            "comment": "Pedal Position 2",
                            "used_if": [
                                {
                                    "option": "Pedal2 Active",
                                }
                            ]
                        },
                        {
                            "id": "C13",
                            "func": "AN15",
                            "a2d": 15,
                            "swt": 56,
                            "pullup": 4700,
                            "pos": [10.5, 3.2],
                        },
                        {
                            "id": "C14",
                            "func": "AN16",
                            "a2d": 16,
                            "swt": 57,
                            "pullup": 4700,
                            "pos": [13.5, 3.2],
                        },
                        {
                            "id": "C15",
                            "func": "AN17",
                            "a2d": 17,
                            "swt": 58,
                            "pullup": 4700,
                            "pos": [16.5, 3.2],
                        },
                        {
                            "id": "C16",
                            "func": "AIT",
                            "a2d": 8,
                            "swt": 49,
                            "pullup": 4700,
                            "pos": [19.5, 3.2],
                            "comment": "Air Intake Temperature",
                        },
                        {
                            "id": "C17",
                            "func": "CTEMP",
                            "a2d": 11,
                            "swt": 52,
                            "pullup": 2200,
                            "pos": [22.5, 3.2],
                            "comment": "Coolant Temperature",
                        },
                        // Row 3, 8 pins
                        {
                            "id": "C18",
                            "func": "OXHEATA",
                            "out_pin": 32,
                            "pos": [1.5, 7],
                            "comment": "Lambda Sensor Heater A",
                        },
                        {
                            "id": "C19",
                            "func": "OXA1",
                            "pos": [4.5, 7],
                            "comment": "Yellow VM",
                        },
                        {
                            "id": "C20",
                            "func": "OXA2",
                            "a2d": 21,
                            "pos": [7.5, 7],
                            "comment": "Lambda, red APE IP",
                        },
                        {
                            "id": "C21",
                            "func": "OXA3",
                            "a2d": 22,
                            "pos": [10.5, 7],
                            "comment": "Ri, black UN RE",
                        },
                        {
                            "id": "C22",
                            "func": "OXA4",
                            "pos": [13.5, 7],
                            "comment": "Violet trim resistor",
                        },
                        {
                            "id": "C23",
                            "func": "AGND4",
                            "pos": [16.5, 7],
                            "comment": "signal 100mA",
                        },
                        {
                            "id": "C24",
                            "func": "OX1",
                            "a2d": 4,
                            "swt": 45,
                            "pullup": 47000,
                            "pos": [19.5, 7],
                            "comment": "1V25 bias 47K",
                        },
                        {
                            "id": "C25",
                            "func": "OX2",
                            "a2d": 3,
                            "swt": 44,
                            "pullup": 47000,
                            "pos": [22.5, 7],
                            "comment": "1V25 bias 47K",
                        },
                        // row 4, 9 pins RTL, pitch 3mm
                        {
                            "id": "C26",
                            "func": "PGND1",
                            "pos": [0, 10.2],
                        },
                        {
                            "id": "C27",
                            "func": "KNOCK2P",
                            "a2d": 1,
                            "pos": [3, 10.2],
                        },
                        {
                            "id": "C28",
                            "func": "KNOCK2N",
                            "a2d": 1,
                            "swt": 42,
                            "pos": [6, 10.2],
                        },
                        {
                            "id": "C29",
                            "func": "AGND1",
                            "pos": [9, 10.2],
                            "comment": "signal 100mA",
                        },
                        {
                            "id": "C30",
                            "func": "MAF",
                            "a2d": 12,
                            "swt": 53,
                            "pullup": 47000,
                            "pos": [12, 10.2],
                            "comment": "MAF sensor",
                        },
                        {
                            "id": "C31",
                            "func": "MAP",
                            "a2d": 5,
                            "swt": 46,
                            "pullup": 47000,
                            "pos": [15, 10.2],
                            "comment": "MAP sensor",
                        },
                        {
                            "id": "C32",
                            "func": "S5V1",
                            "pos": [18, 10.2],
                            "comment": "5V 100mA",
                        },
                        {
                            "id": "C33",
                            "func": "CAN1L",
                            "pos": [21, 10.2],
                            "comment": "8TX",
                        },
                        {
                            "id": "C34",
                            "func": "CAN1H",
                            "pos": [24, 10.2],
                            "comment": "8TX",
                        },
                    ]
                }
            ],
        }
    ],    
    "timers": [ // For timer selector channels
        {
            "id": 1,
            "name": "T1",
            "channels": [
                "T1 overflow count",
                "T1 Period H",
                "T1 Period",
                "T1 counter",
                "T1 Time H",
                "T1 Time",
                "T1 Period Old",
            ]
        },
        {
            "id": 2,
            "name": "T2",
            "channels": [
                "T2 overflow count",
                "T2 Period H",
                "T2 Period",
                "T2 counter",
                "T2 Time H",
                "T2 Time",
                "T2 - T1 Time",
                "T2 T1 Period",
                "T2 F Tooth",
            ]
        },
        {
            "id": 3,
            "name": "T3",
            "channels": [
                "T3 overflow count",
                "T3 Period H",
                "T3 Period",
                "T3 counter",
                "T3 Time H",
                "T3 Time",
                "T3 - T1 Time",
                "T3 T1 Period",
                "T3 F Tooth",
            ]
        },
        {
            "id": 4,
            "name": "T4",
            "channels": [
                "T4 overflow count",
                "T4 Period H",
                "T4 Period",
                "T4 counter",
                "T4 Time H",
                "T4 Time",
                "T4 - T1 Time",
                "T4 T1 Period",
                "T4 F Tooth",
            ]
        },
        {
            "id": 5,
            "name": "T5",
            "channels": [
                "T5 overflow count",
                "T5 Period H",
                "T5 Period",
                "T5 counter",
                "T5 Time H",
                "T5 Time",
                "T5 - T1 Time",
                "T5 T1 Period",
                "T5 F Tooth",
            ]
        },
        {
            "id": 6,
            "name": "T6",
            "channels": [
                "T6 overflow count",
                "T6 Period H",
                "T6 Period",
                "T6 counter",
                "T6 Time H",
                "T6 Time",
                "T6 - T1 Time",
                "T6 T1 Period",
                "T6 F Tooth",
            ]
        },
        {
            "id": 7,
            "name": "T7",
            "channels": [
                "T7 overflow count",
                "T7 Period H",
                "T7 Period",
                "T7 counter",
                "T7 Time H",
                "T7 Time",
                "T7 - T1 Time",
                "T7 T1 Period",
                "T7 F Tooth",
            ]
        },
        {
            "id": 8,
            "name": "T8",
            "channels": [
                "T8 overflow count",
                "T8 Period H",
                "T8 Period",
                "T8 counter",
                "T8 Time H",
                "T8 Time",
                "T8 - T1 Time",
                "T8 T1 Period",
                "T8 F Tooth",
            ]
        },
        {
            "id": 9,
            "name": "T9",
            "channels": [
                "T9 overflow count",
                "T9 Period H",
                "T9 Period",
                "T9 counter",
                "T9 Time H",
                "T9 Time",
                "T9 - T1 Time",
                "T9 T1 Period",
                "T9 F Tooth",
            ]
        },
        {
            "id": 10,
            "name": "T10",
            "channels": [
                "T10 overflow count",
                "T10 Period H",
                "T10 Period",
                "T10 counter",
                "T10 Time H",
                "T10 Time",
                "T10 - T1 Time",
                "T10 T1 Period",
                "T10 F Tooth",
            ]
        },
        {
            "id": 11,
            "name": "T11",
            "channels": [
                "T11 overflow count",
                "T11 Period H",
                "T11 Period",
                "T11 counter",
                "T11 Time H",
                "T11 Time",
                "T11 - T1 Time",
                "T11 T1 Period",
                "T11 F Tooth",
            ]
        },
        {
            "id": 12,
            "name": "T12",
            "channels": [
                "T12 overflow count",
                "T12 Period H",
                "T12 Period",
                "T12 counter",
                "T12 Time H",
                "T12 Time",
                "T12 - T1 Time",
                "T12 T1 Period",
                "T12 F Tooth",
            ]
        },
        {
            "id": 13,
            "name": "T2 Rise",
            "tc_alias": 2,
            "channels": [
                "T2R overflow count",
                "T2R Period H",
                "T2R Period",
                "T2R counter",
                "T2R Time H",
                "T2R Time",
                "T2R - T1 Time",
                "T2R T1 Period",
                "T2R F Tooth",
            ]
        },
        {
            "id": 14,
            "name": "T2 Fall",
            "tc_alias": 2,
            "channels": [
                "T2F overflow count",
                "T2F Period H",
                "T2F Period",
                "T2F counter",
                "T2F Time H",
                "T2F Time",
                "T2F - T1 Time",
                "T2F T1 Period",
                "T2F F Tooth",
            ]
        },
        {
            "id": 15,
            "valid": false
        },
        {
            "id": 16,
            "valid": false
        },
    ],
    "timer_options": [
        "Sync Channel T",
        "Duty detect Rise T",
        "Duty detect Fall T",
        "VVC1 source T",
        "VVC2 source T",
        "VVCX1 source T",
        "VVCX2 source T",
    ],
    "timer_options_exclude": [],
    // Describe how the switches are generated; there are a variety of ways that they are made.
    // Some are bits coming from input pins, some from control routines, some from comparators, some from timers.
    // some are from indirect channels (comcodes).
    // Some of this can be auto-generated from the GIN file where channels are aliased with Switches#1, Switches#2 etc.
    "switches": [
        // Switches#2
        {
            "id": 9,
            "channel": "PIN T9"
        },
        {
            "id": 10,
            "channel": "PIN T10"
        },
        {
            "id": 11,
            "channel": "PIN T11"
        },
        {
            "id": 12,
            "channel": "PIN T12"
        },
        {
            "id": 13,
            "valid": false
        },
        {
            "id": 14,
            "valid": false
        },
        {
            "id": 15,
            "valid": false
        },
        {
            "id": 16,
            "valid": false
        },

        // Switches#4
        {
            "id": 25,
            "channel": "PIN T3"
        },
        {
            "id": 26,
            "channel": "PIN T4"
        },
        {
            "id": 27,
            "channel": "PIN T5"
        },
        {
            "id": 28,
            "valid": false
        },
        {
            "id": 29,
            "channel": "PIN T7"
        },
        {
            "id": 30,
            "channel": "PIN T8"
        },
        {
            "id": 31,
            "valid": false
        },
        {
            "id": 32,
            "channel": "PIN T2"            
        },
    ],

    // Augment options
    "options": [
        {
            "id": "Switches 10 Source",
            "outputs": "Switches#10",
        },
        {
            "id": "User Message1 Source",
            "outputs": ["User Message1"]
        },
        {
            "id": "User Message2 Source",
            "outputs": ["User Message2"] // will also apply to aliases (e.g. Switches)
        },
        // TODO Gear Message Source?
        {
            "id": "Comparator1 Source",
            "outputs": ["Comparator1"]
        },
        {
            "id": "Comparator2 Source",
            "outputs": ["Comparator2"]
        },
        {
            "id": "Comparator3 Source",
            "outputs": ["Comparator3"]
        },
        {
            "id": "Comparator4 Source",
            "outputs": ["Comparator4"]
        },
        {
            "id": "Comparator5 Source",
            "outputs": ["Comparator5"]
        },
        {
            "id": "Comparator6 Source",
            "outputs": ["Comparator6"]
        },
    ],

    // Identify any options that should be interpreted as switch selectors.
    // Generally the GIN file should define these but they can be overridden here in case of 
    // errors in the GIN file.
    "switch_inputs": [
        "yellow switch", // In relation to FIA yellow flag on course.
        "act t limiter switch a",
        "act t limiter switch b",
        "gear+ pot start pin",
        "gear- pot start pin",
        "gear+ retard in",
        "gear+ act t lift pin",
        "gear- blip in pin",
        "gear- advance retard pin",
        "time switch1 pin",
        "time switch2 pin",
        "swt tb input",
        "log switch input",
        "act t swt pin",
        "fans inhibit pin",
        "valve lift on input",
        "rain light input switch",
        "power steer in pin",
        "a/c in pin",
        "fuel pump switch",
        "alt function input",
        "als in pin",
        "als mild in pin",
        "launch in pin",
        "ic auto/man pin",
        "ic spray now pin",
        "ignition fixed switch",
        "cal1 select in pin",
        "cal2 select in pin",
        "cal3 select in pin",
        "cal4 select in pin",
        "cal5 select in pin",
        "cal6 select in pin",
        "cal7 select in pin",
        "cal8 select in pin",
        "road speed limit in pin no cal no",
        "road speed in pin no cal no",
        "oil pressure switch in pin",
        "oil pressure pin",
        "road speed limit defeat in pin",
        "start pulse pin",
        "main relay input",
        "brake front switch",
        "brake rear switch",
        "foot brake in pin",
        "hand brake in pin",
    ],
    "switch_inputs_exclude":[],

    // Identify any options that should be interpreted as A2D input selectors.
    "a2d_options": [
        "AIT source",
        "Plenum Temp source",
        "Coolant source",
        "Baro source",
        "Throttle source",
        "MAP source",
        "MAP2 source"
    ],
    "a2d_options_exclude":[],
    // Indicate any fixed-functions of A2D channels / pullups etc.
    // This information is defaulted from the physical_pins section.
    "a2ds": [
        { "id":0,  "channel": "Analog 00", "name": "Knock 2", "pullup": 0 },
        { "id":1,  "channel": "Analog 01", "name": "Knock 2", "pullup": 0 },
        { "id":2,  "channel": "Analog 02", "name": "Knock", "pullup": 0 },
        { "id":3,  "channel": "Analog 03", "name": "Oxygen 2", "pullup": 47000 },
        { "id":4,  "channel": "Analog 04", "name": "Oxygen 1", "pullup": 47000 },
        { "id":5,  "channel": "Analog 05", "name": "MAP", "pullup": 47000 },
        { "id":6,  "channel": "Analog 06", "name": "Pedal 2", "pullup": 47000 },
        { "id":7,  "channel": "Analog 07", "name": "Pedal 1", "pullup": 47000 },
        { "id":8,  "channel": "Analog 08", "name": "Air Intake Temperature", "pullup": 4700 },
        { "id":9,  "channel": "Analog 09", "name": "Active Throttle 2", "pullup": 47000 },
        { "id":10, "channel": "Analog 10", "name": "Active Throttle 1", "pullup": 47000 },
        { "id":11, "channel": "Analog 11", "name": "Coolant Temperature", "pullup": 2200 },
        { "id":12, "channel": "Analog 12", "name": "MAF", "pullup": 47000 },
        { "id":13, "channel": "Analog 13", "name": "IGSWT", "pullup": 0 },
        { "id":14, "channel": "Analog 14", "name": "PWR", "pullup": 0 },
        { "id":15, "channel": "Analog 15", "name": "", "pullup": 4700 },
        { "id":16, "channel": "Analog 16", "name": "", "pullup": 4700 },
        { "id":17, "channel": "Analog 17", "name": "", "pullup": 4700 },
        { "id":18, "channel": "Analog 18", "name": "Active Throttle 3", "pullup": 47000 },
        { "id":19, "channel": "Analog 19", "name": "Active Throttle 4", "pullup": 47000 },
        { "id":20, "channel": "Analog 20" },
        { "id":21, "channel": "Analog 21" },
        { "id":22, "channel": "Analog 22" },        
        { "id":23, "channel": "Analog 23" },
        { "id":24, "channel": "Analog 24" },
        { "id":25, "channel": "Analog 25" },
        { "id":26, "channel": "Analog 26" },
        { "id":27, "channel": "Analog 27" },
        { "id":28, "channel": "Analog 28" },
        { "id":29, "channel": "Analog 29" },
        { "id":30, "channel": "Analog 30" },
        { "id":31, "channel": "Analog 31" }
    ],

    // Identify options that route PWM numbers to virtual output 'pins'.
    // not all PWM channels are routable.
    "pwms": [
            // options are auto assigned, if option starts with "PWM10".
            // otherwise could be overridden here?
            // PWM10 (on/off)
            // PWM10 Period
            // PWM10 Invert
        {
            "id": 1,
            "out_pin": 8
        },
        {
            "id": 2,
            "out_pin": 9
        },
        {
            "id": 3,
            "out_pin": 10
        },
        {
            "id": 4,
            "out_pin": 11
        },
        {
            "id": 5,
            "out_pin": 12
        },
        {
            "id": 6,
            "out_pin": 13
        },
        {
            "id": 7,
            "out_pin": 14
        },
        {
            "id": 8,
            "out_pin": 15
        },
        {
            "id": 9,
            "out_pin": 16
        },
        {
            "id": 10,
            "out_pin": 17
        },
        {
            "id": 11,
            "out_pin": 18
        },
        {
            "id": 12,
            "out_pin": 19
        },
        {
            "id": 13,
            "out_pin": 20
        },
        {
            "id": 14,
            "out_pin": 21
        },
        {
            "id": 15,
            "out_pin": 22
        },
        {
            "id": 16,
            "out_pin": 23
        },
    ],
    
    // Identify any options that should be interpreted as PWM selectors.
    "pwm_options": [
        "Out $* PWM",
        "Out $* PWM$N", // e.g. Out Idle PWM1
        "Out $* PWM#$N", // e.g. Out VVC#1 PWM#1
    ],
    "pwm_options_exclude":[],

    // Identify options that route to virtual output 'pins'.
    // Note: exclusions are processed before inclusions.
    "out_pin_options_exclude": [
        "Out $* PWM",
        "Out $* PWM$N", // e.g. exclude Out Idle PWM1
        "Out $* PWM#$N", // e.g. exclude Out VVC#1 PWM#1
    ],
    "out_pin_options": [
        "Out $*", // Note this also would match PWM module outputs, they are excluded by the "out_pin_options_exclude" clause.
        "Oil Feed $N Out",
    ],
}

Connection Settings

The Connection Settings dialog is available from the top level menu Connection Setup....

Connection Setup Connection Setup

Basic Settings

Generally the ‘Basic’ settings page is all that you will need. It will display ports of all types that are available.

To select a port, simply click on the port in the list on the ‘Basic’ tab.

Click the Refresh button to refresh the ports in the list. You may need to do this if you have plugged in a USB device after displaying the connection settings.

Additional Settings

Enable Hotplugging

This option allows USB connections to be re-established if the port is removed whilst the ECU is online. You can disable it here if removal of devices is causing problems on your PC.

Open Matching Cal When Connected

This option scans your previous calibration files to find one that matches the data downloaded from the ECU after connecting.

Advanced Tab

In some cases the port settings for the ECU must be mo0re precisely configured than the ‘Basic’ page allows. For example CAN connections may require manually configuring the CAN IDs for transmit / receive.

For Serial COM ports, in most cases, you can detect or set the baud rate directly from the Connect dialog.

To adjust settings for a particular type of port, select the port form the “Transport” drop-down box and set it up with the required options.

XCP Connections

XCP connections must be configured via the ‘Advanced’ tab and require an XCP license.

ECU Simulator

The ECU Simulator is useful for demos and development purposes so is not generally used. It does not simulate any ECU functions other than communications and updating the Run Time channel or user-specified channels.

Connection Troubleshooting

Overview

For an overview of the connection process, see ECU Connection.

If you are still having problems after following this guide, you can visit the GEMS Forum or contact GEMS for assistance.

Common Connection Problems

There can be many causes of connection problems. The most common causes are usually straight forward and easy to solve:

  • Does the ECU have power?
  • Is the cable connecting the ECU to the PC securely attached?
  • Have you selected the correct port in your connection settings?
  • If connecting via a Serial connection, are you using the correct baud rate? (Baud Rates)

Ethernet Firewalls

IP Address Allocation

GEMS ethernet enabled ECUs require the IP address to be automatically allocated. This is the default setting for most computers so in most cases the ECU will be detected and connect without changing any settings. However if the settings are not correct you may need to change to get coms started. Go to the network connections window either by searching Network connections or from the control panel. Double-click on the ‘Ethernet’ Icon.

This will show the Ethernet Status window. Click on ‘Properties’.

You should then see the Ethernet Properties window.

Select Internet Protocol Version 4(TCP/IPv4) and click ‘Properties’.

The “Obtain an IP address automatically” and “Obtain DNS server address automatically” options should be both selected and the 5 manual selection boxes should be empty.

If they are not empty click on ‘Use the following option’ and delete the contents and then reselect the ‘Obtain … Automatically’ options.

Firewall settings

If the connection is still not working and if the ECU name is found in the Connection Setup... window, the Firewall rules may need adjusting.

These should normally be set by installing GWv4 but if there has been an update it may need resetting. The simplest method is to re-install GWv4.

During the install or at application startup, if you are asked to allow GWv4 in the firewall then ‘Agree’.

It may be necessary to add the GWv4 to your firewall manually, particularly if you are using a 3rd party firewall such as Norton®. Instructions for allowing GWv4 through 3rd party firewalls will vary - refer to your firewall vendor for details.

For allowing the application through the Windows Defender Firewall, refer to Microsoft Firewall & network protection in Windows Security.

If you are having trouble configuring this, either visit the GEMS Forum or contact GEMS for assistance.

Telemetry Stream Mode

Some ECUs use the same serial port used for GWv4 connections for telemetry output.

Such ECU’s will start streaming telemetry data from the port a short time after the ECU has been powered on. If this has occurred then power cycle the ECU while GWv4 is attempting to connect.

It helps to have the correct baud rate set in these circumstances, since using the automatic baud rate detection can take a while and the ECU may enter into telemetry stream mode before the correct baud rate has been found.

You can set the baud rate directly from the Connect Progress dialog or in the Advanced tab of Connection Settings.

For a list of baud rates for many of our products, see Baud Rates.

“Cannot Open Port”

If the connection popup says “Cannot Open Port”, this suggests that the port cannot be opened due to one of the following situations:

  • You are using a USB-Serial adaptor and plugged into a different USB port so it is no longer on the came COM channel.

    • To resolve this, open ECU | Connection Setup
    • Select the appropriate port.
    • ConnectShift+F7
  • The port is in use by another application. Applications cannot usually share serial ports. Close / disconnect any other applications that could be using it.

    It may also be worth trying to temporarily disabling your virus scanner in case this is causing a conflict. We would recommend physically disconnecting your PC from the internet if doing so.

  • The port is in use by a program that recently crashed. Reboot the system and try again.

USB to Serial adapters

USB to serial adapters vary significantly and some products do not work well with GWv4. We have found that ATEN adapters tend to work well and we can supply these to you on request.

There are also some USB-Serial adaptors on the market that are using counterfeit microprocessors. In such cases the adaptor vendors may have disabled the device. It is possible to check for this in Windows Device Manager.

If you are having trouble connecting with a USB to Serial adapter try using a different USB port on your PC. This sometimes resolves problems, particularly on laptop PC’s running off the mains that could introduce noise on some USB ports but not others.

Sometimes the USB connector does not make good contact with the socket. A small squeeze of the connector on the cable with your thumb can sometimes improve things. This is only necessary if the PC cannot see the adapter at all (it does not appear in the windows Device Manager).

What else can I try?

  • Check that there is sufficient battery voltage to the ECU. This is generally 12 volts. If your battery voltage is low, then you may experience comms drop-outs or no comms at all.

  • Is there sufficient protection from electrical noise on your connection cable? Can you connect when the ECU is powered but the engine is not running?

  • Check the communications cable using a continuity tester or multi-meter. In particular, test the TX and RX lines between the ends of the cable.

  • Open the Comms Monitor to check if data is being sent by the PC and being returned by the ECU. Requests from the PC are displayed in blue text and responses from the ECU are displayed in red. You should see a red response for every blue request.

  • Check the ECU Status Window to see if there have been any errors.

I get a blue screen or a reboot when using the connection setup window

This is due to a bug in driver software.

Try bringing up Windows® Device Manager and checking if you have a “Soft Data Fax Modem” under the “Modems” item. If you do, this is known to have caused problems in the past but recent editions of GWv4 have a workaround that should avoid the problem.

Right click the item and select ‘Disable’.

It could also be due to the X25 driver. If this is installed then please try removing it and connect using a serial port instead.

It could also be due to a conflict with the LEGO Mindstorms driver. For now, the only solution is to remove the libusb filter driver which will require some software. The ordinary driver should be OK.

Baud Rates

For ECUs that are connected to the PC via an RS232 serial connection, the baudrate must be set correctly.

Product ECU Name Version Baud Rate
Evo ACD evo7acd All versions 9600
Subaru EMCD sub_emcd All Versions 9600
DA37 da37 All Versions 9600
DA36 da36 All Versions 9600
DA38 da38 All Versions 9600
Lancer Evo 7,8,9 (LAN85) LAN85, LAN85 3P, LAN85 4P, LANCER85 All Versions 38400
Lancer evo 3-6 LANCER3, LANCER4, LANCER5, LANCER6 All Versions 9600
Lancer evo 7 LANCER7, LANCER7k v2.33 - v2.53 9600
LANCER7k s2.54 - s2.62 38400
Lancer Evo 8 LANCER8 All Versions 38400
Lancer Evo 9 LANCER+9 All Versions 38400
EVO X Evo X All Versions 115200
EVO X ACD evoxacd All Versions 38400
Subaru 2002 SUBARU85, Subaru2k All Versions 38400
Subaru 96 SUBARU96 All Versions 9600
Subaru 97 SUBARU97 All Versions 9600
Subaru 99 SUBARU99 All Versions 9600
Subaru R Series Subaru R All Versions 38400
EM36 EM36, EM36_ All Versions 38400

Programing/Upgrading ECU Firmware

When upgrading GEMS ECUs, there are two types of ECU, the standard and the Simulink enabled ECUs. With the standard ECU all that will need upgrading is the main firmware. The main firmware is upgraded using a .FIN file. With the Simulink enabled ECU the main firmware may occasionally need upgrading and this is done in the same way as the standard ECU, but it is more likely that the Simulink model will need upgrading. The Simulink model is basically upgraded in the same way as the main firmware, except that a .BIN file is used.

Upgrading Process

To upgrade and ECU first connect to the ECU. See ECU Connection and Connection Settings for details on connecting to an ECU.

Once connected to the ECU simply select Program Firmware... and the following window will be displayed.

Program Firmware Program Firmware

From here simply drag and drop the relevant .FIN or .BIN into the window along with the matching .GIN or .ECUDEF and select next.

Program Firmware Filled Program Firmware Filled

Upon selecting next, you will be asked to upload a calibration. You can either select a previous calibration from your saved files, auto convert the currently loaded calibration to the new firmware, or you can simply not use a calibration. Once you have decided which calibration option you would like, simply select next, and the following window will be displayed:

Program Firmware Load Calibration Program Firmware Load Calibration

This is your final chance to select the ECU you are reprogramming. This can be done my changing the port, which will open a connection setup popup.

There are also various checks that GWv4 can perform that make sure that it is safe to reprogram the ECU. Such as making sure the engine has stopped, and verifying the current ECU firmware.

There are also options to pre-clear the calibration, and also to reset values to defaults.

Program Firmware Checks Program Firmware Checks

Upon clicking next, the ECU will be reprogrammed.

Subsections of Tuning/Setup Guide

Subsections of Concepts

ECU Objects

Overview

The ECU contains a number of “objects” that represent settings or measurements and have varying types (e.g. Tables or Maps).

An object in this sense just refers to any ’thing’ in the ECU that can be configured or viewed in GWv4.

Alternatively, an “ECU Object” could be viewed as a memory range in the ECU memory map, which may be a single bit, a byte, a word, or a larger array of items in memory.

Nomenclature

This table shows an approximate mapping between the terms used in GWv4 and the terms used in the XCP/A2L and Simulink® worlds.

GWv4 Term XCP/A2L Term Simulink® Term
Channel
Parameter (legacy)
Measurement Simulink.Signal (scalar)
Option Characteristic (VALUE) Simulink.Parameter (scalar)
Table Characteristic (CURVE) Simulink.Parameter (vector)
Map Characteristic (MAP) Simulink.Parameter (matrix)

Note that Options / Tables / Maps are allowed to be stored in non-calibration (i.e. volatile RAM) memory and the same goes for Simulink signals, which is why this mapping is only approximate.

Calibration vs Measurement Objects

Calibration objects are those that can be modified by the user and are stored permanently by the ECU in non-volatile memory. These values are usually read from the ECU once when connecting to it.

Measurement objects are generally read-only and used to display real-time feedback about the ECU’s operation. Measurements are read frequently from the ECU when visible in the user interface or if they are being used for PC logging. There are some exceptions to this for monitoring some specific ECU functions, such as whether or not there are changes to the calibration that have not been saved to non-volatile memory.

See Calibrations for more information on calibration files / non-volatile storage.

The ECU may be configured to log measurements in internal logging memory for later retrieval. This is useful for diagnosing problems that may not be visible in real-time and offers much more precise timing resolution than is possible when polling the ECU over a comms link.

Output Pins

Overview

For many functions, the physical output pins that the function is routed to is user-selectable via ‘Out’ options.

e.g. option iconOut Oil Feed 1 or option iconOut Oil Feed 1 PWM.

Inverting Outputs (Active Low)

Depending upon the electrical characteristics of the output pin, it may be necessary to invert the output signal.

To invert the sense of the output, use a negative value in the calibration for the output pin.

Output Pin Restrictions

Some output pins have different features and restrictions. For example, some pins may be used for PWM outputs, digital outputs, or timed.

Care should be taken to ensure that multiple functions are not assigned to the same output pin as this would cause conflicts and un-defined behaviour.

The correct type of pin should be selected for the function being controlled, for example option iconOut Oil Feed 1 PWM must be a PWM-capable output pin.

Pin Numbering

Refer to the ECU manual for the pin numbering scheme used by the ECU. The internal ECU pin numbering scheme differs to the physical pin numbering on the ECU connector.

ECU Internal Routing

Overview

Some functions may be configured / linked within the ECU using internal data / channel routing.

For example, the EGT (Exhaust Gas Temperature) sensor may be connected to any input channel, be it a physical analog input or from a CAN message.

Other features are more fixed, such as AIT (Air Intake Temperature) which only allows selection from a list of analog inputs.

Routing Options

Route-able features will typically have a ‘Source’ option that allows the user to select the input channel. The raw value of the input channel is displayed by a corresponding ‘raw’ channel.

For example, the Oil Feed 1 feature has an option iconOil Feed 1 Source option that selects the input channel for varying the duty cycle. The MSB of the raw input value is displayed by the channel iconOil Feed 1 raw channel.

Source options often have a ‘Bigend’ option that specifies the upper/lower byte of the input channel, if it is 16bit. This is usually set to OFF. In some cases (e.g. Little Endian data coming via CAN bus) the bytes of the raw input channel may require swapping.

If the Bigend option is OFF then the MSB of the raw input value is displayed by the raw channel.

Routing via a User Table or User Map

ECUs will often provide some general purpose ‘User’ tables or maps that can be used for non-linear scaling from abitrary input data.

For example, the table iconUser 1 Duty table can be used to convert a raw input value to a ’tunable’ output value.

These tables and maps can be utilized by using intermediate routing steps.

flowchart LR
    CRX["CAN1 RX1 W1"]-->U1S["User1 Source"]
    U1S-->U1RAW(["User1 raw"])
    U1RAW-->U1DT["User1 Duty Table"]
    U1DT-->U1D(["User1 Duty"])
    U1D-->OF1S["Oil Feed 1 Source"]

Routing from CAN

Specific CAN messages may be received using the CAN Rx setup (from menu action CAN Rx Setup…) or via CAN RX related options in the calibration.

When the CAN port and CAN RX IDs are configured, the ECU will decompose the CAN message into 4x 16bit channels, e.g. for Message 1 on CAN port 1, the channels are:

channel iconCAN1 RX1 W1
channel iconCAN1 RX1 W2
channel iconCAN1 RX1 W3
channel iconCAN1 RX1 W4

CAN Routing Example (EGT)

If, for example, an external temperature sensor module is used that sends a CAN message to the ECU containing a reading for EGT, then this message could be assigned to a CAN RX message ‘box’ e.g. CAN1 RX1. If the EGT temperature was given in the first 2 bytes then channel iconCAN1 RX1 W1 would hold the EGT temperature value, in unscaled form.

To link up channel iconCAN1 RX1 W1 to the EGT feature, the option iconEGT Source would be set to channel iconCAN1 RX1 W1.

If the received EGT signal is in Little Endian (Intel) format, then the option iconEGT Source Bigend would be set to ON to swap the bytes.

The resulting raw value is displayed by the channel iconEGT raw channel and converted to voltage 0…5V for the full-scale input value. This is generally fine for A2D sources but in the case of data received by CAN, this is unlikely to be the correct interpretation. The table iconEGT Sensor table should arrange to convert from these pseudo-volts to valid temperature.

For this example, the temperature module reports temperatures as signed 16bit numbers with 0.1°C resolution per bit. This poses a problem since EGT raw is unsigned and there is no way to make the source be interpreted as a signed number directly.

The table iconEGT Sensor table would need to convert the signed number to an unsigned one by having a discontinuity. Note that hexadecimal values can be directly entered into the table cells (including the axis for many tables, like table iconEGT Sensor).

This table shows the conversion from the channel iconEGT raw channel to a temperature in °C. Notice the discontinuity at 0x8000, which is the point where the signed number changes from full-scale positive to full-scale negative:

EGT raw (hex) EGT raw (V) Temperature °C
0x0000 0.0 0
0x7FFF 2.49996 3276.7
0x8000 2.50004 -3276.8
0xFFFF 5.00 -0.1

However, the table iconEGT Sensor only supports positive output values, from 0 to 1275°C, depending on the value of the option iconTemp Scalar option. See User Scalars for more details on the purpose / effect of scaling factors like option iconTemp Scalar.

If there are 8 cells in the table iconEGT Sensor table, the following values could be used, assuming that the option iconTemp Scalar option = 1 (or 0, in which case the scalar is ignored) and that GWv4 is configured to display temperatures in units of degrees:

EGT raw (hex) EGT raw (V) Temperature °C
0x0000 0.0 0
0x31CE 0.97276 1275.0 (max)
0x7FFF 2.49996 1275.0
0x8000 2.50004 0 (min)
0xFFFF 5.00 0
0xFFFF 5.00 0
0xFFFF 5.00 0
0xFFFF 5.00 0
Note

The axis breakpoints table values should be sorted in increasing order for the ECU to be able to interpolate correctly. In this example, not all the table sites are used; so the remainder of the table is filled with the same values as the last useful row to maintain ordering.

CAN Routing for Simulink® based ECUs

For ECUs that use a Simulink® model, CAN signals may be decoded from a DBC file. The messages are defined ahead of time as part of the firmware build process, the channels in the DBC file become available for use in the Simulink model as Simulink signals.

User Scalars

Overview

User Scalars are a feature that allows the units of values to be changed. ‘Option User Scalars’ also reference calibration options for to apply configurable scaling factors.

Scaling options e.g. like option iconTemp Scalar are stored by the ECU but are not directly involved in any of the ECU’s internal calculations.

Purpose

Internally the ECU works with (typically) raw integer or ‘fixed point’ integer values (variables), and less commonly with floating point values. ECUs running Simulink® models are more likely to be using floating point numbers internally.

As far as the ECU is concerned, any quantities (temperatures, pressures, speeds, oxygen concentrations etc) are just numbers and the units are generally not important. The relationship between values, however, is important and additionally that related quantities use the same internal scaling.

Since integers are discrete values, there is a limit to how precisely values can be represented. The ECU may be able to offer more precise control if important quantities are scaled to make the best possible use of the available range of variables that represent them.

Consider an ECU table that contains 8 bit values; there are only 256 possible states / steps in each cell of the table. If the maximum expected range of physical values can be mapped to fit onto this 0…255 range, then the ECU can make the most precise control decisions. The scaling options, therefore, are telling GWv4 how to convert from these internal raw values into physical units. In other words, the ECU is using a custom type of units and the scaling options are defining how those custom units correspond to a physical ‘real-world’ unit.

For example, option iconTemp Scalar is used as a scaling factor for a number of temperature values in the GWv4 user interface. The scaling is purely for display purposes - but it can mean that higher resolution temperature values can be used internally by the ECU. The units may also be further converted from °C by GWv4 to a different unit (e.g. °F) for display purposes - see Unit configuration.

Internally, the ECU does not care what the units are, just that values represent ratios for control purposes. Changing the units displayed in GWv4 does not change the internal operation of the ECU whatsoever.

Many tables and maps are preconfigured with sensible scaling factors and may not offer the ability to change them, where the level of precision is not so critical or where the range of input values is predictable.

Configuration

If an item is scaled using an Option User Scalar, this will be apparent in the Descriptions View. There may be a ‘Scalar’ (multiplier) option and/or an ‘Offset’ (signed addition) option.

For example, the channel iconEngine Load channel is scaled using the option iconLoad Scalar and option iconLoad Offset options.

These same scaling factors are used anywhere that raw channel iconEngine Load channel values might be encountered so that GWv4 will display them all correctly and the ECU can compare them consistently.

For example, the map iconFuel map might use the channel iconEngine Load channel as the input to one of its axes, and the channel iconRPM channel as the other axis. The load axis breakpoints may be configured, giving a non-linear axis to give more precise control at some points in the engine’s operating range.

The ECU will compare raw channel iconEngine Load values to the (raw) breakpoints in the map iconFuel map, and interpolate between them to find the correct fueling value. The ECU does not care what the actual units are - it is only operating on the raw integer values that represent the engine load. The GWv4 software will use the option iconLoad Scalar and option iconLoad Offset options so that the load values can be presented on screen in meaningful units.

Inputs

Overview

The ECU has a number of inputs - typically analog, digital and message busses (e.g. CAN) that provide it feedback about the system under control.

Input Types

Subsections of Inputs

Analog Outputs

Overview

The ECU has a number of Analog to Digital Converter (ADC) inputs that can be used to measure analog signals. These inputs may be assigned to different functions by setting options in the calibration.

Software Selectable Pull-up/Pull-down Resistors

Some channels have software selectable pull-up or pull-down resistors. These can be used to bias the input voltage to a known level when the input is not connected. This can be useful for sensors that do not have a built-in pull-up or pull-down resistor.

There are typically 2 options to control the pull-up or pull-down resistor. For example, the following table shows the options for Analog 10:

option iconA10 Pull option iconT1 Pull High Description
Off Off No pull-up or pull-down resistor (floating)
Off On No pull-up or pull-down resistor (floating)
On Off Pull-down resistor enabled
On On Pull-up resistor enabled

Some of the timing inputs have a pull-up resistor that can be enabled or disabled. Often the timing input would also have a fixed higher value pull-down resistor.

For example, the following table shows the options for T1 on a typical ECU:

option iconT1 Pull-up Description
Off 10k Pull-Down (used with VR sensor)
On 1k Pull-Up (used with Hall sensor)

Internal Switches

Overview

Input from various sources can be used to generate digital ‘switch’ (on/off) channels by a variety of methods. These internal switch channels may be selected numerically to control various functions in the calibration.

Some switches may be configured to come from external sources, such as CAN messages or digital input pins.

Comparator Switches

Timed Switches

Table Lookup Switches

Switch A.

Generic Switches

Switches selected from user source (e.g. CAN).

Sensors

Overview

Attached to the ECU are a number of sensors that provide information about its environment (e.g. feedback from an engine).

These sensors are connected to the ECU through the wiring loom and provide data that is used to control the engine.

Some sensors have special processing in the ECU to convert their raw data into a more useful form. For example, a temperature sensor may provide a raw voltage that is converted into a temperature reading.

Sensor Types

Subsections of Sensors

Load Sensing

Overview

The Engine Load may be measured in a variety of ways, such as using a Manifold Absolute Pressure (MAP) sensor (Boost Pressure), a Mass Air Flow (MAF) sensor, or a Throttle Position Sensor (TPS). Pedal position may also be used.

MAP or MAF may use Pedal as a backup should the primary sensor fail.

Scaling

The Load Scalar is used to convert the raw ’load’ values into more meaningful physical units.

Pedal as Load

If option iconFuel Map Pedal is On, then a correction, channel iconBoost Correction from the table iconBoost Correct table is used to correct for the change in air pressure entering the engine.

This can result in a more responsive Pedal.

Note the map iconFuel Pedal map is used instead of map iconFuel map as the base fuelling in this case.

MAF Sensor

Overview

The Mass Air Flow (MAF) sensor measures the mass of air entering the engine. This may optionally be used to calculate the amount of fuel required to maintain the desired air/fuel ratio.

The MAF sensor is typically a hot wire or hot film sensor, which heats a wire or film to a constant temperature and measures the cooling effect of the air flow. The cooling effect is proportional to the mass of air flowing past the sensor.

The voltage output of the MAF sensor is often non-linear, so the ECU may apply a calibration curve to convert the raw voltage into a more useful linearized form.

MAF Sensor Options

Option Description
option iconMAF Use MAF as the “Engine Load” measurement?
option iconMAP Set to 0 if using MAF for Engine Load.
option iconLoad source Do not set if using MAF for Engine Load.
option iconMAF source Select an input channel to use for MAF. This could be an Analogue input or another source such as CAN bus.
option iconMAF source Bigend Swaps the bytes from the 16bit MAF source. This may be required if the source is from a little-endian (Intel) 16bit CAN signal.
channel iconMAF Raw Raw MAF sensor reading as obtained from the MAF source.
option iconMAF no Speed comp If ON, the MAF sensor reading is not compensated for engine speed. Otherwise, the MAF sensor reading is multiplied by the inverse engine speed and divided down.
option iconMAF no X16 If ON, the MAF sensor reading is not multiplied by 16, following speed compensation. This option does nothing if option iconMAF no Speed comp is ON.
table iconMAF Sensor MAF Sensor Table to convert raw MAF sensor voltage into a linearized form.
option iconMAF Cal Number of internal teeth over which to average the MAF sensor readings when running. Typically this would be set to 1, 2 or 3 revolutions; the actual value to set here would depend upon the number of internal teeth per revolution which should be configured in the option iconWheel Teeth option.
option iconMAF min Minimum MAF sensor reading, below which an error condition is indicated.
option iconMAF max Maximum MAF sensor reading, above which an error condition is indicated.
channel iconMAF Linear Linearized MAF reading, scaled using MAF (Load) Scalar.
channel iconMAF Linear Scaled Linearized MAF reading, scaled using MAF Scalar.
channel iconMAF as Load Compensated MAF reading, scaled using MAF (Load) Scalar.
channel iconMAF as Load Scaled Compensated MAF reading, scaled using MAF Scalar.
channel iconError MAF Indicates an error condition with the MAF sensor.

Flowchart

flowchart TD
    MAFMIN@{ shape: diamond, label: "&lt; MAF Min"}

    MAFMAX@{ shape: diamond, label: "&gt; MAF Max"}
    MAFNSPD@{ shape: diamond, label: "MAF no Speed comp"}
    NOMAFMUL@{ shape: diamond, label: "MAF no X16"}

    MAFRAW["MAF Raw"]

    MAF_Source(["MAF source"])-- RUNNING? -->MAFSMP(["MAF samples"])
    MAFSMP-->MAFAVG["Average"]-->MAFRAW
    MAFCAL(["MAF Cal [teeth]"])--"Window Size"-->MAFAVG
    MAF_Source--"NOT RUNNING"-->MAFRAW

    MAFRAW-->MAFMIN
    MAFMIN-- Y -->ERROR_MAF(["Error MAF"])
    MAFMIN-- N -->MAFMAX

    MAFMAX-- Y -->ERROR_MAF(["Error MAF"])
    MAFMAX-- N -->MAFTBLW["MAF Sensor Table"]
    SPEEDN(["&minus; Engine Speed"])
    MAFTBLW-->MAFLIN(["MAF Linear [MAF Load Units]"])
    MAFLIN-->MAFLINSCALED(["MAF Linear Scaled [MAF Units]"])
    

    MAFLIN-->MAFNSPD
    MAFNSPD-- N -->SPEEDMUL["&times;"]
    MAFNSPD-- Y -->MAFLOAD
    SPEEDN-->SPEEDMUL

    SPEEDMUL-->NOMAFMUL

    NOMAFMUL-- N -->MUL16["&times;16"]
    NOMAFMUL-- Y -->MAFLOAD
    MUL16--> Overflow -->ERROR_MAF
    MUL16-->MAFLOAD

    MAFLOAD(["MAF as Load [MAF (Load)]"])

    MAFLOAD-- "MAF AND NOT MAP AND NOT &quot;Load Source&quot;" -->LOAD(["Engine Load [Load]"])
    MAFLOAD-->MAFLOAD_SCALED(["MAF as Load Scaled [MAF Units]"])

MAP Sensor

Overview

MAP sensors measure the pressure of air entering an engine (Manifold Absolute Pressure). This information may be used by the ECU to calculate the amount of fuel required for combustion.

There are typically two MAP sensor inputs on the ECU, with the two sensors being used for redundancy and error checking.

The voltage output of the MAP sensor is typically linear with pressure, and the ECU can be configured to convert this voltage into a pressure reading in kPa.

The MAP sensor can optionally be used as a measure of Engine Load, in which case the ECU will convert the pressure reading into a load value. This load value is used as an axis input for many of the ECU’s calibration tables such as the map iconFuel map or the map iconIgnition map.

Calibration

Option / Channel Description
option iconMAP Use MAP as the “Engine Load” measurement?
option iconMAF Set to 0 if using MAP for Engine Load.
option iconLoad source Do not set if using MAP for Engine Load.
option iconMAP Source The source of the MAP sensor data. This is an analog input number.
option iconMAP2 Source The source of the 2nd MAP sensor data. This is an analog input number. If using a single MAP sensor, option iconMAP2 Source should be set to the same value as option iconMAP Source
option iconMAP Cal Number of internal teeth over which to average the MAP sensor readings when running. Typically this would be set to 1, 2 or 3 revolutions; the actual value to set here would depend upon the number of internal teeth per revolution which should be configured in the option iconWheel Teeth option.
option iconMAP1 samples When running this table is filled with the samples used for averaging MAP1.
option iconMAP2 samples When running this table is filled with the samples used for averaging MAP2.
option iconMAP raw Invert Inverts the MAP sensor reading, useful for some sensors that output a voltage that decreases with pressure. This same setting applies to both MAP sensor inputs.
channel iconMAP1 raw Result of averaging / inverting the MAP sensor voltage readings. This value can be monitored to verify the MAP sensor input configuration and that the analogue input is reading the MAP sensor correctly.
channel iconMAP2 raw Result of averaging / inverting the second MAP sensor voltage readings. This value can be monitored to verify the MAP sensor input configuration and that the analogue input is reading the MAP sensor correctly.
option iconMAP Min Error The minimum valid voltage for the MAP sensor.
If channel iconMAP raw reads below this value, an error will be triggered channel iconError MAP.
If channel iconMAP2 raw reads below this value, an error will be triggered channel iconError MAP2.
option iconMAP Max Error The maximum valid voltage for the MAP sensor.
If channel iconMAP raw reads above this value, an error will be triggered channel iconError MAP.
If channel iconMAP2 raw reads above this value, an error will be triggered channel iconError MAP2.
option iconMAP ref low Volts The voltage output of the MAP sensor at a low pressure reference value option iconMAP ref low Pressure.
option iconMAP ref low Pressure The physical pressure reading from the MAP sensor when the voltage reading from the analogue input reads option iconMAP ref low Volts.
option iconMAP ref high Volts The voltage output of the MAP sensor at a high pressure reference value option iconMAP ref high Pressure.
option iconMAP ref high Pressure The physical pressure reading from the MAP sensor when the voltage reading from the analogue input reads option iconMAP ref high Volts.
option iconMAP Pressure Max If non-zero, this overrides the calculated channel iconMAP for Load Max for re-scaling MAP.
channel iconMAPM The MAP sensor calibration multiplier, derived from the reference low and high pressure and voltage values.
channel iconMAPC The MAP sensor calibration constant, derived from the reference low and high pressure and voltage values.
channel iconMAP for Load Max Indicates the maximum pressure that the MAP sensor can read. This value is used to scale the MAP sensor readings to a load value.
channel iconMAP for Load Scalar Alias of channel iconMAP for Load Max
channel iconMAP1 abs The absolute value of the MAP sensor reading, in kPa.
channel iconMAP1 abs FP The absolute value of the MAP sensor reading, scaled using Fuel Pressure Scalar.
channel iconMAP2 abs The absolute value of the second MAP sensor reading, in kPa.
channel iconMAP2 abs FP The absolute value of the second MAP sensor reading, scaled using Fuel Pressure Scalar.
channel iconMAP abs Peak Maximum of channel iconMAP1 abs or channel iconMAP2 abs, in kPa.
channel iconMAP abs Peak FP Maximum of channel iconMAP1 abs or channel iconMAP2 abs, scaled using Fuel Pressure Scalar.
channel iconMAP1 as Load channel iconMAP abs is rescaled by the ECU to make more use of the full-scale range. Scaled to physical units using Load Scalar.
channel iconMAP2 as Load channel iconMAP2 abs is rescaled by the ECU to make more use of the full-scale range. Scaled to physical units using Load Scalar.
channel iconMAP1-MAP2 The difference between channel iconMAP1 as Load and channel iconMAP2 as Load.
channel iconMAP1+MAP2/2 The average of channel iconMAP1 as Load and channel iconMAP2 as Load.
channel iconMAP as Load The average of channel iconMAP1 as Load and channel iconMAP2 as Load, unless an error is detected (e.g. out of range voltage) in either input, in which case the valid input value is used where possible.
channel iconEngine Load If the ECU is configured to use MAP as the measurement of Engine Load, this channel will show the value of channel iconMAP as Load. This value is scaled to physical units using Load Scalar, as with channel iconMAP as Load.
channel iconError MAP Error flag for MAP sensor 1. Set if the voltage reading is outside the range defined by option iconMAP Min Error and option iconMAP Max Error.
channel iconError MAP2 Error flag for MAP sensor 2. Set if the voltage reading is outside the range defined by option iconMAP Min Error and option iconMAP Max Error.
channel iconBarometer The barometric pressure reading, in kPa.
channel iconBoost1 gauge The difference between channel iconMAP1 abs and channel iconBarometer, in kPa.

MAP as Load Scaling

The channel iconMAP1 abs value is rescaled to make full use of the range. This may therefore require adjustment to the Load Scalar to arrive at correct pressure values for channel iconMAP as Load and channel iconEngine Load.

Be aware that if the MAP sensor is not being used as a measure of Engine Load then the Load Scalar could be in use by something else. For example, if Load source is being used for Engine Load then the Load scalar may be responsible for rescaling the data selected by option iconLoad source so that channel iconEngine Load is in the correct units.

Flowchart

flowchart TD
    MAPMINER@{ shape: diamond, label: "&lt; MAP Min Error"}

    MAPMAXER@{ shape: diamond, label: "&gt; MAP Max Error"}
    MLDMAX_D@{ shape: diamond, label: "&gt; MAP for Load max"}

    BARSCLD(["Barometer"])
    MAP1_abs(["MAP1 abs"])

    MAP_Source(["MAP Source (A2D)"])-- RUNNING? -->MAP1SMP(["MAP1  samples"])
    MAP1SMP-->MAP1AVG["Average"]-->MAP_raw_Invert
    MAPCAL(["MAP Cal [teeth]"])--"Window Size"-->MAP1AVG
    MAP_Source--"NOT RUNNING"-->MAP_raw_Invert["MAP raw Invert?"]
    MAP_raw_Invert-->MAPRAW1(["MAP1 raw [V]"])
    MAPRAW1-->MAPMINER
    MAPMINER-- Y -->ERROR_MAP(["Error MAP"])
    MAPMINER-- Y -->MAP_ZERO["0"]-->MAP1_abs(["MAP1 abs"])

    MAPMINER-- N -->MAPMAXER

    MAPMAXER-- Y -->ERROR_MAP(["Error MAP"])
    MAPMAXER-- Y -->MAP_FULL["MAX"]-->MAP1_abs(["MAP1 abs"])
    MAPMAXER-- N -->MAP1M["&times;"]
    MAPM-->MAP1M
    MAP1M-->MAP1C["&plus;"]
    MAPC-->MAP1C
    MAP1C-->MAP1_abs

    MAP1M_SRC["(MAP ref high Pressure &minus; MAP ref low Pressure) / (MAP ref high Volts &minus; MAP ref low Volts)"]
    MAP1M_SRC-->MAPM(["MAPM"])

    MAP_Ref_low_v["MAP ref low Volts"]-->MAPC_M["&times;"]
    MAPM-->MAPC_M

    MAP_Ref_low_p["MAP ref low Pressure"]-->MAPC_C["&minus;"]
    MAPC_M-->MAPC_C
    MAPC_C-->MAPC(["MAPC"])

    MAPC-->MLDMAX_ADD["&plus;"]
    MAPM-->MLDMAX_ADD["&plus;"]
    MLDMAX_ADD-->MLDMAX(["MAP for Load Max [kPa]"])
    MLDMAX_ADD-->MLDS(["MAP for Load Scalar"])

    MLDMAX-->MLDMAX_D
    MLDMAX-->MAP1_abs_DIV

    BARSCLD-->MAP1_abs_sub
    MAP1_abs-->MAP1_abs_sub["&minus;"]

    MAP1_abs_sub-->BSTGAGE1["Boost1 gauge"]

    MAP1_abs-->MLDMAX_D
    MLDMAX_D-- Y -->MAP1_abs_FULL["MAX"]-->MAPLOAD1(["MAP1 as Load [Load]"])
    MLDMAX_D-- N -->MAP1_abs_DIV["/ MAP for Load max"]-->MAPLOAD1(["MAP1 as Load [Load]"])

    MAPLOAD1-->MAPLOAD1_MINUS_2
    MAPLOAD2(["MAP2 as Load [Load]"])-->MAPLOAD1_MINUS_2

    MAPLOAD1_MINUS_2["&minus;"]-->MAPLDIFF(["MAP1-MAP2 [Load]"])

    MAPLOAD1-->MAPLOAD1_AVG_2
    MAPLOAD2-->MAPLOAD1_AVG_2
    MAPLOAD1_AVG_2["Average OR Select"]-->MAPLDAV(["MAP1+MAP2/2 [Load]"])
    MAPLOAD1_AVG_2-->MAPLOAD(["MAP as Load [Load]"])

    MAPLOAD-- "MAP AND NOT MAF AND NOT &quot;Load Source&quot;" -->LOAD(["Engine Load [Load]"])

Outputs

Overview

The ECU has a number of electrical outputs that can be used to control various devices through the wiring loom. These outputs may be assigned to different functions by setting options in the calibration.

Outputs are typically either PWM or digital outputs. PWM outputs are used to control devices that require a proportional control signal, such as a valve or a motor. Digital outputs are used for devices that require a simple on/off control signal.

See also Output Pins.

Output Types

Tip

Oil Feed outputs may also be repurposed and used as slow pulse width modulated (PWM) outputs, or low resolution user signals.

Subsections of Outputs

Digital Outputs

Overview

The ECU has a number of digital outputs (ON / OFF) that can be used to control various devices through the wiring loom. These outputs may be assigned to different functions by setting options in the calibration.

Some digital outputs may be switched to other functions such as PWM or timed outputs. For devices that require a proportional control signal, use a PWM output channel instead.

PWM Outputs

Overview

The ECU has a number of Pulse Width Modulated (PWM) outputs that can be used to control various devices. These outputs may be assigned to different functions such as VV control, Idle valve, Wastegate, Servo.

Some PWM outputs may be claimed by specific functions. For instance, if Active Throttle is enabled, it owns a bridge driver and prevents others attempting to use the output, unless e.g. option iconAct T 1 No Drive is set to ON.

Note

Some PWM channels have usage / precision restrictions - see the specific PWM channel documentation for details.

Duty Cycle

The duty cycle of a PWM signal is the ratio of the ‘on’ time to the total period of the signal. The frequency of the PWM signal is the rate at which the signal repeats. Over time, this produces a proportional control signal with low power loss.

For devices that require a simple on/off control signal, use a digital output channel instead.

Configuration

PWM outputs must be enabled using options in the calibration and are typically routed to from ECU functions using additional calibration options.

Some PWM outputs are used for specific features such as active throttle, so some care is required to avoid conflicts.

Restrictions

PWM1-16 are fixed to individual pins, however, PWM17 onwards are assignable to any simple output pin. In the pin-outs diagram/table, these fixed PWMs have a code of ‘Pnn’, where ‘nn’ is 01-16.

PWM Output Pin Assignment

For PWMs that may be assigned to output pins, pin assignment options are available in the calibration.

e.g. option iconOut PWM17

As with any other output pin assignment, using a negative value will invert the output signal.

Note

Note that output pin assignments differ to PWM numbers. For example, option iconOut PWM17 is a pin number. option iconOut Oil Feed 1 PWM is a PWM number (which may be further routed to a pin).

Oil Feeds

See Oil Feed Outputs for details on the Oil Feed channels - which can either use PWM outputs or generate low-speed PWMs in software on simple digital outputs.

Timed Outputs

Overview

Timed output pins are used for precisely timed pulses for functions such as Ignition, Injection, High Pressure Pump, etc.

On the EM80, there 8 x 8bit PWM output pins that can be PWM outputs 1 to 8, injector outputs 1 to 8 or simple low-side outputs.

Timed outputs allow the processor to schedule asynchronous events like ignition in response to crank tooth interrupts, with high precision timing and are enable features like variable ignition advance / retard to work.

Oil Feed Outputs

Overview

GEMS ECUs typically provide 4 Oil Feed output controllers for controlling solenoid pumps. This section discusses Oil Feed 1, but the same principles apply to the other Oil Feed output controllers.

Tip

Oil Feed outputs may also be repurposed and used as slow pulse width modulated (PWM) outputs, or low resolution user signals.

It is recommended that the behaviour of the oil outputs is tested following configuration. Monitoring the associated output pin channel using a Scope View or a physical oscilloscope is recommended.

Oil Feed Configuration

Each oil feed controller has a set of configuration options. Considering Oil Feed 1:

Option Description
option iconOil Feed 1 Source Selects an input channel for varying the duty cycle. The MSB of the raw input value is displayed by the channel iconOil Feed 1 raw channel.
option iconOil Feed 1 Source Bigend Specifies upper/lower byte of the input channel, if it is 16bit. This is usually set to OFF. In some cases (e.g. Little Endian data coming via CAN bus) the bytes of the raw input channel may require swapping.
option iconOil Feed 1 Mul Multiplier for re-scaling the raw input value, saturates at 100% duty cycle in case of overflow. The result is stored in channel iconOil Feed 1 Duty
option iconOil Feed 1 PWM Out
option iconOut Oil Feed 1 PWM
PWM channel number for high rate / precision PWM, using PWM output settings with duty cycle channel iconOil Feed 1 Duty. Note: PWM numbers are not the same as output pin numbers.
option iconOil Feed 1 Out
option iconOut Oil Feed 1
Digital output pin for low rate PWM, only used if option iconOil Feed 1 PWM Out = 0. If a negative value is supplied for the pin number here (e.g. ‘-5’), the signal is inverted (on e.g. pin ‘5’). In this case there are additional Oil Feed options to control the software PWM.
Warning

Changing the output pin (option iconOil Feed 1 PWM Out or option iconOil Feed 1 Out) may leave the prior output in an undefined state. It is recommended to store the calibration and power-cycle the ECU following output pin changes.

Digital Output Configuration

If the Oil Feed output is using a digital output instead of a PWM output, a low frequency / low precision PWM is generated by software.

The following common options are effective in this mode:

Option Description
option iconOil Feed 1 Stop Duty If ON then when channel iconStat Running is OFF, option iconOil Feed 1 Duty Stopped will be used for the duty cycle of the output, unless option iconOil Feed 1 Stopped OFF is ON (in which case the output would be switched ‘OFF’).
option iconOil Feed 1 Duty Stopped Duty cycle to use when engine is not running (channel iconStat Running is OFF), depending upon option iconOil Feed 1 Stop Duty and option iconOil Feed 1 Stopped OFF options
option iconOil Feed 1 Fixed On Use a fixed-length ON pulse, with the duty cycle affecting the duration of the space between ON pulses.
option iconOil Feed 1 Stopped OFF If ON then the output will be switched off when the engine is not running (channel iconStat Running is OFF), otherwise the output will be set to option iconOil Feed 1 Duty Stopped.

Fixed Mode

Enabled when option iconOil Feed 1 Fixed On = ON.

This mode uses a fixed duration ON pulse and variable duration OFF interval.

Option Description
option iconOil Feed 1 Fixed On ON
option iconOil Feed 1 Fixed T.B. Maximum duration of variable part of OFF period, in milliseconds (added to option iconOil Feed 1 OFF min).
option iconOil Feed 1 Fixed comp If set, changes the type of complement operation performed on channel iconOil Feed 1 Duty prior to scaling option iconOil Feed 1 Fixed T.B.. If ON then a 1’s complement (logical NOT) is used instead of 2’s complement (arithmetic negation). It is recommended to set this to ON for new calibrations and can give better results at higher frequencies.
option iconOil Feed 1 OFF min Minimum duration of OFF period, in milliseconds.
option iconOil Feed 1 Fixed ON Duty Fixed duration of ON pulse, in milliseconds.
channel iconOil Feed 1 Period Reports current period of signal.
channel iconOil Feed 1 T Count Count-up timer, used for signal generation.

The duration of the ‘OFF’ interval is calculated by scaling option option iconOil Feed 1 Fixed T.B. by the (inverted) duty cycle percentage shown by channel iconOil Feed 1 Duty.

The OFF interval can’t ever be 0 and will have a lower limit of 1ms. The lower limit may be clamped to a higher value by setting the option iconOil Feed 1 OFF min option.

option iconOil Feed 1 Fixed ON Duty option defines the duration of the ON pulse. This added to the calculated OFF duration to give the total period of the PWM signal and is placed in channel iconOil Feed 1 Period.

channel iconOil Feed 1 T Count counts up every millisecond.

When channel iconOil Feed 1 T Count exceeds the value of channel iconOil Feed 1 Period, the output is switched on and channel iconOil Feed 1 T Count is reset to 0.

When channel iconOil Feed 1 T Count reaches option iconOil Feed 1 Fixed ON Duty, the output is switched off.

Proportional Mode

Enabled when option iconOil Feed 1 Fixed On = OFF.

Proportional mode has a fixed period and varies the duty cycle of the signal over that period. Additionally this mode can limit the total number of pulses delivered to the output after ECU reset.

Option Description
option iconOil Feed 1 Fixed On OFF
option iconOil Feed 1 Duty Max Maximum ON period
option iconOil Feed 1 Fixed comp If set, changes the type of complement operation performed on channel iconOil Feed 1 Duty prior to scaling option iconOil Feed 1 Duty Max. If ON then a 1’s complement (logical NOT) is used instead of 2’s complement (arithmetic negation). It is recommended to set this to ON for new calibrations and can give better results at higher frequencies.
option iconOil Feed 1 Time base Total period of the PWM signal, in milliseconds.
option iconOil Feed 1 P Max Maximum number of pulses to deliver to the output before ECU reset. If 0, then no limit is applied.
channel iconOil Feed 1 P Count Reports the number of pulses delivered to the output when option iconOil Feed 1 P Max is non-zero.
channel iconOil Feed 1 Duty Time Stores the result of scaling option iconOil Feed 1 Duty Max by channel iconOil Feed 1 Duty.
channel iconOil Feed 1 T Count Count-down timer, used for signal generation.

New calibrations may prefer to use option iconOil Feed 1 Fixed On = ON.

Warning

In Proportional Mode, some ECUs will have an initial 65 second delay before the output PWM becomes operational.

Low values in channel iconOil Feed 1 Duty result in higher duty cycles (effectively inverted).

channel iconOil Feed 1 T Count is decremented every millisecond. When channel iconOil Feed 1 T Count reaches zero, the output is switched off.

When the output is switched off, channel iconOil Feed 1 T Count is reset to option iconOil Feed 1 Time base. Additionally the result of scaling option iconOil Feed 1 Duty Max by channel iconOil Feed 1 Duty is stored in channel iconOil Feed 1 Duty Time. Note that this does not happen in ‘Fixed Mode’.

When channel iconOil Feed 1 T Count reaches the value of option iconOil Feed 1 Duty Time, the output is switched ON.

When switching on the output, if option iconOil Feed 1 P Max option is non-zero then the channel iconOil Feed 1 P Count will count up to this value, and the output will cease to be switched on again until the ECU is reset when option iconOil Feed 1 P Max pulses have been delivered to the output.

Note

option iconOil Feed 1 Duty Max should be less than or equal to option iconOil Feed 1 Time base. The sense of channel iconOil Feed 1 Duty is inverted, so that a value of 0 is really 100% duty cycle. This can be inverted by setting a negative output pin number in option iconOil Feed 1 Out.

Mapped Control

The ECU provides user tables and maps that may be used to control the Oil Feed outputs.

See ECU Internal Routing for details on how to route these user maps to the Oil Feed outputs.

Peak & Hold Injector Outputs

Overview

Some GEMS ECUs provide dedicated on-board “Peak & Hold” injector outputs that provide a specially shaped pulse to drive injector solenoids.

Tip

Fuel Injector settings need either the manufacturer’s data (often restricted) or flow bench test results. GEMS may be able to provide Calibration Aspect files for specific injectors or the layout may include selectors for common injector types.

Peak and Hold Injector Drive

Instead of a simple ON/OFF signal driving an injector solenoid, the drive transistor is first driven hard on for a specified time to ensure opening, then the current is dropped to a holding current, minimising heat dissipation in both injector and transistor. When the injector is closed, the driver circuit recirculates energy from the collapsing magnetic field of the injector coil, preventing abrupt closure of the injector which can lead to physical injector damage (fuel leakage) and unpredictable fuel delivery due to pintle bounce.

The peak & hold injectors are active if option iconInjector Peak & Hold = ON.

Note

Note if injector outputs 4 to 8 are not used as injectors their recirculation diodes may be turned on, to reduce currents when used as PWM outputs, so these outputs must not connect to permanently powered devices. Active if not an injector drive when e.g. option iconFuel 1 Recirculate = ON.

Peak

The table iconInjector Peak Time table specifies the time that the drive transistor is fully ON for, prior to entering hold mode. The peak time is dependent on battery voltage, since this directly affects the rate at which the magnetic field within the injector builds.

Some ECUs may include table table iconInjector Peak Decay Time, which is currently unused, future versions may implement this as a smoother transition from peak to hold.

Hold

The frequency and duty of hold signal is given by option option iconInjector Hold Frequency, and table table iconInjector Hold Duty.

Recirculation

The recirculation diode is controlled per injector driver by options option iconFuel 1 Recirculateoption iconFuel 8 Recirculate. Recirculation manages the current flow when the injector is turned off to smooth the closing.

Compensations

Tables table iconInjector Volts comp and table iconInjector Volts comp Secondary allow for additional compensation in response to battery voltage changes.

Compensations are displayed by channels channel iconInjector Comp Fuel Primary and channel iconInjector Comp Fuel Secondary.

Sensor Scaling

Overview

User Scalars are used to convert internal raw values into a meaningful physical unit, with the option of further changing the units to something more familiar / convenient - see Units.

Adjustable scalars make it possible to make full use of the ECU’s internal resolution and range.

Scalars

Subsections of Sensor Scaling

Fuel Pressure Scalar

Overview

The fuel pressure scalar is used to convert the raw fuel pressure values into more meaningful physical units.

By default, the fuel pressure scalar is calibrated to units of Bar, but this can be changed to other units of pressure - see Units.

Fuel Pressure Scalar Options

Option Description
option iconFuel Pressure Scalar Multiplier, m as in the linear scaling equation, y = mx + c.
option iconFuel Pressure Offset Offset c as in the linear scaling equation, y = mx + c.

Load Scalar

Overview

The load scalar is used to convert the raw ’load’ values into more meaningful physical units.

Typically, Load values are pressure readings calibrated to units of kPa, but this can be changed to other units of pressure (or other quantities) - see Units.

Note that changing the load scalar will affect the meaning of any related calibration values and measurements collectively, which may require recalibration of the ECU.

For example, if using MAP as Load and the MAP sensor is changed to one with a different range, then all load related items may require recalibration if the scaling of raw MAP readings no longer leads to equivalent physical pressure values.

Note

The Load scalar uses the same multiplier and offset as the MAF (Load) Scalar.

Load Scalar Options

Option Description
option iconLoad Scalar Multiplier, m as in the linear scaling equation, y = mx + c.
option iconLoad Offset Offset c as in the linear scaling equation, y = mx + c.

MAF (Load) Scalar

Overview

The Mass Air Flow (MAF) scalar is used to convert raw flow measurement values into more meaningful physical units.

By default, the MAF scalar is calibrated to g/s, but this can be changed to other units of mass flow.

Note

The MAF (Load) scalar uses the same multiplier and offset as the Load Scalar.

MAF (Load) Scalar Options

Option Description
option iconLoad Scalar Multiplier, m as in the linear scaling equation, y = mx + c.
option iconLoad Offset Offset c as in the linear scaling equation, y = mx + c.

MAF Scalar

Overview

The Mass Air Flow (MAF) scalar is used to convert raw flow measurement values into more meaningful physical units.

By default, the MAF scalar is calibrated to g/s, but this can be changed to other units of mass flow.

MAF Scalar Options

Option Description
option iconMAF Scalar Multiplier, m as in the linear scaling equation, y = mx + c.
option iconMAF Offset Offset c as in the linear scaling equation, y = mx + c.

Changes Requiring ECU Reset

Overview

Some changes require the ECU to be reset before they take effect. This is either because the ECU needs to re-initialize the hardware to apply the changes or due to potential safety issues.

Changes Requiring ECU Reset

Item Notes
option iconT3 to T12 Disable Enable / Disables the T3-T12 timer inputs.
PWM9-PWM16 Synthesized by XGATE co-processor.
Knock related settings Engine knock detection.
option iconTacho Pin Output pin used to drive an external RPM tachometer.
CANbus configuration Changes to the CANbus configuration can also be updated with channel iconCAN1 Reset or channel iconCAN2 Reset.
option iconSync Crank Divider On EM80 changes which timer interrupts are enabled until reset.

ECU States

Overview

There are several important states that the ECU can be in when controlling any connected systems (such as an engine).

States

Off

The ECU is not powered.

Powered

The ECU is powered, typically when turning the Ignition key to the ‘on’ position.

When the ECU is initially powered, it will run through the Boot process and then enter the Initialization state.

Boot

After powering on, the ECU will ‘boot’ up (short for ‘bootstrap’).

During boot, if the application firmware is considered valid (not corrupted), the ECU will run the ‘firmware’ and booting is complete.

If the application is not valid then the ECU will be in ‘bootloader’ mode, indicated by the channel iconStat In Boot mode channel.

The bootloader provides facilities to update (load) the application firmware without specialized programming tools.

The application firmware could become invalid due to rare memory corruption events or due to a failed firmware update.

Initialization

When the application firmware begins execution, it will further initialize the ECU hardware and software.

Then Main Relay is On, and Main Relay Off timer = 0.

The Main Relay allows the ECU to have control over when power is fully cut for graceful shutdown.

If engine is not running, the channel iconStopped channel counts up to 33 seconds.

channel iconRun Time timer will count from 0. The channel iconFuel Pump will be On and run for option iconFuel Pump Prime seconds. channel iconStart Pulse Pending will be On.

The main relay can be shut off for safety reasons after channel iconStopped exceeds option iconSafety Time if option iconMain Relay Safety is On, this will disable fans for instance.

Cranking

The cranking state is indicated by the channel iconStat Cranking channel.

Note that the ECU will report that it is in the ‘Cranking’ state at power-up, before any input from option iconStart Pulse pin is detected.

Starting / stopping of the engine is covered in more detail in the Starting the Engine / Ignition Key section.

Running

The ECU has detected that the engine / system is in motion, indicated by the channel iconStat Running channel.

The running state is entered if any crank teeth are detected after the ECU has been powered on.

channel iconStat Running is cleared after no crank events are detected for 4 seconds.

Some GWv4 actions are rejected by the ECU if it is in the running state:

  • Program Firmware...
  • Read Internal Log...

Synchronized

The ECU has synchronized with the timing wheel input(s) and determined the engine cycle position.

This state is indicated by the channel iconStat Sync'd channel.

Shutting Down

The ignition key is turned to Off, the shutdown process is initiated.

The ECU keeps itself alive for a configurable time to allow for graceful shutdown / cooling.

For more details on the Main Relay control during shutdown, see the Starting the Engine / Ignition Key section. data indicated by channel iconError EE Checksum if option option iconAuto EE is On.

Programming NVM / Unsaved Changes

The channel iconStat Prog EE state is entered whilst the ECU is saving calibration changes to non-volatile memory. The channel iconError EE Checksum channel indicates a state where the ECU detects that it has un-committed calibration changes.

See Storing Calibration Changes Permanently for more information.

RPM Pickup

Overview

The ECU uses a sensor to determine the position of the crankshaft. The crankshaft position is used to determine the engine speed and the position of the engine’s pistons so that the ECU can control the ignition and fuel injection timing.

Most engines use a timing wheel with teeth that pass by a sensor. The timing wheel may have 1 or more missing teeth or an extra tooth.

The position(s) of the missing/extra teeth are detected by the ECU and used as a reference point for the engine’s position.

A full engine cycle on a 4 stroke engine is 720 degrees of crankshaft rotation. If sequential injection and/or ignition is required, then an additional sensor is required to determine the engine cycle position. Typically this is a camshaft sensor which rotates at half the speed of the crankshaft.

For port-injected engines that do not have the ability to detect the engine cycle position, it is possible to run the engine ‘wasted spark’ with batch injection. Batches of injectors are triggered simultaneously, once or twice per engine cycle. This is not ideal for emissions or fuel economy but may be acceptable for some applications.

In some cases there are no missing teeth on the timing wheel and an alternative synchronization strategy must be selected (e.g. cam sync).

Subsections of RPM Pickup

RPM Pickup Wizard

Overview

A wizard is available for GWv4 that simplifies configuring the crankshaft / camshaft sensors and the computation of the engine cycle position and RPM.

If you have an unusual tooth pattern or sensor configuration, you may need to manually configure these settings. Contact GEMS for assistance if you are unsure.

There are also existing Calibration and Aspect files available for many common configurations.

Crank Sensor

Overview

The crank sensor is used to determine the position of the crankshaft and the speed of the engine. The crank sensor is usually mounted on the engine block and reads a toothed wheel mounted on the crankshaft. It may be used in conjunction with a camshaft sensor to determine the position of the engine cycle.

Sensor Type

The crank sensor is usually a Hall effect sensor or a VR (Variable Reluctance) sensor. The sensor is connected to ECU timer T1 which has a software selectable pull-up resistor.

Sensor Type option iconT1 Pull-up
Hall Effect / Optical Yes
VR / Inductive No

Edge Selection

The ECU man be configured to select which edge of the signal is used to interrupt the ECU for engine position related processing, these options may be named differently on some ECUs:

  • option iconCrank Rising Edge or option iconT1 Rising Edge
  • option iconCrank Falling Edge or option iconT1 Falling Edge

VR sensors have one direction edge that is sharply defined. In the other direction, there are 2 edges and they are slower. Selecting the correct edge here is crucial to ensure accurate engine position detection.

    xychart-beta
    title "VR Sensor Pulse"
    x-axis [0, 1, 2, 3, 4, 5, 6, 7, 8]
    y-axis "Voltage" -5 --> 5
    line [0, 0, -0.3, -3, 3, 0.3, 0, 0, 0]

An oscilloscope can be used to determine the best edge to use. The sensor output should be monitored while running / turning over the engine to determine which edge is the most sharply defined.

To verify that the correct edge has been selected, it is recommended to record an ECU internal data log with the crankshaft moving at a constant rate. It is expected that the synchronization strategy and table iconTooth Control table have been configured before this test.

Channel Description
channel iconA Tooth Actual teeth feed into to Tooth Control table.
channel iconWheel Tooth Decoded internal tooth number, increments up to the value of option iconWheel Teeth.
channel iconFuel Tooth No Decoded internal teeth for engine cycle, decoded by Tooth Control table used for fuelling, increments up to the value of option iconFuel Teeth..
channel iconIgn Tooth No Decoded internal teeth for engine cycle, decoded by Tooth Control table used for sparking, increments up to the value of option iconSpark Teeth..
channel iconMX Tooth Time Time interval between actual teeth; i.e. time separation between crank interrupts.
channel iconTooth Time Time interval between internal teeth decoded by Tooth Control table. The most important measurement in ECU.

The following images show the difference between the correct and incorrect edges for a VR sensor:

Incorrect Edge

Incorrect Edge Incorrect Edge

See the long tooth interval detected in channel iconMX Tooth Time when channel iconA Tooth = 0

The long tooth appears to be in 2 parts of 3.296 and 1.482 ms, with the regular teeth spaced at 1.185 ms.

This is from a 30-2 wheel so the missing tooth interval should be approximately 3x the regular teeth interval.

Notice that the channel iconTooth Time channel has major discontinuities; it is expected that the internal teeth (decoded by the tooth control table) are regularly spaced and so a more constant value is expected here.

Correct Edge

With the option iconCrank Rising Edge and option iconCrank Falling Edge swapped we get just a single long channel iconMX Tooth Time 3.754 ms, equal to 3 regular teeth (on a 30-2 wheel) as expected. The regular teeth are spaced at ~1.243 ms:

Correct Edge Correct Edge

3.754ms / 1.243ms = 3.02 teeth

Also notice that the channel iconTooth Time and channel iconA Tooth channels are smoother, meaning that the edges are interrupting the ECU more reliably.

If you are unable to start the engine and idle, it is possible to get the timing wheel running at a steady speed by removing the spark plugs (to avoid compression) and using the starter motor to turn the engine over. This will allow the ECU to log the crankshaft position data without the engine running. For safety, any injection and spark outputs can be disabled in the ECU calibration for this test.

Crankshaft Position Sensor Filtering

Hardware Filtering

  • option iconT1 Filter Below - RPM value below which the T1 filter is active.
  • option iconT1 Low Sens Above - Reduces the sensitivity of the T1 input above this RPM value, can be useful for VR sensors.
  • option iconCrank Filter - Time window, in microseconds, for filtering edges on the crank sensor input.

Software Filtering

  • option iconTooth Short Ignore - Enables software filtering of short tooth intervals. This is useful for filtering out noise on the crank sensor input.
  • option iconTooth Short Running - This is a percentage of the last valid actual tooth interval, edges detected that are less than this percentage are rejected.
  • option iconTooth Short Start - When cranking (starting) the engine, before synchronization is achieved, channel iconStat Sync'd == OFF, software filtering uses a fixed time interval for rejecting edges - edges detected that are less than this interval will be rejected.

When running, channel iconTooth Time x channel iconTooth Short running is used to determine the minimum tooth interval that will be considered a valid tooth event.

The calculated value for the short tooth test is stored in A Tooth Short Test.

If a short tooth is detected, it will record this information in:

  • channel iconA Tooth Short [ms] - captures captures channel iconMX Tooth Time
  • channel iconA Tooth Short No - captures channel iconA Tooth
  • channel iconA Tooth Short Rev - captures channel iconCam count MX

This information will be recorded regardless of whether option iconTooth Short Ignore is set.

Cam Sensor

Overview

A cam sensor is used to determine the position of the camshaft, typically relative to the Crank Sensor.

Warning

If the option iconSync Channel T option is changed during the cam sensor configuration, the ECU must be power-cycled before the change will have an effect. Before power-cycling, ensure that the calibration has been committed to Non-volatile memory (NVM).

Camshaft Position Sensor

If a camshaft position sensor is required, similarly to the crank sensor, it is usually a Hall effect sensor or a VR (Variable Reluctance) sensor. The sensor is typically connected to ECU timer T2 which has a software selectable pull-up resistor. It is possible to use a different timer input if required but T2 is the most common choice.

Sensor Type option iconT2 Pull-up
Hall Effect / Optical Yes
VR / Inductive No

As with the crank sensor the cam synchronization edge should be configured.

If you are planning on using the VVC (Variable Valve Control) features then T2 should be configured for both edges, with the appropriate edge for Cam or 4 stroke cycle synchronization selected by the option iconSync channel T option. VVC control would require configuration with the other direction edge where appropriate (option iconVVC1 source T, option iconVVC2 source T, option iconVVCX1 source T, or option iconVVCX2 source T).

For example:

Option Value
option iconT2 Rising Edge ON
option iconT2 Falling Edge ON
option iconSync channel T “T2 Rise”

If not using T3-T12 timing inputs they can be switched off with option iconT3 - T12 Disable to avoid any additional CPU overhead.

Camshaft Sensor Filtering

Like the crank sensor, the cam sensor can have hardware filtering applied to it:

  • option iconT2 Filter Below - RPM value below which the T2 filter is active.
  • option iconT2 Low Sens Above - Reduces the sensitivity of the T2 input above this RPM value, can be useful for VR sensors.

Engine Cycle Sync (Camshaft)

Overview

On 4 stroke engines where sequential injection and/or ignition is required, the ECU must synchronize to the correct revolution of the engine cycle so that the correct fuel and spark events are generated.

The crank wheel typically rotates once per revolution and therefore does not provide the ECU with enough information on its own.

However, the camshaft rotates once per cycle (2 revolutions of the crankshaft) and a sync signal from the camshaft can be used to determine the engine cycle.

Camshaft Sync

The ECU counts the occurrence of rising or falling (or both) edges from the cam sensor.

The counter, typically channel iconT2R counter (rising) or channel iconT2F counter (falling), is captured at an actual crank tooth option iconSync Test A Tooth and is reset to zero to begin counting again; the counter will be reset every crank revolution at the specified tooth.

Example:

Cam Sync Diagram Cam Sync Diagram

In this example with a 8-1 crank wheel, there are 2 rising edges in the 1st crank revolution and 1 rising edge in the 2nd crank revolution.

The synchronization test point may be adjusted using the option iconSync Test A Tooth option.

option iconSync Test A Tooth is the actual crank tooth number (i.e. not an internal tooth number) at which the camshaft counter is captured and reset to zero on every crank revolution. The value is captured into the channel iconCam Tooth Count channel.

option iconSync Teeth is the number of Cam teeth expected at option iconSync Test A Tooth when testing for synchronization if the engine is within the expected half of the 4-stroke cycle.

If option iconSync Test A Tooth were set to 6 in this example (corresponding to the 7th tooth of the crank wheel, counting from 0), then the counter would be set to 2 in the first revolution and 1 in the second revolution.

Setting option iconSync Teeth to 2 would result in synchronization to be achieved on the 1st crank revolution. If set to 1 then synchronization would be achieved on the 2nd crank revolution.

During the ‘synchronization’ portion of the tooth control table, the captured counter value is tested against the Sync Teeth value.

Warning

It is essential that the cycle detection is unambiguous, otherwise the ECU may randomly synchronize to the wrong cycle.

It is recommended to use data logging and/or an oscilloscope to verify the configuration.

Note

It is not possible to set option iconSync Test A Tooth to the missing tooth position, as the ECU would not detect an “A Tooth” at that point.

Variable Valve Control Systems

On variable cam control systems, the timing of the camshaft signal varies with respect to the crankshaft signal.

Considering the example diagram again, if the camshaft was in its most retarded position at that point then the ‘Cam’ signal could shift to the left by up to 80 degrees (almost 2 Actual Teeth in this example).

Cam Sync Diagram Cam Sync Diagram

Cam Sync Diagram VVC Cam Sync Diagram VVC

The original example with option iconSync Test A Tooth set to 6 would still be correct, when counting rising edges, for either cycle 1 or cycle 2 if the cam signal were shifted to the left by as far as 2 teeth.

However, suppose option iconSync Test A Tooth was set to 4. There would be multiple issues:

  • In the first revolution, the ECU would detect either 1 or 2 teeth, depending on whether the camshaft position was advanced by VVC.
  • In the second revolution, option iconSync Test A Tooth closely coincides with the cam signal, and there is a race between the crank signal and cam signal - small timing variations could cause unreliable detection of the cam signal.

In both cases, the cycle detection would be highly unreliable.

Edge Selection

Depending upon the cam sensor configuration, the ECU could be counting rising edges, falling edges or both.

The cam sensor edge direction may be selected by a combination of option iconT2 Rising Edge, option iconT2 Falling Edge and option iconSync Channel T.

It is possible to use timers other than T2 for cam synchronization, but T2 is the most common.

Engines with Variable Valve Control (VVC / VVT) would typically require both edges to be enabled with option iconSync Channel T set to either “T2 Rise” or “T2 Fall” so that only the rising or falling edge of the cam signal is used for engine cycle synchronization.

The edge selection may require adjustment to improve engine cycle detection.

If you are using a VR (Variable Reluctance) sensor for the Cam sensor then there may only be 1 valid edge due to the nature of signals from VR sensors - see Crank Sensor.

Sync 2 (Reliably Synchronize Within 1 Revolution)

An optional feature is available to support synchronization within a single crank revolution.

If option iconSync 2 Active is set to ON, then the cycle shall also be matched using option iconSync 2 Teeth.

If channel iconCam Tooth Count matches option iconSync 2 Teeth then synchronization will be achieved (channel iconStat Sync'd will be set to ON) and the value of option iconSync 2 Fuel Tooth will be placed into channel iconFuel Tooth and the value of option iconSync 2 Spark Tooth will be placed into channel iconSpark Tooth to ‘jump’ these important clocks to the next half of the cycle.

Considering the example again:

Cam Sync Diagram Cam Sync Diagram

For sequential injection + ignition with 4 internal teeth per revolution, this example ECU could be configured with:

Option Value
option iconSync Teeth 2
option iconSync Test A Tooth 6
option iconSync 2 Active ON
option iconSync 2 Teeth 1
option iconSync 2 Fuel Tooth 4
option iconSync 2 Spark Tooth 4
option iconFuel Teeth 8
option iconSpark Teeth 8

Options / Channels

Option Description
option iconStart No Cam Sync The ECU will not attempt to synchronize to the camshaft while cranking (starting) the engine.
option iconSync Channel T Selects Cam synchronization input timer (e.g T2 Rise)
option iconSync Teeth Number of teeth expected to unambiguously identify 1 revolution in the engine cycle. Must be set to 0 if not using a Cam Sync input.
option iconSync Test A Tooth The actual crank tooth number at which the camshaft counter is captured and reset to zero. This is the actual crank tooth (channel iconA Tooth) number, not the internal tooth number.

Care should be taken, particularly with systems using VVC, to ensure reliable detection across the range from most retarded to most advanced camshaft positions.
channel iconCam Tooth Count Value of the sync channel (e.g. channel iconT2R counter) when channel iconA Tooth reaches option iconSync Test A Tooth
channel iconCam Tooth MX Value of channel iconCam Tooth Count when ‘MX’ (Missing / Extra tooth) synchronization tested.
option iconSync 2 Active Enabled Sync 2 feature.
option iconSync 2 Teeth Number of teeth to identify 2nd revolution in the engine cycle.
option iconSync 2 Fuel Tooth Value to set in channel iconFuel Tooth if Sync 2 is achieved. Jumps the injection ‘clock’ to the next half of the cycle. Should be set to the number of internal teeth per revolution, if sequential injection is required.
option iconSync 2 Spark Tooth Value to set in channel iconSpark Tooth if Sync 2 is achieved. Jumps the ignition ‘clock’ to the next half of the cycle. Should be set to the number of internal teeth per revolution, if sequential ignition is required.

Actual Teeth vs Internal Teeth

Overview

There is a difference between actual teeth on the crankshaft wheel and internal teeth used by the ECU for triggering ignition or injection events.

Internal teeth always coincide with actual teeth but they are arranged such that they are at evenly spaced crank angles.

Actual Teeth vs Internal Teeth

Events from ‘actual teeth’ on the crankshaft wheel cause the ECU’s CPU to be interrupted. The ECU decides whether these events are ‘active edges’ aka ‘internal teeth’ that may be used for triggering ignition or injection events.

If using a missing / extra tooth strategy, the actual tooth events are not evenly spaced. The ECU is able to detect this un-even spacing to identify missing / extra teeth.

If the engine cycle can be determined from a camshaft sensor, and sequential injection or ignition is required, then the option iconFuel Teeth and option iconSpark Teeth options should wither be set to the same value as the number of internal teeth (e.g. wasted spark) or to double the value (sequential).

Synchronization

Overview

Once the crank / cam sensors are configured, the synchronization strategy and tooth pattern must be set up to be able to synchronize the ECU with the engine.

When cranking / starting the engine, the ECU will initially be in an unsynchronized state. The ECU will not be able to determine the engine cycle position until synchronization is achieved.

When the ECU reaches the synchronized state, the channel iconStat Sync'd channel will be set to ON.

During cranking, the ECU uses a different control strategy to normal running.

Synchronization Strategy

The most common synchronization strategy is to use a Missing tooth (or eXtra tooth) on the crankshaft wheel, GEMS ECUs refer to this as the Sync MX strategy.

There are 4 synchronization strategies available, controlled by 3 options. These options must be set in a mutually exclusive way:

  • Sync MX - Missing / extra tooth/teeth on the crankshaft wheel.
  • Sync Cam Count - Simplest strategy, uses the camshaft sensor to determine the engine cycle position, prefer option iconSync Crank S count if possible.
  • Sync Crank S Count - Similar to option iconSync Cam Count, counts the number of crankshaft teeth between camshaft teeth.
  • Sync Cam - when the above 3 options are OFF. Ignores the table iconTooth Control table and used camshaft signal to subdivide the engine cycle.

Subsections of Synchronization

Sync MX

Overview

The Sync MX strategy is the most common synchronization strategy. It uses a missing tooth / teeth (or an extra tooth) on the crankshaft wheel to determine the engine cycle position.

Sync MX Options

The following options are used to detect the missing or extra tooth:

Option Description
option iconSync MX ON
option iconSync Cam Count OFF
option iconSync Crank S Count OFF
option iconSync Crank Divider OFF. This option has a major impact on timing interrupts and changing it requires an ECU reset.
option iconMissing Number of missing or extra teeth. Allowed values 0, 1, 2, -1. A value of -1 indicates the wheel uses an extra tooth (e.g. Honda 12+1).
option iconMX Sync Test Number of actual teeth before the missing tooth since the last missing section. For wheels with only 1 missing section or 1 extra tooth, set this to the physical number of teeth - 1. So for e.g. 36-2 this should be 34-1, which is 33. For more complex wheels with multiple missing sections (e.g. Rover K), set to the longest run of teeth without any missing teeth between them.
option iconMX Time Threshold for Missing Tooth detection. Percentage of prior tooth interval time to predict minimum interval to next tooth.
option iconStart MX Time Threshold for Missing Tooth detection (when cranking).
option iconSync Teeth Cam Synchronization, count of Cam sensor events that must occur to reset channel iconFuel Tooth No and channel iconIgn Tooth No.
option iconTest not Sync'd Set to ON so that while cranking, all opportunities are used for synchronization
option iconSync off Above Ignore the Cam sync above the specified channel iconEngine Speed, if non zero. This may be required at higher RPMs if cam and crank interrupts can interfere with each other, reducing timing precision.
option iconSync Err R/S Result in loss of synchronization (channel iconStat Sync'd => OFF) if this number of Sync errors are detected.
option iconSync Test A Tooth and option iconSync Test A enable move cam synchronisation decision at a specific channel iconA Tooth, rather than synchronisation test at last valid entry in Tooth control table. This is may be useful with variable cam control systems, where the cam signal used for synchronisation crosses the old fixed decision point. Only used with “Sync MX” Strategy.

Using a value for ‘Missing’ of 1 may be acceptable for wheels with 2 missing teeth in a row, depending upon the value of channel iconMX Time.

The value of option iconMX Time is a balance between the maximum tolerable deceleration of the engine and the ability to detect the missing tooth.

option iconMX Time or option iconStart MX Time is used to make channel icond Tooth Time that is compared with the new tooth time to detect the missing or extra tooth. If detected it is displayed in channel iconMiss Time.

This is a scaling factor for the tooth interval for giving a lower bound on when the next tooth should arrive.

If there are missing teeth then either 1 or 2 whole intervals will be added to this value, depending upon the value of option iconMissing. If there is an extra tooth then no extra intervals are added.

When the first tooth after the missing section on the wheel is detected then this deadline should be missed - and the ECU will consider this event as having just passed the missing tooth.

Missing Tooth Detection Missing Tooth Detection

For each time the table iconTooth Control table is successfully processed, the ECU will decrement the channel iconSync good count channel until it reaches 0.

Sync Cam Count

Overview

Simplest synchronising strategy, where possible use Sync Crank S Count.

Where Cam Count = Sync teeth

Cam count is the number of cam teeth between crank teeth, as in old Subaru pattern and Dodge Viper.

Examples

Toyota

24 even crank teeth per engine cycle with 1 cam tooth.

  • Tooth Control table is 0-23 = 5, 24 = 3
  • Sync Cam Count = ON
  • Sync Crank S Count = OFF
  • Sync MX = OFF
  • Sync Teeth = 1
  • MX Sync Test = 24

Old Subaru

3 crank teeth per cylinder event.

  • Tooth Control table is 4,5,6, 4,5,6, 4,5,6, 4,5,6, then at 12 = 3
  • Sync Cam Count = ON
  • Sync Crank S Count = OFF
  • Sync MX = OFF
  • Sync Teeth = 1 or 3 there are two 2s
  • MX Sync Test = 12
  • Ignition range = 0.50 teeth
  • Crank Alt Fire = ON
  • Start Ignition = -10

Sync Crank S Count

Overview

Where SS Tooth No = MX Sync test and Sync Tooth = Sync teeth

SS Tooth No is the number of internal crank teeth between cam teeth.

Sync tooth is the value of Fuel tooth at the synchronising cam tooth.

Sync Crank S Count Options

Option Description
option iconSync Crank S Count ON
option iconSync MX OFF
option iconSync Cam Count OFF
option iconSync Cam Width OFF
option iconSync Crank Divider OFF. This option has a major impact on timing interrupts and changing it requires an ECU reset.
option iconMissing Set to 0 since there are no missing / extra teeth.
option iconSync Teeth
option iconMX Sync Test

Examples

Honda S2000

24 even crank teeth per engine cycle with 3 cam teeth at TDC for only 3 cylinders.

  • Tooth Control table is 0-23 = 5, 24 = 3
  • Sync Teeth = don’t care - See channel Sync Tooth or Cam tooth1, the cam tooth for synchronisation relative to crank.
  • MX Sync Test = 12 - See channel SS Tooth No, the number of internal teeth between cam teeth at the synchronising cam tooth, the other possibility 6 is not unique as it occurs twice per engine cycle.

Toyota

24 even crank teeth per engine cycle with 1 cam tooth.

  • Tooth Control table is 0-23 = 5, 24 = 3
  • Sync Teeth = 1
  • MX Sync Test = 24

Simple crank trigger

Edge at 45deg 4 teeth cycle, no cam synchronisation.

  • Tooth Control table is 0-2 = 1, 3 = 5, 24 = 3
  • Sync Teeth = 0
  • MX Sync Test = 4

Adjust ignition range for useful +/45 degrees = 0.5

Ford P8 L8

4 even crank teeth per engine cycle with 2 cam teeth.

  • Tooth Control table is 0-7 = 5, 8 = 3
  • Sync Teeth = don’t care - See channel Sync Tooth or Cam tooth1, the cam tooth for synchronisation relative to crank)
  • MX Sync Test = 6 - See channel SS Tooth No, the number of internal teeth between cam teeth at the synchronising cam tooth, the other possibility 2 is not as strong.
  • Fuel Teeth = 8
  • Spark Teeth = 4 for wasted spark
  • Wheel Teeth = 4

Sync Cam

Overview

Old synchronization strategy used with timing wheels with a high number of teeth without any missing/extra teeth. The camshaft sensor is used to identify the engine cycle position.

Option Description
option iconSync MX OFF
option iconSync Cam Count OFF
option iconSync Crank S Count OFF
option iconSync Cam Width ON
option iconSync Crank Divider ON. This option has a major impact on timing interrupts and changing it requires an ECU reset.
option iconMissing Set to 0 since there are no missing / extra teeth.
option iconCrank Divider Divisor for reducing crank teeth to internal teeth.
option iconCam Width Test Number of subdivided teeth that must be seen in order to synchronize.
option iconSync Teeth Copied to channel iconCrank Div Sync Err if synchronization is lost; number of good sync’s required to set channel iconStat Sync'd to ON.

If the option iconSync Cam Width option is ON, synchronization is achieved if channel iconCam Width = option iconCam Width Test when the Cam interrupt occurs.
In some ECUs this may be option iconMX Sync test.

If the option iconSync Cam Width option is OFF then synchronization would achieved if channel iconSS Tooth No = option iconCam Width Test when the Cam interrupt occurs. However, channel iconSS Tooth No is only set when option iconSync Crank Divider is OFF or during crank interrupt with the Sync Crank S Count strategy enabled. So this mode is no longer of use in recent firmware versions.

In case of loss of sync, channel iconCrank Div Sync Err is set to the value of the option iconSync Teeth and decremented for each successful Cam synchronization. When channel iconCrank Div Sync Err reaches 0, the ECU will consider the engine to be synchronized and will set channel iconStat Sync'd to ON.

channel iconPulse Acc count T1 (aka channel iconPA Count T1) is captured at start of T2 interrupt, stored in channel iconPA count1 temp. This counts T1 events (crank teeth).

channel iconCam Width receives the number of subdivided crank teeth that have occurred since the last Cam sensor event.

Examples

These are historical examples that may contain errors and have not been re-tested on modern hardware.

Historical BMW M3

135 crank teeth on ring gear, one sync pulse at 1/2 engine speed.

  • Crank Divider = 9, giving 15 internal teeth per rev. 24deg/internal tooth
  • Ign Range = 2.75
  • Fuel Teeth = 30
  • Spark Teeth = 15 (wasted spark)
  • Cam Width Test = 30 (May be channel iconMX Sync Test on some ECUs)
  • Sync Cam Width = ON (? original example reported as OFF)
  • Sync Crank Divider = ON

Nissan

360 crank teeth (high speed), 4 cylinder slots of different widths, equivalent to 2,3,5,or 5 crank teeth.

  • Crank Divider = 15, giving 12 internal teeth per rev. 30deg/internal tooth
  • Ign Range = 3.0
  • Fuel Teeth = 24
  • Spark Teeth = 12 (wasted spark)
  • Cam Width Test = 251 (? - needs confirmation)
  • Sync Cam Width = ON
  • Sync Crank Divider = ON

Use only fast falling edges for crank (T1) and cam (T2).

Tooth Control Table

Overview

The main goal of the table iconTooth Control table is to subdivide the physical timing wheel teeth (actual teeth) into regularly spaced internal teeth.

RPM Pickup Wizard

The RPM Pickup wizard can be used to calculate the Tooth Control table values, given some common timing wheel types.

Tooth Control Table

The table iconTooth Control table is a low-level ECU feature that is not obvious but essential to understand if needing to accommodate unusual tooth patterns.

Each site in the table iconTooth Control table corresponds to the sequence of ECU interrupts (events) from actual teeth passing the crank sensor and are therefore not necessarily evenly spaced in time or angle; there will not be any events in the missing section of the wheel or there may be an extra tooth. Some timing wheels have more than one missing teeth section.

The aim is to select from these events an evenly spaced real-world pattern of internal teeth that can be used to schedule fuelling and ignition events. The internal teeth are used to subdivide the engine cycle into equal parts, and the ECU will increment internal tooth counters for each internal tooth detected, with separate counters for fuelling and ignition.

If using a wheel with 2 missing teeth in a row, for example, then the actual teeth will need to be divided by at least 3 (possibly more) to ensure that no internal teeth fall within the missing section and are also evenly spaced in terms of crank angles. Each internal tooth must coincide with an actual tooth passing the sensor; i.e. an interrupt/event occurs in the ECU for each internal tooth.

It is common to subdivide the timing wheel into 12 internal teeth. For example, with a 36-2 wheel that has 2 missing teeth in a row this can be divided by 3 into 12 equally spaced internal teeth that all coincide with actual teeth.

When actual teeth are detected, the ECU will increment channel iconA Tooth and use the value to look up the corresponding site in the table iconTooth Control table.

Each value in the table is composed of 3 digital ‘bits’ (1/0):

Value Bits Function
0 000 Do nothing.
1 001 Active Edge (Internal Tooth).
2 010 Alternate Edge (Used for Crank Alt Fire mode).
3 011 Reset channel iconA Tooth, if loss of sync. Indicates the end of the table.
4 100 Test for synchronization.
5 101 Active Edge (Internal Tooth) + test for synchronization.
6 101 Alternate Edge + test for synchronization.
7 111 Reserved (do not use this value).

Unless all sites in the table are required, the value ‘3’ should be placed at the end of the table so that loss of synchronization can be detected; if channel iconA Tooth overruns the valid section of the table then the ‘3’ shall be encountered and the ECU will reset channel iconA Tooth to 0. The channels channel iconSync Error and channel iconTiming Error will be incremented if this event occurs.

It is expected that the synchronization event(s) will be detected before the ‘3’ value is encountered, which would also result in channel iconA Tooth being reset to 0.

Active edges (internal teeth) are used to schedule fuelling and ignition events and are indicated by either ‘1’ or ‘5’ in the table. The ECU increments internal tooth counters channel iconFuel Tooth No and channel iconIgn Tooth No when an active edge (internal tooth) is encountered in the table iconTooth Control table.

The Synchronization Test bit (100), when set, will cause the ECU to test for synchronization. This allows for some reduction of CPU load when running at higher RPMs by skipping synchronization checks on all tooth interrupts (events) (which would be occurring much more frequently). This bit is normally set in the tooth control values near the end of the table where the missing / extra tooth is approaching, though for some other patterns there could be multiple synchronization points.

When not synchronized (channel iconStat Sync'd == OFF), the ECU can be configured to test for synchronization on all actual teeth by setting option iconTest Not Sync'd to ON (recommended).

Tachometer Output

Overview

The ECU may be configured to output a tachometer signal to drive an external tachometer. The signal is a square wave with a frequency proportional to the engine speed.

Tacho Edge Table

Tachometer state change events are inserted into the table iconTacho Edge table. They should be evenly spaced and typically there should be 4 state changes per revolution (i.e. 2 pulses per rev), depending upon the tachometer input requirements.

It is generally best, therefore, to place the state changes at the same channel iconA Tooth numbers as equidistant ‘active edges’ in the tooth control table, assuming that it is possible to do so.

The option iconTacho Pin option specifies which ECU pin the tachometer signal is output from. Check the ECU pinout to determine which pin number this should be set to.

Note

Changing the Tacho Pin option requires an ECU reset to take effect.

If using the RPM Pickup wizard, the Tachometer output can be calculated for you given a pulse-per-rev value. The RPM Pickup wizard assumes that option iconWheel Teeth is equal to the number of internal teeth.

Starting the Engine / Ignition Key

Overview

Starting the engine may be controlled by the ECU, in response to configurable input signals.

To start the engine, the fuel pump must be powered, the engine is primed with fuel, the starter motor must turn the engine over, timing wheel(s) synchronization must be established, and ignition and injection events must then occur with sufficiently precise timing to ensure that the engine starts powering itself.

Cold engines require a richer fuel mixture due to reduced fuel vaporization and increased oil viscosity. The ECU provides methods of enriching the fuel mixture during cranking and warm-up.

When stopping the engine, the ignition key is turned off, and the ECU will stop fuel injection, park the idle stepper motor, and turn off power to the fuel pump and the ECU itself (Main Relay control).

Starter Control

option iconStarter In is a configurable switch input to request the starter motor to run. This is typically connected to the ignition key in the ‘crank’ position. If starting of the engine is managed externally, then option iconStarter In may be left un-configured.

option iconStarter Out is a configurable output that will be energized when the starter motor should be turned on. This is typically connected to a relay coil that switches the high current supply to the starter motor.

option iconStarter Time out configures the maximum time that the starter motor will be energized. This is a safety feature to prevent damage to the starter motor if the engine fails to start.

option iconStarter Exit Speed configures the engine speed at which the starter motor will be turned off, assuming that the engine has started turning itself over. Starter motors turn the engine over at a relatively low speed (typically up to 500 RPM) - the motor should be turned off as soon as the engine is running under its own power to avoid damage to the starter motor and unnecessarily draining the battery.

Cranking Detection

The cranking state is indicated by the channel iconStat Cranking channel. The ECU will report that it is in the ‘Cranking’ state as soon as it is turned on, even though the engine may not actually be turning.

The ECU indicates that the engine is actually in motion if channel iconStat Running is ON. The ECU will trigger any ignition or injection events until channel iconStat Sync'd is ON, indicating that the ECU has synchronized with the engine timing wheel(s). Synchronization is required to ensure that ignition and injection events occur at the correct time in the engine cycle.

When starting an engine, the ECU must compute an channel iconEngine Speed value prior to fully synchronizing with the crankshaft / camshaft timing wheel(s). The ECU estimates the engine speed using fewer crank teeth than a full engine cycle when channel iconStat Sync'd is OFF, see and Engine Speed (RPM) Calculation for details. This initial speed calculation uses option iconStart Actual Teeth, option iconStart Actual Teeth <2, option iconSpeed mul and option iconSpeed Cycle/rev.

option iconStart Crank Teeth configures the number of ‘synchronized’ teeth (channel iconT1 Count Sync’d) that must be detected before the ECU will exit cranking mode.

The channel iconT1 Count Sync'd channel is the number of actual crank teeth seen since engine synchronization was achieved and counts up until it reaches 255, at which point it stops counting. This channel can be useful to monitor short-term loss of synchronization; it is reset to zero if synchronization is lost.

option iconStart min Speed configures the minimum engine speed that must be exceeded before the ECU will allow ignition events to occur. Ignition events will need to start while the engine is being turned over by the starter motor, so this value should be set to a value that is achievable by the starter motor.

option iconCrank Exit configures the engine speed at which the ECU will exit the cranking state. This should be set to a value lower than the minimum idle speed of the engine, but higher than the speed that can be achieved by the starter motor. It indicates that the engine is running under its own power.

Ignition timing may be adjusted during cranking using the option iconStart Ignition option.

Synchronization During Cranking

Due to compression within the engine, the starter motor is unlikely to be capable of turning the engine smoothly, so wider missing / extra tooth tolerances may be required to account for the more significant variations in engine speed during cranking.

Option option iconStart MX Time is used in place of option iconMX Time when starting to determine the tolerance between crank teeth. Its value will depend upon the type of crank wheel (e.g. Missing or eXtra tooth) / sync strategy.

For configurations that normally use sequential ignition, cam synchronization may be ignored during cranking by setting option iconStart No Cam Sync to ON, effectively running the engine in wasted spark mode during cranking.

Start Pulse (Priming)

Warning

Engines using plastic inlet manifolds should not use this feature as the potential for backfire may severely damage / blast off the manifold.

The Start Pulse feature is not commonly required on modern engines; configuring the ECU to provide extra fuel during cranking is usually sufficient and safer.

To use the Start Pulse feature, the cranking position of the ignition key should be wired to the ECU, with the corresponding input pin selected in the option iconStart Pulse pin option. Note: option iconStart Pulse pin can be configured as an active low by making the option negative.

When the start pulse pin is asserted (and channel iconStat Cranking is ON), the ECU will fire all fuel injectors simultaneously with a channel iconStart Pulse duration of fuel.

channel iconStart Pulse is taken from the table iconStart Pulse table, which is indexed by the channel iconCoolant temperature channel.

The starter will turn the engine, and the ECU will try to synchronize with crank and cam timing signals.

The channel iconEngine Speed channel will be calculated after some timing wheel events have occurred, see Engine Speed (RPM) Calculation for details.

When the engine is synchronized, indicated by channel iconStat Sync'd = On, the ignition and fuel injection events will be allowed.

Note

if option iconStart Pulse pin was not detected the first cycle of injections will be extended by channel iconStart Pulse duration. channel iconAfter Start rev counter will increment until option iconCrank Exit speed is exceeded and normal running established, where upon the channel iconAfter Start timer will start.

Stopping

The ignition key is turned to Off, the channel iconMain Relay Off timer starts.

The following options specify time durations for shutdown tasks that are performed in sequence:

  • option iconMain Relay Stop Eng - fuel injection stopped, may take several seconds for the engine to run down.
  • option iconMain Relay Park IAC - resets and parks idle stepper motor.
  • option iconMain Relay Kill Pwr - turns off outputs - option iconOut Main Relay, and - option iconOut Main Relay 2.

This time must be long enough for idle motor to complete parking.

option iconMain Relay Safety will delay the turn off if there is non-volatile write of calibration data indicated by channel iconError EE Checksum if option option iconAuto EE is On.

Re-starting

If the ignition key is returned to on position, after channel iconMain Relay Off exceeds option iconStart Pulse Rearm Time, and option iconStart Pulse Rearm and option iconMain Relay Off Restart are On, the fuel pump will run again for option iconFuel Pump Prime seconds, and channel iconStart Pulse Pending will go On.

Engine Speed (RPM) Calculation

Overview

Once the synchronization strategy is configured and the ECU is able to synchronize with the engine, the engine speed (RPM) can be calculated.

Engine Speed Calculation

The channel iconEngine Speed channel is calculated using the time intervals of crankshaft position sensor readings.

A value must be specified in the option iconSpeed mul option otherwise channel iconEngine Speed will read zero.

The option iconWheel Teeth option defines how many internal teeth time intervals are summed to produce the channel iconRev Time MSB and channel iconRev Time channels. Depending upon whether option iconWheel Teeth is equal to the number of internal teeth per revolution determines whether or not channel iconRev Time is really the total time for one revolution of the crankshaft (it may not be).

If option iconWheel Teeth was 2x the number of internal teeth per revolution then the engine speed would be summed over 2 revolutions of the crankshaft.

If the option iconSpeed cycle/Rev option is ON then the speed is derived from 150ms/“Rev Time” instead of 300ms/“Rev Time”, which can act as a tradeoff between maximum engine speed and precision.

The option iconSpeed mul option is used to scale the result to a correct RPM value, depending upon the combination of the settings.

Valid settings, e.g. for a calibration with 12 internal teeth:

option iconWheel Teeth option iconSpeed mul option iconSpeed Cycle/rev Max Engine Speed
12 (1 rev) 50% OFF 12799 rpm
12 (1 rev) 100% ON 25599 rpm
24 (2 revs) 100% OFF 25599 rpm

The option iconPickup comp option compensates for fixed timing drift. The ECU’s calculated RPM value can be compared to that measured using a calibrated tachometer to determine the correct value for this option.

When Starting / Cranking

When the engine is starting, the ECU will be in an unsynchronized state and therefore can’t identify the internal teeth, so a different strategy is required to calculate the engine speed.

This strategy is less accurate that using internal teeth - actual crank teeth may be irregularly spaced due to missing / extra teeth.

Times between physical teeth (‘actual’ teeth) are measured between crank wheel sensor events. Engine speed can be estimated over as few as 2 teeth, but accuracy improves with more teeth. A maximum of 7 teeth intervals may be used to estimate the engine speed during cranking.

option iconStart Actual Teeth configures the number of tooth times to sum for the starting Engine Speed calculation. Until this number of teeth have been detected, the engine speed will be zero.

option iconStart Actual Teeth <2 is a ’left-shift’ - the number of times to double the partial rev-time such that it represents something close to either a single revolution or two revolutions (a 4-stroke engine cycle) of the crankshaft, depending upon the calculation strategy.

channel iconRev Timenot sync’d = Tcycle | rev = T‘Start Actual Teeth’ * 2‘Start Actual Teeth <2’

Depending upon the engine speed calculation strategy, rpm will be estimated over either one or two revolutions of the crankshaft, so the option iconStart Actual Teeth and option iconStart Actual Teeth <2 must take into account the ratio between option iconWheel Teeth and the number of actual-vs-internal-teeth derived from the crankshaft timing wheel using the table iconTooth Control table.

For example a few possible settings for option iconStart Actual Teeth and option iconStart Actual Teeth <2 are shown below, derived from a 36-2 timing wheel configuration:

Item Value
Crankshaft timing wheel 36-2 (34 physical teeth)
Subdivider (physical teeth per internal tooth) 3
Internal teeth per revolution (table iconTooth Control) 12 = (36 / 3)
option iconWheel Teeth 24 = (12 * 2)
Engine speed calculated over 2 revs
option iconSpeed mul 100%
option iconSpeed Cycle/rev OFF
Target estimation tooth count 72 = (36 * 2), 2 revs
Reduce to value near 7 by successive divide by 2 36 = (72 / 2)
18 = (72 / 4)
9 = (72 / 8)
4.5 = (72 / 16)
option iconStart Actual Teeth (max 7) 7 = limit 9 to 7
option iconStart Actual Teeth <2 3 = log2(8)
Estimated over 56 = (7 * 8) teeth, 1.65 revs
Error -22% = (56 / 72)
option iconStart Actual Teeth (max 7) 4 = round down 4.5
option iconStart Actual Teeth <2 4 = log2(16)
Estimated over 64 = (4 * 16) teeth, 1.88 revs
Error -11% = (64 / 72)
option iconStart Actual Teeth (max 7) 5 = round up 4.5
option iconStart Actual Teeth <2 4 = log2(16)
Estimated over 80 = (5 * 16) teeth, 2.35 revs
Error +11% = (80 / 72)

The various options for calibration here are a trade-off between accuracy and precision. While a lower option iconStart Actual Teeth value may give a more accurate engine speed (closer to the actual RPM value), it may be less precise than if it had been calculated over more teeth.

The accuracy of the engine speed during this phase is not all that important - any options that depend upon it can be adjusted accordingly. The precision of the engine speed is arguably more important, especially when there are missing / extra teeth on the timing wheel - but the extra precision it does mean that it will take more teeth passing the sensor to achieve a non-zero engine speed value.

Crankshaft timing wheel is a 36-2 (34 actual teeth) and option iconWheel Teeth is set to 12 (1 internal tooth per 3 actual teeth), then to estimate the engine speed over a single revolution of the crankshaft, option iconStart Actual Teeth should be set to 12 * 3 = 36 and option iconStart Actual Teeth <2 should be set to 0.

Ignition Timing

Overview

Ignition events occur relative to crankshaft rotation angles.

Ignition angles are typically measured in degrees relative to Top Dead Center (TDC) of the compression stroke. Internally, the ECU works in units of virtual ‘internal teeth’, which are proportional to the crankshaft rotation angle.

Various items in the calibration may adjust the ignition timing (advance or retard it) relative to TDC.

See RPM Pickup for a discussion on how the ECU determines the crankshaft position, internal teeth, and the relationship to rotation angle.

Ignition Driver Assignment

Once the RPM Pickup has been calibrated, the ignition drivers may be assigned to the engine cylinders.

The options option iconIGN1 to option iconIGN8 enable the associated ignition driver circuit.

Note

Whilst it is desirable for software IGN numbers to refer to cylinder numbers, in practice this may not be possible due to multiplexing of the ignition drivers.

Some newer ECUs use option iconCoil 1 to option iconCoil 8 instead of option iconIGN1 to option iconIGN8. The options ar are assigned to the ignition driver circuits in reverse sequence to avoid multiplexing being used on the lower Coil numbers (allowing Coil N to match Cylinder N on any engine up to 6 cylinders, where there is a single ignition driver per cylinder, if desired).

option iconIGN Tooth 1 to option iconIGN Tooth 8 controls the relative angle of individual ignition driver triggers (firing angles) - essentially these options define the firing order.

The adjusted ignition timing calculation is added to these per-driver angles to result in a final ignition timing value for each driver (producing channel iconSpark 1 Total to channel iconSpark 8 Total).

Depending on the ECU hardware, multiplexing of ignition triggers may be required due to limitations on the number of Timer Output Compare (TOC) pins on the CPU in the ECU.

The EM80 ECU has 6 TOC pins available for controlling up to 8 ignition drivers, so some additional non-timer pins are used to share 2 TOCs between 4 ignition circuits. On EM80, the IGN1 and IGN3 circuits are multiplexed and so are IGN2 and IGN4.

flowchart LR
    IGMUX11-->AND1(["&"])
    TOC1-->AND1
    TOC1-->AND2
    IGMUX12-->AND2(["&"])
    AND1-->IGN1
    AND2-->IGN3
    IGN1-->LM4{{LM4}}
    IGN3-->LM3{{LM3}}

    IGMUX21-->AND3(["&"])
    TOC2-->AND3
    TOC2-->AND4
    IGMUX22-->AND4(["&"])
    AND3-->IGN2
    AND4-->IGN4
    IGN2-->LL2{{LL2}}
    IGN4-->LM2{{LM2}}

    TOC3-->IGN5
    IGN5-->RH3{{RH3}}

    TOC4-->IGN6
    IGN6-->RG3{{RG3}}

    TOC5-->IGN7
    IGN7-->RH2{{RH2}}
    
    TOC6-->IGN8
    IGN8-->RH1{{RH1}}

Multiplexed IGN triggers place some restrictions on the assignment of IGN driver circuits to physical engine cylinders.

Warning

Multiplexed IGN circuits must be mutually exclusively triggered. The consequences of timing overlap here could be severe engine knock / pre-ignition.

To give the maximum amount of timing flexibility we either want to avoid using both IGN drivers within multiplexed pairs, or ensure that multiplexed drivers (e.g. IGN1 and IGN3 on EM80) are assigned to physical cylinders that have TDC that is 360 degrees apart from one another.

It should be possible to calculate if timing overlap is possible using the following formula if necessary:

‘IGN Tooth 1’ + ‘Dwell Max’ >= ‘IGN Tooth 3’

If the above condition is violated, then the IGN circuits are not mutually exclusive and the ECU will not be able to control the ignition timing correctly.

If the engine is running wasted spark then it may be acceptable to fire the multiplexed IGNs at the same time if they are assigned to the correct cylinders.

Tip

You may find that assigning Cylinder 1 to IGN1 is a good starting point for the ignition circuit assignment. This will allow the use the “Spark Total 1” channel to refer to Cylinder 1 as a general indication of ignition advance/retard by convention.

The rest of the IGN circuits may then be assigned, taking into account the firing order and firing angles of the engine.

On a 4 cylinder engine, one option would be to then use IGN2, IGN5 and IGN6 (skipping the multiplexed IGN3 and IGN4), to avoid any chance of overlap in the multiplexer.

Given an even firing order of 1-3-4-2, the IGN + cylinder assignment for this strategy could be as follows:

Cylinder IGN Driver Angle IGN Tooth (if 12 teeth / rev)
1 IGN 1 = ON IGN Tooth 1 = 0.0
2 IGN 2 = ON 540° IGN Tooth 2 = 18.0
3 IGN 5 = ON 180° IGN Tooth 5 = 6.0
4 IGN 6 = ON 360° IGN Tooth 6 = 12.0
IGN 3 = OFF
IGN 4 = OFF
IGN 7 = OFF
IGN 8 = OFF

On 6 cylinder engine, we could follow the same pattern and use IGNs 1,2,5,6,7,8.

Of course we could still use the multiplexor for 4 cylinder, provided we arrange for IGN1 and IGN3 to be 360 degrees apart and the same for IGN2 and IGN4.

Given an even firing order of 1-3-4-2, the IGN + cylinder assignment could be as follows:

Cylinder IGN Driver Angle IGN Tooth (if 12 teeth / rev)
1 IGN 1 = ON IGN Tooth 1 = 0.0
2 IGN 4 = ON 540° IGN Tooth 4 = 18.0
3 IGN 2 = ON 180° IGN Tooth 2 = 6.0
4 IGN 3 = ON 360° IGN Tooth 3 = 12.0
IGN 5 = OFF
IGN 6 = OFF
IGN 7 = OFF
IGN 8 = OFF

On an 8 Cylinder engine we would be forced to use the multiplexed IGNs in any case, so careful assignment if IGNs will be required to ensure optimal phase separation of timing signals.

For example, for an 8 cylinder engine with a firing order of 1-8-4-3-6-5-7-2, the IGN + cylinder assignment could be as follows:

Cylinder IGN Driver Angle IGN Tooth (if 12 teeth / rev)
1 IGN 1 = ON IGN Tooth 1 = 0.0
2 IGN 8 = ON 630° IGN Tooth 8 = 21.0
3 IGN 7 = ON 270° IGN Tooth 7 = 9.0
4 IGN 5 = ON 180° IGN Tooth 5 = 6.0
5 IGN 2 = ON 450° IGN Tooth 2 = 15.0
6 IGN 3 = ON 360° IGN Tooth 3 = 12.0
7 IGN 6 = ON 540° IGN Tooth 6 = 18.0
8 IGN 4 = ON 90° IGN Tooth 4 = 3.0

Ignition Range

The ignition timing range is the difference between the maximum and minimum ignition angles that may be specified in the calibration.

The option option iconIgn Range specifies the number of internal teeth over which the ignition may be adjusted. The ECU uses this value to scale ignition timing adjustments to the ECU’s internal working units (fractional internal teeth).

Note

For correct ECU operation, the option iconIgn Range option must be set correctly.

The option iconIgn Advance Scalar and option iconIgn Advance Offset options are used to convert internal teeth to degrees and have no impact on the internal operation of the ECU.

The range can be tested using option option iconIgnition Fixed to see the maximum advance / retard that can be achieved given option iconIgn Advance Scalar and option iconIgn Advance Offset.

option iconIgn Range should be set to:

"Ignition Range (Degrees)" * "Internal Teeth" / 360

Where Ignition Range, is:

"Max Advance Degrees BTDC" + "Max Retard Degrees ATDC"</code></pre>

For most GEMS ECUs, given a known advance / retard value, the option iconIgn Advance Scalar and option iconIgn Advance Offset options can be calculated as follows:

"Ign Advance Scalar" = ("Max Advance" + "Max Retard") / 127

"Ign Advance Offset" = ("Max Advance" - 63.5) * "Ign Advance Scalar"

Ignition Timing Alignment / Reference Point

If you do not have a base calibration for your engine where the timing alignment is pre-configured, the timing adjustment may be calibrated with the assistance of a timing light (strobe) that is triggered by the ignition signal (spark plug) on cylinder #1.

The ECU calibration should be set such that it is not trying to advance or retard the ignition timing. This may be achieved by setting option option iconIgnition Fixed to a desired advance value and the channel channel iconIgnition Fixed to ON. This will override any ignition adjustments except for option iconSpark Sync and the per-ignition offsets (option iconIGN Tooth 1 to option iconIGN Tooth 8).

TDC should be accurately marked on the crankshaft timing wheel or flywheel. The strobe will illuminate the timing mark(s) on the wheel when the ignition event occurs, allowing the timing angle to be determined.

If the engine is unable to start then it is still possible to use a strobe but the spark plugs should be removed from the cylinders to avoid compression in the engine which would otherwise make the rotation speed inconsistent. The spark plugs should still be attached to the HT leads and attached to the engine earth. Once the engine is running, the timing adjustment process should be repeated for more accurate results.

Note that systems running wasted spark will have 2 ignition events per cycle, so ignition timing figures shown on the strobe light should be halved.

The option iconSpark Sync option may be used to apply a ‘global’ fixed adjustment (trim) to the ignition timing, so that the timing mark may align with a desired advance value.

Note

VR sensors and coils may introduce a small fixed timing drift, which can be compensated for with the option iconPickup comp option. This is a temporal adjustment rather than being related to angle (option iconSpark Sync). If you notice that the ignition advance is changing with RPM then it may be compensated with this option.

For engines that must run at very high RPMs or have many teeth on the crank wheel, the option iconT1 Delay Time +3/16 Tooth option may be used to account for the processing time of the ECU.

These options will affect all timing calibrations so should be configured early in the calibration process.

Options / Channels

Option / Channel Description
option iconT1 Delay Time +3/16 Tooth Account for processing time when a tooth interrupt occurs. For high tooth rate / high RPM, setting this option changes the worst case processing window from 1/16th of a tooth to 1/4 of a tooth.
channel iconIgnition Fixed (Writable) If set to ON, replaces any ignition advance compensations with fixed value from the option iconIgnition Fixed option. Since this is a writeable channel, it will be reset to OFF following a reset of the ECU. This can be useful if calibrating / confirming timing using a strobe, where compensations have already been configured.
option iconIgnition Fixed Fixed ignition advance value to use when channel iconIgnition Fixed is ON.
option iconSpark Sync Trim / ‘Reference Point’ value for ignition timing. Based value to which advance / retard adjustments are added, to give
option iconFuel Sync Not relevant to ignition timing but similar to option iconSpark Sync for adjusting injection timing.
channel iconSpark 1 Total The final ignition timing angle for the 1st ignition driver circuit.
channel iconSpark 2 Total The final ignition timing angle for the 2nd ignition driver circuit.
channel iconSpark 3 Total The final ignition timing angle for the 3rd ignition driver circuit.
channel iconSpark 4 Total The final ignition timing angle for the 4th ignition driver circuit.
channel iconSpark 5 Total The final ignition timing angle for the 5th ignition driver circuit.
channel iconSpark 6 Total The final ignition timing angle for the 6th ignition driver circuit.
channel iconSpark 7 Total The final ignition timing angle for the 7th ignition driver circuit.
channel iconSpark 8 Total The final ignition timing angle for the 8th ignition driver circuit.
channel iconTILMTPT Indicates ignition cutting pattern due to rev limiting (0 == OFF).

Limp Mode

Overview

Limp mode is a safety feature that is activated when the ECU detects a fault condition. The ECU may be configured to limit engine power to prevent damage, and may also send messages or activate outputs to signal this condition (e.g. to illuminate a warning light on the dashboard).

This feature is named ’limp mode’ as it allows the vehicle to continue to operate, albeit with reduced performance, to allow the driver to reach (limp to) a place of safety. Sometimes also called ‘Limp Home Mode’.

Limp Mode Channels

Channel Description
channel iconLimp Indicates the state of the ECU’s limp mode.
channel iconLimping Indicates the length of time the ECU has been in limp mode.
channel iconLimp Act T Target Max Indicates the active throttle target limit when in limp mode.

Limp Mode Configuration

Option Description
option iconLimp Trip time Time in seconds that the ECU will wait before entering limp mode after a fault is detected.
option iconLimp wait after start Time in seconds that the ECU will wait before entering limp mode after the engine has started.
option iconLimp Act T Target max Limit active throttle target to this value when in limp mode.
option iconLimp Act T Target rate Rate of change of active throttle target when in limp mode.
option iconLimp WG Duty Limit wastegate duty cycle to this value when in limp mode.
option iconRain Light Limp
option iconLimp to Rain Light
If ON, activate the Rain Light whe limp mode is active.

Rain Light

Overview

The rain light is a high intensity rear-facing light that is activated in wet conditions to improve visibility for following drivers. The rain light is typically controlled by a switch on the dashboard, or by the ECU in response to a configurable input signal.

For motor sport applications, regulations may require that the rain light is activated under other conditions, such as when following the safety car or if the engine is stalled.

Rain Light Channels

Channel Description
channel iconRain Light Indicates the state of the rain light switch input. Depending upon the ECU configuration, the rain light may still be activated when this channel is OFF, for example when the ECU is in limp mode. If required, the state of this channel may be routed to other ECU features, such as CAN Telemetry.

Rain Light Configuration

Option Description
option iconRain Light Input Switch Switch Input, to request activation of the rain light. The state of the switch is indicated by channel iconRain Light.
option iconRain Light Output Digital output pin for the rain light. If a negative value is supplied for the pin number here (e.g. ‘-5’), the signal is inverted (on e.g. pin ‘5’).
option iconRain Light Limp
option iconLimp to Rain Light
If ON, the rain light will be activated when the ECU is in Limp Mode. This overrides the option iconRain Light Input Switch.
option iconRain Light Stalled Disable If ON, then the rain light will be unaffected by the engine running state, Otherwise the engine will be considered stalled if channel iconStat Cranking is ON.
option iconRain Light Pitting Disable If ON, then the rain light will be unaffected by the state of channel iconRoad Speed Limiter.
option iconRain Light Stalled after started In ON then the stalled condition will only be considered if channel iconHas Started is ON.

i.e. the engine has been running for a time duration set by option iconAfter Start.

On ECUs without option iconAfter Start, this may be a fixed value, typically 16 seconds.

Rain Light Flash Rates

Rates that the rain light may flash at, in order of priority:

Rate Description
ON Limp
1Hz Pitting
4Hz Rain
10Hz Stall

Calibrations

Overview

Calibrations are at the core of GWv4. The majority of ECU’s that GWv4 can connect to contain calibration data, for example a Fuel Map for an engine management system.

Calibrations can be downloaded from the ECU, manipulated either on or off-line and saved to the PC. This allows a library of calibrations to be built up for uploading into the ECU.

Subsections of Calibrations

Starting a New Calibration

To start a new calibration click the New Calibration Icon button on the tool bar, or from the main menu select New Calibration.... You will be given a list of the current ECU’s types and versions installed, select the ECU and version you want to start the new calibration. This will create a new blank calibration.

New Calibration New Calibration

We would recommend that a base map is used as a starting point rather than a blank calibration. You can download calibrations from the GEMS website: gems.co.uk/downloads, or by contacting GEMS directly on info@gems.co.uk

Editing a Calibration

Editing a calibration is done by modifying the maps, tables and options. This is achieved using the map, table and option objects which display them. For details on how to display and edit these, see the Views section.

Editing Offline

When you are working offline (not connected to an ECU) changes you make to the calibration are saved to the current file. These changes can be saved to the ECU by Programming a Calibration.

Editing While Online

When you make changes while you are online (connected to an ECU) these changes will be sent to the ECU but not saved permanently. This means that if the ECU is turned off it will not remember to changes when turned back on. To permanently save to changes to the ECU you need to ‘Store Changes’. Do this by selecting Store Changes in ECUCtrl+K from the main menu. You can set GWv4 to do this automatically store changes periodically by selecting Auto Store.

Undoing Changes

As changes are made to a calibration, GWv4 keeps a record which is maintained until another calibration is opened or GWv4 is closed.

To undo changes:

Select UndoCtrl-Z, press Ctrl+Z, or click the Undo Icon button. This will undo the last change made. Repeating the process undoes the previous change and so on. If a change affected several sites, for example a percentage change on an area of the Fuel Map, then all the site changes will be done in one process.

Undone changes can be redone. To redo the last change undone:

Select RedoCtrl-Y, press Ctrl+Y, or click the Redo Icon button. In addition to the button illuminating when the calibration is changed, “[modified]” is then displayed in the title bar.

Undo History

All recent changes made to the calibration can be viewed as a list, allowing you to revert to an earlier state of the calibration. When you select an earlier state, all changes made since then will be undone. To view the undo history, from the main menu select HistoryCtrl-H. The undo history window will then be shown:

View calibration changes in Undo History View calibration changes in Undo History

The changes made are listed from oldest to newest with newest with at the bottom. To revert to a specific state, simply click on the line in the history you want to revert to and all changes back to that point will be undone.

Programming a Calibration

Programming a calibration loads a selected calibration file into the ECU. If you are working offline then GWv4 will attempt to connect to the current ECU.

Send current calibration

To program the calibration currently open with GWv4, from the main menu select Send Current Calibration, or click the ‘Send Current Calibration’ button Send Current Calibration Icon on the toolbar.

Send Recent/Selected Calibration

To program a calibration to the ECU which is not the currently open calibration, then from the main menu select Send Calibration to ECU..., or click the ‘Send Recent Calibration’ button Send Recent Calibration Icon on the tool bar. Clicking the small down arrow next to this button will display a list of the calibrations which have been opened recently.

Storing Calibration Changes Permanently

Overview

When calibration changes are made whilst the ECU is connected to GWv4, the changes are sent to the ECU and it will operate using those values, but the configuration may not saved permanently.

To make the changes ‘permanent’, the ECU must copy the RAM ‘shadow copy’ into ’non-volatile memory’ (NVM) - typically either EEPROM or Flash memory.

Unless the changes are copied to NVM, when the ECU is powered on again, it will load the prior NVM contents into RAM - losing any changes from the prior session. This behavior is dependent upon the ECU type and configuration.

Auto Store

Auto Store, controlled by option option iconAuto EE, is a switch that controls whether the ECU will automatically save changes to non-volatile memory. This feature is accessible from application menu Auto Store.

If modifying the calibration of an ECU that does not have Auto Store enabled, GWv4 will post a notification to inform that Auto Store is disabled.

Tip

It is best to turn Auto Store OFF when the calibration process is completed and the ECU is not being actively tuned, taking care to ensure that the calibration has been stored to the ECU and backed up on the PC. This will guard against any accidental changes in the field, for example due to an unexpected program error that could corrupt the calibration RAM. If Auto Store is OFF then the ECU is more likely to recover itself following a power cycle.

Storing Changes Manually

If Auto Store is OFF, then the ECU will not automatically save changes.

Using the Store Changes in ECUCtrl+K command will instruct the ECU to save any changes into non-volatile memory.

ECU Storage Status

If the ECU detects that its RAM copy of the calibration does not match the non-volatile copy, EE will be displayed in the application status bar. The term EE is derived from EEPROM.

The channel iconError EE Checksum channel will be set to ON if the ECU detects that there is un-stored calibration data.

While the ECU is programming the non-volatile memory, the channel iconStat Prog EE channel will be set to ON.

Warning

If the ECU is powered off during the programming of non-volatile memory, the ECU may be left in an inconsistent state. It is best to first close the connection and GWv4 will check that the ECU is in a safe state to be powered off.

Password Protection

Some ECUs have security features built in that allow calibrations to be password protected. If an ECU supports security, the Set Password... and Clear Password... menu items are enabled in the ECU menu. A padlock icon appears in the status bar to show the status of the secure ECU. If another computer is used to connect to a password protected ECU, the password must be entered before the calibration can be downloaded or edited. If the password is not known, the calibration must be erased from the ECU to allow access to the ECU.

Set a password

  • Connect to the ECU.
  • Select Set Password....
  • A dialog box appears prompting for a password. The password must be 6 characters long and can contain any alphanumeric character.
  • Enter the password and click ‘OK’.

Clear Password

Once connected to a password protected ECU, the password may be cleared. Clearing the password removes the security such that any PC can connect to this ECU.

To clear the password:

  • Connect to the ECU. You will be prompted for the current password.
  • Select Clear Password....

If the password is not known and you wish have access to the ECU, you can do this by clearing the current calibration. Connect to the ECU, when prompted for the password, select ‘Clear Calibration’. This will clear the calibration in the ECU allowing a new calibration to be uploaded.

Comparing Calibrations

Comparing calibrations enables you to compare the currently open calibration to another calibration of your choice. To compare calibrations, from the main menu select Compare Calibration... ( Compare Calibration Icon ). This will display the following file dialog:

Compare Calibration File Compare Calibration File

Here you can then select a ‘Source’ calibration, that you can compare your currently open calibration to.

When you have selected the file click ‘Open’. A new “Comparison” tab will display that shows a list of all the differences between the two calibrations:

Calibration Compare 1 Calibration Compare 1

The differences will display all groups of values which are different. Select an item from the differences list on the left hand side to view. The main window will then display each individual value which are different.

Only/Not In current ECU

This will display a list of all the differences where value does not feature in either the current calibration, or the compared calibration. This may occur for example when a new option is added to a later version of ECU.

Ignored

Some items are not included in the comparison, these items will be listed here.

Messages/Warnings

Any message that was created during the calibration [convert process](/calibrations/converting-a-calibration.html#Converting a Calibration) will be displayed here.

Configuring Columns

This allows you to add extra ways to compare the differences. For example; if we want to display the actual difference in value between the two; Click on the ‘Configure Columns’ button, then click the ‘Add’ button. Then from the ‘Predefined’ list, select ‘Difference’, and click ‘OK’. The difference between the two value will now be displayed in a new column.

Note

It is possible to create your own calculations, this feature is still in Beta, please contact GEMS for more details.

Copying Values

Values may be copied from the file to the current ECU opened by GWv4.

Copy Selection will copy the values on the rows selected in the right hand pane from the source file to the current ECU (the connected ECU / the file opened in GWv4).

The ‘Use Raw Conversion’ check box causes the actual raw value to be copied between the ECU’s.  Otherwise the value is converted to a scaled value in the context of the source ECU and assigned as the scaled value in the destination ECU.

Changing the source file

To quickly change the comparison to compare a new file, click the ‘Select Source File…’ button in the top right and select the new file to compare with.

Auto Refresh

Selecting Auto Refresh will cause the comparison to be re-evaluated when values are changed in the ECU.  If Auto Refresh is disabled, then you can manually get the compare to be re-evaluated by pressing the ‘Refresh’ button.

Converting a Calibration

Converting a calibration may be required when upgrading the firmware in a GEMS ECU.

Converting a Calibration

To convert a calibration select Convert... This will display the following window:

Convert Calibration Convert Calibration

The currently open calibration can be converted by simply ticking the ‘Convert from currently open calibration’ box.

Alternatively you may wish to convert a previously saved calibration, to do this select the ‘Browse…’ button, and navigate to and select the calibration you wish to convert. Or you can simply drag and drop the calibration from your files into the text window.

Select ‘Next’ and something similar to the following window will then be displayed:

Select a template Select a template

You will automatically be on the manual conversion tab, on the left side of the window are a selection of ECUs the the calibration could be converted to match. If the calibration is specific to a particular ECU then that ECU will already be selected.

The right side of the window displays various versions of each ECU. By default only installed versions will be displayed, but this setting can be turned off by the small tick box at the bottom left of the window.

New versions can also be installed using the ‘Install…’ button towards the bottom right of the window, and old versions can be uninstalled using the ‘Uninstall’ button in the same location.

Manual Conversion

Once the target version has been selected, simply select the ‘Next’ button, and the following window will be displayed:

List of unassigned items List of unassigned items

On the left are new options/channels etc that do not exist in the currently open calibration. These new options/channels will need values assigned to them. This can be done by copying a value from the right column across to the new options/channels, or by assigning a user value.

On the right are old/unused options/channels that exist in the currently open calibration, but not in the template that is being used to convert.

Copying Values

At the bottom left of the window the copy option should be selected by default, if not then simply select the radio button. Now select the new item from the left list to take the value of the old item from the right list. Once both are selected click the ‘Assign’ button at the bottom right of the window. Both selected items will disappear from the lists as the old item is assigned to the new. An example copy is shown below.

Copy unassigned items Copy unassigned items

Assigning New Values

If none of the old items are a match for the new items, then you may want to manually enter a value for the new items. To do this select the ‘Assign user value’ radio button in the bottom left of the window. Once selected there is a text box next to the radio button which you will now be able to type in.

Select a new item from the left list, enter a value in the text box to assign to it, then simply click the ‘Assign’ button and the new item will disappear from the left list as the user value is assigned.

Once all new items have had values assigned to them, or have been left with a default value, simply select the ‘Next’ button.

If there were new items that were left unassigned, then the following window will be displayed.

Unassigned items options Unassigned items options

Otherwise, if all items had a value assigned to them, then something similar to the following window will be displayed.

Add notes if you wish Add notes if you wish

Adding Notes and Saving

Here you can add some notes about the calibration, such as details about important setting in the calibration. These notes can be used to quickly identify calibrations with similar names. The calibration can then be saved, and the following window will be displayed.

Conversion is complete Conversion is complete

The new calibration can then be opened immediately, or original calibration that you were converting from can be left open.

Template Conversion

Conversion templates allow you to easily convert between two ECUs. When creating a conversion template you will be able to select options, tables, and maps from the old ECU and assign these values to new parameters in the new ECU.

It is possible to create a conversion template from within GWv4, this is done via selecting Build Conversion Template..., upon which the following window will be displayed.

Convert Calibration Template Convert Calibration Template

From here you can either choose to load an existing template, or to create a new template. To start creating a new template, simply add a From and To ECU definition.

Once the From and To ECU definitions have been selected, you will see that there are two corresponding lists from each ECU. By default these will show Options first, but you can simply select Tables or Maps. Here you can select to assign completely new values, or you can select to assign one of the old items to one of the new items.

A description for the conversion template also needs to be entered, and then the template can be saved.

Convert Calibration Template Filled Convert Calibration Template Filled

The conversion template will then appear in the templates section of the standard calibration conversion window when you select a source ECU that is the same as the template source.

Live Trim Control

Overview

The Live Trim Control gives easy access to modifier channels.  To display is, select Live Trim ControlCtrl-T from the main menu.

Modifier channels globally adjust the output value of a map but not permanently.

This allows you to find an appropriate value before changing the base map.

For example, Fuel Mod will adjust the value obtained from the Fuel map.  Once you find an appropriate fuelling value, you can program the map at the current site.

Live Trim Control View Live Trim Control View

You can adjust the modifier by using the knob (drag up or down with the mouse).  Or you can use the arrow buttons. The double arrow buttons make a large increment or decrement to the modifier.

To program the modifier into the map, click the ‘Program’ button.  This will apply the modifier and reset the modifier channel to zero.

Warning

The modifier channels are not saved with the map.  If you close the calibration, the modifier channels will be reset to zero.

Note

The Live Trim Control feature was formally known as the Virtual Pot Box.

Linking to an external controller device or the mouse wheel

See also:Potbox Configuration

The modifier channels displayed by th Live Trim Control can be linked to either a GEMS USB ‘Pot-Box’ controller, a MIDI controller or to the mouse wheel.

To set up such a link, press the ‘Link…’ button.

To link to a USB controller, select ‘Link to USB Pot Box’. This will then display the ’link to controller’ dialog

This can alternatively be done by right clicking on the large dial in the Live Trim Control window and selecting ‘link to controller’ from the menu.

Press one of the encoder dials on the Pot Box to set up the link.

To link to the mouse wheel, select ‘Link to Mouse Wheel’.

This will take over control of the mouse wheel until the Live Trim Control window is closed or if the currently open calibration is closed.

Once linked, you can unlink from the mouse wheel by pressing the link button again, which should now be labeled ‘Unlink’.

Scrolling the mouse wheel will adjust the modifier. Pressing the wheel will program the current map site with the modification.

The software also supports MIDI controllers. Specifically the “Behringer X-TOUCH Mini” has custom integration and works well with the software in either Normal or MC modes.

If the mouse wheel doesn’t appear to work

This can sometimes occur if your mouse driver converts wheel events to window scrolling events. In such cases, this can usually be fixed by altering the mouse configuration from the Windows control panel.

From the windows start menu, select ‘Control Panel’.

Double click on ‘Mouse’.

For Microsoft intellipoint mice, you should have a ‘Wheel’ tab. You can either select ‘Use Microsoft Office 97 Scrolling Emulation Only’ or if you want universal scrolling then click ‘Exceptions…’ and add GWv4 to the list.  

The program path should be something like: C:\Program Files\GEMS\GWv4\GWv4.exe

If your mouse configuration differs, there is likely to be information available on the internet to set this up.

Potbox Configuration

Configure Potbox Configure Potbox

The PotBox configuration dialog is available from the ‘Configure’ menu.

Plug your PotBox into a USB port on the PC. The device should be installed automatically by Windows and does not require any special drivers.

If the device has been correctly detected by the system, you should be able to select it by it’s serial number in the “Serial #” box at the top of the dialog. Once selected, the dials correspond to that PotBox. It is possible to have more than one PotBox attached to your computer at once, should you require more extensive control. Each box can be configured independently.

Configuring one of the rotary encoders

To configure a rotary encoder on the PotBox, ensure that the device is selected and rotate/press the encoder. The corresponding dial should be highlighted on the user interface. To link the encoder to a specific modifier or option, click on the ‘’ button below the dial and select the object that you wish to control.

The configuration for all devices is stored in the current tabs layout file and is remembered between sessions for specific ECU types.

Scaling

The scale at which the PotBox modifies a value may be configured using the ‘Scale’ and ‘Bipolar’ options.

Scale’ is multiplied by the number of detents that the rotary encoder was moved when adjusting the target object.

Bipolar’ indicates that the multiplication of ‘Scale’ should take the zero position of the target value into account. i.e. it means that the mid-point of the dial corresponds to zero on the target value.

Link to Controller

The link to controller box makes it possible to link an object such as an option or a modifier channel to either a USB PotBox or a MIDI controller.

Most dials in GWv4 can be linked to a controller my right clicking and selecting ‘Link to Controller’. This includes options in Option Selection Lists and the modifiers on Virtual PotBox windows.

See also:Potbox Configuration

The simplest way to use this with a USB PotBox is to simply press the rotary encoder like a button on the PotBox that you want to use for the linkage and it will be automatically set up.

You can manually set up the various options and may wish to modify the mapping to give a coarser / inverted adjustment by changing the multiplier.

Scale’ is multiplied by the number of detents that the rotary encoder was moved when adjusting the target object.

Bipolar’ indicates that the multiplication of ‘scale’ should take the zero position of the target value into account i.e. it means that the mid-point of the dial corresponds to zero on the target value.

Calibration Aspects

Calibration Aspects are a way of loading/saving only a portion of a calibration file.

Aspects can be used to store specific aspects of an ECU setup.

For example you might want to save a number of different aspect files that only have the Lambda table and the Lambda In X2 options in them.  The resulting files can then be used to quickly reconfigure the ECU based upon a change of lambda sensor.

This is open-ended and can be used to load or save any combination of options, tables and maps.

Aspects can be created from the current calibration by selecting Save Calibration Aspect...

To open a calibration aspect, select Open Calibration Aspect...

Save Calibration Aspect

Save Calibration Aspect Save Calibration Aspect

Select items that you wish to store in your aspect file in the left hand list and move them to the right hand list.

You can do this using a number of methods:

  • Double click on an item.
  • Select items and then drag them across.
  • Select items and click on the single arrow button.

All items can be moved across using the double arrow button.

To switch between tables, options or maps, click on the appropriate tab at the top of the window.

Once you have selected the items that you want in your aspect file, click on the ‘Save’ button and select a filename for the aspect file.

Load Aspect As Template

You can use a previously created aspect file as a template for generating a new aspect file.  This will select all of the same items that were selected in the original file but will use the values that are in the current calibration.

Load Calibration Aspect

This will load the values in a calibration aspect into the current calibration.  

Once you have selected the aspect file, you will be offered the opportunity to review the items that will be changed:

Save Calibration Aspect Save Calibration Aspect

If you do not want some of the values to be loaded in, then simply un-tick the items you do not want included

Usually this is unnecessary and you’ll just need to click ‘Apply’.

Calibration Notes

The Calibration Notes window is a simple text editor for allowing notes to be saved in the calibration its self. This might be useful when particular changes have been made to the calibration which might need explaining at a later date. To view the Calibration Notes window go to Calibration NotesCtrl-N.

Calibration Notes Calibration Notes

Calibration Checker

To view the Calibration Checker go to Calibration Checker

The Calibration Checker compares all values in the current calibration against limits set by the ECU. If a value is changed to be outside these limits, it will be highlighted in the Calibration Checker window:

Calibration Checker Calibration Checker

The Calibration Checker has the following properties which can be accessed through the context menu (right clicking on the Calibration Checker):

  • Hide Valid Names - If yes, this will only show values which have invalid values set. If set to no it will show all values in the current calibration.
  • Popup Invalid - If yes and when the Calibration Checker is hidden, then the Calibration Check will expand to show the invalid values.

Data Logging

Overview

Data-logging is the act of saving recorded data so it can be viewed and analysed at a later time. GWv4 gives you control of two forms of data-logging: ECU internal logging - the data is recorded and stored in the ECU then can be downloaded by GWv4 or a data-analysis package and; PC Logging - data is logged by GWv4 and stored on the hard disk of the computer. Data-logging can record any channel which is available in the current ECU.

Note

ECU Internal Logging is only available where the feature is available on the ECU that is being used with GWv4.

Subsections of Data Logging

PC Logging

PC Logging is data-logging that is done by the PC. Data is recorded by GWv4 and stored to the hard disk. The recorded data-log can then be either played back by GWv4 (see Log Playback) or can be loaded and analysed by GEMS data-analysis software. PC logging can log any of the channels in available in the current product.

To access PC Logging select Configure PC Logging.

A new tab dedicated to PC logging will then be opened, as show in the following picture. Only one PC Logging tab can be opened at a time.

PC Logging Tab PC Logging Tab

Log Folder

The log folder is where the data for the log will be recorded to while the logging is taking place. The actual viewable log file can be saved else where after the log is complete. Make sure there is plenty of free space available. How much space is left is displayed below the log folder. To change the path of the log folder click the ‘’ button to the right of the log folder and select a folder. The folder can also be changed in the Preferences section in the menu Preferences...Alt-F7 and selecting the folders section.

File Name Format

This is the format of the name that will be given to the log file when logging has been completed.

Log Control

To start logging, click the ‘Start’ button, to stop, click the ‘Stop’ button. At any point whilst logging you can add a manual marker in the log by clicking the ‘Add Marker’ button. In the log this will appear as a manual/hand marker.

Channels to be logged

This section contains the channels that are to be logged by the PC Logging. To add a channel click in an empty cell, then either start typing and a list will appear of close matches to what has been type, or click the ‘’ button to the right of the cell and a box will appear with all available channels. To add another channel repeat the process until you have everything showing that you want to log.

If you have a Channel List and you want to log all the channels in that list, then right click on the list and select ‘Add to PC logging’. All channels in that list will now be added to the list of channels to log.

If you want to log all the channels on a tab, right click on the tab name or some blank space on the tab, then click ‘Add all Channels to PC Logging’. This will add all channels on the tab to PC logging, regardless of how they are displayed (Channel List, Tacho, Bar Gauge etc).

Rate is the rate at which the data is read from the ECU where 0 is the fastest and 7 is the slowest. This can be altered by selecting the row of the channel you want to change and editing Update Rate in the Properties Window.

Log Playback

Log Playback allows the playback of data-logs downloaded from either an ECU, a data-logger or PC Logging with GWv4.

The data is visualized using a configurable graph and can be played back as if online to an ECU.

To access the Log Playback window, from the main menu select Log Playback. This will display the following window, if the log playback feature has been used before then there may already be a log loaded with some logging flags etc visible:

Log Playback Window Log Playback Window

To load a data-log, click the ‘Select Log…’ button in the strip of controls at the top of the window. Use the file browser to locate a data-log and click ‘Open’.

Once opened, some channels may be displayed, or the log will appear empty. See {{ < topic “Setting up the Graph Lanes and Channels” > }} to add channels.

Channels in Log Playback Window Channels in Log Playback Window

Playing and Stopping the Log

The log transport buttons in the top left of the playback window control the playing/stopping of the log:

Reset Playback This will set the log playback back to the begging of the log. If the log is currently playing, it will continue playing from the beginning. Default keyboard shortcut: Shift+F9

Playback Button Starts the log playing. Default keyboard shortcut: F9

Stop Playback Stops the log playing. Default keyboard shortcut: F9

Loop Playback When on, the log will loop back to the beginning when it has reach the end.

Setting the current position

Simply click on the position on the graph you want to play from. A black line will indicate the current position. This can be done during playback.

Setting the Current Position Setting the Current Position

Setting up the Graph Lanes and Channels

When you first load in the log, all data from the log will be displayed. You may want to show or hide some channels and also change their colour. To do this right click on the Log Playback graph and select ‘Configure…’. The following window will then be shown:

Log Playback Configure Window Log Playback Configure Window
  • Add Lane - This will add a new lane which in itself can contain many channels. Lanes appear separately in the graph and can be resized individually.
Log Playback Multiple Lanes Log Playback Multiple Lanes
  • Add Channel - Will add a new channel to the currently selected lane. A list of the available channels in the current data will be shown to select from and a selector for the colour you want the new channel to have.
  • Remove - Will remove the currently selected channel or lane. A lane can not be removed if it has any channels in it.
  • Move Up/Down - Moves the selected channel or lane up or down in the list. This will affect in what order they appear in the graph.
  • Minimum/Maximum - Sets the minimum and maximum range for the channel.
  • Colour - Sets the colour for the channel. Click on the colour for the channel, then click the ‘’ button to change the colour.

Zooming In/Out of the Graph

This can be done in two ways:

  • Click and hold the timeline at the top of the graph, then move the mouse up or down, down to zoom in and up to zoom out.
Zoom using the mouse Zoom using the mouse
  • Use the scroll bar - click and drag on an end of the scroll bar. Making the scroll bar smaller will zoom in, making it larger will zoom out.
Zoom using the scroll bar Zoom using the scroll bar

The same can also be done to the amplitude of the graph by adjusting the vertical scroll bar on the right hand side of the graph.

Linking Channels to Channels

Linking the channels in the data-log to channels currently displayed in GWv4 allows the data to be displayed as channel objects such as a Tacho, Bar Gauge or Channel List.

Right click on the graph and select ‘Configure…’ then select the ‘Channel Mappings’ tab:

Log Playback Channel Mappings Log Playback Channel Mappings

To link a channel, simply click the ‘’ in the Linked Channel column for the channel you want to map and select from the currently available channels. The linked channel will then be displayed:

Log Playback Linked Channel Log Playback Linked Channel
  • Multiplier/Offset - Will multiply the raw value by the multiplier value and add or subtract the offset. Useful for converting units, for example: If road speed was recorded in Kph and you want to playback in Mph, then setting the multiplier to 0.62 would achieve this.
  • Set Defaults - This will automatically attempt to mach the channels from those currently available. This can be a quick way to link multiple channels. If the data-log was not made by the current ECU version, then names may differ and some channels will not auto-match.
  • Clear - Clears all the currently linked channels.
  • Load/Save - Allows you to load and save the currently linked channels.

Configure View Options

The Options tab allows you to customise the Log Playback view:

Log Playback View Options Log Playback View Options

ECU Internal Logging

ECU internal logging allows you to set up the data-logging settings for the current ECU.

Note

This feature will not be accessible if the current ECU type does not have the internal logging feature.

To open the ECU Internal Logging setup, from the main menu select ECU Internal Logging Setup... The following window will be displayed:

ECU Logging Setup ECU Logging Setup

The example above is for ECU’s that can record 7 channels at a fast data-rate and 8 channels at a slow data-rate. These rates are displayed at the bottom of the window, along with Run Time which display how much logging time you will have with the current settings. To alter these rates, click up or down on the Change Rate control. This changes both the fast and slow channels to a new rate.

To setup the channels, select one of the channels you want to change and click the ‘’ button. A list of the available channels will be display from which can select.

Options

Log Rate - The speed at which data-logging is recorded. A higher value = slower data-log.

Log Always - If ON the ECU will always log when it is powered on.

Log Switch - If ON this will use the Switch set by Log Switch Input to start and stop logging.

Log Switch Input - Switch number to use for triggering internal logging. To invert the switch set Log Switch Input to the negative of the Switch number. There are up to 127 switches, typically with 6 derived from analog input soft comparators. Some switches are associated with input pins on ECU, others decoded from bits received from messages on CANbus. Refer to the ECU manual for specific details for your ECU.

Log Anti-Lag - If ON the ECU will data-log when Anti-lag is on. Not all ECU’s have this feature.

Conditions

This are requirements that have to be met for the ECU to start logging.

Erase Log

This will erase the data in the ECU. If the ECU is currently logging it will continue to log after the erase.

Note

This action can not take place while the engine is running. The ECU will wait until the engine has stopped then perform the erase action.

Validate List

This will check that all the current settings for internal logging are correct and valid for the ECU.

Reading the Log

To read the internal log from a connected ECU, from the main menu select Read Internal Log... this will cause the following window to be displayed:

Read ECU Log Read ECU Log

You can either retain the log after download or you can erase the log after download.

Assuming that ‘Log Always’ is ON, then if the log is retained, the log will just keep running as if you had not downloaded the log. If the log is erased, then the ECU will start a new log when the current one has been downloaded.

EM80-M Internal Logging

ECU internal logging allows you to set up the data-logging settings for the current ECU.

Note

This feature will not be accessible if the current ECU type does not have the internal logging feature.

To open the ECU Internal Logging setup, from the main menu select ECU Internal Logging Setup... If an EM80-M is connected then the following window will be displayed:

ECU Logging Setup EM80_M ECU Logging Setup EM80_M
On the left the following logging rates can be selected:

  • 1 kHz
  • 500 Hz
  • 250 Hz
  • 200 Hz
  • 125 Hz
  • 100 Hz
  • 50 Hz
  • 40 Hz
  • 20 Hz
  • 10 Hz
  • 8 Hz
  • 5 Hz
  • 4 Hz
  • 2 Hz
  • 1 Hz

This can be done for each individual channel that you wish to log. This can help to save space in the log, as the higher the rate of logging, the faster the log will fill up. This can also be helpful if the channel being logged does not change that often.

To setup the channels, select one of the Empty channels you want to fill and start typing in a channel name. GWv4 will start to predict matching channels in the current ECU, when you see the one you want simply select it. It is also possible to bring up an entire Channel List, this is done by clicking in the text box, and selecting the ‘’ icon that appears in the right of the text box.

Options

Log Always - If ON the ECU will always log when it is powered on.

Loop Logging - If ON the ECU will start to overwrite the beginning of the log with new data when the log memory is full.

Erase Log

This will erase the data in the ECU. If the ECU is currently logging it will continue to log after the erase.

Note

This action can not take place while the engine is running. The ECU will wait until the engine has stopped then perform the erase action.

Validate List

This will check that all the current settings for internal logging are correct and valid for the ECU.

Reading the Log

To read the internal log from a connected ECU, from the main menu select Read Internal Log... this will cause the following window to be displayed:

Read ECU Log Read ECU Log

You can either retain the log after download or you can erase the log after download.

Assuming that Log Always is ON, then if the log is retained, the log will just keep running as if you had not downloaded the log. If the log is erased, then the ECU will start a new log when the current one has been downloaded.

Subsections of Using GWv4

Frequently Asked Questions

Why can’t I select other units in the units configuration?

The current unit does not have any other related units that it can convert to. Check that the base unit has been quantified. For more information see Unit configuration.

Is there an easy way to adjust a map to a target?

Yes, please see PC based auto mappingfor more information.

PC based auto mapping

Auto mapping is a useful feature that can adjust base map values in real time to match a target map as closely as possible. This feature can only be used when online and can be enabled in the Log Map Controller Add Log Map Controller.... Here, controls for the auto mapping algorithm can be set as described in Log Map Controller.

An example auto mapping procedure for Lambda tuning

Let’s go through an example auto mapping procedure on a Lambda Log Map. Before starting, we must make sure that the calibration:

  • Has a base map to adjust.
  • Has a target map set by you that the algorithm will try to match.
  • Has an active Lambda feedback in operation so that Lambda updates from changes made to the base map.
  • Does not have any other processes that can adjust the base map switched on; we just want the auto mapping algorithm in control.

To achieve this we will use the base map of engine load vs engine speed and create a simple target map of lambda set to 1 over the whole map for a simple example (in reality we’d want a richer mixture at lower engine loads and speeds, and leaner at higher). It is better to be conservative and start with a richer target map to avoid overheating the engine. Some GEMS ECUs support closed loop Lambda feedback which have built-in auto mapping. So switch this off if applicable so that GWv4 is the only system changing values through the auto mapping algorithm.

Switch all of the Fuel Lambda options to OFF. Alternatively, set the options Lambda FB Speed Min and Lambda FB Speed Max to 0.

Switching off closed loop Lambda feedback Switching off closed loop Lambda feedback

The base map The base map
The target map The target map

Adjusting auto mapping parameters

Now we need to adjust the auto mapping parameters in the Log Map controller. The typical accuracy of a wideband oxygen sensor is around 0.01 at Lambda 1 so we’ll set this as the Target Accuracy parameter in the Targeting panel. This value is optimistic as there are several other sources of uncertainty. Once you have enough data to make a good uncertainty estimate, update the target accuracy to this value for more confidence in the results. To average out the noise of the Lambda reading, we’ll set the Weight Before Change value to 5, so that the cell will only be changed after 5 milliseconds at this location.

In the Modifications panel, we’ll select a percentage change to modify the base map by. If using this mode, you can only perform auto mapping on non-zero base map cells. Generally we want the Multiplier to be negative to increase stability. Start with a low value and increase later if the steps in the changes are not large enough. We don’t need to add an Offset so leave as zero.

We’ll set sensible maximum changes of 20% in the Maximum Changes panel. Remember that these are changes from the original cell value.

Lastly, start auto mapping by clicking the button.

Log Map Controller setup Log Map Controller setup

Auto mapping a cell

After setting up the Log Map Controller, we can add a Log Map Grid via Add Log Map Grid... or a Log Map Graph via Add Log Map Graph.... The grid/graph will be empty until auto mapping starts.To start, select a cell and click the Start Auto Mapping button on the Log Map Controller. You can now run the engine on a plan to target the desired cells you wish to auto map. It can also be useful to add the Lambda Error (or Ox Error depending on your ECU) channel to a Channel List to see how the auto mapping procedure is progressing. This channel should tend towards zero as the cell’s target value is approached.

Useful channels to keep an eye on Useful channels to keep an eye on
Lambda Log Map during auto mapping Lambda Log Map during auto mapping
The base Fuel Map being adjusted during auto mapping The base Fuel Map being adjusted during auto mapping

Once mapping is complete, don’t forget to switch back on the other processes that adjust the base map.

Troubleshooting tips

Auto mapping may not work for the following reasons:

  • There is some lag between adjusting the Fuel Map and observing a change in lambda. If the Fuel Map is updated too aggressively then you could start oscillating and under extreme settings, the oscillations could be unstable.
  • The Fuel Map needs sensible values in it as a rough starting point. If the auto mapping is adjusting by percentage then values of 0 in the Fuel Map will never change.
  • If you have to pump the pedal on startup, you will be interpolating between the base map and acceleration maps which will change the mixture and feed an incorrect Lambda reading into auto mapping algorithm. Instead, the initial crank pulse should be increased so that pump the pedal is not required.
  • The target Lambda map may be too difficult to reach due to uncontrollable changes in atmospheric conditions and fuel age.

Unit configuration

When configuring units, there may be times where you are unable to select other existing scaled units. This is because there are no available conversions, so you need to select a different base unit.

An example of this issue is the Air-to-fuel Ratio (AFR/Lambda). For some ECUs, Lambda readings are specified in the unitless quantity ‘AFR’. This has no real meaning or relationship to other AFR units, so the base unit needs to be changed to one that is quantified and convertible. To resolve this, select the base unit that matches the current fuel type.

Some of GEMS ECUs provide a user Enumeration/Option List ‘AFR Base Units’ that allows the base units to be recorded in the ECU calibration memory. If this is unavailable, you can create your own using dynamic chained units in user scalars.

Firstly, create your required User Scalars:

[USERSCALAR,AFR Custom,AFR,...] // for exotic fuels
[USERSCALAR,AFR Methanol,afr:AFR Gasoline,...]
[USERSCALAR,AFR Gasoline,afr:AFR Methanol,...]
[USERSCALAR,AFR Diesel,afr:AFR Diesel,...]
// etc

Then create an Enumeration/Option List with these User Scalars:

[ENUM=AfrUnitList,0,AFR Custom,1,AFR Methanol,2,AFR Gasoline,3,AFR Diesel, ...etc]

Then create the Option for the Enumeration:

[AFR Units,,ol(AfrUnitList),...]

Finally, create a new definition for AFR Units using the Option:

[USERSCALAR,AFR Units,O[AFR Units],...]

You will now be able to select the appropriate User Scalar from the AFR Units Option.

Otherwise, the base unit choice must be stored externally to the ECU and GWv4 will not remember your choice. There are a few ways to accomplish this:

  • Reload the same calibration file every time you connect the ECU.

  • Override the base unit to a particular choice for any or all of the following: ECU types, versions, current project, calibration files on your PC. However, this may only be desirable if you are only ever working with a single fuel type.

Select Units / Scaling..., scroll down to the desired unit name and click ‘’ on the right hand side next to the current unit.

Configure Units Override Configure Units Override

  • Save units whilst in the Configure Units / Scaling window and reload then when needed.

  • Change the default AFR units to be afr:LA and calibrate the reading to read 1.0 at the stoichiometric ratio. You can then select AFR for different fuel types from that. However, any other calibrations would also need recalibrating because their AFR offset and AFR scalar will be wrong.

Subsections of Workspace

Docking

Some views are docked to the edges of the Workspace area and will be shown regardless of which tab is selected.

Docked views can be moved and re-docked via drag & drop. Just press and hold the left mouse button on the title bar of a docked view and drop it onto one of the dock targets that are shown during the drag & drop operation.

Views that are docked to the workspace are available from the following menu commands:

Subsections of Docking

View Explorer

The View Explorer window is a tree view list of all maps, tables, options and channel that are in the current ECU type. The View Selector allows you to select any of these view objects and add them to a tab in your workspace.

View Explorer View Explorer

The View Selector is made up of a number main folders. These are: Categorised, Profiles, All, and User. These folders all contain the maps, tables channels etc for the current ECU, but group them in different ways.

  • Categorised: Groups objects by their category i.e. Fuel, ignition, etc.
  • Profiles: Groups objects by the profile they are in (not available in all products). Profiles are used to distinguish common objects from those that are advanced or for security.
  • All: Displays all objects, grouped by their type i.e. Maps, tables, options etc.
  • User: By dragging and dropping objects from other folders the user can create their own structure for storing objects.

Adding an object to the workspace

Adding an object to the workspace using the views selector can be done either by dragging the object into the workspace or by right clicking the object and selecting display. For certain objects there are more than one option as the object can be displayed in more than one way. For example: right clicking on a map will give you the option to display as either a graph or grid.

Splitting the View Explorer

The View Explorer may be vertically split by using the views_split_button View Split icon button:

View Explorer Split View Explorer Split

This splits the view so that the children of the item selected in the top tree are displayed in the bottom panel. This can make navigating the views tree easier if you expand items with a large number of children.

Properties Window

The Properties window displays a list of options and settings for the currently selected object in the workspace. By default it is displayed at the bottom right of the screen but if removed can be re-displayed by selecting it from the menu PropertiesAlt-Enter

Properties Window Properties Window

Changing properties

The properties window will always display the properties for the last selected object in the workspace. So start by selecting the object in the workspace you want to change. This will fill the properties window with the options for that object. Then simply click on the setting you want to change and type a new value.

Property Description

The property description makes up the bottom part of the properties window. It displays a brief description of the currently selected property. In the picture above a description of the Multiplier property is shown. The description section can also be re-sized by clicking and dragging the line at the top description area.

ECU Status Window

The ECU status window displays the current status of a connected ECU and any messages the occur during the connection process. This could be anything to conformation of a calibration upload to security checks.

ECU Status Window ECU Status Window

By default the ECU status window is displayed at the bottom of the screen, but can be accessed again if removed from the menu ECU Status.

The status window may be suppressed from displaying automatically when connecting by setting the ‘Suppress ECU status popup’ property in the general settings (Preferences...Alt-F7 > General) .

Explanation of some messages

  • Parity error - Is caused by the slight errors in the data received. May occur when ECU is switched off. If some are appearing but the ECU is still connected, it suggests that there is some noise on the communications cable. Either try another cable or move cable away from other electrical equipment. If multiple Parity Errors are being shown and the ECU is not connected, this suggests you connection settings are incorrect.
  • Framing error - Similar to Parity error.
  • Error: Rx Timeout - PC has stopped receiving communications from the ECU. Can occur if the ECU is switched off whilst connected.
  • ECU is not securable - The connected ECU does not have the ability to enable a password on the uploaded calibration.

Comms Monitor

The Comms Monitor Window displays the raw data of the communications between GWv4 and the connected ECU.

Requests from the PC are displayed in blue text and prefaced by a “TX”. Responses from the ECU are displayed in green, and are prefaced by a “RX”.

Note

The colours specified her are the default colours, but these can be changed by changing the Colour Scheme (Light/Dark Mode)

This can be useful to diagnose some communications problems. The Comms Monitor window is available from the menu: Comms Monitor.

Comms Monitor Comms Monitor

Descriptions

Overview

The descriptions view displays extra details about ECU Objects selected in the GWv4 user interface.

The view may be shown using the action DescriptionsCtrl-D.

Descriptions View Descriptions View

Tabs

GWv4 has a ’tabbed’ workspace for placing multiple objects to view and adjust information from the connected unit. Users maybe familiar with this system from other software. Tabs are a way of grouping related view objects into multiple pages that can be switched between. Tabs are displayed at the top of the workspace.

Moving between tabs

  • Method 1: Simply clicking with the left mouse button on the tab you want to see.
  • Method 2: Click the Tabs Drop Down button to the right of the tabs. This displays a list of the current tabs from which you can select.
  • Method 3: Hold down the Ctrl key and press a number on the keyboard that corresponds to the tab you want to view. Notice as in the picture above the first 10 tabs are numbered 1 through to 0.
  • Method 4: Hold down the Ctrl key and tap the Tab while keeping the Ctrl pressed down. This will bring up the tab navigator. Keep the Ctrl button pressed and use the mouse or arrow keys to select tabs and the items within each tab.  The selected view will be displayed when the Ctrl key is released.

Create New Tab

To create a new tab, either select ‘New Tab’ from the Layout menu, or right click on the workspace (which also brings up the layout menu). You will then be asked for a name for the new tab, type the name, click ‘OK’ and the new tab will be created. To rename a tab at any point, just right click on the tab and select ‘Rename Tab’.

Remove Tab

To remove a tab, either; with the tab you want to delete selected click the cross in the top right of the tabs area, or right click on the tab and select ‘Delete Tab’

Re-Order Tabs

The order in which the tabs are displayed can be changed. This can be done by dragging a tab to a new position with the mouse.  Press and hold the left mouse button on the tab you want to move.

Saving tabs

To save the current tab as a single tab, select the tab you want to save and from the Layout menu select ‘Save Current Tab’. Type in a name for the saved tab and click ‘OK’. To save all the tabs currently in use, from the Layout menu select ‘Save Tabs’, enter a name and click ‘OK’. This will save all the current tabs as a single file.

Loading tabs

To load a tab or group of tabs, from the Layout menu select ‘Load Tabs ‘. As file open dialog box will be opened, and you can select some of your previously saved tabs.

Factory Tabs Factory Tabs

There are also some factory tabs provided by GEMS, these can be found by selecting the Factory/Cached Tabs tab at the top left of the file open dialog box. In the Factory/Cached Tabs section you can also view the last tabs used by all ECUs or just the currently attached ECU.

  • Factory Tabs - These are tab files that are made by GEMS and are installed in GWv4.
  • Last Viewed: All ECU Types - Will show the last viewed tab layout you were looking at for all ECU types.
  • Last Viewed: < Current ECU > - This will display the last viewed tab layouts for all versions of the current ECU type.

By default the loaded tabs will replace all the current tabs open. To disable this and load the selected tabs alongside those already open, uncheck the ‘Close Existing Tabs’ in the bottom right.

Reset Tabs

To reset all tabs to a single blank tab, from the Layout menu, select ‘Reset Tabs’.

GWv3 Templates

Templates from GWv3 can be converted into GWv4 tab files. To do this select Import GWv3 Templates... and select the file you want to load. This template will be loaded as a single tab which then can be saved as detailed above.

Configure Shortcut Keys

In GWv4 there are many keyboard shortcuts which can quickly give you access to various options or actions. Keyboard shortcuts can be configured by the user, except for the following which can not be changed.

Fixed Key Commands

  • Esc - Clear Selection.
  • F1 - Opens the GWv4 manual.
  • Ctrl + S - Save calibration.
  • Ctrl + Z - Undo.
  • Ctrl + X - Cut.
  • Ctrl + C - Copy.
  • Ctrl + V - Paste.

Useful Shortcuts to know

  • [ ] - The left and right square brackets are used to increase and decrease the value of the current site(s) of a table or map. Holding down the Shift key whilst using these keys will increase or decrease by a larger amount. They can also be used for increasing/decreasing the value in an option list. These keys were chosen because whilst + and - will work on some views, the program cannot tell if you actually wanted to type in a negative number.
  • Shift + F10 - Brings up the context menu, same as right clicking on an object.
  • Ctrl + Tab - Displays the Ctrl+Tab navigator allow quick access to all objects on all tabs.
  • Alt + Enter - Opens the properties window for the current object.
  • Page Up / Page Down - These can be used to navigate up and down lists such as, options, channels and the properties window.
  • Space When online, pressing the Space bar will select the site nearest to the current cursor site in map/table grids.

A full list of keyboard shortcuts can be found here: Shortcut Keys

The user can set up or change the remaining keyboard shortcuts. This allows actions that might be used regularly to be assign to a keyboard key or combination of keys. To bring up the shortcut edit from the menu select Keyboard Shortcuts....

Configure Keyboard Shortcuts Configure Keyboard Shortcuts

Set a new shortcut

Locate the action or menu you would like to set a keyboard shortcut to using the category and Action columns. Make sure the action is selected then click the ‘Setup’ button and simulate the key press you want to use. Once you have clicked OK all your changes will have been implemented.

Schemes

If you want to setup a keyboard set for different scenarios i.e. in-car and workshop, then you can use the action shortcut schemes to setup different sets of keyboard shortcuts for these different scenarios. Click the ‘Configure Schemes’ button. Click ‘Add’, enter a name for the scheme, then click ‘OK’. You can now select this scheme from the Scheme drop down list and edit its keyboard shortcuts.

Colour Scheme (Light/Dark Mode)

Changing the Colour Scheme

Almost all the colours used in GWv4 can be changed to suit. From the main menu select Preferences...Alt-F7, select the Colours section. This displays list on all the colours used at present.

Colour Setup Colour Setup

You load or save your colour selection to a scheme. To load a scheme select one of those installed from the drop-down list at the bottom of the colours section.

To save your current colour settings to an item in this list click the ‘+’ next to the list. To remove an item from the list, select the item, then click the ‘-’ button.

Swapping Between Light and Dark Mode

GWv4 has a light and a dark mode, this is similar to the colour schemes, and each mode does infact have its own colour scheme. Swapping between light and dark mode is just a quick w2ay to change this. To toggle Light/Dark mode simply select Toggle Dark Theme, this will require a restart of GWv4 for the effects to take place.

Setting Default Folders

Sets the default access/storing folders for everything GWv4 will use i.e. Calibrations, tabs, firmware etc. This can be accessed by selecting Preferences...Alt-F7 and then selecting the folders tab.

Default Folders View Default Folders View

To change the location of a folder click the folder path you want to change then click the ‘’ button (as above) to select a new folder.

Note

GWv4 manages GIN files for you. The ECU Definition folder listed above is where GWv4 will next look to find a new GIN file to install. GIN files are copied to a special application managed location when installed. Advanced users can override this setting by changing the general preference ‘Install ECU Definitions with Absolute Paths’.

Units

The Units/Scaling Configurator allows you to change the Units that the values of the ECU are displayed in, for example displaying temperature in degrees Fahrenheit instead of Centigrade.

To display the Units/Scaling Configurator from the main menu select Units / Scaling.... The following window will then be displayed:

Units Units

This window displays a list of all units in the current ECU that are configurable. This may vary between ECUs.

If unit conversions for the given unit can be found, then the drop down box should contain alternative display units.

Click ‘OK’ to apply the changes to the current session. These changes will be remembered by GWv4 for this ECU and version type, so the next time the current ECU type is used the Units settings will be restored.

Loading and Saving settings

The current Unit configuration can be saved and loaded. This can be useful for importing settings between ECUs and versions, or having different setups for working in different countries.

To save the current Unit settings, click ‘Save’, type a name for the settings and click ‘OK’. To load in a saved setting file, click ‘Load’ and select the units settings file you want to load in and click ‘OK’.

Advanced Setup

To make more advanced changes to units click on the ‘’ button of a selected unit. This will sometimes be necessary if you have calibrated a channel using scalar and offset options, or a suitable unit conversion cannot be found, see Unit configuration for more details.

Units Advanced Menu Units Advanced Menu

Rescaling of values to display them in different units requires that a base unit can be identified.  From this base unit, other units can then be derived for display in GWv4.

In some cases, the unit defined in the GIN (ECU definition) file of older ECU’s is not recognized by the application.  In such cases, you can manually set up the intended base unit by selecting it for a specific ECU version or for all ECUs of a given type by setting the appropriate Base Unit Override field.

In other cases this is undesired.  Taking MAF Units for the X25 as an example, the value of the “MAF as Load” channel is calibrated using the “MAF Offset” and “MAF Scalar” options in a specific unit.  This unit is specific to the calibration file, so setting the base unit override for the calibration file is more appropriate.

Not that such unit selections are not stored in the ECU, so to get them to show up after connecting to and downloading data from an ECU, select “Open Matching Cal When Connected” in the Connection Settings dialog box.

Calibration base units override ECU version specific base units.

ECU version specific units override ECU type specific units.

The active base units based upon these overrides and on those implicitly detected by the application are displayed in the ‘Active’ box.

The display units are derived from the active base unit.  

User Defined Units

You can define new units by clicking on the ‘New…’ button:

Units New Menu Units New Menu

Fill in the required fields and click ‘Ok’ to create the unit.

The actual unit conversion is set up by entering a multiplier and an offset - currently only simple linear transformations are possible in the form y = mx + c.

The conversion is displayed below as a sanity check that the units are correctly configured.

Currently, new unit quantities are not user definable.

To delete user units, select the unit and click ‘Delete Unit’.

Sizer Based Layouts

Layouts that use sizers can scale better when changing the size of the application window.

Users will have different screen sizes / font sizes / display scaling settings. The set of possibilities has become more diverse in recent times with high pixel density displays (e.g. 4K screens).

Creating Sizer Based Layouts

Drag-select multiple items and select a layout action from the right-click Layout menu. e.g. Layout | Layout Vertically.

If there are no items selected then the layout commands apply to all top-level items on the current page and the layout shall be stretched to fit the whole area.

Editing sizer-based layouts requires the use of the Layout Hierarchy and Properties tool windows.

Use the Layout Hierarchy window to move items into/out of sizers.

Use the Properties window to change the Layout settings (e.g. Preferred Height / Grow Factor).

Style Property Units

Length based ‘Layout’ properties can specify units. These are similar to css e.g., 1dp specifies that a length is 1 ‘density independent pixel’ in size. The actual number of pixels will then depend on the pixel density of the display connected to the computer.

Available Units

Unit Description
px Physical pixels.
dp Density independent pixels. This depends upon the Windows display scaling setting. If display scaling is set to 100% then dp is equivalent to px. However, if display scaling is set to something else such as 150% then 1dp is equivalent to 1.5 physical pixels. Using dp instead of px can make layouts work on a wider range of displays. It may be better to relate view sizes to the selected font size (e.g. ch, em or rem).
ch Character height for current font. 1ch is equivalent to the height of the current font.
em ’emdash’ character width, relative to the font size of the parent element.
rem Root emdash - width of the current font on the root work page.
vw Fraction of the total view width, in percent. 100 being 100% of the view width.
vh Fraction of the total view height in percent. 100 being 100% of the view height.
vmin Fraction of the minimum of the view height / width.
vmax Fraction of the maximum of the view height / width.
% Percentage of parent container size.

Sizing Algorithm

The sizing algorithm is similar to CSS ‘flexbox’.

Some user interface elements define some defaults for preferred sizes / grow factors. For example buttons prefer to be at their ideal height and not grow or shrink in the Y axis.

Views

Overview

View objects are objects which display data or can be used to edit data and settings. This may be to view a map, table, option or channel. For how to add objects see the Adding an Object section.

The following list (excluding “Manipulating view Objects”) are all the object types and what they are used to display.

Subsections of Views

Manipulating View Objects

Manipulating View Objects covers the following:

Adding an Object

There are 3 ways to add an object to a tab:

  • Click the add object icon in the GWv4 toolbar. By default, the icon will look like a map graph ( Map Graph Icon ), but will change to the last added object’s icon once you have added one. Clicking the down arrow will bring up a list of all the available objects to choose from, clicking the icon itself will add the last object added.

A list of available channels/maps/options will appear for the object you have selected. Here is an example list for a Tacho:

Objects Select Channel Objects Select Channel

Select the data you wish to display then click ‘OK’.

  • From the View Explorer click and drag the object you wish to display into the tab area, as shown below:
Map Graph Drag New Map Graph Drag New
  • Right click on a blank area of the tab. This will provide a list of all objects that can be added, as below:
Context Menu Context Menu

Select the object you wish to add then select the data you wish to shown from the pick list as shown in the first option.

Note

You can display many more than one of each object type, in fact there are no limits on how many objects you wish to add!

Inserting Options and Channels

Options and channels may be inserted into existing lists by dropping them on the ‘insert’ docking hint:

Dock Insert for Options and Channels Dock Insert for Options and Channels

Multiple Selection

Multiple items may be selected in the views tree use Shift and click to select ranges and the Ctrl button to toggle items when clicking with the mouse.

To drag the items, press and hold the left mouse button on an area that is highlighted to begin the drag.

If multiple options or channels are selected, then they will be combined into a single list.

Customising Objects

All view objects in GWv4 can be customised in a number of ways:

Renaming

All objects can be renamed. This can be especially useful for renaming a Channel List as to the channels that is has listed, or renaming a notes object to describe the notes it contains. To rename an object simply select the object and then access the context menu.

To access the context menu, simply right click on the object. Alternatively, press the Context Menu key (to the right of Alt-Gr) whilst the view is focused. Some keyboards do not have a context menu key, in which case you can use Shift-F10.

Context Menu Context Menu

Once the context menu is open, simply select the ‘Rename’ option. Type in the new name for the object, and the object will now be renamed.

Locking

Option Full List, Option Selection List and Channel List can be locked so that the items they display can not be accidentally changed. To do this , right click on either a option list or Channel List and select ‘Lock’. Now the current items can not be changed and new items can not be added until the object is unlocked. To unlock a list simply right click and select ‘Unlock’. You will now be able to make changes to the list.

Grouping Objects

Multiple objects can be grouped together in the same object. These objects then appear as tabs in a singular object as shown in the following picture:

Grouped Objects Grouped Objects

This grouped view saves screen space, allows you to quickly swap between several representations of the same data, and lets you add other useful views such as in this example where a note on how to set up a fuel map has been included.

To do this, click and drag an item you wish to group over the top of the other, where a box will appear in the centre of the window. Dragging the item to that box will highlight the other view’s window and releasing the mouse button will group the windows, shown here:

Drag an item over another to combine them into a single view Drag an item over another to combine them into a single view
Release the mouse to combine the views Release the mouse to combine the views

To remove an object from a group, simply click and drag its tab at the bottom of the group away from the group and release, this item will now be separated.

Changing Objects in the Same View

For some views, you can change the object that you are viewing by clicking on the ‘’ button in the caption bar of the view.

This will then offer the option to pick a new object to display in the same view.

Alternatively to cycle between objects if you just want to do a check over all of the maps/tables for a calibration, use the options in the layout menu:

  • Change View to Previous Object - If the selected view supports it, cycle through objects (e.g. maps) in the same window.
  • Change View to Next Object - As for Change View to Previous Object, in the opposite direction.

These have the keyboard shortcuts ‘Ctrl-Shift-PGUP’ and ‘Ctrl-Shift-PGDN’ respectively by default.  These can of course be configured to whatever you like - see Configure Shortcut Keys.

Manipulating the Layout

Windows within tabs may be moved by grabbing their title bar with the left mouse button and dragging.

Selecting windows

To select a window (or multiple windows), drag from an empty space in the tab using the left mouse button.  This should display a blue ‘rubber band’ selection box. Continue dragging the mouse so that the windows that you wish to select intersect with the rubber band box:

Rubber Band Select Rubber Band Select

You can also select windows by holding down the ‘Ctrl’ key and clicking on the title bar of the windows that you wish to select.  This method can also be used to deselect windows.

Moving a selection

The selected windows can be moved by left mouse button-dragging the selection highlight area.

Copying a selection to another tab

Invoking the context menu on the selection (right mouse button or context menu key), will allow you to copy the windows:

Copy Selected Windows Copy Selected Windows

Once copied, select the tab that you want to paste the windows into and invoke the context menu in a blank area of the tab.  Select ‘paste’ from the context menu.

If there are no blank areas, select the layout sub-menu from a child window context menu.

Resizing selected windows

The selected windows may be resized by using the resize handles at the corners of the selection.  Use the left mouse button and drag the handles to resize.

Closing selected windows

The selected windows may be closed by selecting ‘close windows’ from the context menu of the selection highlight.

Audit

The Audit View enables the construction of node-based graphs that show a dynamic visual flow diagram between objects in the ECU (channels, tables, maps etc).

Audit Audit

Audits graphs consist of nodes (the large square boxes in the diagram above). Each node has junctions which are the small circular attachments on the edges of the nodes. Junctions may be connected to other junctions by edges to indicate data flow.

There are multiple types of nodes.

  • Object Node - Displays an ECU based object (e.g. channel, option, table etc).
  • Submodule Node - Contains a diagram of its own (another node graph). Double clicking on a submodule will display its contents when the layout is locked.
  • Jump Module Node - Jumps to a submodule - this is like a shortcut to a submodule that exists somewhere else in the node graph hierarchy.
  • Notes Node - Displays notes to describe the graph in more detail.

At the top of the audit view is the module bar. This has navigation buttons to the left that enable traversing through the history of nodes that have been viewed during the current session. To the right of the navigation buttons, the current node is displayed and its parent graphs. Clicking on one of these will jump to that view. There is additionally a drop down menu for jumping to other locations in the graph tree.

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Bar

The Bar Gauge is used to display a channel value as a bar. For how to add objects see the Adding an Object section.

Bar Gauge Bar Gauge

Changing the channel

Right click on the Bar Gauge and select properties. This will display the properties for the Bar Gauge. Next to the ‘Channel’ property click the ‘’ button and you will be given a list of all the available channels.

Bar Gauge Orientation

The Bar Gauge can be viewed as either vertical or horizontal. To set this bring up the Bar Gauge’s properties, and simply set ‘Orientation’ to either vertical or horizontal:

Displaying the Current Value

It is possible to display the current value as text in the Bar Gauge by going to the properties window, and setting the ‘Display Value’ property to ‘Yes’:

Setting the Range

Bring up the properties for the Bar Gauge. Set the properties ‘Minimum’ and ‘Maximum’ to your desired values for the Bar Gauge range.

Alarm Range

An alarm range can be configured.  Select ‘Limits…’ from the context (right click) menu, or ‘Limits’ from the properties.

If an alarm limit is reached, then the colour of the background will change to the colour selected in your settings.  The default is red:

Bar Alarm Bar Alarm

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Button

The Button View provides a configurable button that may be used to execute scripts when it is clicked, and allows advanced configuration/control templates to be constructed.

Button scripts should define an onClick function that is called when the button is clicked. The default script for a newly added button should contain an empty onClick function ready to be filled in.

Example script:

function onClick()
{
    var pedal = gin.channels.find("Pedal");
    var pedal\_min = gin.options.find("Pedal min");
    pedal\_min.setReal(pedal.getReal());
}

This script takes the value of the “Pedal” channel and assigns it to the “Pedal Min” option as part of a pedal range configuration page.

When accessed via scripts, the button text can be accessed by the ’text’ property:

var b = window.findViewByID("my\_button");
print(b.text);
b.text = "Bingo";

Buttons define the following global variables in their scripts:

'ecu', of type Ecu.

'gin', [deprecated] Alias of def property. See Ecu for details.

'window' of type Window.

'button' of type Button. This a reference to ’this’, for convenience and readability.

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Channel List

The Channel List provides a customisable list of available channels. This is useful to group similar channels or those which are used together. The Channel List works in the same way as the Option Selection List, just for channels not options.  For how to add objects see the Adding an Object section.

When the ECU is offline, the values in the Channel List are greyed out.

Adding Channels

When a Channel List is added you be shown a blank list with a single blank entry:

Blank Channels Blank Channels

To add an channel simply start typing the name of the channel and GWv4 will provide a list of likely options or click the ‘’ button and you will be shown a list of all available channels. Select the channel you want to display and click ‘OK’. This will add the selected channel to the list and provide a new blank entry from which to select another channel:

Single Channel Single Channel

Adding Multiple Channels

From the channel selection list you can add multiple channels. Click on the ‘’ button to bring up the available channels, then either click and drag over the channels, or use mouse click and either Shift or Ctrl keys to select separate items.

Once selected, click ‘OK’ and the items will be added to your selection list:

Selected Channels Selected Channels

Setting up Limits

For each channel displayed you can set up limits. This can either be to set the range of values (view range) displayed by the bar or to set warnings if the value goes above or below certain values (alarm range). Right click on the channel in the list you want to set a limit for and click on limits, alternatively simply use the keyboard shortcut Alt+L and the following window will be displayed:

Channels List Limits Channels List Limits

The view range, and alarm range can then be set for the channel. If set then they will automatically be enabled, though they can be disabled again by simply un-ticking the enable box.

If the channel then goes out of the alarm range, the channel will go red, as can be seen in the Bar section.

Locking the list

The list can be locked by clicking on the padlock icon Channel List Locked Icon in its title bar. This prevents items being added or removed from the list.

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Checkbox

The CheckBox View provides a configurable check box that may be used to execute scripts when it is clicked or changes state, and allows advanced configuration/control templates to be constructed.

CheckBox scripts should define an onClick and/or an onChanged function that is called when the checkbox is clicked or changed state.  The default script for a newly added checkbox should contain an empty implementations of these functions ready to be filled in.

Example script:

function onSetValue(checked)
{
    var edit = window.findViewByID("some_editor"); 
    edit.enabled = checked;
}

This script enables another control with the script ID 'some_editor' when the checkbox changed value either through clicking it or when another script changed its value.

To make the checkbox interact with an option:

// Get a reference to the option of interest.
var barocorr = gin.options.find("Baro Correction");
function onGetValue()
{
    // Get the value of the on/off option.
    return barocorr.getReal();
}

function onSetValue(checked)
{
    // Set the value of the on/off option.
    barocorr.setReal(checked);
}

When accessed via scripts, the checkbox text can be accessed by the 'text' property and its value by the 'checked' property:

var cb = window.findViewByID("my_checkbox");
cb.text = "Bingo";
cb.checked = !cb.checked// Toggle value

Checkboxes define the following global variables in their scripts:

'ecu', of type Ecu.

'gin', [deprecated] Alias of def property. See Ecu for details.

'window' of type Window.

'view' of type CheckBox. This a reference to 'this', for convenience and readability.

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Dial (Pot)

Pot View Pot View

The Pot View provides a mouse-adjustable dial for editing channel and option values.  Additionally it is possible to add scripting to the control in order to provide more complex control of values.

A channel or option may be selected using the box underneath the dial.  If the selected object is a map modifier then the program button will be visible.  Clicking on the button will perform the same action that the virtual pot box program button does by applying the adjustment to the current map site and resetting the channel to zero.

The label, object selector and program button visibility may be overridden by setting the appropriate Properties Window. Additionally the text of the label may be set via the 'Label' property.  If the property is left blank then it will be set to the name of the selected object unless a script is specified.

If a script is specified for the control then the object selector will be disabled since the script is mutually exclusive.  To disable the script, see the 'Enable Script' property.

If the script defines a function called 'onProgramButton' then the program button will be visible and call that script function when clicked.

Scripts may define the following functions:

  • onGetMin(): Allows the minimum value for the pot control to be specified.
  • onGetMax(): Allows the maximum value for the pot control to be specified.
  • onGetValue(): Should return the current value of the pot control.
  • onSetValue(value): Will be called when the value of the pot control has been adjusted by the user or implicitly.
  • onProgramButton(): Will be called if the program button is clicked by the user.

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Group

The Group View allows a number of other views to be contained within another movable view. This allows configuration/control panels to be created.

Groups can either be created by adding a new group and then adding sub-views to it, or by box-selecting some views and selecting ‘Group in sub-panel’ from it’s context menu (right click).

For creating advanced configuration/control panels, the Group View is very useful. From the right click menu, you can select default show/hide states for the sub-window title bars and borders. Typically you’ll want to hide the title and borders if you are trying to create a native looking form.

See Grouping Objects in the Manipulating View Objects section for more grouping details.

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Image

The image object allows you to place an image on your workspace. This maybe useful for display a diagram, some scanned in notes, or a company logo. For how to add objects see the Adding an Object section.

When the Image object has been added you will be asked to select a picture files from your computer. Use the file browser to locate the files you want to show and click ‘Open’. The selected picture will then be displayed:

Image Image

To change the picture, right click on the image and select Load Image.

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Label

The Label View is very similar to the , but is displayed as static text and is not directly editable.

This is useful for developing advanced configuration/control panels.

The label text is processed to replace $[Units Name] with the units of the specified user Units (e.g. '$[Load Units]' might become kPa, and '$[Speed Units]' might become mph, depending on the user units selection).  

If you need to display something beginning with '$[' then start it with a double sigil, '$$'.  Any double sigil will be converted to a single character.

When accessed via scripts, the label text can be accessed by the 'text' property:

var label = window.findViewByID("my_label");
print(label.text);
label.text = "Bingo";

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Log Map

Log Maps monitor and store a pre-defined channel into the map at sites corresponding to those of a base map. For example, a Lambda Log Map would log the lambda channel, based upon the Fuel Map. As the load and speed approach a particular site in the Fuel Map, the value of lambda is logged into the Lambda Log Map at the corresponding site. As more values of lambda are collected for that site, the site value is averaged out. As engine load and speed changes, the initially empty Log Map is built up to show how lambda changes across the entire load and speed map.

Log Map Views

There are various view to choose from:

  • Log Map Controller allows log mapping and auto mapping to be configured.

  • Log Map Grid 2D view of the values of the logged channel that have been stored for sites in the base map. Similar to Map Grid views. It will initially be empty and will be filled once the desired channel is being logged.

  • Log Map Graph 3D version of the Log Map Grid. Similar to Map Graph views.

  • Log Map Slice displays a slice through the Log Map in the same way as Map Slice views.

  • Log Map Site Target displays the current site positioning in the same way that Map Target views do.

  • Log Map Target Grid 2D view of the target values used in auto mapping. Similar to Map Grid views.

  • Log Map Target Graph 3D version of the Log Map Target Grid. Similar to Map Graph views.

  • Log Map Target Slice displays a slice through the Log Map target in the same way as Map Slice views.

Auto mapping

Some log maps are configured to change their base map according to the difference between the Log Map and an additional map called the target map. The target map can be viewed by displaying a Log Map Target.

The values in the target map should be set to the desired values, for example, for an AFR (gasoline) target map, the map would normally be set to around 14. GWv4 attempts to adjust the base map such that the Log Map site values are as close to the target map site values as possible.

Auto mapping can be configured and enabled using the Log Map Controller view. For more information on how to use auto mapping, see

Detailed Description

Every time the logging channel is read from the ECU (rate is variable), the value is evaluated for log/auto mapping.

Overview of Algorithm

  • Test if site should be logged (filtering stage).
  • Calculate Weighting.
  • Update map if auto mapping.
  • Log the value and weight (if auto mapping, weight is reset to zero).

Filtering

Before a value is considered for logging/auto mapping it must pass a number of tests:

  • The current site should be valid.
  • The secondary filtering channel (if any) should meet constraints defined in the ECU Definition file.
  • The tertiary filtering channel (if any) should meet constraints defined in the ECU Definition file.
  • The percentage distance in either X or Y direction from dead-center of the site should be less than “Site Accuracy” / 2.
  • The time that the site has been covered for should exceed the Remove Time (which is set in the ECU along with Weight Time defined below and can be edited for your own user log maps).

“Weight Before Change” is a value in milliseconds and is set in the Log Map Controller.

Calculations

The site weighting calculation is based on the time at the site and the distance from dead-center of the site:

Weight = TimeWeight * Xweight * Yweight

WeightDiffTime = “Weight Time” - “Remove Time"        (these values are in the ECU Definition file)

TimeWeight

If: “Milliseconds at Site” >= “Weight Time”, 
    TimeWeight = 1

Else:
    TimeWeight = (“Milliseconds at Site” - “Remove Time”) / WeightDiffTime

Xweight, Yweight

If:(site offset percentage < 100 percent weighting / 2) 
    weight = 1

Else: 
    weight = (site accuracy – site offset) / (site accuracy – 100 percent weighting)

The weighting value is applied to the extant weighting value:

Weight = TimeWeight * Xweight * Yweight
NewWeight = Weight + Old Weight

The new (raw) value to be entered into the Log Map:

New Value = ((Log Channel (RAW) * Weight) + (Old Value * Old Weight)) / New Weight

The base map (e.g. Fuel map for lambda log) is updated only if the weighting constraint is satisfied (when New Weight >= Weight Before Change). Otherwise the new values are simply written into the Log Map.

Change value calculation for Auto Mapping

Change = (Target Map Value - Log Map Value) * Error multiplier + Error additive

This can be applied as either:

  • Additive: Map + Change.
  • Percentage: Map + (Map * Change / 100).

When the site is updated in the map, the ’time at site’ is reset, and the site weighting is set to zero.

Log Map Controller

The Log Map Controller is used to configure aspects of Log Mapping and auto mapping.  This view may be added from all the usual places - see Adding an Object, and is found under the following sub menu: Add Log Map Controller...

If you are trying to auto-map using a Lambda Log Map, you will typically want a negative feedback loop.  To configure this, set the Multiplier value to a negative number (e.g. -1).

Log Map Controller Log Map Controller

The Log Map Controller is divided into sections:

Auto mapping

This section gives the user some feedback about the internal state of the log-mapping algorithm and can be useful for discovering reasons why auto mapping might not be working appropriately.

  • Capturing is a percentage of the algorithm’s current logged weight compared to the weight before change. Once this reaches 100%, the algorithm will change the current cell’s value.

  • Target Error is the current difference between the base map and target map.

  • Map Adjustment shows the current expected change to the base map that the algorithm will make in real and percentage terms.

Targeting

Gives control over site filtering based on target accuracy and weight.

  • Target Accuracy - This value defines how different the logged channel value should be from the target map value before it is considered for auto mapping.

  • Weight Before Change - This defines the value that Confidence should reach before a site is considered for auto mapping. It has units of milliseconds.

Modifications

Gives control over how the Log Map modifies its base map when auto mapping.

  • Modify Base Map By - Defines how the logged channel difference is used to adjust the base map by when auto mapping. This can either be:

    • Percentage: The channel difference value from the target map modifies the base map site value by a percentage of its current value. If using this mode, you can only perform auto mapping on non-zero base map cells.
    • Additive: The channel difference is added to the current map site value.
  • Multiplier - The channel difference value is multiplied by this value.  For a negative feedback loop (common with Lambda), use a negative value here.

  • Offset - This value is added to the channel difference after the multiplier has been applied.

Limit Changes to Map

Allows you to define the maximum amount that auto mapping may modify the base map by. The maximum change is defined for each direction, so subtractions from the base map value can have a different limit to additions.

These two changes are denoted by the ‘+’ and ‘-’ boxes. Max Absolute Change Is the maximum difference that can be applied to the base map as an offset from the original site value.

Max Percent Change Is the maximum percentage difference that may be applied to a map site. This is based on the original map value multiplied by the percentages given in the boxes.

Restart Capturing

Click this button to reset the weight of the currently selected cell(s).  This can be useful if the system has not yet reached stability and you want to restart the weight calculations for the current site(s).

Apply One Adjustment

Clicking this button will calculate and adjust the a single selected site according to the current weight. The weight will then be reset to zero.

Start Auto Mapping

Once you are happy with the Log Map Controller settings, click the ‘Start Auto Mapping’ button. GWv4 will then begin to auto map the base map to the target map.

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Log Map Target

The Log Map Target is used to define a target channel value for auto mapping purposes. This value is entered into a map matrix, allowing a target value that varies based upon the axis input values to the related Log Map.

The Log Map target can be displayed in the usual Map formats:

For example, if you were to be auto mapping using a Lambda Log Map, you would enter your target Lambda channel value into this map at the locations you need.

When auto mapping is running, the Fuel Map will be adjusted using feedback from the Lambda channel so that the value tends towards the value in the target map.

In order to set up auto mapping, see Log Map Controller.

Map Graph

The map graph is a 3D representation of a map. It can be use to view and edit sites on the map as well as overlay other objects such as tables and log maps. For details on how to add objects, see the Adding an Object section.

When the map is added to the workspace you will be shown a 3D graph like the following:

Map Graph Map Graph

Viewing the Map Graph

There are three ways by which you can change the view of the map graph; Zoom, rotate and pan.

Zoom increases or decreases the size of the map graph in its window. To zoom in or out, either use the mouse scroll wheel, or zoom keys (default: z,a).

Rotate changes the angle which you are viewing the map graph. To rotate, hold down the Ctrl key and click and drag with the left mouse button. You can also rotate by holding the Ctrl key and using the arrow keys.

Pan changes the position of the map graph in its window. To pan hold down the Ctrl and Alt keys and click and drag with the left mouse button. You can also pan by holding the Ctrl and Alt key and using the arrow keys.

With all of the above, also holding the Shift key increases the speed at which the view changes.

Selecting and Editing the Map Graph

To select a point on the graph, click the point with the left mouse button. To select an area of points, click an drag with the left mouse button. This selection can then be moved around the graph with the arrow keys.

Select the point(s) on the graph to edit their value. This can be done two ways:

  • Incremental increase/decrease: use the [ and ] keys (or + and - on the keypad). Holding Shift when using these keys changes the value by larger increments.

  • To a set value: Just start typing a number with points selected and a box will appear showing your number. Enter the correct value and press enter.

It is also possible to copy and paste a selection from another graph or grid. To do this, select a point or area on another graph or grid, right click and select copy (or Ctrl+C), then select the point or area on the current graph you want to paste in to, right click and select paste (or Ctrl+V).

Changing the look of the Map Graph

It is possible to change the way the map graph looks in a multitude of ways. For instance you can remove the grid, change the gradient colour, or change the lighting.

To change the colour of the map graph, from the Menu select: Configure | Preferences. In the preference window select the colours section. Find the option called ‘Map Graph Fill’. From here you can select from many different gradients or create your own.

All other changes are made in the properties of the map graph. By default the properties window is displayed to the left of the workspace, if it is not shown you can right click on the map graph and select properties. The properties for the map graph will then be displayed. An explanation of each option is displayed at the bottom of the properties window, when the property is selected

For more on the properties window, see the Properties Window section.

Soft selections

Soft selection makes it possible for smooth transitions between the areas on the graph that are being edited at those that are not. Soft selection increases the currently selected area out in all directions. Points closer to the selected area will be more affected by any changes than those further away. The amount these areas are affected is controlled by the dial at the bottom of the graph labeled ‘Select Range’. The higher the value of this dial the larger the area of the soft selection. The smaller the value, the smaller the area of the soft selection. When the dial is at is minimum soft selection is turned off. Soft selected points are defined by red points which fade out as the selection decreases.

Here you can see a cell selection with soft select turned off:

Soft Select Off Soft Select Off

The following shows and example of editing a grid with soft selection on:

Soft Select On Soft Select On
Note

The single ‘hard’ selected point in in the center, and the soft selected points gradually fade out around it.

Soft Select On Change Soft Select On Change

Now that the point has been edited, the points that are soft selected around it have also been affected.

Overlays

The overlay option allows you to view another map or Log Map overlayed on top of the current graph, viewed as colour change. To do this click the ‘’ button to the right of the overlay box and select another map from the list provided. When selected the name of the map being overlayed will be displayed in the overlay box and the colours of the graph will have changed to represent the changes in the overlayed map. The key on the map will also change to display the range of values in the overlayed map.

Follow ECU

When connected to an ECU the Follow ECU option sets the selected site on the graph to the currently active site. For example, using a Fuel Map, if the car is at 5000rpm and at 100kpa load then this position is selected on the Fuel Map.

Map Graph Functions

See section Map & Table Functions

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Map Grid

The map grid is a 2D representation of a map. It can be use to view and edit sites on the map as well as overlay other objects such as tables and log maps. Its displays the same data as the Map Graph and has much of the same functionality. For how to add objects see the Adding an Object section.

When the map grid has been added you will see something similar to the following:

Map Grid Map Grid

Selecting and Editing the Map Grid

To select an area on the grid, you can either click and drag using the left mouse button, or use the arrow keys whilst holding down Shift. Once an area is selected holding the Ctrl button down then pressing the arrows keys, will shift the entire selected area in the direction selected.

To select two non-concurrent areas (i.e. at opposite sides of the grid without the positions in between), select an area then whilst holding the Ctrl key, use the left mouse button to select another area.

To edit a point or group of points selected on the grid, either just start typing a number to set the selected points to a specific value, or use the + and - keys to increment up or down. To increment by a larger amount, hold down the Shift key while using + and -.

When online, pressing the Space bar will select the site nearest to the current cursor site.

Displaying the State

By displaying the state of the values on the grid you can see which sites have been edited how they have been edited. To show the state of each site right click on the grid and select properties. From the Properties window set ‘Colour Mode’ to either ‘State’ or ‘State and Gradient’. Setting to ‘State’ will make each site display just its state colour, setting to ‘State and Gradient’ will display a colour for the site value and in the corner of each site display a separate colour for the sites state:

The default colour code for the states are as follows. These can be changed in Configure > Preferences and going to the calibration states in the colours section.

Colour Dark Mode State Description
White Button Face Unchanged Has not been changed.
Yellow Green Changed Site has been adjusted by the user.
Lime Dark Cyan Calibrated This state can be set either manually by the user or when the site has been calibrated using log-mapping (auto mapping).
Green Dodger Blue Calculated Site has been calculated by GWv4 using a function.
Grey Slate Grey Pasted Site value as been copied from another map then pasted to the current site.
Blue Medium Orchid Optimised Site has been set using the Optimise function.
Orange Orange Undone No longer used since GWv4 4.03.25.  You may see this state if the calibration was used with GWv3.
Red Red Bad GWv4 4.03.25 can not determine the state of this site. It is recommended that you contact GEMS if you see the ‘Bad’ state on a map.

Locking sites

Locking certain sites in the map can be useful so that accidental changes are not made to known good values. You can do this by right clicking on the grid and selecting ‘Lock Sites with Calibrated State’. When this is set any sites which have been set to calibrated can not be changed. You can also manually set states to being calibrated therefore locked, by right clicking on the grid and selecting State>‘Set State to Calibrated’. To unlock the site select State>‘Set State to unchanged’.

Changing the look of the Map Grid

It is possible to change the way the map grid looks in a multitude of ways. For instance you can remove the change the gradient colour, show sites that have been changed and display the current ECU position.

To change the colour of the map grid, from the Menu select: Configure > Preferences. In the preference window select the colours section. Find the option called ‘Map grid Fill’. From here you can select from many different gradients or create your own.

All other changes are made in the properties of the map grid. By default the properties window is displayed to the left of the workspace, if it is not shown you can right click on the map grid and select properties. The properties for the map grid will then be displayed. An explanation of each option is displayed at the bottom of the properties window, when the property is selected

For more on the properties window, see the Properties Window section.

Soft Selections

The amount of soft selection can be changed by using the selection range property of the map grip. For a full explanation of soft selection see the soft selections section of Map Graph.

Map Grid Functions

See section Map & Table Functions.

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Map Slice

The map slice displays a table graph of a section of a map.  This is can be used for example to calibrate the points on the Fuel Map at a set engine speed or engine load.  For how to add objects see the Adding an Object section.

The following is a map slice for the Fuel:

Map Slice Map Slice

The functionality of the map slice is the same as the Table Graph and is edited in the same way.

Axis

This sets whether the slice is viewed along the X or Y axis of the map. In the example above the slice is viewed along the Y axis of the Fuel Map giving Fuel against engine load. Viewing along the X axis would give Fuel against engine speed.

Follow Slice

When connected to an ECU enabling Follow Slice will set the graph to follow the ECU in selecting which slice to show. Using the above as an example: The slice is displaying fuel against engine load. When the engine speed changes this will change the slice being displayed.

Slice Selector

The Slice Selector allows the slice which is displayed to be selected manually. You can either enter the number of the slice, or adjust the slice using the dial or up/down control.

Note

This selection will be overridden when Follow Slice is enabled.

Follow ECU

When enabled this will select the position on the graph of the currently connected ECU. This allows easy editing of the current position using the [ and ] keys for increase and decrease.

  • Hard Selection: This edits only the point selected.
  • Soft Selection: This will edit the current point and apply smaller changes to the sites around it. How many sites are affected is set by the selection range. The red highlight on the graph displays the sites that will be edited.

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Map Target

The map site target displays the current ECU position on the nearest site on the map. For how to add objects see the Adding an Object section.

The site target is displayed as follows:

Site Target On Site Target On
Site Target Off Site Target Off

This makes the current position clear so that an edit can be made, as an edit to the map can only be made when the position of the ECU is in the centre square or the square around it.

Notes

The notes object can be used to place notes in the tab areas. Select ‘add Notes’ when adding an object. For how to add objects see the Adding an Object section.

Once you have added the note object you will be given a blank area to write in:

Notes Notes

The notes object can be resized and the font size can be changed, by right clicking on the object, selecting ‘Properties’ and changing the font size property.

Note

The notes object is different to Calibration Notes as they are not stored in the calibration. They will be saved as part of your tabs file when the current tab or all tabs are saved.

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Number Edit

The Number Edit View provides means to enter in a floating point number and access it from scripts.

The value has no effect on the ECU and is stored in the tabs file, not in the calibration as with options/tables/maps.

To access the value of a Number Edit View on the same tab / Group:

By ID (see the ID property of the Number Edit View):

var edit = window.findViewByID("my\_edit\_box");
print(edit.value);
edit.value = 10;

By Title (see the Title property of the Number Edit View):

var edit = window.findViewByTitle("My Edit Box");
print(edit.value);
edit.value = 10;

The ID method is slightly more robust than the title method in that any renaming of the window title will not break dependent scripts.

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Number Gauge

A Number Gauge provides a clear read-out of a single channel value. For how to add objects see the Adding an Object section.

Number Gauge Number Gauge

Changing the channel

Right click on the number gauge and select properties. This will display the properties for the number gauge. Next to the ‘Channel’ property click the ‘’ button and you will be given a list of all the available channels.

Showing Units

Bring up the properties for the Bar Gauge as per the above and set ‘Show Units’ to ON. This will display as per the following:

Number Gauge Units Number Gauge Units

Changing the size

The numbers on the gauge will always resize to fill the size of their window. To increase or decrease the text size simply re-size the number gauge:

Number Gauge Resize Number Gauge Resize

Alarm Range

An alarm range can be configured.  Select ‘Limits…’ from the context (right click) menu, or ‘Limits’ from the properties.

If an alarm limit is reached, then the colour of the background will change to the colour selected in your settings.  The default is red:

Number Gauge Alarm Number Gauge Alarm

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Option Full List

The Option Full List provides a list of all the options in the current ECU. For how to add objects see the Adding an Object section.

Option Full List Option Full List

Editing an Option

Simply click on the value that you wish to edit. You can then either type in a new value or use the dial or up/down controls to alter the value:

Option List Edit Option List Edit

Some options which have set values will provide you a drop down list from which you can select:

Option List Edit Option List Edit

If an option has a large number of set values, for example an option which has a channel as its value, click the ‘’ button to the right of the value and you will be provided with the channel selection window.

Changing the look of the Option List

The way options are displayed can be changed. Right click on the option list and select Properties.

Alpha Sort - If ON the options are sorted alphabetically.

Condensed - Groups similar items in the option list. To expand a group click on the Expand Group icon on the left of the group. Click on it again to collapse the group.

On the left we have the properties window for the Full Options List, this shows the property Arrangement which has the sub properties Alpha Sort and Condensed. Then on the right we have the full options list, which you will see is in alphabetical order, and has been condensed.

Options Property View
Options List Condensed

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Option Selection List

The option selection list has all the same functionality as the Option Full List except that you can choose which options are included. This is useful to show particular options of a similar function or those which are used together. For how to add objects see the Adding an Object section.

Adding Options

When you first create an Option list you will be shown a blank list with a single blank entry:

Empty Option Select List Empty Option Select List

To add an option simply start typing the name of the option and GWv4 will provide a list of likely options or click the ‘’ button and you will be shown a list of all available options. Select the option you want to display and click ‘OK’. This will add the selected option to the list and provide a new blank entry from which to select another option:

Single Option Select List Single Option Select List

Adding Multiple Options

From the option selection list you can add multiple options. Click on the ‘’ button to bring up the available options, then either click and drag over the options, or use mouse click and either Shift or Ctrl keys to select separate items. Once selected, click ‘OK’ and the items will be added to your selection list:

Multiple Option Select List Multiple Option Select List

Locking the List

The selection list may be locked so that no items can be added or removed from the list by clicking on the Lock Icon button in the title bar.  It is also possible to toggle locking from the context menu (right click).

Option Select Locked Option Select Locked

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Scope

The scope displays a scope trace of a channel value. For how to add objects see the Adding an Object section.

The scope will be displayed as follows:

Scope Scope

If running on a live ECU then the graph will update over time to give a trace of engine speed.

Use the ‘Minimum’, ‘Maximum’ and ‘Time per Division’ properties to control the view axes.

Scope Properties Scope Properties

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Sequencer

The Sequencer can be used to create and execute a list of commands. Various items like CAN signals, variable setting and pop-up windows can be added to the sequence. This can be useful for automating production testing.

To open the Sequencer dialog, go to Add Sequencer.... Any previously saved sequence will appear, here an example sequence for calibrating the throttle pedal is shown. Otherwise the left-hand panel will be empty.

Sequencer Sequencer

The left-hand panel displays the current list of items to run and will be empty. The right-hand area displays the properties of the currently selected item. The bottom window is the sequence log that will be populated when the sequence is executed. The sequence is part of the layout file and will be saved within the .gxt file.

Create a sequence

Sequence controls can be found in the context menu by right-clicking in the left-hand panel.

Context Context

To add a new item to the sequence, select ‘Add Item…’, and a selection dialog will appear with a list of items. You can also insert items before the currently selected item by right-clicking on the item and selecting ‘Insert Item…’. Some items can also have child items, which, if applicable, can be added via ‘Add Child Item…’. You can also remove an item, using ‘Delete’. The sequence will be executed in the order that they appear in the list, and unchecked commands will be skipped. To reorder the list, click and drag the item to its new position. To edit the currently selected item, double click on the desired property in the right-hand panel. The panel can be toggled on and off through the context menu.

Run a sequence

When you are ready to execute the sequence of commands, click the ‘Run’ button. If you want to run an item individually, double click it. The context menu also has options to ‘Run All’, ‘Run Selected’, and ‘Run From Here’. To abort the sequence, click ‘Cancel’.

The progress of the sequence will be logged in the window below the sequence panel, and for each item: in the ‘Status’ column, and in the Result variable. The ‘Status’ column will show one of these states:

  • Passed’ - The item has been executed successfully.
  • Failed’ - The item has failed to execute. An error message will be displayed in the log.
  • Skipped’ - The item has been skipped.
  • Ready’ - The item is ready to be executed.
  • Running’ - The item is currently being executed.
  • Stopped’ - The sequence has not yet reached this item or it is stopped.
  • Canceling’ - The sequence is being canceled.
  • Canceled’ - The sequence has been canceled.

A running sequence will look like this:

Running Running

If a command fails, the sequence will stop and the item will display a failed status. A finished sequence will look like this:

Finished Finished

Using Variables

The Variables Window, accessed through the context menu, allows you to track variables generated by commands. Commands like ‘Object Value: Get’ and ‘Set Variable’ that contain ‘Output Variable’ or ‘Variable’ property under Parameters allow you to create and set variables for use in later sequence items. Choose a name for the ‘Output Variable’ property and set its value in the ‘Value’ property. To use the variable in another sequence item, wrap the variable name in brackets and prepend a dollar sign, e.g. ‘$(variableName)’.

Test Results

Test results can be stored in a variable by setting the ‘Result’ property under Variables.

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Signal Generator

The Signal Generator outputs arbitrary waveforms from you PC sound card, which can be used to simulate timing patterns etc. It can also output into a value in GWv4.

To open the Signal Generator View, go to Add Signal Generator.... A window will appear like this (here with an example signal):

Signal Generator View Signal Generator View

Setting up the Signal

Select an output device from the dropdown menu. Choosing ‘[GW] Value’ will output a signal into a channel in GWv4. The channel can be selected from the next dropdown menu. The signal rate is controlled in the Sample Rate box and the length of the waveform can be adjusted in the Waveform Size box. If the Interpolate checkbox is checked, the signal will be linearly interpolated between waveform points, otherwise no interpolation will be applied. To adjust the signal frequency, use the pot or enter a value in the Frequency box. To turn the signal on and off, use the Enable Output checkbox.

Creating and editing a Signal

The signal waveform can be created and edited using either the grid or graph. You can interact with these in the same way as Table Grids and Table Graphs, by clicking and dragging the waveform, or entering values into the table. See Table Grid and Table Graph topics for more information.

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Table Graph

The table graph is a graph representation of table. It can be used to view and edit the values in a table. For how to add objects see the Adding an Object section.

Table Graph Main Table Graph Main

Selecting and Editing the Table Graph

To edit a single point, move the cursor over the line on the graph and click when the cursor changes to a hand icon. Drag up and down to edit the point. To select multiple points, hold down Ctrl and click on the points to be edited. To select a continuous range of points, click and drag the mouse or hold down Shift and use the left and right arrow keys.

When selected, points on the graph will be highlighted like this:

Table Graph Selection Table Graph Selection

To edit, use [ and ] keys to increment/decrement the selected points.

Another method for editing is to hold the Alt key, then click and drag the mouse over the graph to ‘draw’ over all the points on the graph:

Table Graph mouse editing Table Graph mouse editing

Changing the viewable range of values

Using the scroll bar on the right hand side of the graph you can change the range of values being shown by the graph, allowing you for example, to focus on a particular range. Clicking and dragging the top and bottom of the scroll bar changes the upper and lower values for to be displayed by the graph. By then clicking an dragging in the middle of the scroll bar you can adjust the section of this range to focus on.

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Table Grid

The table grid is a grid representation of the values in a table. It can be used to view and edit these table values. For how to add objects see the Adding an Object section.

Table Grid Main Table Grid Main

Selecting and Editing the Table Grid

To select a single site, click on the grid value. To select a range of sites, click and drag the mouse or hold down Shift and use the left and right arrow keys.

Table Grid Selection Table Grid Selection

To edit, use [ and ] (or +/-) keys to increment/decrement the selected sites, or type a number in to set a specific value.

When the ECU is online, press the Space bar to select the site nearest to the current cursor site.

Configuring the Axis

For some tables the axis can be configured. This is when the axis is based on another table or on an option. To edit a point on the axis, simply double click on the point on the axis and type in the new value.

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Tachometer

The Tacho Gauge provides a Tacho (dial) representation of a channel. For how to add objects see the Adding an Object section.

Tacho Tacho

Configuration

The Tacho is easiest to configure via its configuration dialog (but it is also configurable via the Properties Window).

Right click the gauge and select ‘Configure Gauge…’ or click on the small spanner icon in the title bar of the Tacho window:

Tacho Configuration Tacho Configuration

Global settings may be modified by checking the ‘Edit Global Settings’ checkbox, and will be stored as part of the tabs layout.  These settings are not saved when you save single tabs only (i.e. Use ‘Save Current Tab Only’ in the save tab dialog).

Changing the channel

Right click on the Tacho and select properties. This will display the properties for the Tacho. Next to the ‘Channel’ property click the ‘’ button and you will be given a list of all the available channels.

Setting the range

Bring up the properties for the Tacho. Set the properties ‘Minimum’ and ‘Maximum’ to your desired values for the Tacho range.

Setting a multiplier

If for example you want to display engine speed as 1,2,3 etc instead of 1000,2000,3000 etc, you can do this by setting a multiplier. Bring up the properties for the Tacho and set the ‘Multiplier value’. For this example, it should be set to 0.001.

Adding a red-line area

Using the ‘Thresholds’ section of the configuration dialog, add items using the Plus Icon button.

Each item’s range can be set and a colour/gradient supplied.

Tacho Thresholds Tacho Thresholds

View Properties

Properties editable via the properties editor.

PropertyScript IDDescription
Title title The title of the window.
Script ID id The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
Tool Tip tooltip Window tool tip.
Display Units display_units_text Show units after the number on the view.
Display Units (Label) display_units_label Show units after the label on the view.
Prefix Text prefix_text Text to display before the value.
Postfix Text postfix_text Text to display after the value.
Limits limits Set up alarm limits for this gauge.
Show Value show_value
Show Label show_label
Label Font label_font
Value Font value_font
Value Height % value_height_percent A value of zero disables auto font size fitting if Value Height Max is set
Value Height Max [dp] value_height_max_dp Maximum font height of the value text, in device pixels
Label Height % label_height_percent
Label Height Max [dp] label_height_max_dp Maximum font height of the label, in device pixels
Label Text label_text
Label Align label_align
Label Vertical Align label_valign
Value Align value_align
Value Vertical Align value_valign
Low Limit Text low_limit_text
High Limit Text high_limit_text
Value Override Text value_text
Max length Text max_length_text Leave blank for auto
Background bg_colour Background colour
Text text_colour Text colour
Alarm Low Background alarm_low_bg_colour Alarm Lower Limit Background colour
Alarm Low Text alarm_low_text_colour Alarm Lower Limit Text colour
Alarm High Background alarm_high_bg_colour Alarm Upper Limit Background colour
Alarm High Text alarm_high_text_colour Alarm Upper Limit Text colour
Input Value parameter The source of the value that will be displayed by the gauge.
Update Rate update_rate Rate at which the input value is requested from the ECU.
Decimal Places decimal_places Set to -1 for auto

Wizard

Overview

Wizards in GWv4 allow you to create guided workflows for users, making it easier to configure complex calibrations and enforce relationships between options. They are particularly useful for setting up new calibrations or guiding users through complex configurations.

Creating Wizards

Navigate to: Wizards -> Manage Wizards -> Add Wizard

Main options:

  • Title - Give the wizard a suitable title
  • Script ID - Unique identifier for your wizard
  • Icon - Associate a small graphic with the wizard

Show button strip to configure which buttons you want displayed at the bottom of the wizard.

Typical options for a multi-step wizard would include:

  • Back
  • Next
  • Finish
  • Cancel

Adding Steps

Add the steps using the green plus in the top right. These are the steps/pages of the wizard.

For each step, configure:

  • Title - Descriptive name for the step
  • ID - Unique identifier
  • Previous - ID of the previous page
  • Next - ID of the next page

Advanced Routing: If you are developing a wizard with several options and “routes” through the pages, you will want to configure the “Next” and “Back” buttons in JavaScript, the language of the script.

Press “OK” and you will be directed to a space where you can edit the components of each step of the wizard.

Editing Wizards

Add Views/Options using the green plus in the top header. Write text using “Label”, add option selection using “Option Editor” and so on.

Ensure that each element you add to the page has an appropriate Script ID, so you can reference it and manipulate it in the script.

To access the script, click the button in the top left. This is where you will write code for the functionality of buttons, checkboxes and other elements you’ve added to your pages.

Scripting

Options/Tables/Graphs added to the page directly update the value in the calibration. On the other hand, views such as Combo Boxes and Check Boxes have no direct effect on the calibration options, unless you script it to be so.

Below is an example of a function linking the checking of a checkbox to the updating of a calibration options:

// Updates the ECU option "Err Mask Gear Ratio" if the checkbox is checked
function UpdateErrorFlag() 
{
    if (window.checkbox_enable_error_flag.checked = true) {
        err_mask_option = ecu.option("err mask gear ratio");
        err_mask_option.setString("ON");
    }
}

window.checkbox_enable_error_flag.on("click", UpdateErrorFlag);

Your script should be made up of three key sections:

  • Initialising variables: Initialising values and element parameters
  • Function definitions: Defining important functions such on “OnNext” and “OnBack”, describing how the wizard progresses through the pages
  • Event handling: Mapping the functions to events, such as buttons being clicked or options being selected

For more information on scripting, see Scripting.

Common Scripting Errors

  • If you have scripted your page changes, and the “Next” button is enabled depending on a given selection, you can occasionally get the page transitions chaining, ending on the page after the one you wanted, or even further. This can be countered by disabling “Next” after the first page transition, or by removing selections on the next page as you transition to it.

  • If your variables are not declared, you may be using them in the wrong scope. “let” is block scoped, so those variables are only accessible in the block is was declared in. This is the code section within a pair of curly brackets. On the other hand, “var” is function scoped. It is easiest to declare the ECU options just before you use them in the block. Alternatively, it may be due to a mismatch between the ID you wrote and the actual Script ID defined in the Wizard editor.

  • If you cannot access Combo Box options, follow this script structure:

// Initialisation
window.cbox_name.items = [
    { text: "Choice 1", port:1 },
    { text: "Choice 2", port:2 },
];

// Function Definition
// Changes option channel based off user's selection
function OnChoiceSelected(index, value)
{
     (value) {
        let option = ecu.option("option name");
        option.setString("value.text");
    }
}
// Event Handling
window.cbox_name.on("change", OnChoiceSelected);

Subsections of Functions

Function Editor

Allows a user defined function to be performed on the selected sites.  

The function can also be referred to as a script.  

Simple functions may be written much like a mathematical expression, so no expert knowledge of programming is required.

For example, to make a percentage change of sites in a map, you might write:

v \* 0.1

If you click ‘Apply’, the function will be applied to the sites in the map.  If you want the function to be applied to all sites, uncheck the “Apply to Selection” box.

See also Example Function Scripts.

The language used for scripts is “ECMA Script” and there are many resources on the web on its usage:

http://www.w3schools.com/JS/default.asp

http://en.wikipedia.org/wiki/JavaScript

Simple View

Function Simple View Function Simple View

The function editor can be opened by first selecting a channel, map, option, etc and then pressing Ctrl+F

By default, the function editor will display in a simple view mode.  This offers an immediate method of entering simple mathematical operations.  Pressing the Return key will apply the function and close the window.

If you check the ‘Advanced View’ check box, then you can enter more complicated multi-line scripts.

Advanced View

Function Advance View Function Advance View

You can write very complicated scripts if you need to that apply functions taking into account all of the sites in the map.  Scripts can contain function definitions and may include additional script files from the files system via the ‘include’ function.

Objects and functions defined by GWv4 are listed on the left hand side of the function editor window, along with a brief description of their purpose.  To add one of these items at the current cursor location in your script, double click on the item in the list or simply type it in.  Variable and function names are case-sensitive.

If you do not set the ‘result’ value, then the site will be set to the value of the last expression in the script.

There are too many predefined functions and objects within the scripting language to list here.  

Of most use in this context are the Math functions and constants:

http://www.w3schools.com/jsref/jsref_obj_math.asp

For example, the screenshot above shows the use of the Math.log function.  This is the base 10 logarithm of the value supplied.

Trigonometric and exponentiation functions are also available, as are functions to generate absolute values.

The ‘object’ variable represents the object that you are performing the function on.  For example, this could be a table or a map.

Such objects have member functions to adjust the value of specific sites:

thing.getReal(xy);
thing.setReal(valuexy);

See also Example Function Scripts.

Fill Function

Fill

Fills the map between selected sites or sites with the ‘calibrated’ state (see the ‘State > Set to ‘Calibrated’ context menu command).

To simply interpolate a rectangular selection, use the Interpolate functions.

Sparse Fill Menu Sparse Fill Menu

There are different algorithms available for filling the map.  Which algorithm you choose to use will depend on your purpose.  

The Delaunay Triangulation will generally give the best results but it does require at least three sites to be selected.

Starting with the following map, a number of sites have been selected by Ctrl-Clicking on the map to generate a ‘sparse’ selection.  

The fill algorithms will be discussed with this as a reference.

Our intention is to fill the map sites between the selected sites (i.e. fill the non-selected sites).

Fill Grid Fill Grid
Fill Graph Fill Graph

Nearest Algorithm

For each unselected site in the map, the closest selected site is found and the site value is set to match.

Using our example map above, you would get the following result:

Fill Nearest Grid Fill Nearest Grid
Fill Nearest Graph Fill Nearest Graph

Inverse Distance Weighting Algorithm (IDW)

For each site in the map, the site is given a value based on the inverse of the distance from surrounding selected sites.

The ‘power’ channel adjusts the weighting value and will affect the curvature of the resulting map surface.

Using our example map above, you would get the following result:

Fill IDW Grid Fill IDW Grid
Fill IDW Graph Fill IDW Graph

Delaunay Triangulation Algorithm

This algorithm triangulates between the selected sites.  It finds the most appropriate triangles to use using the Delaunay algorithm (more information is available on the web).

You must have at least three sites selected to use this algorithm and it is recommended that you always select the corner sites because they will not be extrapolated.

There may not always be an appropriate triangulation and in such cases some areas may be missed on the map (for example if you have three collinear points).  If this occurs, try modifying your selection or manually adjust the missing areas.

Using our example map above, you would get the following result:

Fill Delaunay Triangulation Grid Fill Delaunay Triangulation Grid
Fill Delaunay Triangulation Graph Fill Delaunay Triangulation Graph

Example Function Scripts

Example scripts for the function editor.

Generating a Logarithmic Axis

To generate an exponential axis on a map or table, you could use the following script:

var power = 2;  
var m = x / (xcount - 1);  

minvalue + range * Math.pow(mpower);

Adjusting the ‘power’ variable will adjust the curvature of the resulting axis:

Logarithmic 1.5 Logarithmic 1.5

power = 1.5

Logarithmic 2 Logarithmic 2

power = 2

Display Average of All Sites

To calculate the average of all sites and display it without modifying the map , you could use the following script.

This shows some more advanced scripting features.

// Loop over all sites and calculate a rolling average  
let avg = 0;  
let n   = 0;  
let val = 0;  
for (y = 0y < ycount++y) {  
    for (x = 0y < ycount++y) {  
        ++n;  
        val = object.getReal(xy);  
        avg += (val - avg/ n;  
    }  
}  

print("Average Value: " + avg.toString());  
// Terminate the script:  
completed = true;  

// Set the result so that the object is not modified.  
result = v;

This will display the average value of the map in a popup dialog box.

Map & Table Functions

Various functions are available for map and table editing from the context menu.

To access the context menu, right click on the view (e.g. a Map Grid).  

Alternatively, press the Context Menu key (to the right of Alt-Gr) whilst the view is focused.   Some keyboards do not have a context menu key, in which case you can use Shift-F10.

Note

The context menu differs if you right click on the map/table axes of a grid view.

Context Menu Context Menu

Common Functions

For Fuel Map specific function, see the Fuel Map Functions section.

View Grid / View Graph

Creates a new view window in the current tab for the same object (e.g. Fuel Map) with the alternative view type.

Properties

Displays/focuses the properties window for this object.  Properties will be automatically updated to reflect what you are looking at.  If the properties windows is hidden, then it will be shown.

Rename

Allows you to modify the title of the window.

Select All

Selects all sites in the focused object.

Select None

Clears the selection in the focused object.

Cut / Copy / Paste

Clipboard handling for the selected sites.  Clipboard data may also be pasted into applications such as Microsoft Excel® and Open Office Calc®.

State | Set State to ‘Calibrated’ & State | Set State to ‘Unchanged’

Adjusts the state of the sites to either ‘Calibrated’ or ‘Unchanged’.  To see state colours for a map or table, adjust the colour mode property using the properties window.

Lock Sites With Calibrated State

Locks sites that have the calibrated state from being modified.  

For example, if you has set the state of a number of sites to ‘calibrated’, select all sites in the map and then adjust them using the [ or ] keys, the calibrated sites will not be modified.

Interpolate

Performs a two dimensional linear interpolation between the corner values of the selection.

Interpolate Rows / Interpolate Columns

Performs a one dimensional linear interpolation across rows or columns in the selection.

Percent Change

Adjusts the selected sites by a percentage of the current value:

x = x + (x \* percentage / 100)

Negative percentages may be supplied to cause a reduction in the site values.

Absolute Change

Adjusts the selected sites by an absolute value:

x = x + value

Function

Allows a user defined function to be performed on the selected sites.  

The function can also be referred to as a script.  

Simple functions may be written much like a mathematical expression, so no expert knowledge of programming is required.

For example, to make a percentage change of sites in a map, you might write:

v * 0.1

If you click ‘Apply’, the function will be applied to the sites in the map.  If you want the function to only be applied to the selection, tick the “Apply to Selection” box.

For more details, see the Function Editor section.

Smooth

Smooth applies a linear phase low pass filter to the map or table.

Function Smooth View Function Smooth View

Depth corresponds to the window size of the filter kernel (each site being a sample).  A Higher value will allow lower cutoff frequencies.

Smoothness corresponds to the cutoff frequency of the low pass filter.  Higher values represent a lower cutoff.

Fill

Fills the map between selected sites or sites with the ‘calibrated’ state (see the State | Set to ‘Calibrated’ context menu command).

Sparse Fill Menu Sparse Fill Menu

For more information, see the Fill Function section.

Show Raw Values

Displays the values in the map or table as raw (unscaled) hexadecimal values.

See also the Fuel Map Functions section.

Fuel Map Functions

The Fuel map has some specific view options and functions.  These are accessible from the context menu.

To access the context menu, right click on the view (e.g. a Map Grid).  

Alternatively, press the Context Menu key (to the right of Alt-Gr) whilst the view is focused.

Some keyboards do not have a context menu key, in which case you can use Shift-F10.

Context Menu Context Menu

View Raw

Displays the Fuel Map in raw values.

View Pulse Width

Displays the Fuel Map in terms of injector pulse width in milliseconds.

The value is based upon the Microsec/Bit (or MSPB) option and the LD0MPC option.

The scaling is as follows:

load_scaling = (load_site / load_site_max+ ((load_site_max - load_site/ load_site_max* ld0mpc / 256;
value = (mspb / 1000\* load\_scaling;

Try setting the Fuel Map to 255 in raw mode and then switching to pulse-width mode and adjusting the LD0MPC option to get an idea of how ld0mpc affects the scaling of the map.

View Duty Cycle

Displays the map in terms of the duty cycle of the injector pulse train.  Duty Cycle is the fraction of time that the injector is active as a percentage, so a duty cycle of 100 or greater indicates that the injector is permanently on.

Like pulse-width, the duty cycle view uses the LD0MPC option to scale the map based upon the load site. However, the scaling also takes into account the speed axis.

Try it out on a map where all the raw values are the same and adjust LD0MPC to see the effect.

When viewing in Duty Cycle, you will be asked what kind of engine you are running in order that duty cycle can be correctly calculated.

Rescale Fuel Map

Rescaling the Fuel Map adjusts the raw values of the map so that they use the full range of the Fuel Map.  In order to preserve the injector pulse-width, the Microsec/Bit (MSPB) option is adjusted to account for the changes to the base map.

Optimize Fuel Map

Optimizing the Fuel Map adjusts MSPB, LD0MPC and the Fuel Map.

The optimize procedure finds the average slope of the map and removes it by adjusting LD0MPC.  This is based on the general trend of fuel maps increasing in value as load increases.  The map is also scaled to give maximum fueling resolution.

Generally Optimize is not necessary on engines tuned for Rally.

Un-Optimize Fuel Map

Performs the reverse of the optimize function and removes any LD0MPC scaling.  The Fuel Map is also rescaled to normalize the values.

Change Injectors / Pressure

If you are changing your injectors or the fuel pressure, then you may need to recalibrate a number of elements in the calibration.

This command can ease the task by adjusting the Fuel Map, the crank fuel table (crank injector time), the crank pulse table (initial crank pulse) and the secondary option (staged flow ratio).

Subsections of Commands

Shortcut Keys

Shortcut Action
A Zoom Out (fine)
Alt-L Limits…
Alt-S Smooth…
Alt-T Reset Trails
Alt+Ctrl+L Lock Layout (All Tabs)
Alt+Enter Properties
Alt+F6 Add Marker to PC Log
Alt+F7 Preferences…
C Select Column
Ctrl-F Function
Ctrl-R Rename…
Ctrl-Shift-A Absolute Change…
Ctrl-Shift-P Percent Change…
Ctrl-Shift-R Show Raw Values
Ctrl+0 View Tab 10
Ctrl+1 View Tab 1
Ctrl+2 View Tab 2
Ctrl+3 View Tab 3
Ctrl+4 View Tab 4
Ctrl+5 View Tab 5
Ctrl+6 View Tab 6
Ctrl+7 View Tab 7
Ctrl+8 View Tab 8
Ctrl+9 View Tab 9
Ctrl+A Select All
Ctrl+B New Tab…
Ctrl+C Copy
Ctrl+D Descriptions
Ctrl+F Find View…
Ctrl+F6 Stop PC Logging
Ctrl+G Switch Graph/Grid
Ctrl+H History
Ctrl+K Store Changes in ECU
Ctrl+L Add Option Full List
Ctrl+N Calibration Notes
Ctrl+O Open Calibration…
Ctrl+P Add Channel List
Ctrl+S Save
Ctrl+Shift+0 View Tab Group 10
Ctrl+Shift+1 View Tab Group 1
Ctrl+Shift+2 View Tab Group 2
Ctrl+Shift+3 View Tab Group 3
Ctrl+Shift+4 View Tab Group 4
Ctrl+Shift+5 View Tab Group 5
Ctrl+Shift+6 View Tab Group 6
Ctrl+Shift+7 View Tab Group 7
Ctrl+Shift+8 View Tab Group 8
Ctrl+Shift+9 View Tab Group 9
Ctrl+Shift+L Add Option Selection List
Ctrl+Shift+Page Down Change View to Next Object
Ctrl+Shift+Page Up Change View to Previous Object
Ctrl+Shift+S Save As…
Ctrl+Shift+Tab Tab Group Popup
Ctrl+T Live Trim Control
Ctrl+V Paste
Ctrl+X Cut
Ctrl+Y Redo
Ctrl+Z Undo
Delete Delete
Esc Select None
F1 Help
F11 Toggle full screen mode
F4 Toggle Coarse/Fine Edit Mode
F6 Start PC Logging
F7 Reset Channel Mins/Maxes
F8 Toggle Freeze Channels
F9 Start/Stop Log Playback
H Hold Mode
I Interpolate
INS Insert
L Toggle Follow ECU [Hard]
M Zoom to All
O Options Quick Keys
R Select Row
S Zoom to Selection
SHIFT-A Zoom Out (coarse)
SHIFT-Z Zoom In (coarse)
Shift+F1 About the program
Shift+F7 Connect
Shift+F9 Rewind Log Playback
SPACE Select Site at Cursor
U Un-Expand All
V Vertical Expand All
X Interpolate Rows
Y Interpolate Columns
Z Zoom In (fine)

File Menu

Edit Menu

ECU Menu

Telemetry Menu

Logging Menu

View Menu

Wizards Menu

Tools Menu

Layout Menu

Configure Menu

Help Menu

Context Menu

Scripting

Overview

GWv4 features powerful scripting capabilities for automating calibration tasks and creating user interfaces.

This chapter provides a reference for scripting facilities.

// Inertial Measurement Unit
class ImuChannel {
    constructor(name) {
        this.channel = ecu.channel(name);
    }
    get value() { 
        return this.channel.value; 
    }
    get squared() { 
        let v = this.value;
        return v * v;
    }
}
const imu = {
    x: new ImuChannel("Acceleration x axis"),
    y: new ImuChannel("Acceleration y axis"),
    z: new ImuChannel("Acceleration z axis"),
    get squaredMagnitude(){ 
        return this.x.squared + this.y.squared + this.z.squared;
    },
    get magnitude() { 
        return Math.sqrt(this.squaredMagnitude);
    },
};
// Label onGetValue event
function onGetValue() {
    return `${imu.magnitude} [${imu.x.channel.units}]`;
}

Contents

Subsections of Scripting

Global Functions

function IncludeWizardScript(wizard_id)
Includes the script associated with the wizard ID into the current script context, this is similar to a #include directive.
function InvokeAction(action [,options])
Invoke an application action, given its action ID (see application command / menu reference). The options argument can specify ‘deferred’ / ’toggle’ boolean options.
function RunWizard(wizard_id)
Run a user-defined wizard, given its wizard ID (see application command / menu reference).
function print(message)
Prints a message to the log and pops up on screen.
function sleep(milliseconds)
Suspends execution of the script for the specified number of milliseconds. This function is only defined for scripts that execute asynchronously (Button scripts and Sequencer scripts). The actual timing resolution is fairly coarse; you can expect a sleep(1) to take significantly longer than 1 millisecond to resume due to a number of factors. One of these is Windows itself which will give a sleep granularity approaching 10ms.
function trace(message [,show_panel])
Trace the message in the status panel. If the optional argument ‘show_panel’ is provided then the auto-popup behaviour of the status panel may be suppressed.
function traceDetail(message [,show_panel])
Trace a detail message in the status panel. If the optional argument ‘show_panel’ is provided then the auto-popup behaviour of the status panel may be suppressed.
function traceError(message [,show_panel])
Trace an error message in the status panel. If the optional argument ‘show_panel’ is provided then the auto-popup behaviour of the status panel may be suppressed.

External Automation

COM Interface

GWv4 can be externally automated from a variety of programming languages such as JavaScript / VB.net / C# / C++ via its COM (ActiveX / OLE) interface.

The COM interface API documentation is currently provided as a Compressed Help (chm) file in the installation folder of GWv4 (typically /Program Files (x86)/GEMS/GWv4).

App

Type: App

Scripts have an instance of App pre-defined as a global variable called 'app'.

The App object allows a script to interact with the application, such as setting the view to full-screen mode.

Properties

PropertyDescription
isConnected Indicates if the application is currently connected to an ECU.
isDarkTheme Indicates if the application is running the dark mode UI theme.
isFreezeChannels Indicates if channel freeze is on - the UI will frreze displayed values of channels whilst in this mode.
isFreezeParameters [deprecated] alias of isFreezeChannels.
isFullScreen Indicates if the application is currently in full screen mode.

Methods

MethodDescription
beginUndoScope(name)

Undo scopes are used to group multiple changes into a single undo action.

beginUndoScope starts an undo transaction where all modifications that follow are logically grouped together.

Take care to call endUndoScope the same number of times you called beginUndoScope()

Generally it is best to use this in a try...finally statement to ensure that the undo scope is closed, even if an exception is thrown:

try { app.beginUndoScope("My Undo Scope"); // Name appears in the undo history // Make multiple modifications here ecu.option("Option1").setReal(1); ecu.option("Option2").setReal(2); } finally { app.endUndoScope(); }

closeAllCanPorts()

Close all CAN ports opened by scripting. Avoid where possible.

closeNotification(id) Close notification with the given ID.
confirmDialog(message) Pop up a modal confirmation dialog box. Returns 'true' if the user selected 'yes'.
connectEcu() Connects to an ECU using the currently configured port settings.
convertUnits(value, from, to)

Convert the units of a value, given the unit script IDs for 'from' and 'to'.

Returns the converted value or undefined if the conversion was invalid.

disconnectEcu() Closes the connection to the ECU (if connected).
endUndoScope()

Ends an undo scope. Take care to call endUndoScope the same number of times you called beginUndoScope()

error(message) Pop up a modal error dialog box.
freezeChannels(enable) Freezes channel updates on views that allow it.
freezeParameters(enable) [deprecated] alias of freezeChannels.
fullScreen(enable) Enters/exits full screen mode.
getDisplayUnits(script_unit)

Get the display units string (for labels etc) from script units ID.

e.g. app.getDisplayUnits("angle:degrees") returns °

getUnitPreference(user_scalar_name)

Get the unit preference for the given user scalar name.

Returns the unit script ID or undefined if the user scalar name is not found.

getUserSetting(key[, default_value])

Get the value of a user setting, stored globally in the application.

Keys are separated by forward slashes, e.g. "custom/area/my_setting".

Returns 'default_value' if given, or 'undefined', if the setting does not exist.

For custom settings, to avoid conflicts with application settings, prefix the setting with a unique string.

For example, if you have a setting called "my_setting", prefix it with "my_prefix/" to give "my_prefix/my_setting".

hasNotification(id) Determine if a notification with the given ID exists.
information(message) Pop up a modal information dialog box.
informationNotification(message, [options, [actions]]) Show an information notification. HTML is supported in the message. The HTML format is a simplified form, as used by wxHtmlWindow. Returns the notification ID.

Options is a table of key/value pairs. The following options are supported:

  • id - Unique identifier to use for the notification. If not provided, the ID is autogenerated.
  • timeout - the timeout in seconds. Default is 0 (no expiry).
  • icon - the icon to display. If not provided, the default icon shall be displayed for this notification type.
  • link - Callback function for links clicked in the HTML content. 1 argument with the value of the link href attribute..
  • action - Callback function for actions that do not specify an individual callback. 1 argument with the the title of the action.

Actions is an array of items for action buttons. Each item may be be a string or an array with 2 elements. The first element is the action title and the second is a callback function. Alternatively an object may be given for each item with the following properties:

  • text - the action text.
  • callback - the callback function.
  • id - value to use in options.action callback, otherwise the action text is used.
    listCanPorts()

    List available CAN ports, returns object {text,type,id}

    openCanPort(options { id, rate, data_rate, clear_queues, read:callback(frame), error:callback(e) })

    Open CAN port with given port ID

    clear_queues defaults to true, which clears the RX and TX queues of the port immediately after opening.

    readDataLog() Receive the internal log from the ECU.
    resetChannelMinMax() Resets min/max values of channels as displayed on channel lists.
    resetParameterMinMax() [deprecated] alias of resetChannelMinMax.
    setLogPlaybackPosition(time) Moves the log playback position to the given time (specified in seconds)
    setUnitPreference(user_scalar_name, unit_script_id)

    Set the unit preference for the given user scalar name.

    Returns true if the unit preference was changed, or false if the unit preference already had the given value.

    errorNotification(message, [options, [actions]]) Show an error notification. HTML is supported in the message. The HTML format is a simplified form, as used by wxHtmlWindow. Returns the notification ID.

    Options is a table of key/value pairs. The following options are supported:

    • id - Unique identifier to use for the notification. If not provided, the ID is autogenerated.
    • timeout - the timeout in seconds. Default is 0 (no expiry).
    • icon - the icon to display. If not provided, the default icon shall be displayed for this notification type.
    • link - Callback function for links clicked in the HTML content. 1 argument with the value of the link href attribute..
    • action - Callback function for actions that do not specify an individual callback. 1 argument with the the title of the action.

    Actions is an array of items for action buttons. Each item may be be a string or an array with 2 elements. The first element is the action title and the second is a callback function. Alternatively an object may be given for each item with the following properties:

    • text - the action text.
    • callback - the callback function.
    • id - value to use in options.action callback, otherwise the action text is used.
      startLogPlayback() Starts log playback of the log file loaded into the Log Transport view.
      startPCLogging() Start logging data on the PC using the current PC Logging configuration.
      stopLogPlayback() Stops log playback, if running.
      stopPCLogging() Stops PC logging, if running.
      verifyCal() Run the Verify Calibration action to check that the contents of the ECU calibration match that on the PC.
      warning(message) Pop up a modal warning dialog box.
      warningNotification(message, [options, [actions]]) Show a warning notification. HTML is supported in the message. The HTML format is a simplified form, as used by wxHtmlWindow. Returns the notification ID.

      Options is a table of key/value pairs. The following options are supported:

      • id - Unique identifier to use for the notification. If not provided, the ID is autogenerated.
      • timeout - the timeout in seconds. Default is 0 (no expiry).
      • icon - the icon to display. If not provided, the default icon shall be displayed for this notification type.
      • link - Callback function for links clicked in the HTML content. 1 argument with the value of the link href attribute..
      • action - Callback function for actions that do not specify an individual callback. 1 argument with the the title of the action.

      Actions is an array of items for action buttons. Each item may be be a string or an array with 2 elements. The first element is the action title and the second is a callback function. Alternatively an object may be given for each item with the following properties:

      • text - the action text.
      • callback - the callback function.
      • id - value to use in options.action callback, otherwise the action text is used.

        CANFrame

        Type: CANFrame

        Script class for a Can Frame.

        Properties

        PropertyDescription
        brs Flag indicating if the frame is has BRS (Bit Rate Switch) set.
        cycleTime Cycle time for the frame (as identified by 'frame.key'), in seconds.
        dataHex Get/Set the data of the frame as a hexadecimal string, with bytes separated by spaces (e.g. "01 02 03 04 05 06 07 08"). The spaces are optional when setting the value, so "0102030405060708" is also valid.
        extended Flag indicating if the frame is extended (true) or standard (false).
        fd Flag indicating if the frame is CAN-FD (EDL)
        id Get/Set the ID of the frame.
        key Get a key value suitable for use in a map or set, based on the frame ID and flags. Actual bit layout is subject to change between application versions.
        length Length of the frame in bytes. This is the number of data bytes in the frame, not including the ID or CRC.
        rtr Flag indicating if the frame is has RTR (Remote Transmission Request) set.

        Methods

        MethodDescription
        frame[index] Get / Set the data byte at the given index in the frame.
        getSignalFloatBE(start_bit, length) Get the value of a big-endian (Motorola) signal in the frame as a float, given the start bit and length in bits.
        getSignalFloatLE(start_bit, length) Get the value of a little-endian (Intel) signal in the frame as a float, given the start bit and length in bits.
        getSignalIntBE(start_bit, length) Get the value of a big-endian (Motorola) signal in the frame as a signed integer, given the start bit and length in bits.
        getSignalIntLE(start_bit, length) Get the value of a little-endian (Intel) signal in the frame as a signed integer, given the start bit and length in bits.
        getSignalUIntBE(start_bit, length) Get the value of a big-endian (Motorola) signal in the frame as an unsigned integer, given the start bit and length in bits.
        getSignalUIntLE(start_bit, length) Get the value of a little-endian (Intel) signal in the frame as an unsigned integer, given the start bit and length in bits.
        setExtID(id) Set the ID of the frame to an extended (29-bit) ID.
        setFDExtID(id) Set the ID of the frame to a CAN-FD extended (29-bit) ID.
        setFDStdID(id) Set the ID of the frame to a CAN-FD standard (11-bit) ID.
        setSignalFloatBE(start_bit, length, value) Set the value of a big-endian (Motorola) signal in the frame as a float, given the start bit and length in bits.
        setSignalFloatLE(start_bit, length, value) Set the value of a little-endian (Intel) signal in the frame as a float, given the start bit and length in bits.
        setSignalIntBE(start_bit, length, value) Set the value of a big-endian (Motorola) signal in the frame as a signed integer, given the start bit and length in bits.
        setSignalIntLE(start_bit, length, value) Set the value of a little-endian (Intel) signal in the frame as a signed integer, given the start bit and length in bits.
        setSignalUIntBE(start_bit, length, value) Set the value of a big-endian (Motorola) signal in the frame as an unsigned integer, given the start bit and length in bits.
        setSignalUIntLE(start_bit, length, value) Set the value of a little-endian (Intel) signal in the frame as an unsigned integer, given the start bit and length in bits.
        setStdID(id) Set the ID of the frame to a standard (11-bit) ID.

        CanPort

        Type: CanPort

        Script class for Can Ports (see app.openCanPort).

        Methods

        MethodDescription
        clearQueues() Clear the read and write queues of the CAN port.
        close() Close the CAN port.
        status(callback(error))) Request status of the CAN port. The callback will be called with an Error object containing the status information.
        write(frame [,callback]) Write a CAN frame to the port. Create the frame using `new CANFrame()`. Frames are read using callback specified when opening the port.

        CANRxChannel

        Type: CANRxChannel

        Script class for CAN Rx (receive) channel (obtain via ecu.canRxSetup.getChannel(n)).

        Properties

        PropertyDescription
        messageCount Get the number of CAN channels available for this setup.

        Methods

        MethodDescription
        findMessageByID(id) Find the message slot with the given CAN ID, returns -1 if not found. For extended IDs, bitwise OR the ID with 0x80000000. Returns -1 if not found.
        findUnusedMessage([start_index]) Find the first unused message slot, starting from the given index (default 0). Returns -1 if no unused message slot is found.
        getMessage(index) Get the CAN Rx Message Slot (0-based).

        CANRxMessage

        Type: CANRxMessage

        Script class for CAN Rx (receive) message slot (obtain via ecu.canRxSetup.getChannel(n).getMessage(x)).

        Properties

        PropertyDescription
        idMaskRaw Get/Set the 'raw' CAN ID mask of the message. For extended IDs, bitwise OR the ID with 0x80000000.
        idRaw Get/Set the 'raw' CAN ID of the message. For extended IDs, bitwise OR the ID with 0x80000000.
        index Get the index of this message within the list of messages for the channel.
        isExtended Get/Set the 'extended' flag of the message. If true, the ID is an extended ID (29 bits), otherwise it is a standard ID (11 bits).
        isExtendedMask Get/Set the 'extended mask' flag of the message. If true, the ID mask is an extended mask (29 bits), otherwise it is a standard mask (11 bits).
        isUnused Returns true if the message is unused, i.e. any of the received data slot channels are not referenced by any ECU options.
        isUsed Returns true if the message is used, i.e. any of the received data slot channels are referenced by any ECU options.
        slotCount Get the number of slots in the message, typically 16-bit per channel - see slotSize.
        slotSize Get the size of each slot in the message, in bytes. Typically 2 bytes per slot (16-bits).
        usedByRevision Get the revision number of the 'used by' state, useful; for lazy evaluation where it may be expensive to traverse the 'used by' list on all unrelated calibration changes.

        Methods

        MethodDescription
        getSlotChannel(index) Get the channel (of type EcuChannel) for the given slot index (0-based). Returns null if no channel is assigned.
        getSlotUsedBy(index) Get the list of ECU options that use the given slot index (0-based) in this message. Returns an empty array if no options use the slot.
        getUsedBy() Get the list of ECU options that reference any slots within this message. Returns an empty array if no options use the message.

        CANRxSetup

        Type: CANRxSetup

        Script class for CAN Rx (receive) setup (obtain via ecu.canRxSetup).

        Properties

        PropertyDescription
        channelCount Get the number of CAN channels available for this setup.

        Methods

        MethodDescription
        getChannel(index) Get the CAN channel (0-based, i.e. 0 is CAN1), of type CANRxChannel.

        Ecu

        Type: Ecu

        Represents the ECU.

        Properties

        PropertyDescription
        canRxSetup Return CANRxSetup object
        commsOpsPerSec Performance metric: Number of comms operations performed per second. Averaged.
        currentBaudRate Get/Set the current baud-rate for the connected ECU. Only applicable if the port in use supports changing the baudrate (e.g works for serial ports but not for ethernet ECUs).
        def The EcuDefinition (ECU definition) object used by the ECU.
        gin [deprecated] Alias of def property.
        isConnected Indicates if the application is currently connected to an ECU.

        Methods

        MethodDescription
        analogChannel(channel) Get the given indexed analog input channel.
        category(name) Find a EcuCategory with the given name. Returns null if not found. The search is case insensitive and also checks 'old names'.
        channel(name) Find a EcuChannel with the given name. Returns null if not found. The search is case insensitive and also checks 'old names'.
        channelTable(name) Find a EcuChannelTable with the given name. Returns null if not found. The search is case insensitive and also checks 'old names'.
        clearFileSetting(key)

        Clears the setting for the given key, stored in the calibration file

        commitCalibration() [deprecated] Alias of storeChanges.
        connect() Connects to an ECU using the currently configured port settings.
        disconnect() Closes the connection to the ECU (if connected).
        ecuString(name) Find a EcuString with the given name. Returns null if not found. The search is case insensitive and also checks 'old names'.
        getFileSetting(key[, default_value])

        Get the value of an arbitrary setting, stored in the calibration file.

        Note that these values are only stored in calibration files and not in the ECU itself. The setting will only be rerievable if the calibration file is matchs to the ECU following connect

        Keys are separated by forward slashes, e.g. "custom/area/my_setting".

        Returns 'default_value' if given, or 'undefined', if the setting does not exist.

        For custom settings, to avoid conflicts with application settings, prefix the setting with a unique string.

        For example, if you have a setting called "my_setting", prefix it with "my_prefix/" to give "my_prefix/my_setting".

        isWritePending() Determine if any queued writes to the ECU are pending.
        isWritePending(address, size) Determine if a queued write to the given address range is pending.
        logMap(name) Find a EcuLogMap with the given name. Returns null if not found. The search is case insensitive and also checks 'old names'.
        logMapTarget(name) Find a EcuLogMapTarget with the given name. Returns null if not found. The search is case insensitive and also checks 'old names'.
        map(name) Find a EcuMap with the given name. Returns null if not found. The search is case insensitive and also checks 'old names'.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        option(name) Find a EcuOption with the given name. Returns null if not found. The search is case insensitive and also checks 'old names'.
        region(name) Find a EcuRegion with the given name. Returns null if not found. The search is case insensitive and also checks 'old names'.
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; ecu.on("scalingChanged", callback); view.removeListener("scalingChanged", callback);
        setFileSetting(key, value)

        Set the value of a arbitrary setting, stored in the calibration file.

        Note that these values are only stored in calibration files and not in the ECU itself. The setting will only be rerievable if the calibration file is matchs to the ECU following connect

        Returns true if the setting was changed, or false if the setting already had the given value.

        For custom settings, to avoid conflicts with application settings, prefix the setting with a unique string.

        For example, if you have a setting called "my_setting", prefix it with "my_prefix/" to give "my_prefix/my_setting".

        storeChanges() Store changes in the ECU to non-volatile memory.
        table(name) Find a EcuTable with the given name. Returns null if not found. The search is case insensitive and also checks 'old names'.
        userScalar(name) Find a EcuUserScalar with the given name. Returns null if not found. The search is case insensitive and also checks 'old names'.
        waitForEEDone([timeout]) Wait for the 'EE' busy condition to complete following storeChanges call.
        waitForWritesDone([timeout]) Wait for any write commands issued to the ECU to complete.

        Events

        EventDescription
        calReset

        Called when calibration file was reset (e.g. following loading of a calibration file).

        External scripts can bind to the 'calReset' event to be notified when the value changes.

        ecu.on("calReset", function() { ... });

        change

        Called when any calibration / measurement (channel) value was changed.

        External scripts can bind to the 'change' event to be notified when the value changes.

        ecu.on("change", function() { ... });

        changed

        Alias of "change" event. Originally the only event was "change" but the documentation was ambiguous.

        changed_cal

        Called when a calibration (non measurement) value was changed.

        External scripts can bind to the 'changed_cal' event to be notified when the value changes.

        ecu.on("changed_cal", function() { ... });

        changed_cal_details(details)

        Called when a calibration (non measurement) value was changed.

        External scripts can bind to the 'changed_cal_details' event to be notified when the value changes.

        ecu.on("changed_cal_details", function(details) { ... });

        'details' is an array of arrays of the form:

        [ [ size, address, address_extension ], ... ]

        address_extension is used by XCP ECUs and will be omitted if 0

        changed_details(details)

        Called when any calibration / measurement (channel) value was changed.

        External scripts can bind to the 'changed_details' event to be notified when the value changes.

        ecu.on("changed_details", function(details) { ... });

        'details' is an array of arrays of the form:

        [ [ size, address, address_extension ], ... ]

        address_extension is used by XCP ECUs and will be omitted if 0

        changed_logmap

        Called when a logmap value was changed.

        External scripts can bind to the 'changed_logmap' event to be notified when the value changes.

        ecu.on("changed_logmap", function(name, x, y) { ... });

        changed_volatile

        Called when a volatile/measurement (non calibration) value was changed.

        External scripts can bind to the 'changed_volatile' event to be notified when the value changes.

        ecu.on("changed_volatile", function() { ... });

        changed_volatile_details(details)

        Called when a volatile/measurement (non calibration) value was changed.

        External scripts can bind to the 'changed_volatile_details' event to be notified when the value changes.

        ecu.on("changed_volatile_details", function(details) { ... });

        'details' is an array of arrays of the form:

        [ [ size, address, address_extension ], ... ]

        address_extension is used by XCP ECUs and will be omitted if 0

        commsStatusChanged(state)

        Called when the ECU Comms status changed (e.g. went online / offline / error state.

        External scripts can bind to the 'commsStatusChanged' event to be notified when the value changes.

        ecu.on("commsStatusChanged", function(state) { ... });

        'state' is an object with the following boolean properties:

        • active
        • connecting
        • identified
        • secured
        • errors
        • offline

        dynamicNamesChanged

        Called when any item names were changed. Some calibration items names are based upon calibration values.

        External scripts can bind to the 'dynamicNamesChanged' event to be notified when the event occurs.

        ecu.on("dynamicNamesChanged", function() { ... });

        scalingChanged

        Called when scaling factors (user scalars / display units) were changed.

        External scripts can bind to the 'scalingChanged' event to be notified when the value changes.

        ecu.on("scalingChanged", function() { ... });

        EcuDefinition

        Type: EcuDefinition

        Represents the ECU Definition File and provides access to structures in the ECU such as EcuMap, EcuTable, EcuOption, EcuChannel.

        Related Types

        Properties

        PropertyDescription
        calNameSize Length of the calibration name structure.
        canWriteWords Indicates if the ECU supports writes larger than single byte writes.
        categories EcuItemCollection of all EcuCategory objects.
        channelCount Number of EcuChannel objects.
        channelTableCount Number of EcuChannelTable objects.
        channels EcuItemCollection of all EcuChannel objects.
        channeltables EcuItemCollection of all EcuChannel objects.
        ecustrings EcuItemCollection of all EcuString objects.
        enumerationCount Number of 'EcuEnumeration' objects.
        fileName The path of the installed ECU Definition file on the file system.
        fullName The full name of the ECU (same as def.name + def.version)
        isBigEndian Indicates if the ECU uses 'big endian' values.
        isSecurable Indicates if the ECU can have a password set.
        logMapCount Number of EcuLogMap objects.
        logbufferSize Size of the LOGTBL structure used for fast channel reads.
        logmaps EcuItemCollection of all EcuLogMap objects.
        logmaptargets EcuItemCollection of all EcuLogMapTarget objects.
        mapCount Number of EcuMap objects.
        maps EcuItemCollection of all EcuMap objects.
        name The name of the ECU (e.g. 'EVO X '), for non-XCP ECUs this is always 8 characters long and padded with spaces.
        optionCount Number of EcuOption objects.
        optionListCount [deprecated] Alias of enumerationCount.
        options EcuItemCollection of all EcuOption objects.
        parameterCount [deprecated] Alias of channelCount.
        parameterTableCount [deprecated] Alias of channelTableCount.
        parameters [deprecated] alias of channels
        regionCount Number of EcuRegion objects.
        regions EcuItemCollection of all EcuRegion objects.
        stringCount Number of EcuString objects.
        tableCount Number of EcuTable objects.
        tables EcuItemCollection of all EcuTable objects.
        userScalarCount Number of EcuUserScalar objects.
        userscalars EcuItemCollection of all EcuUserScalar objects.
        usesNewModifiers Legacy flag relating to Modifier EcuChannels.
        version The version of the ECU (e.g. '01v00')

        Subsections of EcuDefinition

        EcuCategory

        Type: EcuCategory

        Extends EcuItemIndexed

        Script class for Category objects in the ECU Definition file.

        Categories define logical groupings of objects that derive from EcuItemIndexed.

        Properties

        PropertyDescription
        axes Array of the object's axes, elements are of type EcuItem.
        axisCount The number of axes this object has (0 for options/channels, 1 for tables, 2 for maps).
        description Description text for the object, normally displayed in the Descriptions view.
        isConvertibleToReal 'true' if the value of this object has a conversion from raw (internal) to real (physical).
        name The name of the object - e.g. 'Fuel' for the Fuel Map.
        outputValue Interpolated output value. For tables / maps this is the linearly interpolated value at the current axes position. For options / channels this is the current value.
        siteCount The total number of sites in the object.
        typeName The internal type name of the object - e.g. 'Table' or 'Map'.
        units The physical units of 'real' values in the object.
        dependencyCount Number of sub-object dependencies.
        displayIdentifier Display Identifier of this item.
        ginIndex Index of this item within the EcuItemCollection for the object type in ECU Definition.
        identifier Identifier of this item.
        isIgnoredInCompareAndConvert 'true' if this object is not used in Compare / Convert Calibration operations, typically because it is aliased with another value at the same address.
        longIdentifier Long Identifier of this item.
        displayName The category Display Name
        parentIndex The index of the parent Category.

        Methods

        MethodDescription
        getAttribute(name) Get value of attribute with the given name
        getAxisChannel(index) Get the channel (if any) for the given axis of the object.
        getAxisPosition(index) Get the floating point position for the current input channel value for the given axis of the object.
        getRaw(axes) Get the raw (internal) value at the specified site. 'axes' is an array of the [x,y] site in the object. Can be omitted for objects without axes (e.g. Options). The array can be passed inline - e.g. getRaw({2, 4}).
        getReal(axes) Get the real (scaled to physical units) value at the specified site.
        getString(axes) Get a textual representation of the value at the specified site.
        getText(axes) Get a textual representation of the value at the specified site. Alias of getString.
        hasAttribute(name) Determine of object has an attribute with the given name
        rawFromReal(value, axes) Convert a real value to a raw value, given the scaling function for the site specified by 'axes'.
        realFromRaw(value, axes) Convert a raw value to a real value, given the scaling function for the site specified by 'axes'.
        rescale(multiplier, offset) Rescale the real value of all sites in the object by the given multiplier and offset.
        setRaw(value, axes) Set the raw (internal) value at the specified site.
        setReal(value, axes) Set the real (scaled to physical units) value at the specified site.
        setString(value, axes) Set the textual value at the specified site.
        setText(value, axes) Set the textual value at the specified site. Alias of setString.

        EcuChannel

        Type: EcuChannel

        Extends EcuObjectScaled

        Script class for Channel objects in the ECU Definition file.

        Channels are single-valued (scalar) measurements.

        Properties

        PropertyDescription
        axes Array of the object's axes, elements are of type EcuItem.
        axisCount The number of axes this object has (0 for options/channels, 1 for tables, 2 for maps).
        description Description text for the object, normally displayed in the Descriptions view.
        isConvertibleToReal 'true' if the value of this object has a conversion from raw (internal) to real (physical).
        name The name of the object - e.g. 'Fuel' for the Fuel Map.
        outputValue Interpolated output value. For tables / maps this is the linearly interpolated value at the current axes position. For options / channels this is the current value.
        siteCount The total number of sites in the object.
        typeName The internal type name of the object - e.g. 'Table' or 'Map'.
        units The physical units of 'real' values in the object.
        dependencyCount Number of sub-object dependencies.
        displayIdentifier Display Identifier of this item.
        ginIndex Index of this item within the EcuItemCollection for the object type in ECU Definition.
        identifier Identifier of this item.
        isIgnoredInCompareAndConvert 'true' if this object is not used in Compare / Convert Calibration operations, typically because it is aliased with another value at the same address.
        longIdentifier Long Identifier of this item.
        address Address of the object within the calibration data.
        elementSizeBytes Number of bytes occupied by each individual site in the object.
        hasEnumeration 'true' if the object has an Enumeration list (named discrete values).
        isBit 'true' if the object corresponds to a single bit (e.g. an on/off Option).
        isReadOnly 'true' if the value of the object may only be read and not written.
        isSigned 'true' if the raw value is signed (2's complement).
        maxRaw Maximum raw (ECU internal) value.
        maxReal Maximum real (scaled in physical units) value
        minRaw Minimum raw (ECU internal) value.
        minReal Minimum real (scaled in physical units) value
        profileCount Number of 'profiles' defined for this object.
        c offset in object scaling y = mx + c.
        hasFunctionTable 'true' if the object is scaled via a static function table (lookup table).
        hasUserScalar 'true' if the object is scaled by a UserScalar.
        isCommCode 'true' if the object can hold the address of a channel.
        isFloatingPoint 'true' if the object value can be displayed with a decimal point.
        isFloatingPointRaw 'true' if the object value can be displayed with a decimal point (does not take into account user scalars).
        isMasked 'true' if the object has a bit mask.
        isReciprocal 'true' if the scaling function is a reciprocal rather than y= mx + c.
        m multiplier in object scaling y = mx + c.
        mask Bitmask value. Due to limitations of JavaScript, this may be ill-defined for 64bit values.
        maximum maximum value of the object.
        minimum minimum value of the object.
        raw Get/set the raw value of the Channel (ECU internal units).
        real

        Get/set the real value of the Channel (scaled in physical units).

        tip:

        Alias of the 'value' property

        text Get/set the textual (string) value of the Channel.
        value Get/set the real value of the Channel (scaled in physical units). tip:

        Alias of the 'real' property

        Methods

        MethodDescription
        getAttribute(name) Get value of attribute with the given name
        getAxisChannel(index) Get the channel (if any) for the given axis of the object.
        getAxisPosition(index) Get the floating point position for the current input channel value for the given axis of the object.
        getRaw(axes) Get the raw (internal) value at the specified site. 'axes' is an array of the [x,y] site in the object. Can be omitted for objects without axes (e.g. Options). The array can be passed inline - e.g. getRaw({2, 4}).
        getReal(axes) Get the real (scaled to physical units) value at the specified site.
        getString(axes) Get a textual representation of the value at the specified site.
        getText(axes) Get a textual representation of the value at the specified site. Alias of getString.
        hasAttribute(name) Determine of object has an attribute with the given name
        rawFromReal(value, axes) Convert a real value to a raw value, given the scaling function for the site specified by 'axes'.
        realFromRaw(value, axes) Convert a raw value to a real value, given the scaling function for the site specified by 'axes'.
        rescale(multiplier, offset) Rescale the real value of all sites in the object by the given multiplier and offset.
        setRaw(value, axes) Set the raw (internal) value at the specified site.
        setReal(value, axes) Set the real (scaled to physical units) value at the specified site.
        setString(value, axes) Set the textual value at the specified site.
        setText(value, axes) Set the textual value at the specified site. Alias of setString.

        EcuChannelTable

        Type: EcuChannelTable

        Extends EcuObjectScaled

        Script class for ChannelTable objects in the ECU Definition file.

        EcuChannelTables are a vector of EcuChannel objects.

        Properties

        PropertyDescription
        axes Array of the object's axes, elements are of type EcuItem.
        axisCount The number of axes this object has (0 for options/channels, 1 for tables, 2 for maps).
        description Description text for the object, normally displayed in the Descriptions view.
        isConvertibleToReal 'true' if the value of this object has a conversion from raw (internal) to real (physical).
        name The name of the object - e.g. 'Fuel' for the Fuel Map.
        outputValue Interpolated output value. For tables / maps this is the linearly interpolated value at the current axes position. For options / channels this is the current value.
        siteCount The total number of sites in the object.
        typeName The internal type name of the object - e.g. 'Table' or 'Map'.
        units The physical units of 'real' values in the object.
        dependencyCount Number of sub-object dependencies.
        displayIdentifier Display Identifier of this item.
        ginIndex Index of this item within the EcuItemCollection for the object type in ECU Definition.
        identifier Identifier of this item.
        isIgnoredInCompareAndConvert 'true' if this object is not used in Compare / Convert Calibration operations, typically because it is aliased with another value at the same address.
        longIdentifier Long Identifier of this item.
        address Address of the object within the calibration data.
        elementSizeBytes Number of bytes occupied by each individual site in the object.
        hasEnumeration 'true' if the object has an Enumeration list (named discrete values).
        isBit 'true' if the object corresponds to a single bit (e.g. an on/off Option).
        isReadOnly 'true' if the value of the object may only be read and not written.
        isSigned 'true' if the raw value is signed (2's complement).
        maxRaw Maximum raw (ECU internal) value.
        maxReal Maximum real (scaled in physical units) value
        minRaw Minimum raw (ECU internal) value.
        minReal Minimum real (scaled in physical units) value
        profileCount Number of 'profiles' defined for this object.
        c offset in object scaling y = mx + c.
        hasFunctionTable 'true' if the object is scaled via a static function table (lookup table).
        hasUserScalar 'true' if the object is scaled by a UserScalar.
        isCommCode 'true' if the object can hold the address of a channel.
        isFloatingPoint 'true' if the object value can be displayed with a decimal point.
        isFloatingPointRaw 'true' if the object value can be displayed with a decimal point (does not take into account user scalars).
        isMasked 'true' if the object has a bit mask.
        isReciprocal 'true' if the scaling function is a reciprocal rather than y= mx + c.
        m multiplier in object scaling y = mx + c.
        mask Bitmask value. Due to limitations of JavaScript, this may be ill-defined for 64bit values.
        maximum maximum value of the object.
        minimum minimum value of the object.

        Methods

        MethodDescription
        getAttribute(name) Get value of attribute with the given name
        getAxisChannel(index) Get the channel (if any) for the given axis of the object.
        getAxisPosition(index) Get the floating point position for the current input channel value for the given axis of the object.
        getRaw(axes) Get the raw (internal) value at the specified site. 'axes' is an array of the [x,y] site in the object. Can be omitted for objects without axes (e.g. Options). The array can be passed inline - e.g. getRaw({2, 4}).
        getReal(axes) Get the real (scaled to physical units) value at the specified site.
        getString(axes) Get a textual representation of the value at the specified site.
        getText(axes) Get a textual representation of the value at the specified site. Alias of getString.
        hasAttribute(name) Determine of object has an attribute with the given name
        rawFromReal(value, axes) Convert a real value to a raw value, given the scaling function for the site specified by 'axes'.
        realFromRaw(value, axes) Convert a raw value to a real value, given the scaling function for the site specified by 'axes'.
        rescale(multiplier, offset) Rescale the real value of all sites in the object by the given multiplier and offset.
        setRaw(value, axes) Set the raw (internal) value at the specified site.
        setReal(value, axes) Set the real (scaled to physical units) value at the specified site.
        setString(value, axes) Set the textual value at the specified site.
        setText(value, axes) Set the textual value at the specified site. Alias of setString.

        EcuItem

        Type: EcuItem

        Base class for all ECU Definition objects.

        Properties

        PropertyDescription
        axes Array of the object's axes, elements are of type EcuItem.
        axisCount The number of axes this object has (0 for options/channels, 1 for tables, 2 for maps).
        description Description text for the object, normally displayed in the Descriptions view.
        isConvertibleToReal 'true' if the value of this object has a conversion from raw (internal) to real (physical).
        name The name of the object - e.g. 'Fuel' for the Fuel Map.
        outputValue Interpolated output value. For tables / maps this is the linearly interpolated value at the current axes position. For options / channels this is the current value.
        siteCount The total number of sites in the object.
        typeName The internal type name of the object - e.g. 'Table' or 'Map'.
        units The physical units of 'real' values in the object.

        Methods

        MethodDescription
        getAttribute(name) Get value of attribute with the given name
        getAxisChannel(index) Get the channel (if any) for the given axis of the object.
        getAxisPosition(index) Get the floating point position for the current input channel value for the given axis of the object.
        getRaw(axes) Get the raw (internal) value at the specified site. 'axes' is an array of the [x,y] site in the object. Can be omitted for objects without axes (e.g. Options). The array can be passed inline - e.g. getRaw({2, 4}).
        getReal(axes) Get the real (scaled to physical units) value at the specified site.
        getString(axes) Get a textual representation of the value at the specified site.
        getText(axes) Get a textual representation of the value at the specified site. Alias of getString.
        hasAttribute(name) Determine of object has an attribute with the given name
        rawFromReal(value, axes) Convert a real value to a raw value, given the scaling function for the site specified by 'axes'.
        realFromRaw(value, axes) Convert a raw value to a real value, given the scaling function for the site specified by 'axes'.
        rescale(multiplier, offset) Rescale the real value of all sites in the object by the given multiplier and offset.
        setRaw(value, axes) Set the raw (internal) value at the specified site.
        setReal(value, axes) Set the real (scaled to physical units) value at the specified site.
        setString(value, axes) Set the textual value at the specified site.
        setText(value, axes) Set the textual value at the specified site. Alias of setString.

        EcuItemCollection

        Type: EcuItemCollection

        Various items such as Table / Map / Option / Channel stored in Gin or Ecu are within EcuItemCollections.

        Properties

        PropertyDescription
        length The number of items in the collection.

        Methods

        MethodDescription
        at(index) Get the object at the given index. e.g. gin.maps.at(0) returns the first item in the collection.
        find(name) Find the sub object with the given name. e.g. gin.maps.find('fuel'). The search is case-insensitive.
        indexOf(object) Given an object that is stored in the collection, return its index.

        EcuItemIndexed

        Type: EcuItemIndexed

        Extends EcuItem

        Base class for some ECU Definition objects.

        Properties

        PropertyDescription
        axes Array of the object's axes, elements are of type EcuItem.
        axisCount The number of axes this object has (0 for options/channels, 1 for tables, 2 for maps).
        description Description text for the object, normally displayed in the Descriptions view.
        isConvertibleToReal 'true' if the value of this object has a conversion from raw (internal) to real (physical).
        name The name of the object - e.g. 'Fuel' for the Fuel Map.
        outputValue Interpolated output value. For tables / maps this is the linearly interpolated value at the current axes position. For options / channels this is the current value.
        siteCount The total number of sites in the object.
        typeName The internal type name of the object - e.g. 'Table' or 'Map'.
        units The physical units of 'real' values in the object.
        dependencyCount Number of sub-object dependencies.
        displayIdentifier Display Identifier of this item.
        ginIndex Index of this item within the EcuItemCollection for the object type in ECU Definition.
        identifier Identifier of this item.
        isIgnoredInCompareAndConvert 'true' if this object is not used in Compare / Convert Calibration operations, typically because it is aliased with another value at the same address.
        longIdentifier Long Identifier of this item.

        Methods

        MethodDescription
        getAttribute(name) Get value of attribute with the given name
        getAxisChannel(index) Get the channel (if any) for the given axis of the object.
        getAxisPosition(index) Get the floating point position for the current input channel value for the given axis of the object.
        getRaw(axes) Get the raw (internal) value at the specified site. 'axes' is an array of the [x,y] site in the object. Can be omitted for objects without axes (e.g. Options). The array can be passed inline - e.g. getRaw({2, 4}).
        getReal(axes) Get the real (scaled to physical units) value at the specified site.
        getString(axes) Get a textual representation of the value at the specified site.
        getText(axes) Get a textual representation of the value at the specified site. Alias of getString.
        hasAttribute(name) Determine of object has an attribute with the given name
        rawFromReal(value, axes) Convert a real value to a raw value, given the scaling function for the site specified by 'axes'.
        realFromRaw(value, axes) Convert a raw value to a real value, given the scaling function for the site specified by 'axes'.
        rescale(multiplier, offset) Rescale the real value of all sites in the object by the given multiplier and offset.
        setRaw(value, axes) Set the raw (internal) value at the specified site.
        setReal(value, axes) Set the real (scaled to physical units) value at the specified site.
        setString(value, axes) Set the textual value at the specified site.
        setText(value, axes) Set the textual value at the specified site. Alias of setString.

        EcuLogMap

        Type: EcuLogMap

        Extends EcuItemIndexed

        Script class for LogMap objects in the ECU Definition file.

        LogMaps are multi-valued objects with a two axes (matrix) and store the recorded value of a channel within their sites.

        The values are stored on the PC, not the ECU.

        Properties

        PropertyDescription
        axes Array of the object's axes, elements are of type EcuItem.
        axisCount The number of axes this object has (0 for options/channels, 1 for tables, 2 for maps).
        description Description text for the object, normally displayed in the Descriptions view.
        isConvertibleToReal 'true' if the value of this object has a conversion from raw (internal) to real (physical).
        name The name of the object - e.g. 'Fuel' for the Fuel Map.
        outputValue Interpolated output value. For tables / maps this is the linearly interpolated value at the current axes position. For options / channels this is the current value.
        siteCount The total number of sites in the object.
        typeName The internal type name of the object - e.g. 'Table' or 'Map'.
        units The physical units of 'real' values in the object.
        dependencyCount Number of sub-object dependencies.
        displayIdentifier Display Identifier of this item.
        ginIndex Index of this item within the EcuItemCollection for the object type in ECU Definition.
        identifier Identifier of this item.
        isIgnoredInCompareAndConvert 'true' if this object is not used in Compare / Convert Calibration operations, typically because it is aliased with another value at the same address.
        longIdentifier Long Identifier of this item.

        Methods

        MethodDescription
        getAttribute(name) Get value of attribute with the given name
        getAxisChannel(index) Get the channel (if any) for the given axis of the object.
        getAxisPosition(index) Get the floating point position for the current input channel value for the given axis of the object.
        getRaw(axes) Get the raw (internal) value at the specified site. 'axes' is an array of the [x,y] site in the object. Can be omitted for objects without axes (e.g. Options). The array can be passed inline - e.g. getRaw({2, 4}).
        getReal(axes) Get the real (scaled to physical units) value at the specified site.
        getString(axes) Get a textual representation of the value at the specified site.
        getText(axes) Get a textual representation of the value at the specified site. Alias of getString.
        hasAttribute(name) Determine of object has an attribute with the given name
        rawFromReal(value, axes) Convert a real value to a raw value, given the scaling function for the site specified by 'axes'.
        realFromRaw(value, axes) Convert a raw value to a real value, given the scaling function for the site specified by 'axes'.
        rescale(multiplier, offset) Rescale the real value of all sites in the object by the given multiplier and offset.
        setRaw(value, axes) Set the raw (internal) value at the specified site.
        setReal(value, axes) Set the real (scaled to physical units) value at the specified site.
        setString(value, axes) Set the textual value at the specified site.
        setText(value, axes) Set the textual value at the specified site. Alias of setString.

        EcuLogMapTarget

        Type: EcuLogMapTarget

        Extends EcuItemIndexed

        Script class for LogMapTarget objects in the ECU Definition file.

        LogMapTargets are multi-valued objects with two axes (matrix) and store the calibration target value of a channel within their sites.

        The values are stored on the PC, not the ECU.

        Properties

        PropertyDescription
        axes Array of the object's axes, elements are of type EcuItem.
        axisCount The number of axes this object has (0 for options/channels, 1 for tables, 2 for maps).
        description Description text for the object, normally displayed in the Descriptions view.
        isConvertibleToReal 'true' if the value of this object has a conversion from raw (internal) to real (physical).
        name The name of the object - e.g. 'Fuel' for the Fuel Map.
        outputValue Interpolated output value. For tables / maps this is the linearly interpolated value at the current axes position. For options / channels this is the current value.
        siteCount The total number of sites in the object.
        typeName The internal type name of the object - e.g. 'Table' or 'Map'.
        units The physical units of 'real' values in the object.
        dependencyCount Number of sub-object dependencies.
        displayIdentifier Display Identifier of this item.
        ginIndex Index of this item within the EcuItemCollection for the object type in ECU Definition.
        identifier Identifier of this item.
        isIgnoredInCompareAndConvert 'true' if this object is not used in Compare / Convert Calibration operations, typically because it is aliased with another value at the same address.
        longIdentifier Long Identifier of this item.

        Methods

        MethodDescription
        getAttribute(name) Get value of attribute with the given name
        getAxisChannel(index) Get the channel (if any) for the given axis of the object.
        getAxisPosition(index) Get the floating point position for the current input channel value for the given axis of the object.
        getRaw(axes) Get the raw (internal) value at the specified site. 'axes' is an array of the [x,y] site in the object. Can be omitted for objects without axes (e.g. Options). The array can be passed inline - e.g. getRaw({2, 4}).
        getReal(axes) Get the real (scaled to physical units) value at the specified site.
        getString(axes) Get a textual representation of the value at the specified site.
        getText(axes) Get a textual representation of the value at the specified site. Alias of getString.
        hasAttribute(name) Determine of object has an attribute with the given name
        rawFromReal(value, axes) Convert a real value to a raw value, given the scaling function for the site specified by 'axes'.
        realFromRaw(value, axes) Convert a raw value to a real value, given the scaling function for the site specified by 'axes'.
        rescale(multiplier, offset) Rescale the real value of all sites in the object by the given multiplier and offset.
        setRaw(value, axes) Set the raw (internal) value at the specified site.
        setReal(value, axes) Set the real (scaled to physical units) value at the specified site.
        setString(value, axes) Set the textual value at the specified site.
        setText(value, axes) Set the textual value at the specified site. Alias of setString.

        EcuMap

        Type: EcuMap

        Extends EcuObjectScaled

        Script class for Map objects in the ECU Definition file.

        Maps are multi-valued objects with two axes (matrix).

        Properties

        PropertyDescription
        axes Array of the object's axes, elements are of type EcuItem.
        axisCount The number of axes this object has (0 for options/channels, 1 for tables, 2 for maps).
        description Description text for the object, normally displayed in the Descriptions view.
        isConvertibleToReal 'true' if the value of this object has a conversion from raw (internal) to real (physical).
        name The name of the object - e.g. 'Fuel' for the Fuel Map.
        outputValue Interpolated output value. For tables / maps this is the linearly interpolated value at the current axes position. For options / channels this is the current value.
        siteCount The total number of sites in the object.
        typeName The internal type name of the object - e.g. 'Table' or 'Map'.
        units The physical units of 'real' values in the object.
        dependencyCount Number of sub-object dependencies.
        displayIdentifier Display Identifier of this item.
        ginIndex Index of this item within the EcuItemCollection for the object type in ECU Definition.
        identifier Identifier of this item.
        isIgnoredInCompareAndConvert 'true' if this object is not used in Compare / Convert Calibration operations, typically because it is aliased with another value at the same address.
        longIdentifier Long Identifier of this item.
        address Address of the object within the calibration data.
        elementSizeBytes Number of bytes occupied by each individual site in the object.
        hasEnumeration 'true' if the object has an Enumeration list (named discrete values).
        isBit 'true' if the object corresponds to a single bit (e.g. an on/off Option).
        isReadOnly 'true' if the value of the object may only be read and not written.
        isSigned 'true' if the raw value is signed (2's complement).
        maxRaw Maximum raw (ECU internal) value.
        maxReal Maximum real (scaled in physical units) value
        minRaw Minimum raw (ECU internal) value.
        minReal Minimum real (scaled in physical units) value
        profileCount Number of 'profiles' defined for this object.
        c offset in object scaling y = mx + c.
        hasFunctionTable 'true' if the object is scaled via a static function table (lookup table).
        hasUserScalar 'true' if the object is scaled by a UserScalar.
        isCommCode 'true' if the object can hold the address of a channel.
        isFloatingPoint 'true' if the object value can be displayed with a decimal point.
        isFloatingPointRaw 'true' if the object value can be displayed with a decimal point (does not take into account user scalars).
        isMasked 'true' if the object has a bit mask.
        isReciprocal 'true' if the scaling function is a reciprocal rather than y= mx + c.
        m multiplier in object scaling y = mx + c.
        mask Bitmask value. Due to limitations of JavaScript, this may be ill-defined for 64bit values.
        maximum maximum value of the object.
        minimum minimum value of the object.

        Methods

        MethodDescription
        getAttribute(name) Get value of attribute with the given name
        getAxisChannel(index) Get the channel (if any) for the given axis of the object.
        getAxisPosition(index) Get the floating point position for the current input channel value for the given axis of the object.
        getRaw(axes) Get the raw (internal) value at the specified site. 'axes' is an array of the [x,y] site in the object. Can be omitted for objects without axes (e.g. Options). The array can be passed inline - e.g. getRaw({2, 4}).
        getReal(axes) Get the real (scaled to physical units) value at the specified site.
        getString(axes) Get a textual representation of the value at the specified site.
        getText(axes) Get a textual representation of the value at the specified site. Alias of getString.
        hasAttribute(name) Determine of object has an attribute with the given name
        rawFromReal(value, axes) Convert a real value to a raw value, given the scaling function for the site specified by 'axes'.
        realFromRaw(value, axes) Convert a raw value to a real value, given the scaling function for the site specified by 'axes'.
        rescale(multiplier, offset) Rescale the real value of all sites in the object by the given multiplier and offset.
        setRaw(value, axes) Set the raw (internal) value at the specified site.
        setReal(value, axes) Set the real (scaled to physical units) value at the specified site.
        setString(value, axes) Set the textual value at the specified site.
        setText(value, axes) Set the textual value at the specified site. Alias of setString.

        EcuObject

        Type: EcuObject

        Extends EcuItemIndexed

        Base class for some ECU Definition objects.

        Properties

        PropertyDescription
        axes Array of the object's axes, elements are of type EcuItem.
        axisCount The number of axes this object has (0 for options/channels, 1 for tables, 2 for maps).
        description Description text for the object, normally displayed in the Descriptions view.
        isConvertibleToReal 'true' if the value of this object has a conversion from raw (internal) to real (physical).
        name The name of the object - e.g. 'Fuel' for the Fuel Map.
        outputValue Interpolated output value. For tables / maps this is the linearly interpolated value at the current axes position. For options / channels this is the current value.
        siteCount The total number of sites in the object.
        typeName The internal type name of the object - e.g. 'Table' or 'Map'.
        units The physical units of 'real' values in the object.
        dependencyCount Number of sub-object dependencies.
        displayIdentifier Display Identifier of this item.
        ginIndex Index of this item within the EcuItemCollection for the object type in ECU Definition.
        identifier Identifier of this item.
        isIgnoredInCompareAndConvert 'true' if this object is not used in Compare / Convert Calibration operations, typically because it is aliased with another value at the same address.
        longIdentifier Long Identifier of this item.
        address Address of the object within the calibration data.
        elementSizeBytes Number of bytes occupied by each individual site in the object.
        hasEnumeration 'true' if the object has an Enumeration list (named discrete values).
        isBit 'true' if the object corresponds to a single bit (e.g. an on/off Option).
        isReadOnly 'true' if the value of the object may only be read and not written.
        isSigned 'true' if the raw value is signed (2's complement).
        maxRaw Maximum raw (ECU internal) value.
        maxReal Maximum real (scaled in physical units) value
        minRaw Minimum raw (ECU internal) value.
        minReal Minimum real (scaled in physical units) value
        profileCount Number of 'profiles' defined for this object.

        Methods

        MethodDescription
        getAttribute(name) Get value of attribute with the given name
        getAxisChannel(index) Get the channel (if any) for the given axis of the object.
        getAxisPosition(index) Get the floating point position for the current input channel value for the given axis of the object.
        getRaw(axes) Get the raw (internal) value at the specified site. 'axes' is an array of the [x,y] site in the object. Can be omitted for objects without axes (e.g. Options). The array can be passed inline - e.g. getRaw({2, 4}).
        getReal(axes) Get the real (scaled to physical units) value at the specified site.
        getString(axes) Get a textual representation of the value at the specified site.
        getText(axes) Get a textual representation of the value at the specified site. Alias of getString.
        hasAttribute(name) Determine of object has an attribute with the given name
        rawFromReal(value, axes) Convert a real value to a raw value, given the scaling function for the site specified by 'axes'.
        realFromRaw(value, axes) Convert a raw value to a real value, given the scaling function for the site specified by 'axes'.
        rescale(multiplier, offset) Rescale the real value of all sites in the object by the given multiplier and offset.
        setRaw(value, axes) Set the raw (internal) value at the specified site.
        setReal(value, axes) Set the real (scaled to physical units) value at the specified site.
        setString(value, axes) Set the textual value at the specified site.
        setText(value, axes) Set the textual value at the specified site. Alias of setString.

        EcuObjectScaled

        Type: EcuObjectScaled

        Extends EcuObject

        Base class for some ECU Definition objects.

        Properties

        PropertyDescription
        axes Array of the object's axes, elements are of type EcuItem.
        axisCount The number of axes this object has (0 for options/channels, 1 for tables, 2 for maps).
        description Description text for the object, normally displayed in the Descriptions view.
        isConvertibleToReal 'true' if the value of this object has a conversion from raw (internal) to real (physical).
        name The name of the object - e.g. 'Fuel' for the Fuel Map.
        outputValue Interpolated output value. For tables / maps this is the linearly interpolated value at the current axes position. For options / channels this is the current value.
        siteCount The total number of sites in the object.
        typeName The internal type name of the object - e.g. 'Table' or 'Map'.
        units The physical units of 'real' values in the object.
        dependencyCount Number of sub-object dependencies.
        displayIdentifier Display Identifier of this item.
        ginIndex Index of this item within the EcuItemCollection for the object type in ECU Definition.
        identifier Identifier of this item.
        isIgnoredInCompareAndConvert 'true' if this object is not used in Compare / Convert Calibration operations, typically because it is aliased with another value at the same address.
        longIdentifier Long Identifier of this item.
        address Address of the object within the calibration data.
        elementSizeBytes Number of bytes occupied by each individual site in the object.
        hasEnumeration 'true' if the object has an Enumeration list (named discrete values).
        isBit 'true' if the object corresponds to a single bit (e.g. an on/off Option).
        isReadOnly 'true' if the value of the object may only be read and not written.
        isSigned 'true' if the raw value is signed (2's complement).
        maxRaw Maximum raw (ECU internal) value.
        maxReal Maximum real (scaled in physical units) value
        minRaw Minimum raw (ECU internal) value.
        minReal Minimum real (scaled in physical units) value
        profileCount Number of 'profiles' defined for this object.
        c offset in object scaling y = mx + c.
        hasFunctionTable 'true' if the object is scaled via a static function table (lookup table).
        hasUserScalar 'true' if the object is scaled by a UserScalar.
        isCommCode 'true' if the object can hold the address of a channel.
        isFloatingPoint 'true' if the object value can be displayed with a decimal point.
        isFloatingPointRaw 'true' if the object value can be displayed with a decimal point (does not take into account user scalars).
        isMasked 'true' if the object has a bit mask.
        isReciprocal 'true' if the scaling function is a reciprocal rather than y= mx + c.
        m multiplier in object scaling y = mx + c.
        mask Bitmask value. Due to limitations of JavaScript, this may be ill-defined for 64bit values.
        maximum maximum value of the object.
        minimum minimum value of the object.

        Methods

        MethodDescription
        getAttribute(name) Get value of attribute with the given name
        getAxisChannel(index) Get the channel (if any) for the given axis of the object.
        getAxisPosition(index) Get the floating point position for the current input channel value for the given axis of the object.
        getRaw(axes) Get the raw (internal) value at the specified site. 'axes' is an array of the [x,y] site in the object. Can be omitted for objects without axes (e.g. Options). The array can be passed inline - e.g. getRaw({2, 4}).
        getReal(axes) Get the real (scaled to physical units) value at the specified site.
        getString(axes) Get a textual representation of the value at the specified site.
        getText(axes) Get a textual representation of the value at the specified site. Alias of getString.
        hasAttribute(name) Determine of object has an attribute with the given name
        rawFromReal(value, axes) Convert a real value to a raw value, given the scaling function for the site specified by 'axes'.
        realFromRaw(value, axes) Convert a raw value to a real value, given the scaling function for the site specified by 'axes'.
        rescale(multiplier, offset) Rescale the real value of all sites in the object by the given multiplier and offset.
        setRaw(value, axes) Set the raw (internal) value at the specified site.
        setReal(value, axes) Set the real (scaled to physical units) value at the specified site.
        setString(value, axes) Set the textual value at the specified site.
        setText(value, axes) Set the textual value at the specified site. Alias of setString.

        EcuOption

        Type: EcuOption

        Extends EcuObjectScaled

        Script class for Option objects in the ECU Definition file.

        Options are single-valued (scalar) calibration values.

        Properties

        PropertyDescription
        axes Array of the object's axes, elements are of type EcuItem.
        axisCount The number of axes this object has (0 for options/channels, 1 for tables, 2 for maps).
        description Description text for the object, normally displayed in the Descriptions view.
        isConvertibleToReal 'true' if the value of this object has a conversion from raw (internal) to real (physical).
        name The name of the object - e.g. 'Fuel' for the Fuel Map.
        outputValue Interpolated output value. For tables / maps this is the linearly interpolated value at the current axes position. For options / channels this is the current value.
        siteCount The total number of sites in the object.
        typeName The internal type name of the object - e.g. 'Table' or 'Map'.
        units The physical units of 'real' values in the object.
        dependencyCount Number of sub-object dependencies.
        displayIdentifier Display Identifier of this item.
        ginIndex Index of this item within the EcuItemCollection for the object type in ECU Definition.
        identifier Identifier of this item.
        isIgnoredInCompareAndConvert 'true' if this object is not used in Compare / Convert Calibration operations, typically because it is aliased with another value at the same address.
        longIdentifier Long Identifier of this item.
        address Address of the object within the calibration data.
        elementSizeBytes Number of bytes occupied by each individual site in the object.
        hasEnumeration 'true' if the object has an Enumeration list (named discrete values).
        isBit 'true' if the object corresponds to a single bit (e.g. an on/off Option).
        isReadOnly 'true' if the value of the object may only be read and not written.
        isSigned 'true' if the raw value is signed (2's complement).
        maxRaw Maximum raw (ECU internal) value.
        maxReal Maximum real (scaled in physical units) value
        minRaw Minimum raw (ECU internal) value.
        minReal Minimum real (scaled in physical units) value
        profileCount Number of 'profiles' defined for this object.
        c offset in object scaling y = mx + c.
        hasFunctionTable 'true' if the object is scaled via a static function table (lookup table).
        hasUserScalar 'true' if the object is scaled by a UserScalar.
        isCommCode 'true' if the object can hold the address of a channel.
        isFloatingPoint 'true' if the object value can be displayed with a decimal point.
        isFloatingPointRaw 'true' if the object value can be displayed with a decimal point (does not take into account user scalars).
        isMasked 'true' if the object has a bit mask.
        isReciprocal 'true' if the scaling function is a reciprocal rather than y= mx + c.
        m multiplier in object scaling y = mx + c.
        mask Bitmask value. Due to limitations of JavaScript, this may be ill-defined for 64bit values.
        maximum maximum value of the object.
        minimum minimum value of the object.
        raw Get/set the raw value of the Option (ECU internal units).
        real

        Get/set the real value of the Option (scaled in physical units).

        tip:

        Alias of the 'value' property

        text Get/set the textual (string) value of the Option.
        value Get/set the real value of the Option (scaled in physical units). tip:

        Alias of the 'real' property

        Methods

        MethodDescription
        getAttribute(name) Get value of attribute with the given name
        getAxisChannel(index) Get the channel (if any) for the given axis of the object.
        getAxisPosition(index) Get the floating point position for the current input channel value for the given axis of the object.
        getRaw(axes) Get the raw (internal) value at the specified site. 'axes' is an array of the [x,y] site in the object. Can be omitted for objects without axes (e.g. Options). The array can be passed inline - e.g. getRaw({2, 4}).
        getReal(axes) Get the real (scaled to physical units) value at the specified site.
        getString(axes) Get a textual representation of the value at the specified site.
        getText(axes) Get a textual representation of the value at the specified site. Alias of getString.
        hasAttribute(name) Determine of object has an attribute with the given name
        rawFromReal(value, axes) Convert a real value to a raw value, given the scaling function for the site specified by 'axes'.
        realFromRaw(value, axes) Convert a raw value to a real value, given the scaling function for the site specified by 'axes'.
        rescale(multiplier, offset) Rescale the real value of all sites in the object by the given multiplier and offset.
        setRaw(value, axes) Set the raw (internal) value at the specified site.
        setReal(value, axes) Set the real (scaled to physical units) value at the specified site.
        setString(value, axes) Set the textual value at the specified site.
        setText(value, axes) Set the textual value at the specified site. Alias of setString.
        getComcodeChannel()

        For options that select a channel, dereference to find the pointed-to channel.

        EcuRegion

        Type: EcuRegion

        Extends EcuItemIndexed

        Script class for Region objects in the ECU Definition file.

        Regions define memory regions within the ECU.

        Properties

        PropertyDescription
        axes Array of the object's axes, elements are of type EcuItem.
        axisCount The number of axes this object has (0 for options/channels, 1 for tables, 2 for maps).
        description Description text for the object, normally displayed in the Descriptions view.
        isConvertibleToReal 'true' if the value of this object has a conversion from raw (internal) to real (physical).
        name The name of the object - e.g. 'Fuel' for the Fuel Map.
        outputValue Interpolated output value. For tables / maps this is the linearly interpolated value at the current axes position. For options / channels this is the current value.
        siteCount The total number of sites in the object.
        typeName The internal type name of the object - e.g. 'Table' or 'Map'.
        units The physical units of 'real' values in the object.
        dependencyCount Number of sub-object dependencies.
        displayIdentifier Display Identifier of this item.
        ginIndex Index of this item within the EcuItemCollection for the object type in ECU Definition.
        identifier Identifier of this item.
        isIgnoredInCompareAndConvert 'true' if this object is not used in Compare / Convert Calibration operations, typically because it is aliased with another value at the same address.
        longIdentifier Long Identifier of this item.

        Methods

        MethodDescription
        getAttribute(name) Get value of attribute with the given name
        getAxisChannel(index) Get the channel (if any) for the given axis of the object.
        getAxisPosition(index) Get the floating point position for the current input channel value for the given axis of the object.
        getRaw(axes) Get the raw (internal) value at the specified site. 'axes' is an array of the [x,y] site in the object. Can be omitted for objects without axes (e.g. Options). The array can be passed inline - e.g. getRaw({2, 4}).
        getReal(axes) Get the real (scaled to physical units) value at the specified site.
        getString(axes) Get a textual representation of the value at the specified site.
        getText(axes) Get a textual representation of the value at the specified site. Alias of getString.
        hasAttribute(name) Determine of object has an attribute with the given name
        rawFromReal(value, axes) Convert a real value to a raw value, given the scaling function for the site specified by 'axes'.
        realFromRaw(value, axes) Convert a raw value to a real value, given the scaling function for the site specified by 'axes'.
        rescale(multiplier, offset) Rescale the real value of all sites in the object by the given multiplier and offset.
        setRaw(value, axes) Set the raw (internal) value at the specified site.
        setReal(value, axes) Set the real (scaled to physical units) value at the specified site.
        setString(value, axes) Set the textual value at the specified site.
        setText(value, axes) Set the textual value at the specified site. Alias of setString.

        EcuString

        Type: EcuString

        Extends EcuObject

        Script class for EcuString objects in the ECU Definition file.

        EcuStrings are multi-valued objects with a single dimension (vector) and typically contain a short text string.

        Properties

        PropertyDescription
        axes Array of the object's axes, elements are of type EcuItem.
        axisCount The number of axes this object has (0 for options/channels, 1 for tables, 2 for maps).
        description Description text for the object, normally displayed in the Descriptions view.
        isConvertibleToReal 'true' if the value of this object has a conversion from raw (internal) to real (physical).
        name The name of the object - e.g. 'Fuel' for the Fuel Map.
        outputValue Interpolated output value. For tables / maps this is the linearly interpolated value at the current axes position. For options / channels this is the current value.
        siteCount The total number of sites in the object.
        typeName The internal type name of the object - e.g. 'Table' or 'Map'.
        units The physical units of 'real' values in the object.
        dependencyCount Number of sub-object dependencies.
        displayIdentifier Display Identifier of this item.
        ginIndex Index of this item within the EcuItemCollection for the object type in ECU Definition.
        identifier Identifier of this item.
        isIgnoredInCompareAndConvert 'true' if this object is not used in Compare / Convert Calibration operations, typically because it is aliased with another value at the same address.
        longIdentifier Long Identifier of this item.
        address Address of the object within the calibration data.
        elementSizeBytes Number of bytes occupied by each individual site in the object.
        hasEnumeration 'true' if the object has an Enumeration list (named discrete values).
        isBit 'true' if the object corresponds to a single bit (e.g. an on/off Option).
        isReadOnly 'true' if the value of the object may only be read and not written.
        isSigned 'true' if the raw value is signed (2's complement).
        maxRaw Maximum raw (ECU internal) value.
        maxReal Maximum real (scaled in physical units) value
        minRaw Minimum raw (ECU internal) value.
        minReal Minimum real (scaled in physical units) value
        profileCount Number of 'profiles' defined for this object.

        Methods

        MethodDescription
        getAttribute(name) Get value of attribute with the given name
        getAxisChannel(index) Get the channel (if any) for the given axis of the object.
        getAxisPosition(index) Get the floating point position for the current input channel value for the given axis of the object.
        getRaw(axes) Get the raw (internal) value at the specified site. 'axes' is an array of the [x,y] site in the object. Can be omitted for objects without axes (e.g. Options). The array can be passed inline - e.g. getRaw({2, 4}).
        getReal(axes) Get the real (scaled to physical units) value at the specified site.
        getString(axes) Get a textual representation of the value at the specified site.
        getText(axes) Get a textual representation of the value at the specified site. Alias of getString.
        hasAttribute(name) Determine of object has an attribute with the given name
        rawFromReal(value, axes) Convert a real value to a raw value, given the scaling function for the site specified by 'axes'.
        realFromRaw(value, axes) Convert a raw value to a real value, given the scaling function for the site specified by 'axes'.
        rescale(multiplier, offset) Rescale the real value of all sites in the object by the given multiplier and offset.
        setRaw(value, axes) Set the raw (internal) value at the specified site.
        setReal(value, axes) Set the real (scaled to physical units) value at the specified site.
        setString(value, axes) Set the textual value at the specified site.
        setText(value, axes) Set the textual value at the specified site. Alias of setString.

        EcuTable

        Type: EcuTable

        Extends EcuObjectScaled

        Script class for Table objects in the ECU Definition file.

        Tables are multi-valued objects with a single axis (vector).

        Properties

        PropertyDescription
        axes Array of the object's axes, elements are of type EcuItem.
        axisCount The number of axes this object has (0 for options/channels, 1 for tables, 2 for maps).
        description Description text for the object, normally displayed in the Descriptions view.
        isConvertibleToReal 'true' if the value of this object has a conversion from raw (internal) to real (physical).
        name The name of the object - e.g. 'Fuel' for the Fuel Map.
        outputValue Interpolated output value. For tables / maps this is the linearly interpolated value at the current axes position. For options / channels this is the current value.
        siteCount The total number of sites in the object.
        typeName The internal type name of the object - e.g. 'Table' or 'Map'.
        units The physical units of 'real' values in the object.
        dependencyCount Number of sub-object dependencies.
        displayIdentifier Display Identifier of this item.
        ginIndex Index of this item within the EcuItemCollection for the object type in ECU Definition.
        identifier Identifier of this item.
        isIgnoredInCompareAndConvert 'true' if this object is not used in Compare / Convert Calibration operations, typically because it is aliased with another value at the same address.
        longIdentifier Long Identifier of this item.
        address Address of the object within the calibration data.
        elementSizeBytes Number of bytes occupied by each individual site in the object.
        hasEnumeration 'true' if the object has an Enumeration list (named discrete values).
        isBit 'true' if the object corresponds to a single bit (e.g. an on/off Option).
        isReadOnly 'true' if the value of the object may only be read and not written.
        isSigned 'true' if the raw value is signed (2's complement).
        maxRaw Maximum raw (ECU internal) value.
        maxReal Maximum real (scaled in physical units) value
        minRaw Minimum raw (ECU internal) value.
        minReal Minimum real (scaled in physical units) value
        profileCount Number of 'profiles' defined for this object.
        c offset in object scaling y = mx + c.
        hasFunctionTable 'true' if the object is scaled via a static function table (lookup table).
        hasUserScalar 'true' if the object is scaled by a UserScalar.
        isCommCode 'true' if the object can hold the address of a channel.
        isFloatingPoint 'true' if the object value can be displayed with a decimal point.
        isFloatingPointRaw 'true' if the object value can be displayed with a decimal point (does not take into account user scalars).
        isMasked 'true' if the object has a bit mask.
        isReciprocal 'true' if the scaling function is a reciprocal rather than y= mx + c.
        m multiplier in object scaling y = mx + c.
        mask Bitmask value. Due to limitations of JavaScript, this may be ill-defined for 64bit values.
        maximum maximum value of the object.
        minimum minimum value of the object.

        Methods

        MethodDescription
        getAttribute(name) Get value of attribute with the given name
        getAxisChannel(index) Get the channel (if any) for the given axis of the object.
        getAxisPosition(index) Get the floating point position for the current input channel value for the given axis of the object.
        getRaw(axes) Get the raw (internal) value at the specified site. 'axes' is an array of the [x,y] site in the object. Can be omitted for objects without axes (e.g. Options). The array can be passed inline - e.g. getRaw({2, 4}).
        getReal(axes) Get the real (scaled to physical units) value at the specified site.
        getString(axes) Get a textual representation of the value at the specified site.
        getText(axes) Get a textual representation of the value at the specified site. Alias of getString.
        hasAttribute(name) Determine of object has an attribute with the given name
        rawFromReal(value, axes) Convert a real value to a raw value, given the scaling function for the site specified by 'axes'.
        realFromRaw(value, axes) Convert a raw value to a real value, given the scaling function for the site specified by 'axes'.
        rescale(multiplier, offset) Rescale the real value of all sites in the object by the given multiplier and offset.
        setRaw(value, axes) Set the raw (internal) value at the specified site.
        setReal(value, axes) Set the real (scaled to physical units) value at the specified site.
        setString(value, axes) Set the textual value at the specified site.
        setText(value, axes) Set the textual value at the specified site. Alias of setString.

        EcuUserScalar

        Type: EcuUserScalar

        Extends EcuItemIndexed

        Script class for UserScalar ECU Definition objects.

        UserScalars define alternative units and scaling for EcuObjectScaled derived objects.

        Scaling can potentially be variable, via EcuOptions, depending upon the UserScalar definition

        Properties

        PropertyDescription
        axes Array of the object's axes, elements are of type EcuItem.
        axisCount The number of axes this object has (0 for options/channels, 1 for tables, 2 for maps).
        description Description text for the object, normally displayed in the Descriptions view.
        isConvertibleToReal 'true' if the value of this object has a conversion from raw (internal) to real (physical).
        name The name of the object - e.g. 'Fuel' for the Fuel Map.
        outputValue Interpolated output value. For tables / maps this is the linearly interpolated value at the current axes position. For options / channels this is the current value.
        siteCount The total number of sites in the object.
        typeName The internal type name of the object - e.g. 'Table' or 'Map'.
        units The physical units of 'real' values in the object.
        dependencyCount Number of sub-object dependencies.
        displayIdentifier Display Identifier of this item.
        ginIndex Index of this item within the EcuItemCollection for the object type in ECU Definition.
        identifier Identifier of this item.
        isIgnoredInCompareAndConvert 'true' if this object is not used in Compare / Convert Calibration operations, typically because it is aliased with another value at the same address.
        longIdentifier Long Identifier of this item.
        c offset in object scaling y = mx + c.
        isFloatingPoint 'true' if the object value is be displayed with a decimal point.
        m multiplier in object scaling y = mx + c.

        Methods

        MethodDescription
        getAttribute(name) Get value of attribute with the given name
        getAxisChannel(index) Get the channel (if any) for the given axis of the object.
        getAxisPosition(index) Get the floating point position for the current input channel value for the given axis of the object.
        getRaw(axes) Get the raw (internal) value at the specified site. 'axes' is an array of the [x,y] site in the object. Can be omitted for objects without axes (e.g. Options). The array can be passed inline - e.g. getRaw({2, 4}).
        getReal(axes) Get the real (scaled to physical units) value at the specified site.
        getString(axes) Get a textual representation of the value at the specified site.
        getText(axes) Get a textual representation of the value at the specified site. Alias of getString.
        hasAttribute(name) Determine of object has an attribute with the given name
        rawFromReal(value, axes) Convert a real value to a raw value, given the scaling function for the site specified by 'axes'.
        realFromRaw(value, axes) Convert a raw value to a real value, given the scaling function for the site specified by 'axes'.
        rescale(multiplier, offset) Rescale the real value of all sites in the object by the given multiplier and offset.
        setRaw(value, axes) Set the raw (internal) value at the specified site.
        setReal(value, axes) Set the real (scaled to physical units) value at the specified site.
        setString(value, axes) Set the textual value at the specified site.
        setText(value, axes) Set the textual value at the specified site. Alias of setString.
        apply(value [, axes])

        Apply the user scalar's scaling function to the given value at the [optional] site position.

        Some scalars are not the same for different sites (for example the duty cycle scalar on the fuel map). Such scalars are rare and in most cases the axes argument can be omitted.

        applyInverse(value [, axes])

        The inverse function of 'apply'.

        View

        Type: View

        Script class for View types.

        Related Types

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.

        Subsections of View

        AspectSelector

        Type: AspectSelector

        Extends View

        Script class of the AspectSelector view.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.
        index Change the current selection of the AspectSelector view.

        View Properties

        Properties defined by the view that are normally editable via properties editor.

        PropertyNameDescription
        title Title The title of the window.
        id Script ID The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
        tooltip Tool Tip Window tool tip.
        display_units_text Display Units Show units after the number on the view.
        display_units_label Display Units (Label) Show units after the label on the view.
        prefix_text Prefix Text Text to display before the value.
        postfix_text Postfix Text Text to display after the value.
        limits Limits Set up alarm limits for this gauge.
        show_value Show Value
        show_label Show Label
        label_font Label Font
        value_font Value Font
        value_height_percent Value Height % A value of zero disables auto font size fitting if Value Height Max is set
        value_height_max_dp Value Height Max [dp] Maximum font height of the value text, in device pixels
        label_height_percent Label Height %
        label_height_max_dp Label Height Max [dp] Maximum font height of the label, in device pixels
        label_text Label Text
        label_align Label Align
        label_valign Label Vertical Align
        value_align Value Align
        value_valign Value Vertical Align
        low_limit_text Low Limit Text
        high_limit_text High Limit Text
        value_text Value Override Text
        max_length_text Max length Text Leave blank for auto
        bg_colour Background Background colour
        text_colour Text Text colour
        alarm_low_bg_colour Alarm Low Background Alarm Lower Limit Background colour
        alarm_low_text_colour Alarm Low Text Alarm Lower Limit Text colour
        alarm_high_bg_colour Alarm High Background Alarm Upper Limit Background colour
        alarm_high_text_colour Alarm High Text Alarm Upper Limit Text colour
        parameter Input Value The source of the value that will be displayed by the gauge.
        update_rate Update Rate Rate at which the input value is requested from the ECU.
        decimal_places Decimal Places Set to -1 for auto

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.

        Events

        EventDescription
        afterApply()

        Event raised after the AspectSelector value is applied on selection change.

        Note that the callback is called within an active undo-scope + calibration update scope.

        External scripts can bind to the 'afterApply' event to be notified.

        view.on("afterApply", function() { ... });

        beforeApply()

        Event raised before the AspectSelector value is applied on selection change.

        Note that the callback is called within an active undo-scope + calibration update scope.

        External scripts can bind to the 'beforeApply' event to be notified.

        view.on("beforeApply", function() { ... });

        change(index)

        Event raised after the AspectSelector selection changed / was applied.

        External scripts can bind to the 'change' event to be notified.

        view.on("change", function(index, value) { ... });

        Button

        Type: Button

        Extends View

        Script class of the Button view.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.
        text Get/Set the text of the Button view.

        View Properties

        Properties defined by the view that are normally editable via properties editor.

        PropertyNameDescription
        title Title The title of the window.
        id Script ID The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
        tooltip Tool Tip Window tool tip.
        display_units_text Display Units Show units after the number on the view.
        display_units_label Display Units (Label) Show units after the label on the view.
        prefix_text Prefix Text Text to display before the value.
        postfix_text Postfix Text Text to display after the value.
        limits Limits Set up alarm limits for this gauge.
        show_value Show Value
        show_label Show Label
        label_font Label Font
        value_font Value Font
        value_height_percent Value Height % A value of zero disables auto font size fitting if Value Height Max is set
        value_height_max_dp Value Height Max [dp] Maximum font height of the value text, in device pixels
        label_height_percent Label Height %
        label_height_max_dp Label Height Max [dp] Maximum font height of the label, in device pixels
        label_text Label Text
        label_align Label Align
        label_valign Label Vertical Align
        value_align Value Align
        value_valign Value Vertical Align
        low_limit_text Low Limit Text
        high_limit_text High Limit Text
        value_text Value Override Text
        max_length_text Max length Text Leave blank for auto
        bg_colour Background Background colour
        text_colour Text Text colour
        alarm_low_bg_colour Alarm Low Background Alarm Lower Limit Background colour
        alarm_low_text_colour Alarm Low Text Alarm Lower Limit Text colour
        alarm_high_bg_colour Alarm High Background Alarm Upper Limit Background colour
        alarm_high_text_colour Alarm High Text Alarm Upper Limit Text colour
        parameter Input Value The source of the value that will be displayed by the gauge.
        update_rate Update Rate Rate at which the input value is requested from the ECU.
        decimal_places Decimal Places Set to -1 for auto

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.

        Events

        EventDescription
        onClick()

        Called in Button scripts when the user clicked the Button.

        External scripts can bind to the 'click' event to be notified when the user clicks the Button.

        button.on("click", function() { ... });

        CheckableView

        Type: CheckableView

        Extends View

        Script class of the CheckableView.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.
        checked Get/Set the check state of the CheckableView view.
        text Get/Set the text of the CheckableView view.
        value Get/Set the check state of the CheckableView view. Synonymous with 'checked'

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.

        Events

        EventDescription
        checked()

        Called when the view changed to the checked state.

        External scripts can bind to the 'checked' event to be notified.

        view.on("checked", function() { ... });

        onClick(checked)

        Called in CheckableView scripts when the user clicked the CheckableView.

        External scripts can bind to the 'click' event to be notified when the user clicks the Button.

        view.on("click", function(checked) { ... });

        The checked parameter is the new state of the CheckableView.

        The 'click' event is emitted when the user clicked the control.

        onGetValue() Gets the value that should be displayed by the CheckableView. Accesses to channels and options are tracked automatically, so changes to those values will cause onGetValue to be called again.
        onSetValue(checked)

        Called whenever the CheckableView state changes either through clicking or by another script setting the checked property.

        External scripts can bind to the 'change' event to be notified when the user clicks the Button.

        view.on("change", function(checked) { ... });

        The checked parameter is the new state of the CheckableView.

        The 'change' event is emitted when the checked state changes either through clicking or by another script setting the checked property.

        unchecked()

        Called when the view changed to the unchecked state.

        External scripts can bind to the 'unchecked' event to be notified.

        view.on("unchecked", function() { ... });

        CheckBox

        Type: CheckBox

        Extends CheckableView

        Script class of the Check Box view.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.
        checked Get/Set the check state of the CheckableView view.
        text Get/Set the text of the CheckableView view.
        value Get/Set the check state of the CheckableView view. Synonymous with 'checked'

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.

        Events

        EventDescription
        checked()

        Called when the view changed to the checked state.

        External scripts can bind to the 'checked' event to be notified.

        view.on("checked", function() { ... });

        onClick(checked)

        Called in CheckableView scripts when the user clicked the CheckableView.

        External scripts can bind to the 'click' event to be notified when the user clicks the Button.

        view.on("click", function(checked) { ... });

        The checked parameter is the new state of the CheckableView.

        The 'click' event is emitted when the user clicked the control.

        onGetValue() Gets the value that should be displayed by the CheckableView. Accesses to channels and options are tracked automatically, so changes to those values will cause onGetValue to be called again.
        onSetValue(checked)

        Called whenever the CheckableView state changes either through clicking or by another script setting the checked property.

        External scripts can bind to the 'change' event to be notified when the user clicks the Button.

        view.on("change", function(checked) { ... });

        The checked parameter is the new state of the CheckableView.

        The 'change' event is emitted when the checked state changes either through clicking or by another script setting the checked property.

        unchecked()

        Called when the view changed to the unchecked state.

        External scripts can bind to the 'unchecked' event to be notified.

        view.on("unchecked", function() { ... });

        ComboBox

        Type: ComboBox

        Extends View

        Script class of the ComboBox view.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.
        index Change the current selection of the ComboBox view.
        items Set the list of items in the ComboBox. Expects an array of objects. Objects must have the property 'text'.

        View Properties

        Properties defined by the view that are normally editable via properties editor.

        PropertyNameDescription
        title Title The title of the window.
        id Script ID The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
        tooltip Tool Tip Window tool tip.
        display_units_text Display Units Show units after the number on the view.
        display_units_label Display Units (Label) Show units after the label on the view.
        prefix_text Prefix Text Text to display before the value.
        postfix_text Postfix Text Text to display after the value.
        limits Limits Set up alarm limits for this gauge.
        show_value Show Value
        show_label Show Label
        label_font Label Font
        value_font Value Font
        value_height_percent Value Height % A value of zero disables auto font size fitting if Value Height Max is set
        value_height_max_dp Value Height Max [dp] Maximum font height of the value text, in device pixels
        label_height_percent Label Height %
        label_height_max_dp Label Height Max [dp] Maximum font height of the label, in device pixels
        label_text Label Text
        label_align Label Align
        label_valign Label Vertical Align
        value_align Value Align
        value_valign Value Vertical Align
        low_limit_text Low Limit Text
        high_limit_text High Limit Text
        value_text Value Override Text
        max_length_text Max length Text Leave blank for auto
        bg_colour Background Background colour
        text_colour Text Text colour
        alarm_low_bg_colour Alarm Low Background Alarm Lower Limit Background colour
        alarm_low_text_colour Alarm Low Text Alarm Lower Limit Text colour
        alarm_high_bg_colour Alarm High Background Alarm Upper Limit Background colour
        alarm_high_text_colour Alarm High Text Alarm Upper Limit Text colour
        parameter Input Value The source of the value that will be displayed by the gauge.
        update_rate Update Rate Rate at which the input value is requested from the ECU.
        decimal_places Decimal Places Set to -1 for auto

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.
        getItem(index) Get item at the given index

        Events

        EventDescription
        change(index, value)

        Event raised when the combobox selection changed.

        External scripts can bind to the 'change' event to be notified.

        view.on("change", function(index, value) { ... });

        Dial

        Type: Dial

        Extends View

        Script class of the Dial view.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.
        value Get/Set the value of the dial.

        View Properties

        Properties defined by the view that are normally editable via properties editor.

        PropertyNameDescription
        title Title The title of the window.
        id Script ID The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
        tooltip Tool Tip Window tool tip.
        display_units_text Display Units Show units after the number on the view.
        display_units_label Display Units (Label) Show units after the label on the view.
        prefix_text Prefix Text Text to display before the value.
        postfix_text Postfix Text Text to display after the value.
        limits Limits Set up alarm limits for this gauge.
        show_value Show Value
        show_label Show Label
        label_font Label Font
        value_font Value Font
        value_height_percent Value Height % A value of zero disables auto font size fitting if Value Height Max is set
        value_height_max_dp Value Height Max [dp] Maximum font height of the value text, in device pixels
        label_height_percent Label Height %
        label_height_max_dp Label Height Max [dp] Maximum font height of the label, in device pixels
        label_text Label Text
        label_align Label Align
        label_valign Label Vertical Align
        value_align Value Align
        value_valign Value Vertical Align
        low_limit_text Low Limit Text
        high_limit_text High Limit Text
        value_text Value Override Text
        max_length_text Max length Text Leave blank for auto
        bg_colour Background Background colour
        text_colour Text Text colour
        alarm_low_bg_colour Alarm Low Background Alarm Lower Limit Background colour
        alarm_low_text_colour Alarm Low Text Alarm Lower Limit Text colour
        alarm_high_bg_colour Alarm High Background Alarm Upper Limit Background colour
        alarm_high_text_colour Alarm High Text Alarm Upper Limit Text colour
        parameter Input Value The source of the value that will be displayed by the gauge.
        update_rate Update Rate Rate at which the input value is requested from the ECU.
        decimal_places Decimal Places Set to -1 for auto

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.
        program() For Modifier Channels, the program button will apply the modification to the related Map / Table.

        Events

        EventDescription
        onProgramButton()

        Called in when the Dial 'program' button (of available) is clicked.

        External scripts can bind to the 'program' event to be notified when this event occurs.

        view.on("program", function(value) { ... });

        onSetValue(value)

        Called in when the Dial value has changed.

        External scripts can bind to the 'change' event to be notified when the value changes.

        view.on("change", function(value) { ... });

        GridView

        Type: GridView

        Extends View

        Script class of the GridView view.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.
        columns Get/Set the columns for the view. Note that the columns may also be set via the 'data' property.
        data Get/Set the data for the view. This may be specified as an array of rows or an object, with a 'data' property for the rows (an array). Each row is an array of objects for each cell in the row. The columns may be specified via the 'columns' property, if using an object, specified like a row. Cell objects may have any of the following properties, which may be specified as functions or values.
        • checked - For cells with checkboxes, indicates if cell should be checked. Else uses 'value'.
        • value - the value of the cell.
        • setter - function to accept value from cell editor.
        • editorOptions - If specified, the cell editor will be a drop-down with the specified values. This may be an array of values or an array of objects of the form { text: "text", value: "value" }. A function may also be specified that returns such a structure.
        • text - the text to display in the cell. value will be used if text not provided.
        • option - name or instance of an ecu.option. Many fields are populated from the object, unless overidden.
        • channel - name or instance of an ecu.channel. Many fields are populated from the object, unless overidden.
        • object - instance of an ecu object (e.g. ecu.option). Many fields are populated from the object, unless overidden.
        • description - Description text.
        • toolTip - Tool tip to show when cell is hovered.
        • statusTip - Tip to show in status bar when cell is hovered.
        • userText - User text value.
        • tag - Column tag, used for persistence of column widths.
        • icon - the icon to display in the cell.
        • iconExpanded - the icon to display in the cell if it is expanded (tree views).
        • colSpan - number of columns spanned by the cell.
        • rowSpan - number of rows spanned by the cell.
        • color - the color to display in the cell.
        • backgroundColor - the background color to display in the cell.
        • userValue - User value.
        • sortKey - If sorting the column, this value is used in preference to 'text' or 'value'
        • isSelectable - Indicates if the cell may be selected
        • isEditable - Indicates if the cell may be edited
        • isEnabled - Indicates if the cell is enabled
        • isDisabled - Indicates if the cell is disabled
        • isDefault - Indicates if the cell is a default value
        • isCheckable - Indicates if the cell is checkable (should display a checkbox)
        • isUserCheckDisabled - Indicates if the isCheckable cells checkbox may be checked/unchecked by the user
        selected Get/Set the selected sites, as a JSON string, scripts can use JSON.parse.

        View Properties

        Properties defined by the view that are normally editable via properties editor.

        PropertyNameDescription
        title Title The title of the window.
        id Script ID The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
        tooltip Tool Tip Window tool tip.
        display_units_text Display Units Show units after the number on the view.
        display_units_label Display Units (Label) Show units after the label on the view.
        prefix_text Prefix Text Text to display before the value.
        postfix_text Postfix Text Text to display after the value.
        limits Limits Set up alarm limits for this gauge.
        show_value Show Value
        show_label Show Label
        label_font Label Font
        value_font Value Font
        value_height_percent Value Height % A value of zero disables auto font size fitting if Value Height Max is set
        value_height_max_dp Value Height Max [dp] Maximum font height of the value text, in device pixels
        label_height_percent Label Height %
        label_height_max_dp Label Height Max [dp] Maximum font height of the label, in device pixels
        label_text Label Text
        label_align Label Align
        label_valign Label Vertical Align
        value_align Value Align
        value_valign Value Vertical Align
        low_limit_text Low Limit Text
        high_limit_text High Limit Text
        value_text Value Override Text
        max_length_text Max length Text Leave blank for auto
        bg_colour Background Background colour
        text_colour Text Text colour
        alarm_low_bg_colour Alarm Low Background Alarm Lower Limit Background colour
        alarm_low_text_colour Alarm Low Text Alarm Lower Limit Text colour
        alarm_high_bg_colour Alarm High Background Alarm Upper Limit Background colour
        alarm_high_text_colour Alarm High Text Alarm Upper Limit Text colour
        parameter Input Value The source of the value that will be displayed by the gauge.
        update_rate Update Rate Rate at which the input value is requested from the ECU.
        decimal_places Decimal Places Set to -1 for auto

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.
        refresh() Refresh the view, invalidating any cached values.

        Label

        Type: Label

        Extends View

        Script class of the Sequencer view.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.
        text

        Get/Set the text displayed by the label.

        Label text can include macro expansion in the form $[User Scalar Name] to display units.

        View Properties

        Properties defined by the view that are normally editable via properties editor.

        PropertyNameDescription
        title Title The title of the window.
        id Script ID The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
        tooltip Tool Tip Window tool tip.
        display_units_text Display Units Show units after the number on the view.
        display_units_label Display Units (Label) Show units after the label on the view.
        prefix_text Prefix Text Text to display before the value.
        postfix_text Postfix Text Text to display after the value.
        limits Limits Set up alarm limits for this gauge.
        show_value Show Value
        show_label Show Label
        label_font Label Font
        value_font Value Font
        value_height_percent Value Height % A value of zero disables auto font size fitting if Value Height Max is set
        value_height_max_dp Value Height Max [dp] Maximum font height of the value text, in device pixels
        label_height_percent Label Height %
        label_height_max_dp Label Height Max [dp] Maximum font height of the label, in device pixels
        label_text Label Text
        label_align Label Align
        label_valign Label Vertical Align
        value_align Value Align
        value_valign Value Vertical Align
        low_limit_text Low Limit Text
        high_limit_text High Limit Text
        value_text Value Override Text
        max_length_text Max length Text Leave blank for auto
        bg_colour Background Background colour
        text_colour Text Text colour
        alarm_low_bg_colour Alarm Low Background Alarm Lower Limit Background colour
        alarm_low_text_colour Alarm Low Text Alarm Lower Limit Text colour
        alarm_high_bg_colour Alarm High Background Alarm Upper Limit Background colour
        alarm_high_text_colour Alarm High Text Alarm Upper Limit Text colour
        parameter Input Value The source of the value that will be displayed by the gauge.
        update_rate Update Rate Rate at which the input value is requested from the ECU.
        decimal_places Decimal Places Set to -1 for auto

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.

        MultiSiteView

        Type: MultiSiteView

        Extends View

        Script class of the Multi-Site views (map/table grid/graph).

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.
        canShowCorrectionsDialog Determines if the view supports corrections dialog (e.g. Log Maps).

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.
        resetLogMapCapture() Resets Log Map capturing (if supported). This sets all the site weights in the log map to zero.
        showCorrectionsDialog() Shows the corrections dialog (if supported)

        Notes

        Type: Notes

        Extends View

        Script class of the Notes view.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.
        text Get/Set the text of the Notes view.

        View Properties

        Properties defined by the view that are normally editable via properties editor.

        PropertyNameDescription
        title Title The title of the window.
        id Script ID The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
        tooltip Tool Tip Window tool tip.
        display_units_text Display Units Show units after the number on the view.
        display_units_label Display Units (Label) Show units after the label on the view.
        prefix_text Prefix Text Text to display before the value.
        postfix_text Postfix Text Text to display after the value.
        limits Limits Set up alarm limits for this gauge.
        show_value Show Value
        show_label Show Label
        label_font Label Font
        value_font Value Font
        value_height_percent Value Height % A value of zero disables auto font size fitting if Value Height Max is set
        value_height_max_dp Value Height Max [dp] Maximum font height of the value text, in device pixels
        label_height_percent Label Height %
        label_height_max_dp Label Height Max [dp] Maximum font height of the label, in device pixels
        label_text Label Text
        label_align Label Align
        label_valign Label Vertical Align
        value_align Value Align
        value_valign Value Vertical Align
        low_limit_text Low Limit Text
        high_limit_text High Limit Text
        value_text Value Override Text
        max_length_text Max length Text Leave blank for auto
        bg_colour Background Background colour
        text_colour Text Text colour
        alarm_low_bg_colour Alarm Low Background Alarm Lower Limit Background colour
        alarm_low_text_colour Alarm Low Text Alarm Lower Limit Text colour
        alarm_high_bg_colour Alarm High Background Alarm Upper Limit Background colour
        alarm_high_text_colour Alarm High Text Alarm Upper Limit Text colour
        parameter Input Value The source of the value that will be displayed by the gauge.
        update_rate Update Rate Rate at which the input value is requested from the ECU.
        decimal_places Decimal Places Set to -1 for auto

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.

        NumberEdit

        Type: NumberEdit

        Extends View

        Script class of the Number Edit view.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.
        value Get/Set the value of the NumberEdit.

        View Properties

        Properties defined by the view that are normally editable via properties editor.

        PropertyNameDescription
        title Title The title of the window.
        id Script ID The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
        tooltip Tool Tip Window tool tip.
        display_units_text Display Units Show units after the number on the view.
        display_units_label Display Units (Label) Show units after the label on the view.
        prefix_text Prefix Text Text to display before the value.
        postfix_text Postfix Text Text to display after the value.
        limits Limits Set up alarm limits for this gauge.
        show_value Show Value
        show_label Show Label
        label_font Label Font
        value_font Value Font
        value_height_percent Value Height % A value of zero disables auto font size fitting if Value Height Max is set
        value_height_max_dp Value Height Max [dp] Maximum font height of the value text, in device pixels
        label_height_percent Label Height %
        label_height_max_dp Label Height Max [dp] Maximum font height of the label, in device pixels
        label_text Label Text
        label_align Label Align
        label_valign Label Vertical Align
        value_align Value Align
        value_valign Value Vertical Align
        low_limit_text Low Limit Text
        high_limit_text High Limit Text
        value_text Value Override Text
        max_length_text Max length Text Leave blank for auto
        bg_colour Background Background colour
        text_colour Text Text colour
        alarm_low_bg_colour Alarm Low Background Alarm Lower Limit Background colour
        alarm_low_text_colour Alarm Low Text Alarm Lower Limit Text colour
        alarm_high_bg_colour Alarm High Background Alarm Upper Limit Background colour
        alarm_high_text_colour Alarm High Text Alarm Upper Limit Text colour
        parameter Input Value The source of the value that will be displayed by the gauge.
        update_rate Update Rate Rate at which the input value is requested from the ECU.
        decimal_places Decimal Places Set to -1 for auto

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.

        Events

        EventDescription
        onSetValue(value)

        Called in when the NumberEdit value has changed.

        External scripts can bind to the 'change' event to be notified when the value changes.

        view.on("change", function(value) { ... });

        OptionEditor

        Type: OptionEditor

        Extends View

        Script class of the Number Edit view.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.
        value Get/Set the (real) value of the OptionEditor.

        View Properties

        Properties defined by the view that are normally editable via properties editor.

        PropertyNameDescription
        title Title The title of the window.
        id Script ID The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
        tooltip Tool Tip Window tool tip.
        display_units_text Display Units Show units after the number on the view.
        display_units_label Display Units (Label) Show units after the label on the view.
        prefix_text Prefix Text Text to display before the value.
        postfix_text Postfix Text Text to display after the value.
        limits Limits Set up alarm limits for this gauge.
        show_value Show Value
        show_label Show Label
        label_font Label Font
        value_font Value Font
        value_height_percent Value Height % A value of zero disables auto font size fitting if Value Height Max is set
        value_height_max_dp Value Height Max [dp] Maximum font height of the value text, in device pixels
        label_height_percent Label Height %
        label_height_max_dp Label Height Max [dp] Maximum font height of the label, in device pixels
        label_text Label Text
        label_align Label Align
        label_valign Label Vertical Align
        value_align Value Align
        value_valign Value Vertical Align
        low_limit_text Low Limit Text
        high_limit_text High Limit Text
        value_text Value Override Text
        max_length_text Max length Text Leave blank for auto
        bg_colour Background Background colour
        text_colour Text Text colour
        alarm_low_bg_colour Alarm Low Background Alarm Lower Limit Background colour
        alarm_low_text_colour Alarm Low Text Alarm Lower Limit Text colour
        alarm_high_bg_colour Alarm High Background Alarm Upper Limit Background colour
        alarm_high_text_colour Alarm High Text Alarm Upper Limit Text colour
        parameter Input Value The source of the value that will be displayed by the gauge.
        update_rate Update Rate Rate at which the input value is requested from the ECU.
        decimal_places Decimal Places Set to -1 for auto

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.

        Events

        EventDescription
        change(value)

        Called in when the OptionEditor value has changed.

        External scripts can bind to the 'change' event to be notified when the value changes.

        view.on("change", function(value) { ... });

        RadioButton

        Type: RadioButton

        Extends CheckableView

        Script class of the RadioButton view.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.
        checked Get/Set the check state of the CheckableView view.
        text Get/Set the text of the CheckableView view.
        value Get/Set the check state of the CheckableView view. Synonymous with 'checked'

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.

        Events

        EventDescription
        checked()

        Called when the view changed to the checked state.

        External scripts can bind to the 'checked' event to be notified.

        view.on("checked", function() { ... });

        onClick(checked)

        Called in CheckableView scripts when the user clicked the CheckableView.

        External scripts can bind to the 'click' event to be notified when the user clicks the Button.

        view.on("click", function(checked) { ... });

        The checked parameter is the new state of the CheckableView.

        The 'click' event is emitted when the user clicked the control.

        onGetValue() Gets the value that should be displayed by the CheckableView. Accesses to channels and options are tracked automatically, so changes to those values will cause onGetValue to be called again.
        onSetValue(checked)

        Called whenever the CheckableView state changes either through clicking or by another script setting the checked property.

        External scripts can bind to the 'change' event to be notified when the user clicks the Button.

        view.on("change", function(checked) { ... });

        The checked parameter is the new state of the CheckableView.

        The 'change' event is emitted when the checked state changes either through clicking or by another script setting the checked property.

        unchecked()

        Called when the view changed to the unchecked state.

        External scripts can bind to the 'unchecked' event to be notified.

        view.on("unchecked", function() { ... });

        Scope

        Type: Scope

        Extends View

        Script class of the Scope view.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.

        View Properties

        Properties defined by the view that are normally editable via properties editor.

        PropertyNameDescription
        title Title The title of the window.
        id Script ID The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
        tooltip Tool Tip Window tool tip.
        display_units_text Display Units Show units after the number on the view.
        display_units_label Display Units (Label) Show units after the label on the view.
        prefix_text Prefix Text Text to display before the value.
        postfix_text Postfix Text Text to display after the value.
        limits Limits Set up alarm limits for this gauge.
        show_value Show Value
        show_label Show Label
        label_font Label Font
        value_font Value Font
        value_height_percent Value Height % A value of zero disables auto font size fitting if Value Height Max is set
        value_height_max_dp Value Height Max [dp] Maximum font height of the value text, in device pixels
        label_height_percent Label Height %
        label_height_max_dp Label Height Max [dp] Maximum font height of the label, in device pixels
        label_text Label Text
        label_align Label Align
        label_valign Label Vertical Align
        value_align Value Align
        value_valign Value Vertical Align
        low_limit_text Low Limit Text
        high_limit_text High Limit Text
        value_text Value Override Text
        max_length_text Max length Text Leave blank for auto
        bg_colour Background Background colour
        text_colour Text Text colour
        alarm_low_bg_colour Alarm Low Background Alarm Lower Limit Background colour
        alarm_low_text_colour Alarm Low Text Alarm Lower Limit Text colour
        alarm_high_bg_colour Alarm High Background Alarm Upper Limit Background colour
        alarm_high_text_colour Alarm High Text Alarm Upper Limit Text colour
        parameter Input Value The source of the value that will be displayed by the gauge.
        update_rate Update Rate Rate at which the input value is requested from the ECU.
        decimal_places Decimal Places Set to -1 for auto

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.
        clear() Clear the scope data
        putData(channel, timestamp, value) Add data to the scope

        SensorCalibrationView

        Type: SensorCalibrationView

        Extends View

        Script class of the Sensor Calibration view.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.

        View Properties

        Properties defined by the view that are normally editable via properties editor.

        PropertyNameDescription
        title Title The title of the window.
        id Script ID The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
        tooltip Tool Tip Window tool tip.
        display_units_text Display Units Show units after the number on the view.
        display_units_label Display Units (Label) Show units after the label on the view.
        prefix_text Prefix Text Text to display before the value.
        postfix_text Postfix Text Text to display after the value.
        limits Limits Set up alarm limits for this gauge.
        show_value Show Value
        show_label Show Label
        label_font Label Font
        value_font Value Font
        value_height_percent Value Height % A value of zero disables auto font size fitting if Value Height Max is set
        value_height_max_dp Value Height Max [dp] Maximum font height of the value text, in device pixels
        label_height_percent Label Height %
        label_height_max_dp Label Height Max [dp] Maximum font height of the label, in device pixels
        label_text Label Text
        label_align Label Align
        label_valign Label Vertical Align
        value_align Value Align
        value_valign Value Vertical Align
        low_limit_text Low Limit Text
        high_limit_text High Limit Text
        value_text Value Override Text
        max_length_text Max length Text Leave blank for auto
        bg_colour Background Background colour
        text_colour Text Text colour
        alarm_low_bg_colour Alarm Low Background Alarm Lower Limit Background colour
        alarm_low_text_colour Alarm Low Text Alarm Lower Limit Text colour
        alarm_high_bg_colour Alarm High Background Alarm Upper Limit Background colour
        alarm_high_text_colour Alarm High Text Alarm Upper Limit Text colour
        parameter Input Value The source of the value that will be displayed by the gauge.
        update_rate Update Rate Rate at which the input value is requested from the ECU.
        decimal_places Decimal Places Set to -1 for auto

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.

        Sequencer

        Type: Sequencer

        Extends View

        Script class of the Sequencer view.

        Related Types

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.

        View Properties

        Properties defined by the view that are normally editable via properties editor.

        PropertyNameDescription
        title Title The title of the window.
        id Script ID The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
        tooltip Tool Tip Window tool tip.
        display_units_text Display Units Show units after the number on the view.
        display_units_label Display Units (Label) Show units after the label on the view.
        prefix_text Prefix Text Text to display before the value.
        postfix_text Postfix Text Text to display after the value.
        limits Limits Set up alarm limits for this gauge.
        show_value Show Value
        show_label Show Label
        label_font Label Font
        value_font Value Font
        value_height_percent Value Height % A value of zero disables auto font size fitting if Value Height Max is set
        value_height_max_dp Value Height Max [dp] Maximum font height of the value text, in device pixels
        label_height_percent Label Height %
        label_height_max_dp Label Height Max [dp] Maximum font height of the label, in device pixels
        label_text Label Text
        label_align Label Align
        label_valign Label Vertical Align
        value_align Value Align
        value_valign Value Vertical Align
        low_limit_text Low Limit Text
        high_limit_text High Limit Text
        value_text Value Override Text
        max_length_text Max length Text Leave blank for auto
        bg_colour Background Background colour
        text_colour Text Text colour
        alarm_low_bg_colour Alarm Low Background Alarm Lower Limit Background colour
        alarm_low_text_colour Alarm Low Text Alarm Lower Limit Text colour
        alarm_high_bg_colour Alarm High Background Alarm Upper Limit Background colour
        alarm_high_text_colour Alarm High Text Alarm Upper Limit Text colour
        parameter Input Value The source of the value that will be displayed by the gauge.
        update_rate Update Rate Rate at which the input value is requested from the ECU.
        decimal_places Decimal Places Set to -1 for auto

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.
        clearTrace() Clears the trace view. For long running sequences the trace window can become a performance issue.
        get(name) Get the value of a sequencer variable.
        gotoItem(name) Direct the sequencer to jump to the sequence item called 'name' once the current item completes.
        has(name) Returns 'true' if the sequencer variable has been previously defined.
        set(name, value) Set the value of a sequencer variable. The variable will be created if it does not exist.
        trace(msg) Trace a message in the info area of the sequencer window.
        unset(name) Deletes the sequencer variable. Following this, has(name) will return false.

        Subsections of Sequencer

        SequencerItem

        Type: SequencerItem

        An individual Sequencer item - represents a single step in the defined sequence.

        Methods

        MethodDescription
        getProperty(name) Get the value of a property of the sequence item (normally editable via the properties pane of the sequencer view).
        setProperty(name, value) Set the value of a property of the sequence item (normally editable via the properties pane of the sequencer view).
        trace Trace a message in the info area of the sequencer window.

        SignalGenerator

        Type: SignalGenerator

        Extends View

        Script class of the Signal Generator view.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.
        frequency Get/Set the signal generator frequency, in Hz.
        isOutputEnabled Enables/disables the output of the generator.
        numCells Get/Set the number of cells in the waveform.
        pullupResistance Get/Set the pullup resistance value, in ohms.
        waveform Get the waveform object, a table of type EcuObjectScaled. This enables editing of waveform values.

        View Properties

        Properties defined by the view that are normally editable via properties editor.

        PropertyNameDescription
        title Title The title of the window.
        id Script ID The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
        tooltip Tool Tip Window tool tip.
        display_units_text Display Units Show units after the number on the view.
        display_units_label Display Units (Label) Show units after the label on the view.
        prefix_text Prefix Text Text to display before the value.
        postfix_text Postfix Text Text to display after the value.
        limits Limits Set up alarm limits for this gauge.
        show_value Show Value
        show_label Show Label
        label_font Label Font
        value_font Value Font
        value_height_percent Value Height % A value of zero disables auto font size fitting if Value Height Max is set
        value_height_max_dp Value Height Max [dp] Maximum font height of the value text, in device pixels
        label_height_percent Label Height %
        label_height_max_dp Label Height Max [dp] Maximum font height of the label, in device pixels
        label_text Label Text
        label_align Label Align
        label_valign Label Vertical Align
        value_align Value Align
        value_valign Value Vertical Align
        low_limit_text Low Limit Text
        high_limit_text High Limit Text
        value_text Value Override Text
        max_length_text Max length Text Leave blank for auto
        bg_colour Background Background colour
        text_colour Text Text colour
        alarm_low_bg_colour Alarm Low Background Alarm Lower Limit Background colour
        alarm_low_text_colour Alarm Low Text Alarm Lower Limit Text colour
        alarm_high_bg_colour Alarm High Background Alarm Upper Limit Background colour
        alarm_high_text_colour Alarm High Text Alarm Upper Limit Text colour
        parameter Input Value The source of the value that will be displayed by the gauge.
        update_rate Update Rate Rate at which the input value is requested from the ECU.
        decimal_places Decimal Places Set to -1 for auto

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.

        Events

        EventDescription
        onFrequencyChanged()

        Called when the frequency of the generator has been changed.

        External scripts can bind to the 'frequency_changed' event to be notified when the user clicks the Button.

        view.on("frequency_changed", function(frequency) { ... });

        The frequency parameter is the new frequency of the generator, in Hz.

        ToggleButton

        Type: ToggleButton

        Extends CheckableView

        Script class of the ToggleButton view.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.
        checked Get/Set the check state of the CheckableView view.
        text Get/Set the text of the CheckableView view.
        value Get/Set the check state of the CheckableView view. Synonymous with 'checked'

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.

        Events

        EventDescription
        checked()

        Called when the view changed to the checked state.

        External scripts can bind to the 'checked' event to be notified.

        view.on("checked", function() { ... });

        onClick(checked)

        Called in CheckableView scripts when the user clicked the CheckableView.

        External scripts can bind to the 'click' event to be notified when the user clicks the Button.

        view.on("click", function(checked) { ... });

        The checked parameter is the new state of the CheckableView.

        The 'click' event is emitted when the user clicked the control.

        onGetValue() Gets the value that should be displayed by the CheckableView. Accesses to channels and options are tracked automatically, so changes to those values will cause onGetValue to be called again.
        onSetValue(checked)

        Called whenever the CheckableView state changes either through clicking or by another script setting the checked property.

        External scripts can bind to the 'change' event to be notified when the user clicks the Button.

        view.on("change", function(checked) { ... });

        The checked parameter is the new state of the CheckableView.

        The 'change' event is emitted when the checked state changes either through clicking or by another script setting the checked property.

        unchecked()

        Called when the view changed to the unchecked state.

        External scripts can bind to the 'unchecked' event to be notified.

        view.on("unchecked", function() { ... });

        UnitPreferenceView

        Type: UnitPreferenceView

        Extends View

        Script class of the UnitPreferenceView.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.
        unit Get/Set the selected unit script ID.
        unitPreference Get/Set the selected unit preference name (User Scalar)

        View Properties

        Properties defined by the view that are normally editable via properties editor.

        PropertyNameDescription
        title Title The title of the window.
        id Script ID The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
        tooltip Tool Tip Window tool tip.
        display_units_text Display Units Show units after the number on the view.
        display_units_label Display Units (Label) Show units after the label on the view.
        prefix_text Prefix Text Text to display before the value.
        postfix_text Postfix Text Text to display after the value.
        limits Limits Set up alarm limits for this gauge.
        show_value Show Value
        show_label Show Label
        label_font Label Font
        value_font Value Font
        value_height_percent Value Height % A value of zero disables auto font size fitting if Value Height Max is set
        value_height_max_dp Value Height Max [dp] Maximum font height of the value text, in device pixels
        label_height_percent Label Height %
        label_height_max_dp Label Height Max [dp] Maximum font height of the label, in device pixels
        label_text Label Text
        label_align Label Align
        label_valign Label Vertical Align
        value_align Value Align
        value_valign Value Vertical Align
        low_limit_text Low Limit Text
        high_limit_text High Limit Text
        value_text Value Override Text
        max_length_text Max length Text Leave blank for auto
        bg_colour Background Background colour
        text_colour Text Text colour
        alarm_low_bg_colour Alarm Low Background Alarm Lower Limit Background colour
        alarm_low_text_colour Alarm Low Text Alarm Lower Limit Text colour
        alarm_high_bg_colour Alarm High Background Alarm Upper Limit Background colour
        alarm_high_text_colour Alarm High Text Alarm Upper Limit Text colour
        parameter Input Value The source of the value that will be displayed by the gauge.
        update_rate Update Rate Rate at which the input value is requested from the ECU.
        decimal_places Decimal Places Set to -1 for auto

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.

        Events

        EventDescription
        change(unit)

        Called whenever the selected unit changes either through clicking or by a script setting it.

        Scripts can bind to the 'change' event to be notified when the selection changes.

        view.on("change", function(unit) { ... });

        The unit parameter is the script ID of the selected units (e.g. voltage:V)

        UnitSelector

        Type: UnitSelector

        Extends View

        Script class of the UnitSelector view.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.
        unit Get/Set the selected unit script ID.

        View Properties

        Properties defined by the view that are normally editable via properties editor.

        PropertyNameDescription
        title Title The title of the window.
        id Script ID The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
        tooltip Tool Tip Window tool tip.
        display_units_text Display Units Show units after the number on the view.
        display_units_label Display Units (Label) Show units after the label on the view.
        prefix_text Prefix Text Text to display before the value.
        postfix_text Postfix Text Text to display after the value.
        limits Limits Set up alarm limits for this gauge.
        show_value Show Value
        show_label Show Label
        label_font Label Font
        value_font Value Font
        value_height_percent Value Height % A value of zero disables auto font size fitting if Value Height Max is set
        value_height_max_dp Value Height Max [dp] Maximum font height of the value text, in device pixels
        label_height_percent Label Height %
        label_height_max_dp Label Height Max [dp] Maximum font height of the label, in device pixels
        label_text Label Text
        label_align Label Align
        label_valign Label Vertical Align
        value_align Value Align
        value_valign Value Vertical Align
        low_limit_text Low Limit Text
        high_limit_text High Limit Text
        value_text Value Override Text
        max_length_text Max length Text Leave blank for auto
        bg_colour Background Background colour
        text_colour Text Text colour
        alarm_low_bg_colour Alarm Low Background Alarm Lower Limit Background colour
        alarm_low_text_colour Alarm Low Text Alarm Lower Limit Text colour
        alarm_high_bg_colour Alarm High Background Alarm Upper Limit Background colour
        alarm_high_text_colour Alarm High Text Alarm Upper Limit Text colour
        parameter Input Value The source of the value that will be displayed by the gauge.
        update_rate Update Rate Rate at which the input value is requested from the ECU.
        decimal_places Decimal Places Set to -1 for auto

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.

        Events

        EventDescription
        change(unit)

        Called whenever the selected unit changes either through clicking or by a script setting it.

        Scripts can bind to the 'change' event to be notified when the selection changes.

        view.on("change", function(unit) { ... });

        The unit parameter is the script ID of the selected units (e.g. voltage:V)

        selection(selected)

        Called whenever the 'base' (unsorted) selection changes.

        WizardListView

        Type: WizardListView

        Extends View

        Script class of the WizardListView.

        Properties

        PropertyDescription
        Since version 4.04.23, Named properties may be accessed directly instead of requiring getViewProperty / setViewProperty. The property ID may be identified in the Properties view.
        enabled Enables/disables the view.
        index Change the current selection of the WizardListView view.
        items Change the current selection of the WizardListView view.

        View Properties

        Properties defined by the view that are normally editable via properties editor.

        PropertyNameDescription
        title Title The title of the window.
        id Script ID The scripting ID of the window. Can be used as an alternative to the title for searching for windows from scripts.
        tooltip Tool Tip Window tool tip.
        display_units_text Display Units Show units after the number on the view.
        display_units_label Display Units (Label) Show units after the label on the view.
        prefix_text Prefix Text Text to display before the value.
        postfix_text Postfix Text Text to display after the value.
        limits Limits Set up alarm limits for this gauge.
        show_value Show Value
        show_label Show Label
        label_font Label Font
        value_font Value Font
        value_height_percent Value Height % A value of zero disables auto font size fitting if Value Height Max is set
        value_height_max_dp Value Height Max [dp] Maximum font height of the value text, in device pixels
        label_height_percent Label Height %
        label_height_max_dp Label Height Max [dp] Maximum font height of the label, in device pixels
        label_text Label Text
        label_align Label Align
        label_valign Label Vertical Align
        value_align Value Align
        value_valign Value Vertical Align
        low_limit_text Low Limit Text
        high_limit_text High Limit Text
        value_text Value Override Text
        max_length_text Max length Text Leave blank for auto
        bg_colour Background Background colour
        text_colour Text Text colour
        alarm_low_bg_colour Alarm Low Background Alarm Lower Limit Background colour
        alarm_low_text_colour Alarm Low Text Alarm Lower Limit Text colour
        alarm_high_bg_colour Alarm High Background Alarm Upper Limit Background colour
        alarm_high_text_colour Alarm High Text Alarm Upper Limit Text colour
        parameter Input Value The source of the value that will be displayed by the gauge.
        update_rate Update Rate Rate at which the input value is requested from the ECU.
        decimal_places Decimal Places Set to -1 for auto

        Methods

        MethodDescription
        callListener(eventName, [args]) Calls all event listeners for the given event name, useful for testing.
        getViewProperties() Returns an array of objects containing the view properties. Each element has the fields 'name', 'id', 'value', 'hint'. If the property is a category then it will also have an array field 'properties'. These properties are the ones normally editable via the properties view.
        getViewProperty(id) Gets a property value from the view, given the property ID. Property IDs can be listed using getViewProperties. These properties are the ones normally editable via the properties view.
        on(eventName, callback) Adds an event listener for the given event name. e.g. view.on("click", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; view.on("click", callback); view.removeListener("click", callback);
        setViewProperty(id, value) Sets a property on the view, given the property ID and value. Property IDs can be listed using getViewProperties These properties are the ones normally editable via the properties view.

        Window

        Type: Window

        Script class for Window utilities.

        A global 'window' object is provided to access these functions and the 'workpage'.

        var button = window.findViewByID("do_not_press"); var button2 = window.do_not_press; // shorthand 

        var button = window.do_not_press; // shorthand

        Properties

        PropertyDescription
        Since version 4.04.23, view IDs may be accessed directly instead of through findViewByID. Assignment to an unspecified ID shall set the script id of the view being assigned.

        Methods

        MethodDescription
        findViewByID(id) Searches child views for the first one with a script ID that matches 'id' (set via view properties). Returns a reference to the view, or 'null' if nothing found.
        findViewByTitle(title) Searches child views for the first one with a title that matches 'title'. Returns a reference to the view, or 'null' if nothing found.
        setRefreshTimer(callback) Sets a callback function to be called periodically, dependent upon the user interface update rate setting in general preferences.

        Typically around 25Hz.

        To cancel the timer, call this function with a 'null' argument.

        Wizard

        Type: Wizard

        Extends Window

        Script class for Wizard scripts.

        A global 'wizard' object is provided to access these functions.

        wizard.on("next", function() { print("Next Clicked"); });

        Properties

        PropertyDescription
        Since version 4.04.23, view IDs may be accessed directly instead of through findViewByID. Assignment to an unspecified ID shall set the script id of the view being assigned.
        isEditMode Determine if the wizard is running in edit mode.
        isRunMode Determine if the wizard is running in run mode.

        Methods

        MethodDescription
        findViewByID(id) Searches child views for the first one with a script ID that matches 'id' (set via view properties). Returns a reference to the view, or 'null' if nothing found.
        findViewByTitle(title) Searches child views for the first one with a title that matches 'title'. Returns a reference to the view, or 'null' if nothing found.
        setRefreshTimer(callback) Sets a callback function to be called periodically, dependent upon the user interface update rate setting in general preferences.

        Typically around 25Hz.

        To cancel the timer, call this function with a 'null' argument.

        back()

        Go to the previous step.

        Returns true if the previous step was found.

        The wizard will emit the "step" event after the step is changed. The event is deferred via the application event loop.

        This function will only work if the previous step is defined in the predefined step list

        Scripts may implement the on("back", ()=>{...}) event handler for dynamic control over step ordering.

        See gotoStep and vetoEventfor more information.

        cancel()

        Cancel the wizard.

        close([exit_code])

        Close the wizard dialog.

        If exit_code is provided, the wizard shall be closed with the given exit code. Otherwise the wizard shall be closed with the default exit code (OK, 5100).

        codes include:

        • OK - 5100
        • CANCEL - 5101
        • APPLY - 5102
        • YES - 5103
        • NO - 5104
        • HELP - 5009

        The exit code may be specified as an integer or string.

        wizard.close("cancel");

        finish()

        Finish the wizard.

        getStep() Get the current step. Returns the script ID of the current step.
        gotoStep(id) Go to the step given by the script ID passed in.

        Returns true if the step was found.

        The wizard will emit the "step" event after the step is changed. The event is deferred via the application event loop.

        next()

        Go to the next step.

        Returns true if the next step was found.

        The wizard will emit the "step" event after the step is changed. The event is deferred via the application event loop.

        This function will only work if the next step is defined in the predefined step list

        Scripts may implement the on("next", ()=>{...}) event handler for dynamic control over step ordering.

        See gotoStep and vetoEventfor more information.

        on(eventName, callback) Adds an event listener for the given event name. e.g. wizard.on("next", function() { ... });
        removeAllListeners([eventName]) Removes all event listeners for the given event name. If the event name is not given then all listeners for all events are removed.
        removeListener(eventName, callback) Removes an event listener for the given event name. e.g. let callback = function() { ... }; wizard.on("next", callback); view.removeListener("next", callback);
        setEnableBack([enable])

        Enable or disable the back button.

        When called with no arguments, the back button shall be enabled if the current step has a 'back' item in the predefined step list.

        setEnableCancel([enable])

        Enable or disable the cancel button.

        When called with no arguments, the cancel button shall be enabled by default.

        setEnableCustomButton([enable])

        Enable or disable the custom button.

        When called with no arguments, the custom button shall be enabled by default.

        setEnableFinish([enable])

        Enable or disable the finish button.

        When called with no arguments, the finish button shall be enabled if the current step does not have a 'next' item in the predefined step list.

        setEnableHelp([enable])

        Enable or disable the help button.

        When called with no arguments, the help button shall be enabled if the current step (or the wizard) has help HTML or URL defined.

        setEnableNext([enable])

        Enable or disable the next button.

        When called with no arguments, the next button shall be enabled if the current step has a 'next' item in the predefined step list.

        showHelpHtml(html)

        Show the given HTML in the help panel.

        showHelpURL(url)

        Close the help panel (if open) and launch the URL in the system default web browser.

        vetoEvent([veto])

        Prevent the current event from being processed.

        When called with no arguments, the current event shall be prevented from being processed.

        When called with a boolean argument, the current event shall be prevented from being processed if the argument is true.

        Events

        EventDescription
        back

        Event raised when back button was clicked.

        wizard.on("back", function() { ... });

        Calling vetoEvent() during this event will prevent the wizard from taking the default 'back' action.

        See also setEnableBack.

        See also gotoStep for dyamic control of step ordering.

        cancel

        Event raised when cancel button was clicked.

        wizard.on("cancel", function() { ... });

        Calling vetoEvent() during this event will prevent the wizard from taking the default 'cancel' action.

        See also setEnableCancel.

        close(code)

        Event raised when the wizard is closing.

        code is a wxWidgets ID (e.g. wxID_CANCEL).

        wizard.on("close", function(code) { ... });

        Calling vetoEvent() during this event will prevent the wizard from closing the wizard.

        custom

        Event raised when custom button was clicked.

        wizard.on("custom", function() { ... });

        Calling vetoEvent() during this event will prevent the wizard from taking the default 'custom' action.

        See also setEnableCustom.

        finish

        Event raised when finish button was clicked.

        wizard.on("finish", function() { ... });

        Calling vetoEvent() during this event will prevent the wizard from taking the default 'finish' action.

        See also setEnableFinish.

        help

        Event raised when help button was clicked.

        wizard.on("help", function() { ... });

        Calling vetoEvent() during this event will prevent the wizard from taking the default 'help' action.

        See also setEnableHelp.

        next

        Event raised when next button was clicked.

        wizard.on("next", function() { ... });

        Calling vetoEvent() during this event will prevent the wizard from taking the default 'next' action.

        See also setEnableNext.

        See also gotoStep for dyamic control of step ordering.

        step

        Event raised when the current step has changed.

        wizard.on("step", function() { ... });

        The step event shall be emitted shortly after the wizard starts if any steps were defined.

        Array

        Overview

        Arrays are integral to the JavaScript language.

        Arrays are used to store multiple values in a single variable.

        Elements within an array can be accessed using the subscript operator:

        var x = [1, 2, 3, 4];
        var index = 2;
        var y = x[index]; // y == 3
        

        Properties

        Property Description
        constructor Returns the function that created the Array object’s prototype.
        length Sets or returns the number of elements in an array.
        prototype Allows you to add properties and methods to an object.

        Methods

        Method Description
        concat(array1, array2, ...) Joins two or more arrays, and returns a copy of the joined arrays
        join(separator = ',') Joins all elements of an array into a string
        pop() Removes the last element of an array, and returns that element
        push(item1, ...) Adds new elements to the end of an array, and returns the new length
        reverse() Reverses the order of the elements in an array
        shift() Removes the first element of an array, and returns that element
        slice(start, end) Selects a part of an array, and returns the new array. ’end’ may be omitted to select all items up to the end of the array. ‘start’ may be negative to select elements from the end of the array.
        sort() Sorts the elements of an array.
        splice(index,count,[item1], ...) Adds/Removes elements from an array. ‘index’ is the index from which to add/remove, ‘count’ is the number of items to remove, and optionally elements to add at ‘index’ may be supplied.
        toString() Converts an array to a string, and returns the result. Same as array.join(’,’).
        unshift(item1, ...) Adds new elements to the beginning of an array, and returns the new length
        valueOf() Returns the primitive value of an array

        Function Objects

        Function objects allow you to create scripted views of values in the ECU. Function Objects cane be created using the Create Function Object... command.

        At present, this only applies to tables and maps. In the future Options or Channels may also be created.

        For example, it is possible to create an editable map that displays the end injection angle by running scripts against the Injection Advance/Angle map and the Fuel Map. See the example script at the end of this topic. This script (or similar) is used as an initial starting point for new Function Objects.

        The script for a function object is executed once when compiled to set up the context for the object. This is a good opportunity to find the objects (maps, tables etc) that your script is based upon.

        Subsequently the object is accessed via a number of functions that you can define in the script:

        • getAxes()
        • getRaw(axes) [required]
        • setRaw(raw, axes)
        • getMinRaw(axes)
        • getMaxRaw(axes)
        • realFromRaw(raw, axes)
        • rawFromReal(real, axes)

        getAxes

        function getAxes()

        This must return the axes of the object. This is an array that specifies the dimensions your object.

        In general it is easiest to use the axes of another object (e.g. the Fuel Map):

        var fuel = ecu.map("fuel");
        function getAxes() {
            if (fuel) return fuel.axes;
            return {};
        }

        If this function is not defined then the object is one dimensional (like an option/channel).

        getRaw

        function getRaw(axes) [required]

        This should return the value of your object at the site specified by ‘axes’. The ‘axes’ parameter is an array that specifies the x and, optionally, the y coordinate of the object.

        Note

        The value returned will be interpreted as an integer.

        function getRaw(axes) 
        {
            if (fuel && injadv) {
                // fuelAngle is a user defined function that gets the angle range 
                // over which fuel is injected at a given site.
                return raw_per_real * (fuelAngle(axes) + injadv.getReal(axes));
            }
            return 0;
        }

        setRaw

        function setRaw(raw, axes)

        If specified, then the function object will be editable. This function should set the integer value ‘raw’ at the site specified by ‘axes’ in an appropriate manner.

        function setRaw(raw, axes) 
        {
            if (fuel && injadv) {
                var real = raw;
                real /= raw_per_real;
                real -= fuelAngle(axes);
                injadv.setReal(real, axes);
            }
        }

        getMinRaw

        function getMinRaw(axes)

        Get the minimum raw value for the function object. If defined, this will affect how the limits are calculated for views of the function object.

        getMaxRaw

        function getMaxRaw(axes)

        Get the maximum raw value for the function object. If defined, this will affect how the limits are calculated for views of the function object.

        realFromRaw

        function realFromRaw(axes)

        Define how raw integer values are represented as real (floating point) numbers.

        Raw numbers are always integers and a single +/- increment on a map/table/option etc generally corresponds to a single raw unit unless any overrides have been specified.

        If you specify this function then you should also define its inverse, ‘rawFromReal’.

        rawFromReal

        function rawFromReal(axes)

        Define how real (floating point) values are represented as raw (integer) numbers. The inverse of ‘realFromRaw’.

        Example: End of Injection Angle Script

        // ---------------------------------------------------------
        // This script generates a map for the end injection angle.
        // This will not take into account fuel modifiers / 
        // compensations that occur after the Fuel map has been 
        // processed by the ECU.
        // ---------------------------------------------------------
        //
        // ---------------------------------------------------------
        // Initialization.
        // ---------------------------------------------------------
        // First off, get hold of the base maps and options that are
        // needed in our calculations.
        // This code is run once after the script is compiled.
        let fuel   = ecu.map("fuel");
        let injadv = ecu.map("inj advance");
        if (injadv == null) {
            injadv = ecu.map("inj angle");
        }
        if (injadv == null) {
            injadv = ecu.map("injection angle");
        }
        
        // Some (but not all) ECUs have some additional scaling across the map
        // This enables higher map resolution on 8-bit fuel maps by offsetting
        // values against a general trend plane defined by ld0mpc and mspb.
        let opt_ld0mpc = ecu.option("ld0mpc");
        let opt_mspb = ecu.option("mspb");
        if (opt_mspb == null) {
            opt_mspb = ecu.option("microsec/bit");
        }
        if (opt_mspb == null) {
            opt_mspb = ecu.option("inj microsec/bit");
        }
        
        // Raw numbers are always integers.
        // To increase the resolution of our map, we can supply a
        // real/raw scaling so that a single raw unit is a fraction
        // of a single real number (floating point).
        //
        // see realFromRaw and rawFromReal below.
        //
        // Since edits to this map adjusts the injection angle map,
        // we'll use the same precision as that map.
        //
        let raw_per_real = 1.0; // number of raw units per real.
        if (injadv) {
            raw_per_real = injadv.realFromRaw(1) - 
                               injadv.realFromRaw(0);
            raw_per_real = Math.abs(raw_per_real);
            if (raw_per_real > 0) {
                raw_per_real = 1 / raw_per_real;
            }
            else {
                raw_per_real = 1;
            }
        }
        
        // ---------------------------------------------------------
        // Helper functions.
        // ---------------------------------------------------------
        
        // ---------------------------------------------------------
        // Apply load scaling.
        function ld0mpcFromRaw(d, site) {
            let ld0 = opt_ld0mpc.raw;
            if ((ld0 == 255) || (ld0 == 0)) {
                return d;
            }
            // Maximum load site index:
            let maxld = fuel.axes[1].siteCount - 1;
            // Calculate the compressed value:
            return d * (
                (site / maxld) +
                ((maxld - site) / maxld) * 
                (ld0 / 256.0));
        }
        // ---------------------------------------------------------
        function fuelUnitsAreMillisec()
        {
            let units = fuel.units;
            switch (units) {
            case "ms":
            case "mS":
            case "MS":
            case "Ms":
                // Fuel is already displayed in milliseconds,
                // so no calculations are required.
                return true;
            default:
                return false;
            }
        }
        // ---------------------------------------------------------
        // Get the fuel injector pulsewidth, in milliseconds.
        function fuelMillisec(axes) {
            if (fuelUnitsAreMillisec()) {
                // Fuel is already displayed in milliseconds,
                // so no calculations are required.
                return fuel.getReal(axes);
            }
            // Calculate pulsewidth in milliseconds.
            // On many ECU's this is scaled via mspb and ld0mpc from
            // the raw fuel value.
            let raw = fuel.getRaw(axes);
            // For ECU's that do not use MSPB or Microsec/bit,
            // the default mspb value may require tweaking so that 
            // the view is correct when the Fuel Map is viewed in
            // pulsewidth mode.
            let mspb = 1;
            if (opt_mspb) {
                mspb = opt_mspb.real;
            }
            if (opt_ld0mpc) {
                let load_site = axes[1];
                raw = ld0mpcFromRaw(raw, load_site);
            }
            return raw * mspb / 1000.0;
        }
        // ---------------------------------------------------------
        // Calculate the angle range that fuel is injected over
        // from a given fuel pulsewidth and engine RPM.
        function fuelAngleFromMS(ms, rpm) {
            // Seconds that the injector is open for.
            let s = ms / 1000.0;
            // degrees per second
            let dps = 360.0 * rpm / 60.0;
            return dps * s;
        }
        // ---------------------------------------------------------
        // Calculate the angle range that fuel is injected over
        // at a given Fuel Map site.
        function fuelAngle(axes) {
            // Get the RPM from the Fuel Map axis table
            let ms = fuelMillisec(axes);
            let rpm = fuel.axes[0].getReal([axes[0]]);
            return fuelAngleFromMS(ms, rpm);
        }
        
        // ---------------------------------------------------------
        // Map data access functions.
        // This code is called as needed by the application.
        // ---------------------------------------------------------
        
        // ---------------------------------------------------------
        // Get the axes of our calculated map.
        // In this case we use the same axes as the Fuel Map.
        function getAxes() {
            if (fuel) return fuel.axes;
            return [];
        }
        // ---------------------------------------------------------
        // Get the raw integer calculated value at the given site.
        function getRaw(axes) {
            if (fuel && injadv) {
                return raw_per_real * 
                      (fuelAngle(axes) + injadv.getReal(axes));
            }
            return 0;
        }
        // ---------------------------------------------------------
        // Set the raw integer calculated value at the given site.
        // This adjusts the injection start angle such that the end
        // injection angle is set to the provided value.
        function setRaw(raw, axes) {
            if (fuel && injadv) {
                let real = raw;
                real /= raw_per_real;
                real -= fuelAngle(axes);
                injadv.setReal(real, axes);
            }
        }
        // ---------------------------------------------------------
        // Get minimum raw integer value for this calculated map.
        function getMinRaw(axes) {
            return raw_per_real * injadv.minReal;
        }
        // ---------------------------------------------------------
        // Get maximum raw integer value for this calculated map.
        function getMaxRaw(axes) {
            return raw_per_real * 
                  (injadv.maxReal + fuelAngleFromMS(60, 10000));
        }
        // ---------------------------------------------------------
        // Get the scaled floating point value from a raw value.
        function realFromRaw(raw, axes) {
            return raw / raw_per_real;
        }
        // ---------------------------------------------------------
        // Get the raw value from a scaled floating point value.
        function rawFromReal(real, axes) {
            return real * raw_per_real;
        }

        XCP

        Overview

        GWv4 features XCP / A2L support if an XCP license is installed.

        Contents

        Subsections of XCP

        A2L Unit Groups

        Support Predefined Unit Conversions

        GWv4 offers conversion of units in the user interface from the units specified in the A2L file, where possible.

        There can be some ambiguity for units and some units of the same type may require independent grouping for conversions in GWv4.

        Unit Quantity

        The ’type’ of a unit such as G-Force (g) or Mass (g) is important. Units may be specified in the A2L file in GWv4 format.

        acceleration:G
        mass:g

        This deviates from the ASAM A2L specification but may be convenient for your application.

        Alternatively, an annotation field can be added to the object specifying the unit to keep the unit field clean for use with other applications:

        \begin ANNOTATION
            ANNOTATION_ORIGIN "UnitQuantity"
            ANNOTATION_LABEL "pressure"
        \end

        Unit Selection Grouping

        Whilst it may be acceptable in most cases to control all temperature units via a single selection, there may be other items that want to have different units for the same quantity.

        For example, it may be preferred to have some pressures in kPa and others in Bar, depending upon the expected range. See Pressure Units and WGT Units below.

        The units format allows for a group to be specified if desired:

        pressure:bar:WGT

        These will show up in the units selection dialog as WGT Units.

        Alternatively, a group name may be specified in an annotation field of the A2L object.

        A2L supports multiple ANNOTATION fields:

            \begin ANNOTATION
                ANNOTATION_ORIGIN "UnitGroup"
                ANNOTATION_LABEL "Pressure"
            \end
            \begin ANNOTATION
                ANNOTATION_ORIGIN "UnitQuantity"
                ANNOTATION_LABEL "pressure"
            \end

        If a group name is not specified, then a unit quantity will be checked for from the predefined units.

        "°C" => "temperature:C" => quantity is temperature.

        If this quantity does not already have a unit selected for it then the display name of the quantity will be used:

        temperature:C => Temperature Units.

        If the quantity does already have a unit selected for it but the unit being added is not the same one as previously seen then a new group will be created with a numerical suffix:

        “°F” => temperature:F => Temperature2 Units.

        Extending the Predefined Units

        It is possible to add new units to tab layout files.

        This is supported through a configuration file that can be loaded / saved, and is in json5 format

        {
            quantities:{
                mass: { // Existing Predefined Quantity
                     units: {
                         // Add ‘suns’ unit, relative to kg.
                         // The default base unit of mass is g which is what the unit would 
                         // be scaled relative to if ‘rel’ were not specified.
                         suns:{name:"Suns", m:0.0000000000000000000000000000005, rel:"kg"}
                     }
                },
                cpuperf:{
                    name:"CPU Performance",
                    units: {
                        // base unit is FLOPS. Units are scaled relative to this unless specified by ‘rel’
                        flops:{name: "FLOPS"}, 
                        kflops:{name: "Kilo FLOPS", unit: "KFLOPS", m:0.001},
                        mflops:{name: "Mega FLOPS", unit: "MFLOPS", m:0.000001},
                        gflops:{name: "Giga FLOPS", unit: "GFLOPS", m:0.000000001},
                        tflops:{name: "Tera FLOPS", unit: "TFLOPS", m:0.0000000000001},
                        pflops:{name: "Peta FLOPS", unit: "PFLOPS", m:0.000000000000001},
                        eflops:{name: "Exa FLOPS", unit: "EFLOPS", rel: "PFLOPS", m:0.001}
                    }
                }
            }
        }

        Extending the Predefined Units thorough the UI

        The “Configure Units / Scaling” dialog has a new button:

        “Define Units…”

        This will bring up a ‘Define Units’ dialog.

        Units and Quantities may be added/removed via +/- buttons.

        The selected unit or quantity to be configured by clicking the configure button (wrench icon).

        Adding a new item will pop up the configuration box. The configuration box will allow the display name and the script name to be specified for both quantities and units.

        When configuring units, the display unit, linear scaling (m and c values) and the relative unit may be selected. The relative unit will default to the base unit.

        The base unit will not allow configuration of the ‘m’ or ‘c’ values which will be fixed as ‘1’ and ‘0’ (identity).

        Quantities and units must have unique names and script names (units must only be unique within a given quantity).

        The remove button is be disabled if there is no selection or if the item is predefined.

        Additionally, the remove button is disabled for units that are used as a relative unit.

        The default base unit may not be removed if there are any other units defined.

        Load / Save Unit Configuration File

        The unit configuration file can be loaded or saved from the Unit Selection Dialog.

        Loading of units offers to merge or replace the existing user defined units (if any and if the merge would result in any changes).

        Storage

        Unit configurations are stored in layout files.

        A2L SI units

        At present, A2L UNIT is not supported.

        Open Source Licenses

        GWv4 has been created using some excellent Open Source libraries - many thanks to their developers for creating and maintaining them.

        The open source library licenses are included here and also in the installation folder for the application, accessible from Help | About | View Licenses.