;-------------------------------------------------------------------------------
; $Id: core.ini,v 1.623 2023/04/20 01:42:48 culverk Exp $
;
; This ini file is Copyright 2007,2008,2009,2010,2011,2012,2013 James Murray and Kenneth Culver.
; It is only to be used with a genuine B&G MS3.
;
; Original author(s) uncertain. Contains work of Eric Fahlgren
; Re-written to support MS3
;
;
; configuration defines, either #set or #unset

;This enables the "full" CAN/serial commands so this INI can be used anywhere on the CAN network.
#set CAN_COMMANDS
#unset INI_VERSION_2 ; this is set by TunerStudio, but needs to be unset for Megatune to work
#unset INTERNAL_LOG_FIELDS
#unset PORT_STATUS
#unset OUTMSG_EDITING  ; Allow editing of the outmsg data
#unset EXPANDED_CLT_TEMP

[MegaTune]
   MTversion      = 2.25 ; MegaTune itself; needs to match exec version.

#if CAN_COMMANDS
   versionInfo    = "r\$tsCanId\x0e\x00\x00\x00\x3c"  ; Title bar
   queryCommand   = "r\$tsCanId\x0f\x00\x00\x00\x14"  ; Verify against signature.
#else
   versionInfo    = "S"  ; Put this in the title bar.
   queryCommand   = "Q"  ; Verify against signature.
#endif
   signature      = "MS3 Format 0600.12M"
                     ; 123456789.123456789.

[TunerStudio]
   iniSpecVersion = 3.78
   helpManualDownloadRoot = "http://www.msextra.com/doc/pdf/"

;----------------------------------------------------------------------------
#if INI_VERSION_2
; ok
#else
 #error Megatune cannot be used with MS3 - please upgrade to TunerStudio
#endif
;----------------------------------------------------------------------------
; Temperature Limits and Settings Reference
; contributed by Mike Soultanian
;----------------------------------------------------------------------------
;
; Below is a listing of all of the temperature ranges used throughout the INI
; for the MegaSquirt.
;
; CELSIUS (Expanded/Normal):
;     Low limit: -40C/-40C
;     High limit: 230C/150C
;     Low danger: 65C/10C
;     Low warning: 93C/65C
;     High warning: 162C/93C
;     High danger: 176C/104C
;
; FAHRENHEIT (Expanded/Normal):
;     Low Limit: -40F/-40F
;     High limit: 450F/300F
;     Low danger: 150F/50F
;     Low warning: 200F/150F
;     High warning: 325F/200F
;     High danger: 350F/220F (also used for curve editor limits)
;----------------------------------------------------------------------------

[ReferenceTables]

    tableWriteCommand     = "w\$tsCanId%2i%2o%2c%v"
#if CAN_COMMANDS
    tableBlockingFactor = 256  ; just in case MS2 is used
#else
    tableBlockingFactor = 2048
#endif

    ;This next section copied and modified from ms2ReferenceTables.ini
    referenceTable = std_ms2gentherm, "Calibrate Thermistor Tables..."
;topichelp??
        tableIdentifier = 000, "Coolant Temperature Sensor", 001, "Air Temperature Sensor", 003, "Custom#1 Temperature Sensor"
        ; tableLimits (optional) = intentifier, min, max, defaultVal 
        ; will set the default value if value is outside the min and max limits.
#if EXPANDED_CLT_TEMP
        tableLimits = 000, -40, 400, 350
#else
        tableLimits = 000, -40, 350, 180
#endif
    tableLimits = 001, -40, 350, 70
    tableLimits = 003, -40, 400, 70
        adcCount        = 1024  ; length of the table
    bytesPerAdc         = 2     ; using shorts
    scale               = 10    ; scale by 10 before sending to controller
    ;tableGenerator = Generator type, Label 
    tableGenerator  = thermGenerator, "Thermistor Measurements"
    tableGenerator  = fileBrowseGenerator, "Browse for Inc File"
    ; thermOption       = name, resistor bias, tempPoint1(C), resPoint1, tempPoint2, resPoint2, tempPoint3, resPoint3
    thermOption     = "BMW",        2490,    -10, 9500,     20, 2500,     80, 330
    thermOption = "Chrysler 85 up", 2490,    5.5, 24500,  30.5, 8100,     88.3, 850
    thermOption     = "Ford",       2490,      0, 94000,    50, 11000,    98, 2370
    thermOption     = "GM",         2490,    -40, 100700,   30, 2238,     99, 177
    thermOption     = "Mazda",      2490,    -20, 16150,    40, 1150,     80, 300
    thermOption = "Mazda RX-7_MAT", 2490,     20, 41500,    50, 11850,    85, 3500
    thermOption = "Mazda other",    2490,    -40, 2022088,  21, 68273,    99, 3715
    thermOption = "Mitsubishi",     2490,    -40, 100490,   30, 1875,     99, 125
    thermOption     = "Nissan",     2490,    -10, 9000,     20, 1875,     50, 820
    thermOption     = "Toyota",     2490,    -20, 15000,    20, 2500,    100, 185
    thermOption     = "Toyota",     2490,    -40, 101890,   30, 2268,     99, 156
    thermOption     = "Subaru",     2490,    -20, 22000,    20, 2500,     80, 330
    thermOption     = "Porsche",    2490,    -20, 22000,    20, 2500,     80, 330
    thermOption = "Saab (Bosch)",   2490,      0, 5800,     80, 320,     100, 180
    thermOption = "VW L-Jet Cylinder Head Temp Sensor II", 2490, -13.888, 11600, 53.888, 703, 95.555, 207
    solution        = "3 Point Therm Generator",          thermGenerator
    solution        = "Custom inc File",    fileBrowseGenerator

[SettingGroups]
   ; the referenceName will over-ride previous, so if you are creating a 
   ; settingGroup with a reference name of lambdaSensor, it will replace the 
   ; setting group defined in the settingGroups.xml of the TunerStudio config
   ; folder. If is is an undefined referenceName, it will be added.
   ; keyword    =  referenceName,  DisplayName

    settingGroup = lambdaSensor, "Oxygen Sensor / Display" 
    settingOption = NARROW_BAND_EGO, "Narrowband Sensor - Volts"
    settingOption = LAMBDA, "Wideband - Lambda"
    settingOption = DEFAULT, "WideBand - AFR" ; DEFAULT will be over looked and this will fall into the #else block of the statement.

    settingGroup = lambdaDisplay, "" ; Hide this settingGroup option
    settingOption = DEFAULT, "" ;

[PcVariables]
   ; valid types: boolean, double, int, list
   ;  
   ; no offset as they are local variables. 
   ; entry format the same as Constants, except there is no offset.
   ; arrays are not yet supported. 
   ; name = class,  type,    shape,  units,       scale, translate,    lo,      hi, digits
   ; name = type, min, max;
   ;
   ; type List: value will be index.
   
   ;tsCanId      = bits,   U08,   [0:3] ; The short one, just numbers
    tsCanId       = bits,   U08,   [0:3], "CAN ID 0", "CAN ID 1", "CAN ID 2", "CAN ID 3", "CAN ID 4", "CAN ID 5", "CAN ID 6", "CAN ID 7", "CAN ID 8", "CAN ID 9", "CAN ID 10","CAN ID 11","CAN ID 12","CAN ID 13","CAN ID 14","INVALID"
;    testScale     = scalar, U16,    "%",   0.001,   0,    0,    600,   4
;    testTransform = scalar, U08,    "#",     0.1,   0,    0,   25.5,   1
    rpmhigh = scalar, U16, "rpm", 1, 0, 0, 30000, 0
    rpmwarn = scalar, U16, "rpm", 1, 0, 0, 30000, 0
    rpmdang = scalar, U16, "rpm", 1, 0, 0, 30000, 0
    loadhigh = scalar, U16, "", 1, 0, 100, 1000, 0
    wue_lpg = bits, U08, [0:0], "No", "Yes"
    clt_exp = bits, U08, [0:0], "Normal", "Expanded"
    algorithmUnits = bits,    U08,   [0:3], "%", "kPa", "%Baro", "% TPS", "MAFload", "MAFload", "ITB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" ; *
    sensor01Alias  = string, ASCII, 20 
    sensor02Alias  = string, ASCII, 20 
    sensor03Alias  = string, ASCII, 20 
    sensor04Alias  = string, ASCII, 20 
    sensor05Alias  = string, ASCII, 20 
    sensor06Alias  = string, ASCII, 20 
    sensor07Alias  = string, ASCII, 20 
    sensor08Alias  = string, ASCII, 20 
    sensor09Alias  = string, ASCII, 20 
    sensor10Alias  = string, ASCII, 20 
    sensor11Alias  = string, ASCII, 20 
    sensor12Alias  = string, ASCII, 20 
    sensor13Alias  = string, ASCII, 20 
    sensor14Alias  = string, ASCII, 20 
    sensor15Alias  = string, ASCII, 20 
    sensor16Alias  = string, ASCII, 20

    scatterRuntimeEnabled = bits, U08, [0:0], "Disabled", "Enabled"
    
    portLabels = bits, U08, [0:8], "unused", "injection LED", "warmup LED", "squirt LED", "fuel pump", "PWM or on/off idle", "stepper idle", "primary injectors", "secondary injectors", "a programmable on/off output", "spark outputs", "HEI bypass", "knock", "MAF", "MAP", "baro", "EGO", "tacho out", "A/C idleup out", "A/C idleup in", "fan out", "boost out", "N2O stage 1 nitrous", "N2O stage 1 fuel", "N2O stage 2 nitrous", "N2O stage 2 fuel", "N2O in", "launch in", "variable launch in", "3 step in", "datalog button", "datalog LED", "bike shift in", "bike shift out", "generic PWM A", "generic PWM B", "generic PWM C", "generic PWM D", "generic PWM E", "generic PWM F", "datalog stream", "dual fuel in", "fuel tableswitch", "spark tableswitch", "boost tableswitch", "overboost tableswitch", "ReqFuel switch", "AFR tableswitch", "stoich switch", "max AFR safety switch", "accelerometer X", "accelerometer Y", "accelerometer Z", "vss out", "water inj pump", "water inj valve", "water inj in", "ignition trigger LED", "flex fuel in", "cam input", "vss1 in", "vss2 in", "speed sensor 1 in", "speed sensor 2 in", "gear position in", "anti-lag in", "anti-lag out", "anti-lag PWM out", "Boost 2 out", "EGT 1 in", "EGT 2 in", "EGT 3 in", "EGT 4 in", "EGT 5 in", "EGT 6 in", "EGT 7 in", "EGT 8 in", "EGT 9 in", "EGT 10 in", "EGT 11 in", "EGT 12 in", "EGT 13 in", "EGT 14 in", "EGT 15 in", "EGT 16 in", "Generic Sensor 1 in", "Generic Sensor 2 in", "Generic Sensor 3 in", "Generic Sensor 4 in", "Generic Sensor 5 in", "Generic Sensor 6 in", "Generic Sensor 7 in", "Generic Sensor 8 in", "Generic Sensor 9 in", "Generic Sensor 10 in", "Generic Sensor 11 in", "Generic Sensor 12 in", "Generic Sensor 13 in", "Generic Sensor 14 in", "Generic Sensor 15 in", "Generic Sensor 16 in", "VVT 1 output", "VVT 2 output", "VVT 3 output", "VVT 4 output", "VVT cam 2/3/4 input", "Real Time Clock", "Torque Convertor Lockup", "Traction control", "Rotary trailing dwell timer", "Internal SPI2", "2nd MAP", "Long Term Trim button", "dual-fuel injectors", "launch timed in", "launch timed out", "throttle stop", "check engine light", "vss3 in", "vss4 in", "Staged inj switch output 1", "Alternator control output", "Alternator load monitor input", "Alternator current monitor input", "Alternator lamp output", "Staged inj switch output 1", "Shift light output", "Oil pressure warning output", "TCS input", "MAP2", "Generic Closed-Loop Out 1", "Generic Closed-Loop Out 2", "Line-lock staging input", "Line-lock staging output", "SDcard trigger output", "Pit limiter input", "TC LED out", "Dome fill out", "Dome empty out", "Power Control", "P&H control", "Pullup", "PWM Fuel Pump", "crank input", "CAN Parameters", "IObox1", "IObox2", "IObox3", "IObox4", "CAN Receiving"
    prefSpeedUnits   =   bits,  U08,   [0:0], "MPH", "KPH"
    prefLengthUnits  =   bits,  U08,   [0:0], "m", "in"
    accel_vs_yaw_name = bits, U08, [0:0], "Accel Z", "Yaw Z"
    accel_vs_yaw_units = bits, U08, [0:0], "ms-2", "deg/sec"

[LoggerDefinition]
    ; valid logger types: composite, tooth, trigger, csv
    
    ;loggerDef = uniqueName, Display Name, type
    loggerDef = mapLogger, "MAP Logger", csv
       dataReadCommand = "r\\x00\\xf4\\x00\\x00\\x04\\x00" ; standard TS command format
       dataReadTimeout = 10000 ; time in ms
       dataReadyCondition = { ( status3 & 0x02 ) == 0x02 }
       ;dataLength = 1024 ; in bytes, including headers, footers and data (not used)
       
       ;recordDef = headerLen. footerLen, recordLen
       recordDef =   0,   0,   2; in bytes, the recordLen is for each record, currently limited to 4 bytes
       
       ;recordField = Name,          HeaderName, startBit, bitCount, scale, units, updateCondition
       recordField = nonMap,           "Not MAP",       15, 1, 1.0, "Flag"
       recordField = mapWindow,        "MAPwindow",     14, 1, 1.0, "Flag", { !nonMap } 
       recordField = rpmPrint,         "isRPM",         14, 1, 1.0, "Flag", { nonMap } 
       recordField = mapSensor,        "Sensor",        10, 3, 1.0, "#",    { !nonMap }    
       recordField = mapAdc,           "MAP ADC",       0, 10, 1.0, "ADC",  { !nonMap }    
       recordField = sampleRpm,        "RPM",           0, 14, 1.0, "rpm",  { nonMap && rpmPrint }    
       recordField = crankAngle,       "CrankAngle",    0, 13, 0.1, "deg",  { nonMap && !rpmPrint } 
       
       ;calcField  = name,        HeaderName,    units, expression
       calcField   = mapValue,         "MAP",   "kPa",  { map0 + (mapmax - map0) * mapAdc/1023 }

    loggerDef = mafLogger, "MAF Logger", csv
       dataReadCommand = "r\\x00\\xf5\\x00\\x00\\x04\\x00" ; standard TS command format
       dataReadTimeout = 10000 ; time in ms
       dataReadyCondition = { ( status3 & 0x02 ) == 0x02 }
       ;dataLength = 1024 ; in bytes, including headers, footers and data (not used)
       
       ;recordDef = headerLen. footerLen, recordLen
       recordDef =   0,   0,   2; in bytes, the recordLen is for each record, currently limited to 4 bytes
       
       ;recordField = Name,          HeaderName, startBit, bitCount, scale, units, updateCondition
       recordField = nonMaf,           "Not MAF",       15, 1, 1.0, "Flag"
       recordField = mapWindow,        "MAPwindow",     14, 1, 1.0, "Flag", { !nonMaf } 
       recordField = rpmPrint,         "isRPM",         14, 1, 1.0, "Flag", { nonMaf } 
       recordField = mapSensor,        "Sensor",        10, 3, 1.0, "#",    { !nonMaf }    
       recordField = mafAdc,           "MAF ADC",       0, 10, 1.0, "ADC",  { !nonMaf }    
       recordField = sampleRpm,        "RPM",           0, 14, 1.0, "rpm",  { nonMaf && rpmPrint }    
       recordField = crankAngle,       "CrankAngle",    0, 13, 0.1, "deg",  { nonMaf && !rpmPrint }
       calcField   = mapValue,         "MAF Freq",   "Hz",  { (MAFOption_t == 0 || (!(mafAdc > 0))) ? 0 : (maf_freq1 > 62.5) ? (1000000 / (32 * mafAdc)) : (1000000 / (128 * mafAdc)) }

    loggerDef = mafLogger, "Engine Logger", csv
       dataReadCommand = "r\\x00\\xf6\\x00\\x00\\x04\\x00" ; standard TS command format
       dataReadTimeout = 10000 ; time in ms
       dataReadyCondition = { ( status3 & 0x02 ) == 0x02 }
       ;dataLength = 1024 ; in bytes, including headers, footers and data (not used)
       
       ;recordDef = headerLen. footerLen, recordLen
       recordDef =   0,   0,   3; in bytes, the recordLen is for each record, currently limited to 4 bytes
       
       ;recordField = Name,          HeaderName, startBit, bitCount, scale, units, updateCondition
       recordField = PT7,               "PTT7",          23,  1, 1,   ""
       recordField = PT6,               "PTT6",          22,  1, 1,   ""
       recordField = PT5,               "PTT5",          21,  1, 1,   ""
       recordField = PT4,               "PTT4",          20,  1, 1,   ""
       recordField = PT3,               "PTT3",          19,  1, 1,   ""
       recordField = PT2,               "PTT2",          18,  1, 1,   ""
       recordField = PT1,               "PTT1",          17,  1, 1,   ""
       recordField = PT0,               "PTT0",          16,  1, 1,   ""

       recordField = PB7,               "Spk H",        15,  1, 1,   ""
       recordField = PB6,               "Spk G",        14,  1, 1,   ""
       recordField = PB5,               "Spk F",        13,  1, 1,   ""
       recordField = PB4,               "Spk E",        12,  1, 1,   ""
       recordField = PB3,               "Spk D",        11,  1, 1,   ""
       recordField = PB2,               "Spk C",        10,  1, 1,   ""
       recordField = PB1,               "Spk B",         9,  1, 1,   ""
       recordField = PB0,               "Spk A",         8,  1, 1,   ""

       recordField = PA7,               "Inj H",         7,  1, 1,   ""
       recordField = PA6,               "Inj G",         6,  1, 1,   ""
       recordField = PA5,               "Inj F",         5,  1, 1,   ""
       recordField = PA4,               "Inj E",         4,  1, 1,   ""
       recordField = PA3,               "Inj D",         3,  1, 1,   ""
       recordField = PA2,               "Inj C",         2,  1, 1,   ""
       recordField = PA1,               "Inj B",         1,  1, 1,   ""
       recordField = PA0,               "Inj A",         0,  1, 1,   ""

    loggerDef = mafLogger, "Engine Logger + MAP", csv
       dataReadCommand = "r\\x00\\xf7\\x00\\x00\\x04\\x00" ; standard TS command format
       dataReadTimeout = 10000 ; time in ms
       dataReadyCondition = { ( status3 & 0x02 ) == 0x02 }
       ;dataLength = 1024 ; in bytes, including headers, footers and data (not used)
       
       ;recordDef = headerLen. footerLen, recordLen
       recordDef =   0,   0,   4; in bytes, the recordLen is for each record, currently limited to 4 bytes
       
       ;recordField = Name,          HeaderName, startBit, bitCount, scale, units, updateCondition

       recordField = mapAdc,           "MAP ADC",       24, 8, 4.0, "ADC" ; scaled to 8 bits    

       recordField = PT7,               "PTT7",          23,  1, 1,   ""
       recordField = PT6,               "PTT6",          22,  1, 1,   ""
       recordField = PT5,               "PTT5",          21,  1, 1,   ""
       recordField = PT4,               "PTT4",          20,  1, 1,   ""
       recordField = PT3,               "PTT3",          19,  1, 1,   ""
       recordField = PT2,               "PTT2",          18,  1, 1,   ""
       recordField = PT1,               "PTT1",          17,  1, 1,   ""
       recordField = PT0,               "PTT0",          16,  1, 1,   ""

       recordField = PB7,               "Spk H",        15,  1, 1,   ""
       recordField = PB6,               "Spk G",        14,  1, 1,   ""
       recordField = PB5,               "Spk F",        13,  1, 1,   ""
       recordField = PB4,               "Spk E",        12,  1, 1,   ""
       recordField = PB3,               "Spk D",        11,  1, 1,   ""
       recordField = PB2,               "Spk C",        10,  1, 1,   ""
       recordField = PB1,               "Spk B",         9,  1, 1,   ""
       recordField = PB0,               "Spk A",         8,  1, 1,   ""

       recordField = PA7,               "Inj H",         7,  1, 1,   ""
       recordField = PA6,               "Inj G",         6,  1, 1,   ""
       recordField = PA5,               "Inj F",         5,  1, 1,   ""
       recordField = PA4,               "Inj E",         4,  1, 1,   ""
       recordField = PA3,               "Inj D",         3,  1, 1,   ""
       recordField = PA2,               "Inj C",         2,  1, 1,   ""
       recordField = PA1,               "Inj B",         1,  1, 1,   ""
       recordField = PA0,               "Inj A",         0,  1, 1,   ""

       calcField   = mapValue,         "MAP",   "kPa",  { map0 + (mapmax - map0) * mapAdc/1023 }


    loggerDef = mafLogger, "Engine Logger + MAF", csv
       dataReadCommand = "r\\x00\\xf8\\x00\\x00\\x04\\x00" ; standard TS command format
       dataReadTimeout = 10000 ; time in ms
       dataReadyCondition = { ( status3 & 0x02 ) == 0x02 }
       ;dataLength = 1024 ; in bytes, including headers, footers and data (not used)
       
       ;recordDef = headerLen. footerLen, recordLen
       recordDef =   0,   0,   4; in bytes, the recordLen is for each record, currently limited to 4 bytes
       
       ;recordField = Name,          HeaderName, startBit, bitCount, scale, units, updateCondition

       recordField = mafAdc,           "MAF ADC",       24, 8, 4.0, "ADC" ; scaled to 8 bits    

       recordField = PT7,               "PTT7",          23,  1, 1,   ""
       recordField = PT6,               "PTT6",          22,  1, 1,   ""
       recordField = PT5,               "PTT5",          21,  1, 1,   ""
       recordField = PT4,               "PTT4",          20,  1, 1,   ""
       recordField = PT3,               "PTT3",          19,  1, 1,   ""
       recordField = PT2,               "PTT2",          18,  1, 1,   ""
       recordField = PT1,               "PTT1",          17,  1, 1,   ""
       recordField = PT0,               "PTT0",          16,  1, 1,   ""

       recordField = PB7,               "Spk H",        15,  1, 1,   ""
       recordField = PB6,               "Spk G",        14,  1, 1,   ""
       recordField = PB5,               "Spk F",        13,  1, 1,   ""
       recordField = PB4,               "Spk E",        12,  1, 1,   ""
       recordField = PB3,               "Spk D",        11,  1, 1,   ""
       recordField = PB2,               "Spk C",        10,  1, 1,   ""
       recordField = PB1,               "Spk B",         9,  1, 1,   ""
       recordField = PB0,               "Spk A",         8,  1, 1,   ""

       recordField = PA7,               "Inj H",         7,  1, 1,   ""
       recordField = PA6,               "Inj G",         6,  1, 1,   ""
       recordField = PA5,               "Inj F",         5,  1, 1,   ""
       recordField = PA4,               "Inj E",         4,  1, 1,   ""
       recordField = PA3,               "Inj D",         3,  1, 1,   ""
       recordField = PA2,               "Inj C",         2,  1, 1,   ""
       recordField = PA1,               "Inj B",         1,  1, 1,   ""
       recordField = PA0,               "Inj A",         0,  1, 1,   ""

[TurboBaud]
   turboBaudOnCommand = "w\$tsCanId\x07\x02\xad\x00\x01\x51"
   turboBaudOffCommand = "w\$tsCanId\x07\x02\xad\x00\x01\x50"

   ; turboBaudSpeed defines the speed for 
   ; TS to set the PC baud to when turboBaud is activated
   turboBaudSpeed = { baudhigh }  ; reference the Constant so they will always be in sync with one setting.
   sdTurboActive = { 1 } ; this can reference a Constant or PcVariable in order to make it user selectable.
   runtimeTurboActive = { 0 } 

[Constants]

   ;----------------------------------------------------------------------------
   ; Constants Definition
   ; --------------------
   ;
   ; Scalar Values
   ; -------------
   ; The scaling and translation values are used as follows:
   ;    msValue   = userValue / scale - translate
   ;    userValue = (msValue + translate) * scale
   ;
   ; Array Values
   ; ------------
   ; Arrays are specified just like scalars, except that they have a "shape"
   ; entry in the fourth parameter.  The shape allows you to define lists or
   ; tables, for example [8] defines a list with eight values and [2x4] defines
   ; a table with eight values (two rows and four columns).  Tables may be
   ; stored in either "X-" or "Y-order."  X-order means that memory is layed
   ; out like.
   ;
   ;     [x1,y1] [x2,y1]...[xn,y1] [x1,y2]...
   ;
   ; Y-order would be
   ;
   ;     [x1,y1] [x1,y2]...[x1,yn] [x2,y1]...
   ;
   ; To use the TableEditor, you must define two lists and a table, and
   ; the lengths of the lists must correspond to the shape of the table.
   ;
   ; Bit Fields
   ; ----------
   ; Bits are numbered 0-7, the rightmost being bit zero.  The basic
   ; data word that stores bit fields must be unsigned.
   ;
   ; You need NOT supply the correct number of labels matching the
   ; number of bits you've specified (one bit requires 2 values, two
   ; bits requires 4 values and so on).  If you neglect to supply enough
   ; labels, they will be synthesized using the sequence "1", "2" and so
   ; on based upon their position in the sequence (the cltType and matType
   ; will end up with identical lists).
   ;
   ;----------------------------------------------------------------------------

; updated settings from "new" serial
   pageActivationDelay = 1
   blockReadTimeout = 500
   tsWriteBlocks =      on
;   writeBlocks = on
   interWriteDelay = 0

;Relationship between TS pages and MS3 pages
;TS  MS3 internal
;MS3 internal pages 0-3 are sensor lookup tables
;1     4
;2     5
;MS3 internal pages 6,7 are outpc,txbuf
;3     8
;4     9
;5     10
;6     11
;7     12
;8     13
;9     18
;10    19
;11    21
;12    22
;13    23
;14    24
;15    25
;16    26 ; RAM only page
;17    27
;18    28
;19    29
;20    30
;21    31

   endianness          = big
   nPages              = 21
   pageSize            = 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024, 1024
   pageIdentifier      = "\$tsCanId\x04", "\$tsCanId\x05", "\$tsCanId\x08", "\$tsCanId\x09", "\$tsCanId\x0a", "\$tsCanId\x0b", "\$tsCanId\x0c", "\$tsCanId\x0d", "\$tsCanId\x12", "\$tsCanId\x13", "\$tsCanId\x15", "\$tsCanId\x16", "\$tsCanId\x17", "\$tsCanId\x18", "\$tsCanId\x19", "\$tsCanId\x1a", "\$tsCanId\x1b", "\$tsCanId\x1c", "\$tsCanId\x1d", "\$tsCanId\x1e", "\$tsCanId\x1f"
   burnCommand         = "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i"
   pageReadCommand     = "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c", "r%2i%2o%2c"
   pageValueWrite      = "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v"
   pageChunkWrite      = "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v", "w%2i%2o%2c%v"
   crc32CheckCommand   = "k%2i\x00\x00\x00\x04",   "k%2i\x00\x00\x00\x04",   "k%2i\x00\x00\x00\x04",   "k%2i\x00\x00\x00\x04",   "k%2i\x00\x00\x00\x04", "k%2i\x00\x00\x00\x04", "k%2i\x00\x00\x00\x04", "k%2i\x00\x00\x00\x04", "k%2i\x00\x00\x00\x04", "k%2i\x00\x00\x00\x04", "k%2i\x00\x00\x00\x04", "k%2i\x00\x00\x00\x04", "k%2i\x00\x00\x00\x04", "k%2i\x00\x00\x00\x04", "k%2i\x00\x00\x00\x04", "k%2i\x00\x00\x00\x04", "k%2i\x00\x00\x00\x04", "k%2i\x00\x00\x00\x04", "k%2i\x00\x00\x00\x04", "k%2i\x00\x00\x00\x04", "k%2i\x00\x00\x00\x04"

 tableCrcCommand = "k\$tsCanId%2i%2o%2c"
 retrieveConfigError    = "r\$tsCanId\x07\x04\x00\x00\xff"

; new serial
   messageEnvelopeFormat = msEnvelope_1.0 ;  TS could use the 'F' command to determine this automatically.

 ;TS could use the 'f' command to determine this automatically. Will change if using CAN passthrough
#if CAN_COMMANDS
    blockingFactor = 256  ; just in case MS2 is used
#else
    blockingFactor = 2048
#endif

    validateArrayBounds = true 

;New for TS 3.0.08ish upwards, define lists of standard I/O options

; Analogue input options. [0:5] options 1-63
 #define PIN_ADCS1 = "INVALID", "INVALID", "Analog In 3", "Analog In 1", "Analog In 2", "MAP", "INVALID", "CAN ADC01", "CAN ADC02", "CAN ADC03", "CAN ADC04", "CAN ADC05", "CAN ADC06", "CAN ADC07", "CAN ADC08", "CAN ADC09", "CAN ADC10", "CAN ADC11", "CAN ADC12", "CAN ADC13", "CAN ADC14", "CAN ADC15", "CAN ADC16", "CAN ADC17", "CAN ADC18", "CAN ADC19", "CAN ADC20", "CAN ADC21", "CAN ADC22", "CAN ADC23", "CAN ADC24", "Analog In 4", "Analog In 5", "Analog In 6", "Analog In 7", "Analog In 8", "INVALID", "O2 In", "AMPEFI Wideband", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"

#define PIN_ADCS = "INVALID", $PIN_ADCS1
#define PIN_ADCS_OFF = "Off", $PIN_ADCS1
 #define PIN_ADCS_EGO = "O2 In", $PIN_ADCS1

;Digital inputs. [0:5]
;options1 onwards
 #define PIN_DIGIN1 = "Digital Switched In 3", "Digital Input 4", "Digital Input 5", "Digital Frequency In 2", "INVALID", "INVALID", "INVALID", "Digital Switched 12V In", "Digital Switched In 2", "Digital Frequency In 3", "Digital Frequency In 1", "CMP", "Digital Switched In 1", "INVALID", "INVALID", "CANIN1", "CANIN2", "CANIN3", "CANIN4", "CANIN5", "CANIN6", "CANIN7", "CANIN8", "Loop 1", "Loop 2", "Loop 3", "Loop 4", "Loop 5", "Loop 6", "Loop 7", "Loop 8", "Digital In Out 1", "Digital In Out 2", "Digital In Out 3", "Digital In Out 4", "Digital In Out 5", "Analog In 3", "Analog In 1", "Analog In 2", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"

;add the zeroth option
#define PIN_DIGIN = "INVALID", $PIN_DIGIN1
#define PIN_DIGIN_OFF = "Off", $PIN_DIGIN1

; (Hardware) Frequency inputs [0:2] typically.
 #define PIN_HWFREQIN = "Digital Frequency In 1", "CMP", "Digital Frequency In 2", "Digital Frequency In 3"

;Digital outputs [0:6]
;options 1-39
 #define PIN_DIGOUT1 = "Stepper Out 1", "Stepper Out 2", "PWM / Idle Out 1", "INVALID", "High Current Out 1", "High Current Out 2", "Tach Out", "PWM Out 2", "High Current Out 3", "PWM Out 3", "Injector Out I", "Injector Out J", "INVALID", "INVALID", "INVALID", "Injector Out A", "Injector Out B", "Injector Out C", "Injector Out D", "Injector Out E", "Injector Out F", "Injector Out G", "Injector Out H", "Digital Frequency In 1", "Digital Frequency In 2", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Spark Out A", "Spark Out B", "Spark Out C", "Spark Out D", "Spark Out E", "Spark Out F", "Spark Out G", "Spark Out H"

#define PIN_DIGOUT_INVALID8 = "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", 
;options 40-47
#define PIN_DIGOUT_CANPWM = "CANPWM1", "CANPWM2", "CANPWM3", "CANPWM4", "CANPWM5", "CANPWM6", "CANPWM7", "CANPWM8"
;options 48-63
#define PIN_DIGOUT_CANOUT = "CANOUT1", "CANOUT2", "CANOUT3", "CANOUT4", "CANOUT5", "CANOUT6", "CANOUT7", "CANOUT8", "CANOUT9", "CANOUT10", "CANOUT11", "CANOUT12", "CANOUT13", "CANOUT14", "CANOUT15", "CANOUT16"
;options 64-127
 #define PIN_DIGOUT2 = "Digital In Out 1", "Digital In Out 2", "Digital In Out 3", "Digital In Out 4", "Digital In Out 5", "PWM Out 4", "PWM Out 5", "Digital Output 1 LED", "Digital Output 2", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"

;Build complete option list from 0.
#define PIN_DIGOUT = "INVALID", $PIN_DIGOUT1, $PIN_DIGOUT_INVALID8, $PIN_DIGOUT_INVALID8, $PIN_DIGOUT_INVALID8, $PIN_DIGOUT2
#define PIN_DIGOUT_OFF = "Off", $PIN_DIGOUT1, $PIN_DIGOUT_INVALID8, $PIN_DIGOUT_INVALID8, $PIN_DIGOUT_INVALID8, $PIN_DIGOUT2
#define PIN_DIGOUT_CANOUT_OFF = "Off", $PIN_DIGOUT1, $PIN_DIGOUT_INVALID8, $PIN_DIGOUT_CANOUT, $PIN_DIGOUT2
#define PIN_DIGOUT_CANOUT_INVALID = "INVALID", $PIN_DIGOUT1, $PIN_DIGOUT_INVALID8, $PIN_DIGOUT_CANOUT, $PIN_DIGOUT2
#define PIN_DIGOUT_CANPWM = "INVALID", $PIN_DIGOUT1, $PIN_DIGOUT_CANPWM, $PIN_DIGOUT_CANOUT, $PIN_DIGOUT2

 #define PIN_HWPWMOUT = "High Current Out 3", "PWM Out 2", "PWM Out 3", "High Current Out 1", "High Current Out 2", "PWM / Idle Out 1", "PWM Out 4", "PWM Out 5"

#define PIN_HWPWMOUT_FIDLE3 = "Off", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", $PIN_HWPWMOUT
#define PIN_HWPWMOUT_VVT = "Off", $PIN_HWPWMOUT, "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"

;VSS inputs, only 4 bits. Options 1-15
 #define VSS_OPTS1 = "Digital Switched In 3", "Digital Input 4", "Digital Input 5", "Digital Frequency In 2", "INVALID", "INVALID", "INVALID", "Digital Switched 12V In", "Digital Switched In 2", "Digital Frequency In 3", "Digital Frequency In 1", "CMP", "Digital Switched In 1"

#define VSS_OPTS = "INVALID", $VSS_OPTS1, "CAN VSS", "Use CAN PWMin", "Use GPS speed", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
#define VSS_OPTS_OFF = "Off", $VSS_OPTS1, "CAN VSS", "Use CAN PWMin", "Use GPS speed", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
#define SS_OPTS_OFF1 = "Off", $VSS_OPTS1, "From VSS1", "Poll CAN"
#define SS_OPTS_OFF2 = "Off", $VSS_OPTS1, "INVALID", "Poll CAN"

   page = 1
   ;  name            = class,  type, offset,      shape,  units,       scale, translate,    lo,      hi, digits
      nCylinders      = bits,    U08,      0,      [0:4], "INVALID","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      no_skip_pulses  = scalar,  U08,      1,             "",         1.00000,   0.00000,  1.00,  10.00,      0 ; * (  1 byte)
      ICIgnCapture    = bits,    U08,      2,      [0:0], "Falling Edge", "Rising Edge"                          ; ICIgnOption
      engineType      = bits,    U08,      2,      [3:3], "Even fire", "Odd fire"
    ; old setting and settings
      spkout_hi_lo    = bits,    U08,      2,      [4:4], "Going Low (Normal)", "Going High (Inverted)"          ; *
    ; new settings
      spkout_hi_lo2    = bits,    U08,      2,      [4:4], "Going Low", "Going High"          ; *

      max_coil_dur    = scalar,  U08,      3,             "ms",       0.1000,   0.00000,  1.00,    8.00,      1 ; * (  1 byte)
      max_spk_dur     = scalar,  U08,      4,             "ms",       0.1000,   0.00000,  0.00,   25.50,      1 ; * (  1 byte)
;      dwellAcc        = scalar,  U08,      5,             "ms",       0.1000,   0.00000,  0.00,   25.50,      0 ; * (  1 byte)
      crankingRPM     = scalar,  S16,     6,             "RPM",      1.00000,   0.00000,   200,  3000.0,      0 ; * (  2 bytes)
      triggerOffset   = scalar,  S16,     8,             "deg",      0.10000,   0.00000, -90.0,  380.00,      1 ; * (  2 bytes)
      TpsBypassCLTRevlim = scalar, S16,   10,             "TPS %",    0.10000,   0.00000, 0,      120,        1 ; * (  2 bytes)
;      RevLimRpm2      = scalar,  S16,     12,             "RPM",      1.00000,   0.00000,  0.00,20000,      0 ; * (  2 bytes)

      map0            = scalar,  S16,    14,             "kPa",      0.10000,   0.00000,  -3276.8, 3276.7,      1 ; * (  2 bytes)
      mapmax          = scalar,  S16,    16,             "kPa",      0.10000,   0.00000,  -3276.8, 3276.7,      1 ; * (  2 bytes)
#if CELSIUS
      clt0            = scalar,  S16,    18,             "°C",       0.05555,  -320.000, -100.0,  500.0,      1 ; * (  2 bytes)
      cltmult         = scalar,  S16,    20,             "%",        1.00000,   0.00000, -200.0,  200.0,      0 ; * (  2 bytes)
      mat0            = scalar,  S16,    22,             "°C",       0.05555,  -320.000, -100.0,  500.0,      1 ; * (  2 bytes)
#else
      clt0            = scalar,  S16,    18,             "°F",       0.10000,   0.00000, -100.0,  500.0,      1
      cltmult         = scalar,  S16,    20,             "%",        1.00000,   0.00000, -200.0,  200.0,      0
      mat0            = scalar,  S16,    22,             "°F",       0.10000,   0.00000, -100.0,  500.0,      1
#endif
      matmult         = scalar,  S16,    24,             "%",        1.00000,   0.00000, -200.0,  200.0,      0 ; * (  2 bytes)

      tpsMin          = scalar,  S16,    26,             "ADC",      1.00000,   0.00000,    0, 1023,      0 ; * (  2 bytes)
      tpsMax          = scalar,  S16,    28,             "ADC",      1.00000,   0.00000,    0, 1023,      0 ; * (  2 bytes)
      batt0           = scalar,  S16,    30,             "V",        0.10000,   0.00000,    -10, 10,      1 ;   (  2 bytes)
      battmax         = scalar,  S16,    32,             "V",        0.10000,   0.00000,     10, 100,      1 ;   (  2 bytes)
      ego0            = scalar,  S16,    34,             "afr",      0.10000,   0.00000,-3276.8, 3276.7,      1 ;   (  2 bytes)
      egomult         = scalar,  S16,    36,             "%",        1.00000,   0.00000, -200.0,  200.0,      0 ;   (  2 bytes)

      baro0           = scalar,  S16,    38,             "kPa",      0.10000,   0.00000,-3276.8, 3276.7,      1 ; * (  2 bytes)
      baromax         = scalar,  S16,    40,             "kPa",      0.10000,   0.00000,-3276.8, 3276.7,      1 ; * (  2 bytes)
      bcor0           = scalar,  S16,    42,             "%",        1.00000,   0.00000,-3276.8, 3276.7,      1 ; * (  2 bytes)
      bcormult        = scalar,  S16,    44,             "%",        1.00000,   0.00000, -200.0,  200.0,      0 ; * (  2 bytes)
      iacfullopen     = scalar,  S16,    46,             "steps",    1.00000,   0.00000,  0.0,   4000.0,      0
      reluctorteeth1  = scalar,  U16,    48,      "",        0.01, 0,0,255,2 ; this is VSS1
;      crankTolerance  = scalar,  U08,    50,             "%",        1.00000,   0.00000,  0.00,  255.00,      0 ; * (  1 byte)
;      asTolerance     = scalar,  U08,    51,             "%",        1.00000,   0.00000,  0.00,  255.00,      0 ; * (  1 byte)
;      pulseTolerance  = scalar,  U08,    52,             "%",        1.00000,   0.00000,  0.00,  255.00,      0 ; * (  1 byte)
;      IdleCtl         = bits  ,  U08,    53,      [0:3], "None", "On/Off valve", "IAC Stepper Moving Only", "IAC Stepper Always On", "PWM Warmup", "15-Minute IAC", "PWM Closed-loop", "IAC Closed-loop moving only", "IAC Closed-loop always-on", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" ; *
        IdleCtl         = bits  ,  U08,    53,      [0:2], "None", "On/Off valve", "PWM valve (2 or 3 wire)", "Stepper valve (4 or 6 wire)", "DBW", "INVALID", "INVALID", "INVALID"
        IdleCtl_alg     = bits  ,  U08,    53,      [3:3], "Open-loop (warmup)", "Closed-loop"
      IdleCtl_vss     = bits  ,  U08,    53,      [4:4], "Use Engine State", "Use VSS"
      IdleCtl_home    = bits  ,  U08,    53,      [5:5], "Closed", "Open"
      IACtstep        = scalar,  U08,    54,             "ms",       1.000,   0.00000,  0.00,   25,      0 ; * (  1 byte)
      IAC_tinitial_step=scalar,  U08,    55,             "ms",       1.000,   0.00000,  0.00,   25,      0 ; * (  1 byte)
      IACminstep      = scalar,  U08,    56,             "steps",         1.00000,   0.00000,  0.00,  255.00,      0 ; * (  1 byte)
      dwellduty       = scalar,  U08,    57,             "%",        0.39,      0.0,      0,     100,0
      IACStart        = scalar,  S16,    58,             "",         1.00000,   0.00000,  0.00, 4000.00,      0
#if CELSIUS
      IdleHyst        = scalar,  S16,    60,             "°C",       0.05555,   0.00000, -40.0,  {clthighlim},       1 ; * (  2 bytes)
        #else
      IdleHyst        = scalar,  S16,    60,             "°F",       0.10000,   0.00000, -40.0,  {clthighlim},       1
#endif
      IACcrankpos     = scalar,  S16,    62,             "steps",    1.00000,   0.00000,  0.00, 4000.00,      0 ; * (  2 bytes)
      IACcrankxt      = scalar,  S16,    64,             "s",      1.00000,   0.00000,  0.00,32767.00,      0 ; * (  2 bytes)
        IACcurlim     = bits,    U08,    66, [0:1], "Moving only", "Hold current", "Always on", "INVALID"
;gap
      reluctorteeth2  = scalar,  U16,    68,      "",        0.01, 0,0,255,2 ; this is VSS2
      boosttol        = scalar,  S16,    70, "kPa",      0.10000,   0.00000,  0.00,  50,        1
      OverBoostKpa2   = scalar,  S16,    72,             "kPa",      0.10000,   0.00000,  0.00,  700,        1
      fc_rpm_lower    = scalar,  U16,    74,             "rpm",      1.00000,       0.0,   0.0,     20000,    0 ; * (  1 byte)
      OverBoostOption = bits,    U08,    76,     [0:1],  "None",    "Fuel Cut", "Spark Cut", "Both"
      OverBoostOption_tol       = bits,    U08,    76,     [2:2],  "Off",    "On"
      hardware_spk    = bits,    U08,    77,     [0:2],   "INVALID", "INVALID", "Spark", "INVALID", "Tacho Out", "INVALID", "INVALID", "INVALID"
      hardware_fuel   = bits,    U08,    77,     [4:4],   "Inj I/J", "Inj A,B.."
      hardware_cam    = bits,    U08,    77,     [6:7],   "Digital Frequency In 2", "CMP", "MAP sensor", "INVALID"
      OverBoostKpa    = scalar,  S16,    78,             "kPa",      0.10000,   0.00000,  0.00,  700,        1
      OverBoostHyst   = scalar,  S16,    80,             "kPa",      0.10000,   0.00000,  0.00,  100,         1
      N2Olaunchmaxmap = scalar,  S16,    82, "kPa", 0.1, 0, 100, 700, 1
      tpsThresh       = scalar,  S16,    84,             "%/s",      0.10000,   0.00000,  0.00,  3276.0,      1 ; * (  2 byte)
      mapThresh       = scalar,  S16,    86,             "kPa/s",    1.00000,   0.00000,  0.00,  10000.0,      0 ; * (  2 byte) threshold for MAE
      taeColdA        = scalar,  U08,    88,             "%ReqFuel",       1,   0.00000,  0,  255,      0 ; * (  1 byte) ; Tpsacold
      taeColdM        = scalar,  U08,    89,             "%",        1.00000,   0.00000,  100,  255.00,      0 ; * (  1 byte) ; AccMult
      taeTime         = scalar,  U08,    90,             "s",        0.010000,   0.00000,  0.00,   1.00,      2 ; * (  1 byte) ; TpsAsync
      tpsasync_events = scalar,  U08,    90,             "events",        1,   0.00000,  0.00,   255,      0 ; * (  1 byte) ; TpsAsync
      tdePct          = scalar,  U08,    91,             "",         1.00000,   0.00000,  50.00, 100.00,      0 ; * (  1 byte) ; TPSDQ
      floodClear      = scalar,  S16,    92,             "%",        0.10000,   0.00000,  0.00,  100.00,      1 ; * (  2 bytes) ; TPSWOT
      TPSOXLimit      = scalar,  S16,    94,             "%",        0.10000,   0.00000,  0.00,  300.00,      1 ; * (  2 bytes) ; TPSOXLimit
      tpsProportion   = scalar,  U08,    96,             "%",        1.00000,   0.00000,  0.00,  100.00,      0 ; * (  1 byte) ; Tps_acc_wght
      baroCorr        = bits  ,  U08,    97,      [0:1], "None", "Initial MAP Reading", "Two Independent Sensors", "INVALID"; BaroOption
      egoType         = bits  ,  U08,    98,      [0:1], "Disabled", "Narrow Band", "Wide Band", "INVALID"                  ; egoOption
      egoCount        = scalar,  U08,    99,             "",         1.00000,   0.00000,  0.00,  255.00,      0 ; * (  1 byte)
      egoDelta        = scalar,  U08,    100,             "%",        0.10000,   0.00000,  0.00,  25.50,      1 ; * (  1 byte)
      oldegoLimit     = scalar,  U08,    101,             "%",        1.00000,   0.00000,  0.00,  255.00,      0 ; * (  1 byte)
      EGOVtarget       = scalar,  U08,    102,             "Volts",     0.00489,   0.00000,  0.00,   1,     3 
      tempUnits       = bits  ,  U08,    103,      [0:0], "Coolant/MAT Tables in °F", "Coolant/MAT Tables in °C" ; * (  1 byte)
      egonum          = scalar,  U08,    104,               "",         1, 0, 0, 12, 0
      rtc_trim        = scalar,  S08,    105,               "ppm",      1, 0, -127, +127, 0
#if CELSIUS
      fastIdleT       = scalar,  S16,    106,             "°C",       0.05555,  -320.000,-40.00,  {clthighlim},      1 ; * (  2 bytes)
      egoTemp         = scalar,  S16,    108,             "°C",       0.05555,  -320.000,-40.00,  {clthighlim},      1 ; * (  2 bytes)   
        #else
      fastIdleT       = scalar,  S16,    106,             "°F",       0.10000,   0.00000,-40.00,  {clthighlim},      1
      egoTemp         = scalar,  S16,    108,             "°F",       0.10000,   0.00000,-40.00,  {clthighlim},      1
#endif
      egoRPM          = scalar,  U16,    110,             "RPM",      1.00000,   0.00000,  0.00, 20000,      0 ; RPMOXLimit
      reqFuel         = scalar,  U16,    112,             "ms",       0.001,   0.00000,  0.00,  65.535,      2 ; * (  2 bytes)
      divider         = scalar,  U08,    114,             "",         1.00000,   0.00000,  0.00,     255,      0 ; * (  1 byte)
      alternate       = bits,    U08,    115,      [0:0], "Simultaneous", "Alternating"                          ; * (  1 byte)
      altcrank        = bits,    U08,    115,      [1:1], "Every event", "Alternate events"
      alternate_blend = bits,    U08,    115,      [2:2], "Off", "Blend Curve (7)"
      injPwmT         = scalar,  U08,    116,             "ms",       0.12800,   0.128,  0.00,   32.64,      1 ; * (  1 byte)
      injPwmPd        = scalar,  U08,    117,             "us",       1.00000,   0.00000, 40.00,  100.00,      0 ; * (  1 byte)
      injPwmP         = scalar,  U08,    118,             "%",        1.00000,   0.00000,  0.00,  100.00,      0 ; * (  1 byte)
      twoStroke       = bits,    U08,    119,      [0:1], "Four-stroke",    "Two-stroke", "INVALID", "Rotary"    ; *
;      injType         = bits,    U08,    120,      [0:0], "Port Injection", "Throttle Body"                      ; * not used by code
      nInjectors      = bits,    U08,    121,      [0:4], "INVALID", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
      OddFireang      = scalar,  U16,    122,             "",         0.10000,   0.00000,  0.00,  720.00,      1 ; * (  2 byte)
      rpmLF           = scalar,  U08,    124,             "",         1.00000,   0.00000,  10.00,  100.00,      0 ; * (  1 byte)
      mapLF           = scalar,  U08,    125,             "",         1.00000,   0.00000,  10.00,  100.00,      0 ; * (  1 byte)
      tpsLF           = scalar,  U08,    126,             "",         1.00000,   0.00000,  10.00,  100.00,      0 ; * (  1 byte)
      egoLF           = scalar,  U08,    127,             "",         1.00000,   0.00000,  10.00,  100.00,      0 ; * (  1 byte)
      adcLF           = scalar,  U08,    128,             "",         1.00000,   0.00000,  10.00,  100.00,      0 ; * (  1 byte)
      knk_pin_out     = bits,    U08,    129, [0:6], $PIN_DIGOUT_OFF
      mafLF           = scalar,  U08,    130,             "",         1.00000,   0.00000,  10.00,  100.00,      0
;gap
      algorithm       = bits,    U08,    132,      [0:3], "INVALID", "Speed Density", "Percent Baro", "Alpha-N", "INVALID", "MAF", "ITB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" ; *
      algorithm2      = bits,    U08,    132,      [4:7], "Disabled", "Speed Density", "Percent Baro", "Alpha-N", "INVALID", "MAF", "ITB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
      IgnAlgorithm    = bits,    U08,    133,      [0:3], "INVALID", "Speed Density", "Percent Baro", "Alpha-N", "INVALID", "MAF", "ITB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
      IgnAlgorithm2   = bits,    U08,    133,      [4:7], "Disabled", "Speed Density", "Percent Baro", "Alpha-N", "INVALID", "MAF", "ITB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
      AfrAlgorithm    = scalar,  U08,    134,             "",         1.00000,   0.00000,  0.00,  255.00,      0 ; U (  1 byte) UNUSED
      dwelltime       = scalar,  U08,    135,             "ms",       0.10000,       0,        0.1,     25.5, 1
      trigret_ang     = scalar,  U16,    136,    "deg", 0.1, 0, 5, 180,1
      RevLimOption_retard = bits,U08,    138,      [0:1], "Off", "Progressive retard", "Fixed angle", "INVALID"
      RevLimOption_spkcut = bits,U08,    138,      [2:2], "Off", "On"
      RevLimCLTbased  = bits,    U08,    138,      [3:3], "Normal", "CLT based"
      RevLimOption_fuelprog=bits,U08,    138,      [4:4], "Off", "On"
      RevLimOption_fuelcut =bits,U08,    138,      [5:5], "Off", "On"
      RevLimMaxRtd    = scalar,  U08,    139,             "deg",      0.10000,   0.00000,0,   25.5,      0 ; * (  1 byte)
      ego_startdelay  = scalar,  U08,    140,             "s",      1, 0, 0, 120, 0
      can_poll2_gps   = bits,    U08,    141, [1:2], "Off", "JBperf GPS", "Race Technology 11bit", "INVALID"
      can_poll2_vss   = bits,    U08,    141, [3:3], "Listen", "Poll"
      can_poll2_egolag= bits,    U08,    141, [4:4], "Off", "On"
      opt142_rtc      = bits,    U08,    142, [0:1], "Off", "On-board", "CAN", "INVALID"
      opt142_gs_share = bits,    U08,    142, [2:2], "Off", "On"
      injPwmT2        = scalar,  U08,    143,             "ms",       0.12800,   0.12800,  0.00,   32.64,      1 ; * (  1 byte)
      injPwmPd2       = scalar,  U08,    144,             "us",       1.00000,   0.00000, 40.00,  100.00,      0 ; * (  1 byte)
      injPwmP2        = scalar,  U08,    145,             "%",        1.00000,   0.00000,  0.00,  100.00,      0 ; * (  1 byte)
      can_ego_id      = scalar,  U08,    146,            "",        1.00000,   0.00000,  0.00,  14,      0 ;
          can_ego_table   = scalar,  U08,    147,             "",         1.00000,   0.00000,     0,     15,       0 ; * (  1 byte)
          can_ego_offset  = scalar,  U16,    148,             "bytes",    1.00000,   0.00000,     0,   4095,       0
      baro_upper      = scalar,  S16,    150,             "kPa",      0.10000,   0.00000,  60,  150,      1 ;
      baro_lower      = scalar,  S16,    152,             "kPa",      0.10000,   0.00000,  60,  150,      1 ;
      baro_default    = scalar,  S16,    154,             "kPa",      0.10000,   0.00000,  60,  150,      1 ;
      can_poll2_ego2  = bits,    U08,    156, [0:3], "Disable", "Innovate format", "AEM 4ch UEGO", "ECOTRONS ALM", "Generic", "AEM X UEGO", "CANEGT broadcast", "14point7 Spartan3", "AMPEFI CAN WB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
      ego_limdelay    = scalar,  U08,    157,             "s",      0.1, 0, 0, 10, 1
      launchcutzone =   scalar,  S16,    158,             "RPM",      1.00000,   0.00000,  0.00,  1000,       0
      RevLimNormal2 =   scalar,  S16,    160,             "RPM",      1.00000,   0.00000,  0.00,  20000,       0 ;
      hw_latency      = scalar,  U08,    162,      "usec", 1.0, 0.00000, 0.00, 255.00, 0
;next three are loadopts in the firmware
      loadCombine     = bits,    U08,    163,      [0:1], "additive", "multiplicitive", "Blend Curve (1)", "INVALID"
      loadMult        = bits,    U08,    163,      [2:2], "don't multiply", "multiply"
      loadStoich      = bits,    U08,    163,      [3:3], "don't include AFRtarget", "include AFRtarget"
      loadCombineign  = bits,    U08,    163,      [4:4], "additive", "Blend Curve (2)"
      loadMult2       = bits,    U08,    163,      [5:5], "don't multiply", "multiply"
      loadopts_oldbaro= bits,    U08,    163,      [6:6], "Off", "On"
      baud            = scalar,  U32,    164,             "",         1.00000,   0.00000,9600.0,500000.0,      0 ; x (  4 bytes)
      MAPOXLimit      = scalar,  S16,    168,             "%",      0.10000,   0.00000,  0.00,  500,      2 ; * (  2 bytes)
      can_poll_id_rtc = scalar,  U08,    170,            "",        1.00000,   0.00000,  0.00,  14,      0
      mycan_id        = scalar,  U08,    171,            "",        1.00000,   0.00000,  0.00,  14,      0
      mapsample_percent = scalar, U08,   172,            "%",       1.00000,   0.00000,  0.00,  50,       0
      can_poll_id_ports = scalar,  U08,    173,            "",        1.00000,   0.00000,  0.00,  14,      0 ;
      can_poll_id     = scalar,  U08,    174,            "",        1.00000,   0.00000,  0.00,  14,      0 ;
      aeTaperTime     = scalar,  U08,    175,             "s",        0.010000,   0.00000,  0.00,   1.00,      2 ; * (  1 byte) ; TpsAsync2
      tpsasync2_events= scalar,  U08,    175,             "events",        1,   0.00000,  0.00,   255,      0 ; * (  1 byte) ; TpsAsync2
      aeEndPW         = scalar,  S16,    176,             "%ReqFuel",       1,   0.00000,  0.00, 100,      0 ; * tpsaccel2 ; TpsAccel2
      egoAlgorithm    = bits  ,  U08,    178,      [0:1], "Simple", "INVALID", "PID", "No correction" ; * (  1 byte)
      egoAlgorithm_auth=bits  ,  U08,    178,      [2:2], "Off", "On"
      egoAlgorithm_delay_table=bits, U08, 178,     [3:3], "Use IGN events", "Use delay table"
      egoAlgorithm_auth2=bits  ,  U08,    178,      [4:4], "Combined", "Separate"
      egoKP           = scalar,  U08,    179,             "%",        1.00000,   0.00000,  0.00,  200.00,      0 ; * (  1 byte)
      egoKI           = scalar,  U08,    180,             "%",        1.00000,   0.00000,  0.00,  200.00,      0 ; * (  1 byte)
      egoKD           = scalar,  U08,    181,             "%",        1.00000,   0.00000,  0.00,  200.00,      0 ; * (  1 byte)

      ac_idleup_vss_offpoint = scalar,  U16,    182,      { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale },   0.00000,  0.00,   { maxspeed },      0 ; * (  2 bytes)
      ac_idleup_vss_hyst     = scalar,  U16,    184,      { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale },   0.00000,  0.00,   { maxspeed },      0 ; * (  2 bytes)

      flexFuel        = bits  ,  U08,    186,      [0:0], "Disabled", "Enabled"                                  ; * (  1 byte)
      flexport        = bits,    U08,    186,      [1:2], "INVALID", "INVALID", "Digital Switched In 1", "Digital Frequency In 1";  (1 byte )
      fuelFreq        = array ,  U08,    187,    [    2], "Hz",       1.00000,   0.00000,  0.00,     255,      0 ; * (  2 bytes)
         fuelFreq0    = scalar,  U08,    187,             "Hz",       1.00000,   0.00000,  0.00,     255,      0
         fuelFreq1    = scalar,  U08,    188,             "Hz",       1.00000,   0.00000,  0.00,     255,      0
      fuelCorr        = array ,  U08,    189,    [    2], "%",        1.00000,   0.00000,  50,     255,      0 ; * (  2 bytes)
         fuelCorr0    = scalar,  U08,    189,             "%",        1.00000,   0.00000,  50,     255,      0
         fuelCorr1    = scalar,  U08,    190,             "%",        1.00000,   0.00000,  50,     255,      0

      dwellmode       = bits  ,  U08,    191,  [0:1], "Standard Dwell", "Fixed Duty", "Time after Spark", "Charge at Trigger"
      pwmidle_shift_lower_rpm = scalar, U16, 192,        "rpm",       1.00000,   0.00000,  0.00,      20000,    0
      ac_idleup_tps_offpoint = scalar,  S16, 194,        "%",         0.10000,   0.00000,  0.00,      100.00,   1 
      ac_idleup_tps_hyst = scalar,      S16, 196,        "%",         0.10000,   0.00000,  0.00,      100.00,   1
      fan_idleup_tps_offpoint = scalar, S16, 198,        "%",         0.10000,   0.00000,  0.00,      150.00,   1
      fan_idleup_tps_hyst = scalar,     S16, 200,        "%",         0.10000,   0.00000,  0.00,      100.00,   1
      fan_idleup_vss_offpoint = scalar, U16, 202,        { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale },   0.00000,  0.00,      { maxspeed },   0

      knk_option       = bits ,  U08,    204,      [0:1], "Disabled", "Safe Mode", "Aggressive Mode", "INVALID"  ; * (  1 byte )
      knk_option_an    = bits ,  U08,    204,      [2:3], "On/Off", "Analogue", "INVALID", "Internal"
      knkDirection    = bits  ,  U08,    204,      [4:4], "Low Input", "High Input"                   ; *
      knkpull         = bits  ,  U08,    204,      [5:6], "INVALID", "None", "Pull up", "INVALID"                   ; *
      knk_option_wind  = bits ,  U08,    204,      [7:7], "At end", "Peak"
      knk_maxrtd      = scalar,  U08,    205,             "deg",      0.1,       0.0,      0.0,    25.5,       1 ; * (  1 byte )
      knk_step1       = scalar,  U08,    206,             "deg",      0.1,       0.0,      1.0,    25.5,       1 ; * (  1 byte )
      knk_step2       = scalar,  U08,    207,             "deg",      0.1,       0.0,      0.5,    10.0,       1 ; * (  1 byte )
      knk_trtd        = scalar,  U08,    208,             "s",      0.1,       0.0,      0.0,    25.5,       1 ; * (  1 byte )
      knk_tadv        = scalar,  U08,    209,             "s",      0.1,       0.0,      0.0,    25.5,       1 ; * (  1 byte )
      knk_dtble_adv   = scalar,  U08,    210,             "deg",      0.1,       0.0,      0.0,    25.5,       1 ; * (  1 byte )
      knk_ndet        = scalar,  U08,    211,             "knocks",   1.0,       0.0,      0.0,     255,       0 ; * (  1 byte )
      EAEOption       = bits  ,  U08,    212,      [0:2], "Off", "EAE", "INVALID", "X-tau", "X-tau with CLT correction", "INVALID", "INVALID", "INVALID"      ; * (  1 byte )
      knkport         = bits,    U08,    213, [0:5], $PIN_DIGIN
      knk_maxmap      = scalar,  S16,    214,             "kPa",      0.1,       0.0,      0.0,   500,       1 ; * (  2 bytes)
      knk_lorpm       = scalar,  U16,    216,             "rpm",      1.0,       0.0,      0.0,   20000,       0 ; * (  2 bytes)
      knk_hirpm       = scalar,  U16,    218,             "rpm",      1.0,       0.0,      0.0,   20000,       0 ; * (  2 bytes)
      triggerTeeth    = scalar,  U16,    220,             "teeth",    1.0,       0.0,      2,     255,       0 ; * (  2 bytes)
      No_Miss_Teeth   = scalar,  U08,    222,             "teeth",    1.0,       0.0,      0.0,     4,       0 ; * (  1 byte )
      pwmidle_shift_open_time = scalar, U08, 223,         "s",      1.0,       0.0,      0.0,     20,        0 ; * (  1 byte )
      Miss_ang        = scalar,  U16,    224,             "deg BTDC",    0.1,       0.0,      0.0,     720,       1 ; * (  2 bytes )
      ICISR_tmask     = scalar,  U08,    226,             "ms",       0.1,       0.0,      0.0,    25.5,       1 ; * (  1 byte )
      ICISR_pmask     = scalar,  U08,    227,             "%",        1.0,       0.0,      0.0,     90,       0 ; * (  1 byte )
      ae_lorpm        = scalar,  U16,    228,             "rpm",      1.0,       0.0,      0.0,   20000,       0 ; * (  2 bytes)
      ae_hirpm        = scalar,  U16,    230,             "rpm",      1.0,       0.0,      0.0,   20000,       0 ; * (  2 bytes)
      fuelSpkDel      = array ,  S16,    232,    [    2], "deg",      0.10000,   0.00000,-45.00,   45.00,      1 ; * (  4 bytes)
         fuelSpkDel0  = scalar,  S16,    232,             "deg",      0.10000,   0.00000,-45.00,   45.00,      1
         fuelSpkDel1  = scalar,  S16,    234,             "deg",      0.10000,   0.00000,-45.00,   45.00,      1
      spk_conf2_gmtfi = bits  ,  U08,    236,      [0:2], "Off", "GM Bypass on SpkB", "Buick C3I", "TFI Non-signature", "TFI Signature PIP",  "INVALID", "INVALID", "INVALID"
      spk_conf2_oddodd= bits  ,  U08,    236,      [3:4], "Alternate", "INVALID", "Paired", "Custom"
      spk_conf2_dwell = bits  ,  U08,    236,      [5:5], "Off", "On"
      spk_conf2_dwelltbl = bits, U08,    236,      [6:6], "Off", "On"
      spk_conf2_dli   = bits  ,  U08,    236,      [7:7], "Off", "Toyota DLI"
;spk_config
      spk_config_campol   =bits, U08,    237,      [0:0], "Low", "High"
      spk_config_camcrank = bits, U08,   237,      [1:1], "Crank wheel", "Cam wheel"
      spk_config_trig2 =bits,    U08,    237,      [2:3], "INVALID", "Single wheel with missing tooth", "Dual wheel", "Dual wheel with missing tooth"
      spk_config_trig2l =bits,   U08,    237,      [4:5], "INVALID", "Rising edge", "Falling edge", "Poll level"
      spk_config_resetcam =bits, U08,    237,      [6:7], "Cam", "Crank", "Every cylinder", "INVALID"

 ; invalids in next line are spare and should be used, extra CASes hidden.
      spk_mode0       = bits  ,  U08,    238,      [0:5], "EDIS", "EDIS Multispk", "Basic trigger", "Trigger return",  "Toothed wheel", "420A/Neon", "36-2+2", "36-2-2-2", "Subaru 6/7", "Miata 99-05", "6g72", "IAW Weber", "CAS 4/1", "4G63", "Twin trigger", "Chrysler 2.2/2.5", "Renix 44-2-2", "Suzuki Swift", "Suzuki Vitara 2.0", "Daihatsu 3cyl", "Daihatsu 4cyl", "VTR1000", "Rover#1", "Rover#2", "Rover#3", "GM 7X", "Log crank", "Log crank&cam", "QR25DE", "Honda RC51", "Fiat 1.8 16V", "Fuel Only", "Optispark", "Nissan SR20", "Nissan RB25", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID","LS1", "YZF1000", "Honda Acura", "VQ35DE","Jeep 2000", "Jeep 2002", "Zetec VCT", "Flywheel tri-tach", "2JZ VVTi", "Honda TSX/D17/K24A2", "Mazda6 2.3 VVT", "Viper V10","Viper V10 Gen1", "INVALID", "HD32-2", "Miata 36-2","Daihatsu 12+1", "Subaru 36-2-2-2 VVT", "Ski doo PTEC", "Nissan QG15","Mazda MZR", "6G75", "INVALID", "INVALID"
      spk_mode3_trim  = bits,    U08,    239,      [0:0], "Off", "On"
      spk_mode3_tach3 = bits,    U08,    239,      [1:1], "CMP", "Digital Frequency Input 2"
      spk_mode3_hirespol= bits,  U08,    239,      [2:2], "Normal", "Inverted"
      spk_mode3_kick  = bits,    U08,    239,      [3:3], "Off", "On"
      spk_mode3_wasted= bits,    U08,    239,      [4:4], "Wasted-COP startup", "Wait for cam signal"
      spk_mode3       = bits,    U08,    239,      [5:7], "Single coil", "INVALID", "Wasted spark", "Wasted COP", "Coil on plug", "INVALID", "Dual dizzy", "INVALID" ;  (1 byte )
      rtbaroport      = bits,   U08,  240, [0:5], $PIN_ADCS, 0="MAP", 37="Internal Baro Sensor"
      ego2port      = bits,   U08,  241, [0:5], $PIN_ADCS
      mapport      = bits,   U08,  242, [0:5], $PIN_ADCS, 0="MAP"
      mapport_t    =   bits,   U08,  242, [6:7], "Voltage", "Frequency", "Off", "INVALID"
;NB these mapport are in next byte
      mapport_f    =   bits,   U08,  243, [6:7], $PIN_HWFREQIN
      knkport_an        = bits,   U08,  243, [0:5], $PIN_ADCS
      OvrRunC        = bits  ,   U08,    244,      [0:0], "Off", "On"
      OvrRunC_progcut= bits  ,   U08,    244,      [1:1], "Off", "On"
      OvrRunC_progret= bits  ,   U08,    244,      [2:2], "Off", "On"
      OvrRunC_progign= bits  ,   U08,    244,      [3:3], "Off", "On"
      OvrRunC_retign = bits  ,   U08,    244,      [4:4], "Off", "On"
      poll_level_tooth      = scalar,  U08,    245,  "",     1, 0, 0, 255, 0
;      feature4_0ftrig  = bits,   U08,    246,      [0:0], "Simple", "Advanced"
      feature4_0igntrig= bits,   U08,    246,      [1:1], "Off", "Ignition trigger indicator"

      feature4_0maxdwl = bits,   U08,    246,      [3:3], "Off", "On"
      feature4_0ftrig = bits,    U08,    246,      [4:5], "Off", "INVALID", "Simple", "Advanced"
      feature4_0mindwl = bits,   U08,    246,      [6:6], "Off", "On"
      feature4_0resyncdel = bits,   U08,    246,      [7:7], "Off", "On"
 
      timing_flags    = bits,    U08,    247,    [0:0], "Use Table", "Fixed timing";
      use_prediction  = bits,    U08,    247,    [1:1], "No Prediction", "1st Deriv Prediction";
      crank_dwell     = scalar,  U08,    248,     "ms", 0.1000,0.00000,1.00,8.00,1
      tsw_pin_f       = bits,    U08,    249,      [0:5], $PIN_DIGIN, 14="Blend Curve (3)"
      crank_timing    = scalar,  S16,    250,     "degrees", 0.10000,0.00000,-10.00,90.00,1;
      fixed_timing    = scalar,  S16,    252,     "degrees", 0.10000,0.00000,-90.00,90.00,1;
      tsf_rpm         = scalar,  U16,    254, "rpm", 1, 0, 0, 20000, 0
      tsf_kpa         = scalar,  S16,    256, "kPa", 0.1, 0, 0, 500, 1
      tsf_tps         = scalar,  S16,    258, "%", 0.10000,   0.00000,  0.00,  100.00,      1;
      tss_rpm         = scalar,  U16,    260, "rpm", 1, 0, 0, 20000, 0
      tss_kpa         = scalar,  S16,    262, "kPa", 0.1, 0, 0, 500, 1
      tss_tps         = scalar,  S16,    264, "%", 0.10000,   0.00000,  0.00,  100.00,      1;

;      feature5_0                        266
      f5_0_tsf       = bits  ,   U08,    266,      [0:0], "Off", "On"
      f5_0_tsf_opt   = bits  ,   U08,    266,      [1:3], "Hardware", "rpm", "kPa", "TPS", "On/Off VVT", "INVALID", "INVALID", "INVALID"
      f5_0_tss       = bits  ,   U08,    266,      [4:4], "Off", "On"
      f5_0_tss_opt   = bits  ,   U08,    266,      [5:7], "Hardware", "rpm", "kPa", "TPS", "On/Off VVT", "INVALID", "INVALID", "INVALID"

      tsw_pin_s       = bits,    U08,    267,      [0:5], $PIN_DIGIN, 14="Blend Curve (4)"
      pwmidlecranktaper= scalar, U08,    268,     "s",        1.00000,   0.00000,  0.00,  100.00,      0
      knk_step_adv    = scalar,  U08,    269,             "deg",      0.1,       0.0,      0.5,    10.0,       1 ; * (  1 byte )
      fc_rpm_upper    = scalar,  U16,    270,      "rpm",      1.00000,       0.0,   0.0,     20000,    0
      resyncdel_rpm   = scalar,  U16,    272,      "rpm",      1.00000,       0.0,   0.0,     20000,    0
      boost_ctl_upperlimit =      scalar, S16, 274, "kPa",0.10000, 0.00000, 5, 500, 1


#if CELSIUS
      fc_clt          = scalar,   S16,    276,  "°C",       0.05555,  -320.000, -40.0,  {clthighlim},      1 ; * (  2 bytes)
        #else
      fc_clt          = scalar,   S16,    276,  "°F",       0.10000,   0.00000, -40.0,  {clthighlim},      1
#endif
      fc_delay        = scalar,  U08,    278,  "s",        0.1, 0, 0, 5.0, 1

      tacho_opt3f     = bits,    U08,    279, [0:6], $PIN_DIGOUT
      fc_ego_delay    = scalar,  U08,    280, "s", 1, 0, 0.00, 10, 0

      tacho_opt80     = bits,    U08,    281, [7:7], "Off", "On" ; tacho_opt2
      tacho_optvar    = bits,    U08,    281, [6:6], "Fixed", "Variable"
      tacho_opt40     = bits,    U08,    281, [5:5], "Normal", "Half speed"
      tacho_scale     = scalar,  U16,    282,  "%",        0.1, 0, 10, 1000, 1
      launch_opt2_ignorerpm = bits, U08,    284,      [0:0], "Off", "On"
      slew_opts_tss   = bits,    U08,    285, [0:0], "Off", "On"
      slew_opts_blend4= bits,    U08,    285, [1:2], "None", "Increasing", "Decreasing", "Both"     
      feature3_tps    = bits,    U08,    286,      [0:0], "Off", "On"
      feature3_aseunit= bits,    U08,    286,      [1:1], "Cycles", "0.1 seconds"
      feature3_maplog = bits,    U08,    286,      [2:2], "Off", "On"
      feature3_3      = bits,    U08,    286,      [3:3], "Off", "On"
      feature3_battv  = bits,    U08,    286,      [4:4], "Off", "On"
      feature3_n2oin  = bits,    U08,    286,      [5:5], "On", "Off"
      feature3_matase = bits,    U08,    286,      [6:6], "Off", "On"
      feature3_dwell  = bits,    U08,    286,      [7:7], "Off", "On"
      launch_opt_vss  = bits,    U08,    287,      [0:1], "Off", "VSS1", "VSS2", "INVALID"
      launch_opt_vssgear = bits, U08,    287,      [2:2], "Off", "On"
      launch_opt_retard = bits,  U08,    287,      [3:3], "Off", "On" 
      launch_opt_bank = bits,    U08,    287,      [4:5], "Off","Bank1", "Bank2", "Both"
      launch_opt_on   = bits,    U08,    287,      [6:7], "Off", "Launch","INVALID","Launch/Flatshift"
      launch_sft_zone  = scalar,  S16,    288,      "RPM",      1.00000,   0.00000,  100,  2000,      0 ; * (  2 bytes)
      launch_sft_deg  = scalar,  S16,    290,             "deg",      0.10000,   0.00000, -90.0,  180.00,      2 ; * (  2 bytes)
      launch_hrd_lim  = scalar,  S16,    292,             "RPM",      1.00000,   0.00000,  0.00,  20000,      0 ; * (  2 bytes)
      launch_tps      = scalar,  S16,    294,  "%",       0.10000,   0.00000,   0.0,  100.00,      0 ;
      launchlimopt    = bits  ,  U08,    296,      [0:1], "None", "Spark Cut", "Fuel Cut", "Spark and fuel"         ; * (  1 byte)
      launchlimopt_adv= bits  ,  U08,    296,      [2:2], "Basic", "Advanced"
      launchlimopt_cut= bits  ,  U08,    296,      [3:4], "Random Progressive", "Random Ramped", "Fixed 5/7", "Fixed 4/5"
      launchlimopt_map= bits  ,  U08,    296,      [5:5], "Off", "On"
      launchvsstime   = scalar,  U08,    297,  "s",     1, 0, 0, 255, 0
      launchvss_maxgear= scalar,  U08,    298,      "",        1, 0, 1, 6, 0
      launch_opt_pins = bits,  U08,    299,  [0:5], $PIN_DIGIN
      flats_arm       = scalar,  U16,    300,      "RPM",      1.00000,   0.00000,  0.00,  20000,      0
      launchvss_minvss = scalar,  U16,    302,  { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale },   0.00000,  1,   { maxspeed },      1
      flats_deg       = scalar,  S16,    304,      "deg",      0.10000,   0.00000, -90.0,  180.00,      2 ; * (  2 bytes)
      flats_hrd       = scalar,  U16,    306,      "RPM",      1.00000,   0.00000,  0.00,  20000,      0 ; * (  2 bytes)
      staged_pri_size = scalar,  U16,    308,      "cc",       1.00000, 0.00000, 0.0000, 15000.0,      0 ; * ( 2 bytes)
      staged_sec_size = scalar,  U16,    310,      "cc",       1.00000, 0.00000, 0.0000, 15000.0,      0 ; * ( 2 bytes)
      staged_first_param = bits, U08,   312,   [0:2], "Off", "RPM", "MAP", "TPS", "Duty", "Table", "INVALID", "INVALID"
      staged_second_param = bits, U08, 312,    [3:5], "Off", "RPM", "MAP", "TPS", "Duty", "INVALID", "INVALID", "INVALID"
      staged_transition_on = bits, U08, 312,   [6:6], "Off", "On"
      staged_second_logic = bits, U08, 312,   [7:7], "OR", "AND"
      staged_pw1_0 = bits, U08, 312, [7:7], "Off", "On"
      staged_transition_events = scalar, U08, 313, "ign events", 1.00000, 0.00000, 0.00, 255.0,  0
      staged_param_1 = scalar,   S16,    314, "units", 1.00000, 0.00000, 0.00, 25500.0, 0
      staged_param_2 = scalar,   S16,    316, "units", 1.00000, 0.00000, 0.00, 25500.0, 0
      staged_hyst_1 = scalar,    S16,    318, "units", 1.00000, 0.00000, 0.00, 25500.0, 0
      staged_hyst_2 = scalar,    S16,    320, "units", 1.00000, 0.00000, 0.00, 25500.0, 0

; Nitrous System
      N2Oopt_01     = bits,     U08, 322,[0:1],"INVALID","Bank1", "Bank2", "Both"
      N2Oopt_2      = bits,     U08, 322,[2:2], "Off", "On"  ; enables stage 1
      N2Oopt_3      = bits,     U08, 322,[3:3], "Off", "On"  ; enables stage 2
      N2Oopt_4      = bits,     U08, 322,[4:4], "Off", "On"  ; use AFR2
      N2Oopt_5      = bits,     U08, 322,[5:5], "Off", "On"  ; nitrous + launch
      N2Oopt2_prog_time= bits,  U08, 322,[6:7], "RPM-based", "Time-based", "VSS-based", "INVALID"
;input and output pins moved
      N2Oopt2_prog  = bits,     U08, 323,[0:0], "On/Off", "Progressive"
      N2Oopt2_fuel  = bits,     U08, 323,[1:1], "Use N2O duty", "Own curve"
      N2Oopt2_prog_freq= bits,  U08, 323,[2:4], "INVALID", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
      N2Oopt2_prog_freqf= bits, U08, 323,[5:7], "Same", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
      N2ORpm        = scalar,   U16, 324, "RPM",   1, 0, 1000, 20000, 0
      N2ORpmMax     = scalar,   U16, 326, "RPM",   1, 0, 1000, 20000, 0
      N2OTps        = scalar,   S16, 328, "%", 0.10000,   0.00000,  0.00,  100.00,      1;

#if CELSIUS
      N2OClt        = scalar, S16, 330,             "°C",       0.05555,  -320.000, -40.0,  {clthighlim},      1 ; * (  2 bytes)
        #else
      N2OClt        = scalar, S16, 330,             "°F",       0.10000,   0.00000, -40.0,  {clthighlim},      1
#endif
      N2OAngle      = scalar,    S16, 332,             "deg",      0.10000,   0.00000, 0,  50,      2 ; * (  2 bytes)
      N2OPWLo       = scalar,    S16, 334, "ms",  0.001, 0, -32, +32, 3
      N2OPWHi       = scalar,    S16, 336, "ms",  0.001, 0, -32, +32, 3

;nitrous/launch
      N2Odel_launch = scalar, U08,   338,       "s",         0.01, 0, 0, 2.55, 2
      N2Odel_flat   = scalar, U08,   339,       "s",         0.01, 0, 0, 2.55, 2
      N2Oholdon     = scalar, U08,   340,       "s",         0.01, 0, 0, 2.55, 2
;nitrous stage 2
; Nitrous System
      N2O2delay     = scalar, U08, 341, "s", 0.01, 0, 0, 2.55,2
      N2O2Rpm       = scalar, U16, 342, "RPM",   1, 0, 1000, 25000, 0
      N2O2RpmMax    = scalar, U16, 344, "RPM",   1, 0, 1000, 25000, 0
      N2O2Angle     = scalar, S16, 346,             "deg",      0.10000,   0.00000, 0,  50,      2 ; * (  2 bytes)
      N2O2PWLo      = scalar, S16, 348, "ms",  0.001, 0, -32, +32, 3
      N2O2PWHi      = scalar, S16, 350, "ms",  0.001, 0, -32, +32, 3
      RotarySplitModeFD = bits, U08, 352, [0:0], "FC mode", "FD mode"
      RotarySplitModeNeg = bits, U08, 352, [1:1], "Not Allowed", "Allowed"
      dlyct          = scalar, U08, 353, "", 1,0,0,255,0
      dwelltime_trl  = scalar,  U08, 354,             "ms",       0.10000,       0,        0.1,     25.5, 1
      N2Oopt_pins   = bits,     U08, 355, [0:5], $PIN_DIGIN
      RevLimRtdAng    = scalar,  S16, 356,             "deg",      0.10000,   0.00000,-10,   25.5,      1
      vss4_can_offset  = scalar, U16, 358,            "",        1.00000,   0.00000,  0.00,  65535,      0 ;
      RevLimNormal2_hyst= scalar,U16, 360,             "RPM",      1.00000,   0.00000,  100,  1000,       0
      pwmidleset_inv           = bits,   U08, 362, [3:3], "Normal, 0%=off", "Inverted, 100%=off"
      trig_init      = scalar, U08, 363, "", 1,0,0,255,0
;pwmidle
      pwmidle_ms               = scalar, U16, 364, "ms", 1, 0.00000, 0, 500, 0
      pwmidle_close_delay      = scalar, U08, 366, "s", 1, 0.00000, 0, 10, 0
      pwmidle_open_duty        = scalar, U08, 367, "%", 0.392, 0.00000, 0, 100, 1 
      pwmidle_open_steps       = scalar, U08, 367, "steps", 1.00000, 0.00000, 0, 255, 0 ; same but steps
      pwmidle_closed_duty      = scalar, U08, 368, "%", 0.392, 0.00000, 0, 100, 1 
      pwmidle_closed_steps     = scalar, U08, 368, "steps", 1.00000, 0.00000, 0, 255, 0 ; same but steps
      pwmidle_pid_wait_timer   = scalar, U08, 369, "s", 0.1, 0.00000, 1, 10, 0
      pwmidle_freq_pin3       = bits,   U08, 370, [0:3], $PIN_HWPWMOUT_FIDLE3
      pwmidle_freq_koeo          = bits,   U08, 370, [7:7], "Off", "On"
      ac_idleup_min_rpm         = scalar, U16, 371, "rpm", 1, 0, 0, 20000, 0
      pwmidle_flags_wot         = bits,   U08, 373, [0:0], "Off", "On"
      slew_rate_global          = scalar, U08, 374, "deg/tenth", 1, 0.00000, 1, 40, 0 
      pwmidle_dp_adder         = scalar, U08, 375, "%", 0.392, 0.00000, 0, 20, 1 
      pwmidle_dp_adder_steps   = scalar, U08, 375, "steps", 1.00000, 0.00000, 0, 51, 0 ; same but steps (51 steps = 20%)
      n2o_opt3_pedal        = bits,   U08, 376, [0:0], "Re-start", "Continue"
      n2o_opt3_enable2      = bits,   U08, 376, [1:1], "Off", "On"
      n2o_pedal_time        = scalar, U08, 377, "s", 0.1, 0.0, 0, 2, 1 
      n2o_enable2_pin       = bits,   U08, 378, [0:5], $PIN_DIGIN
      blend4LF             = scalar,  U08, 379,    "%",   1, 0, 1,  100, 0
      pwmidle_Kp_new               = scalar, U16, 380, "%", 0.1, 0.00000, 0, 200, 1 
      pwmidle_Ki_new               = scalar, U16, 382, "%", 0.1, 0.00000, 0, 200, 1 
      pwmidle_Kd_new               = scalar, U16, 384, "%", 0.1, 0.00000, 0, 200, 1
      pwmidle_freq_scale       = bits,   U08, 386, [0:3], "1021Hz", "766Hz", "613Hz", "511Hz", "383Hz", "306Hz", "204Hz", "153Hz", "99Hz", "75Hz", "50Hz", "48Hz", "30Hz", "20Hz", "15Hz", "12Hz"
      pwmidle_freq_pin         = bits,   U08, 386, [4:6], $PIN_HWPWMOUT
      boost_ctl_settings_freq  = bits,   U08, 387, [0:2], "INVALID", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
      boost_ctl_settings_on    = bits,   U08, 387, [3:3], "Off","On"
      boost_ctl_settings_cl    = bits,   U08, 387, [4:4], "Open-loop", "Closed-loop"
      boost_ctl_settings_invert_new= bits,   U08, 387, [5:5], "Normal", "Inverted"
      boost_ctl_settings_dome  = bits,   U08, 387, [6:6], "Single Solenoid", "Dome Control"
      boost_ctl_settings_biasonly = bits,   U08, 387, [7:7], "Off", "On"

      boost_ctl_pins           = bits,   U08, 388, [0:6], $PIN_DIGOUT_OFF
      boost_ctl_Kp             = scalar, U08, 389, "%", 1, 0.00000, 0, 200, 0
      boost_ctl_Ki             = scalar, U08, 390, "%", 1, 0.00000, 0, 200, 0
      boost_ctl_Kd             = scalar, U08, 391, "%", 1, 0.00000, 0, 200, 0
      boost_ctl_closeduty      = scalar, U08, 392, "%", 1, 0.00000, 0, 100, 0
      boost_ctl_openduty       = scalar, U08, 393, "%", 1, 0.00000, 0, 100, 0
      boost_ctl_pwm_scale      = bits,   U08, 396, [0:3], "1021Hz", "766Hz", "613Hz", "511Hz", "383Hz", "306Hz", "204Hz", "153Hz", "99Hz", "75Hz", "50Hz", "48Hz", "30Hz", "20Hz", "15Hz", "12Hz" 
      boost_ctl_pwm            = bits,   U08, 396, [4:5], "INVALID", "INVALID","Slow", "INVALID"

      NoiseFilterOpts = bits, U08, 397, [0:0], "Off", "On"
      NoiseFilterOpts1 = bits, U08, 397, [1:1], "Off", "On"
      NoiseFilterOpts2 = bits, U08, 397, [2:2], "Off", "On"
      NoiseFilterOpts3 = bits, U08, 397, [3:3], "Off", "On"
      launchcuttiming  = scalar, S16, 398, "deg", 0.10000, 0.00000, -50.00, 50.00, 1 
      pwmidle_max_rpm_new = scalar, U16, 400, "", 1, 0.00000, 0, 4000, 0
      pwmidle_targ_ramptime = scalar, U08, 402, "s", 1, 0.00000, 0, 10, 0
      boost_ctl_pins_pwm       = bits,   U08, 403, [0:2], $PIN_HWPWMOUT
      vss_opt1         = bits,    U08,    404, [0:4], $VSS_OPTS
      vss_opt2         = bits,    U08,    405, [0:4], $VSS_OPTS
      vss_opt3         = bits,    U08,    406, [0:4], $VSS_OPTS_OFF
      vss_opt4         = bits,    U08,    407, [0:4], $VSS_OPTS_OFF
     boost_ctl_range1  =      scalar, U08, 408, "%", 1, 0.00000, 1, 100, 0
    prefFuelPressUnits  =   bits,  U08,  409, [0:1], "kPa.d", "psi.d", "bar.d", "INVALID"

; gap 18 bytes
      secondtrigopts  = bits,    U08,    428,     [0:0],  "Off", "On"
      secondtrigopts1 = bits,    U08,    428,     [1:1],  "Off", "On"
      secondtrigopts2 = bits,    U08,    428,     [2:2],  "Off", "On"
      secondtrigopts3 = bits,    U08,    428,     [3:3],  "Off", "On"

      TC5_required_width = scalar, U16,  429,             "uSec",     1.0,   0.00000,  0.00,  5000,        0 ;
      egoLimit =        scalar,  S16,    431,             "%",        0.10000,   0.00000,  0.00,  50,         0 ;
      stoich =          scalar,  S16,    433,             "AFR",      0.10000,   0.00000,  0.00,  25.5,        1 ;
      MAPOXMin        = scalar,  S16,    435,             "%",      0.10000,   0.00000,  -10,  500,      2 ; * (  2 bytes)
      IC2ISR_tmask     = scalar,  U08,    437,             "ms",       0.1,       0.0,      0.0,    25.5,       1 ; * (  1 byte )
      IC2ISR_pmask     = scalar,  U08,    438,             "%",        1.0,       0.0,      0.0,     90,       0 ; * (  1 byte )
;afrload and eaeload are part of extra_load_opts in firmware
      afrload =          bits,    U08,    439, [0:3], "Use primary load (Algorithm)", "MAP", "% baro", "TPS", "INVALID", "MAF", "ITB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
      eaeload =          bits,    U08,    439, [4:7], "Use primary load (Algorithm)", "MAP", "% baro", "TPS", "INVALID", "MAF", "ITB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
;      airden_scaling  = scalar, U08, 440, "%", 1,   0.00000,  0,  150.00,      0
      fan_idleup_vss_hyst = scalar, U16, 441, { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale }, 0, 0,  { maxspeed },         0
      log_style_led = bits, U08, 443, [0:6], $PIN_DIGOUT_CANOUT_OFF
    primedelay = scalar, U08,    444,             "s",        0.1,       0.0,      0.0,     3,       1 
    pwmidle_cl_opts_initvaluetable = bits, U08, 445, [0:0], "Use last value", "Use initial value table"
    pwmidle_cl_opts_initval_clt = bits, U08, 445, [1:1], "Use MAT", "Use CLT"
    pwmidle_cl_opts_display_pid = bits, U08, 445, [2:2], "Basic", "Advanced"
    boost_ctl_flags = bits, U08, 446, [0:1], "INVALID", "Setup Mode", "Basic Mode", "Advanced Mode"
    boost_ctl_flags2 = bits, U08, 446, [2:3], "INVALID", "Setup Mode", "Basic Mode", "Advanced Mode" 
    idleveadv_to_pid_idleadv = bits, U08, 447, [0:0], "Use Engine State", "Use PID idle activation"
    idleveadv_to_pid_idleve = bits, U08, 447, [1:1], "Use Engine State", "Use PID idle activation"
    boost_ctl_sensitivity = scalar,       S16, 448, "",     0.1, 0, 0, 500,   1
    boost_ctl_sensitivity2 = scalar,      S16, 450, "",     0.1, 0, 0, 500,   1
    fuelcut_fuelon_upper_rpmdot = scalar, U16, 452, "rpmdot", 10, 0, 0, 10000, 0
    fuelcut_fuelon_lower_rpmdot = scalar, U16, 454, "rpmdot", 10, 0, 0, 10000, 0
    staged_secondary_enrichment = scalar, U16, 456, "ms", 0.001, 0, 0, 10, 3
    staged_primary_delay = scalar, U08, 458, "ign events", 1, 0, 0, 30, 0

      idleadvance_on  = bits, U08, 459, [0:0], "Off", "On" ;
      idleve_on       = bits, U08, 459, [1:1], "Off", "On"
      idleadv_vsson   = bits, U08, 459, [4:5], "Off", "VSS1", "VSS2", "INVALID"
      idle_special_ops_timing_assist = bits, U08, 459, [6:6], "Off", "On"

      ; dummy 6 bytes

#if CELSIUS
      idleadvance_clt = scalar, S16, 466, "°C", 0.05555, -320, -40, {clthighlim}, 1
        #else
      idleadvance_clt = scalar, S16, 466, "°F", 0.10000, 0.00000, -40, {clthighlim}, 1
#endif
      idleadvance_delay = scalar, U08, 468, "s", 1, 0, 0, 5, 0
      idleadvance_curve = array, S16, 469, [ 4 ],  "deg", 0.10000, 0.00000, -10.00, 90.00, 1 
      idleadvance_loads = array, S16, 477, [ 4 ],  "%", 0.10000, 0.00000, 0, 100, 1

;SD datalogging
      log_style2_but = bits, U08, 485, [0:5], $PIN_DIGIN
      log_style_block = bits, U08, 486, [0:1], "64 byte", "64 byte + stream", "128 byte", "INVALID"
      log_style_gps = bits, U08, 486, [5:5], "Off", "On"
;      log_style_on = bits, U08, 486, [6:7], "Disabled", "Insertion", "Button", "Trigger" ; old names
      log_style_on2 = bits, U08, 486, [6:7], "Disabled", "Always", "Button", "Trigger" ; new names

      log_style2_cont = bits, U08, 487, [0:0], "Start new log", "Stop after log"
      log_style2_alwaysin=bits,U08,487, [1:1], "Use detect switch", "Always in"
      log_style2_samp = bits, U08, 487, [3:4], "Timed", "every tooth", "every cycle", "INVALID"
      log_style2_clg  = bits, U08, 487, [5:5], "Off", "On"
      log_style_ledspd = bits, U08, 487, [6:7], "Normal", "Slower", "Faster", "Fastest" ; note old name -moved
      log_style2_ledspd = bits, U08, 487, [6:7], "Normal", "Slower", "Faster", "Fastest" ; new name

      log_style3_adc  = bits, U08, 488, [0:2], "INT_MAP", "INVALID", "INVALID", "Analog In 3", "Analog In 1", "Analog In 2", "INVALID", "INVALID"
      log_length    = scalar, U08, 489, "mins", 1, 0, 1, 255, 0
      log_int = scalar, U16, 490, "ms", 0.128,0,2.0,8388,1
      log_rate = scalar, U16, 490, "", 1.0, {  (1000/log_int) - (log_int/ 0.128) },0,1000,0
      canegt_base = scalar, U16, 492, "", 1, 0, 1, 2047, 0
      canegt_base2 = scalar, U16, 494, "", 1, 0, 1, 2047, 0      

    fanctl1_mode = bits, U08, 496, [0:0], "On/Off", "PWM variable"
    fanctl1_inv  = bits, U08, 496, [1:1], "Normal", "Inverted"
	fanctl1_freq = bits, U08, 497, [0:3], "INVALID", "INVALID", "250Hz", "225Hz", "200Hz", "175Hz", "150Hz", "125Hz", "100Hz", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
      fanctl1_duty_off = scalar, U08, 498, "%", 1,0,0,100,0
      fanctl1_duty_min = scalar, U08, 499, "%", 1,0,0,100,0
      fanctl1_duty_full = scalar, U08, 500, "%", 1,0,0,100,0
;spare501
#if CELSIUS
      fanctl1_temp_full         = scalar,   S16, 502, "°C", 0.05555, -320, -40, 150.00, 1
#else
      fanctl1_temp_full         = scalar,   S16, 502, "°F", 0.10000, 0.00000, -40, 300, 1
#endif
      boost_ctl_upperlimit2     = scalar, S16, 504, "kPa",0.10000, 0.00000, 5, 500, 1
      boost_ctl_rate_disable    = scalar, S16, 506, "kPa/sec", 1, 0.00000, 5, 500, 0 
      boost_ctl_rate_disable2   = scalar, S16, 508, "kPa/sec", 1, 0.00000, 5, 500, 0 

      canego_base = scalar, U16, 510, "", 1, 0, 1, 2047, 0

;168 bytes free

; big gap 2
        testval1 = scalar, U16, 680, "", 1,0,0,65535,0
        testval2 = scalar, U16, 682, "", 1,0,0,65535,0

      firea = scalar, U08, 684, "", 1,0,0,16,0
      fireb = scalar, U08, 685, "", 1,0,0,16,0
      firec = scalar, U08, 686, "", 1,0,0,16,0
      fired = scalar, U08, 687, "", 1,0,0,16,0
      firee = scalar, U08, 688, "", 1,0,0,16,0
      firef = scalar, U08, 689, "", 1,0,0,16,0
      fireg = scalar, U08, 690, "", 1,0,0,16,0
      fireh = scalar, U08, 691, "", 1,0,0,16,0
      firei = scalar, U08, 692, "", 1,0,0,16,0
      firej = scalar, U08, 693, "", 1,0,0,16,0
      firek = scalar, U08, 694, "", 1,0,0,16,0
      firel = scalar, U08, 695, "", 1,0,0,16,0
      firem = scalar, U08, 696, "", 1,0,0,16,0
      firen = scalar, U08, 697, "", 1,0,0,16,0
      fireo = scalar, U08, 698, "", 1,0,0,16,0
      firep = scalar, U08, 699, "", 1,0,0,16,0

      sequential = bits, U08, 700, [0:1], "Off", "Semi-sequential", "Fully Sequential", "INVALID"
      sequential_angle_spec = bits, U08, 700, [2:4], "INVALID", "End of squirt", "Middle of Squirt",  "INVALID", "Beginning of squirt", "INVALID", "INVALID", "INVALID"
      sequential_trim_on_off = bits, U08, 700, [5:5], "Off", "On"

      boost_launch_duty = scalar, U08, 701, "%", 1,0,0,100,0
      boost_launch_target = scalar, U16, 702, "kPa", 0.1,0,0,700,1
      boost_feats_tsw     = bits,    U08,    704,      [0:5], $PIN_DIGIN_OFF, 14="Blend Curve(6)", 15="Gear"
      boost_feats_launch  = bits,    U08,    704,      [7:7], "Off", "On"
      boost_feats_timed   = bits,    U08,    704,      [6:6], "Off", "On"

;see lower for launch_var_on
      launch_3step_in      = bits,  U08,     705,      [0:5], $PIN_DIGIN_OFF
      launch_var_low      = scalar, U16,     706, "rpm", 1,0,0,20000,0
      launch_var_up       = scalar, U16,     708, "rpm", 1,0,0,20000,0
      vssout_scale        = scalar, U32,     710,    "", 1, 0, 0, 300000, 0
      launch_sft_deg3     = scalar, S16,     714,      "deg",      0.10000,   0.00000, -90.0,  180.00,      2 ; * (  2 bytes)
      launch_hrd_lim3     = scalar, U16,     716,      "RPM",      1.00000,   0.00000,  0.00,  20000,      0 ; * (  2 bytes)
      map_sample_duration = scalar, S16,     718,      "deg",      0.10000,   0.00000,  0,     180,         1 ; * ( 2 bytes )
      opentime_opt1_master = bits, U08, 720, [7:7], "Same", "Individual"
      opentime_opt1_table = bits, U08, 720, [6:6], "Voltage Curve", "Voltage/Pressure Table"
#define OPENTIME_OPTS = "Curve/Table 1", "Curve/Table 2", "Curve/Table 3", "Curve/Table 4"
      opentime_opt1    = bits, U08, 720, [0:1], $OPENTIME_OPTS
      opentime_opt2    = bits, U08, 721, [0:1], $OPENTIME_OPTS
      opentime_opt3    = bits, U08, 722, [0:1], $OPENTIME_OPTS
      opentime_opt4    = bits, U08, 723, [0:1], $OPENTIME_OPTS
      opentime_opt5    = bits, U08, 724, [0:1], $OPENTIME_OPTS
      opentime_opt6    = bits, U08, 725, [0:1], $OPENTIME_OPTS
      opentime_opt7    = bits, U08, 726, [0:1], $OPENTIME_OPTS
      opentime_opt8    = bits, U08, 727, [0:1], $OPENTIME_OPTS
      opentime_opta    = bits, U08, 728, [0:1], $OPENTIME_OPTS
      opentime_opta_pwm= bits, U08, 728, [4:4], "Off", "On"
      opentime_optb    = bits, U08, 729, [0:1], $OPENTIME_OPTS
      opentime_optb_pwm= bits, U08, 729, [4:4], "Off", "On"
      opentime_optb_own= bits, U08, 729, [5:5], "Off", "On"

      opentime_opt11    = bits, U08, 730, [0:1], $OPENTIME_OPTS
      opentime_opt12    = bits, U08, 731, [0:1], $OPENTIME_OPTS
      opentime_opt13    = bits, U08, 732, [0:1], $OPENTIME_OPTS
      opentime_opt14    = bits, U08, 733, [0:1], $OPENTIME_OPTS
      opentime_opt15    = bits, U08, 734, [0:1], $OPENTIME_OPTS
      opentime_opt16    = bits, U08, 735, [0:1], $OPENTIME_OPTS
;      opentime_opt17    = bits, U08, 736, [0:1], $OPENTIME_OPTS
;      opentime_opt18    = bits, U08, 737, [0:1], $OPENTIME_OPTS

      smallpw_opt1_master = bits, U08, 738, [7:7], "Off", "On"
      smallpw_opt1    = bits, U08, 738, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
      smallpw_opt2    = bits, U08, 739, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
      smallpw_opt3    = bits, U08, 740, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
      smallpw_opt4    = bits, U08, 741, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
      smallpw_opt5    = bits, U08, 742, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
      smallpw_opt6    = bits, U08, 743, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
      smallpw_opt7    = bits, U08, 744, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
      smallpw_opt8    = bits, U08, 745, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
      smallpw_opta    = bits, U08, 746, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
      smallpw_optb    = bits, U08, 747, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"

      smallpw_opt11   = bits, U08, 748, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
      smallpw_opt12   = bits, U08, 749, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
      smallpw_opt13   = bits, U08, 750, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
      smallpw_opt14   = bits, U08, 751, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
      smallpw_opt15   = bits, U08, 752, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
      smallpw_opt16   = bits, U08, 753, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
;      smallpw_opt17   = bits, U08, 754, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
;      smallpw_opt18   = bits, U08, 755, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"

      maxafr_opt1_on = bits, U08, 756, [0:0], "Off", "On"
      maxafr_opt1_load= bits,U08, 756, [1:2], "MAP", "TPS", "INVALID", "INVALID"
      maxafr_opt1_led = bits,U08, 757, [0:6], $PIN_DIGOUT_CANOUT_OFF
      maxafr_en_load   = scalar, U16,    758,    "%",    0.10000, 0,       0,      500,   1
      maxafr_en_rpm    = scalar, U16,    760,    "rpm",  1,       0,       0,      20000, 0
      maxafr_en_time   = scalar, U16,    762,    "s",  0.001,     0,       0,      5.000, 1
      maxafr_spkcut_time=scalar, U16,    764,    "s",  0.001,     0,       0,      5.000, 2
      maxafr_ret_tps   = scalar, S16,    766,    "%",    0.10000, 0,       0,      110,   1
      maxafr_ret_map   = scalar, S16,    768,    "%",    0.10000, 0,       0,      500,   1
      maxafr_ret_rpm   = scalar, U16,    770,    "rpm",  1,       0,       0,      20000, 1
      launch_addfuel   = scalar, S16,    772,     "ms",  0.001,   0.0000,  -32,      +32, 3
      wheeldia1        = scalar,  U16,    774,     { bitStringValue( prefLengthUnits ,  prefLengthUnits ) },   { prefLengthUnits == 0 ? 0.001 : 0.03937 }, 0, { prefLengthUnits == 0 ? 0.3 : 12 }, { prefLengthUnits == 0 ? 2 : 79 }, 3;{ prefLengthUnits == 0 ? 3 : 1 }
      wheeldia2        = scalar,  U16,    778,     { bitStringValue( prefLengthUnits ,  prefLengthUnits ) },   { prefLengthUnits == 0 ? 0.001 : 0.03937 }, 0, { prefLengthUnits == 0 ? 0.3 : 12 }, { prefLengthUnits == 0 ? 2 : 79 }, 3;{ prefLengthUnits == 0 ? 3 : 1 }
      fdratio1         = scalar,  U16,    776,      ":1",      0.01,   0.00000,  0.40,  6.0,      2 ; * (  2 bytes)
;not a gap
      vss1_pos         = bits,    U08,    780, [0:1], "Wheel", "Driveline", "Pulses per mile", "Pulses per km"
      vss2_pos         = bits,    U08,    780, [2:3], "Wheel", "Driveline", "Pulses per mile", "Pulses per km"
      launch_var_on      = bits,   U08,  781, [0:5], $PIN_ADCS_OFF
      flats_minvss = scalar,  U16,    782,      { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale },   0.00000,  0.00,   { maxspeed },      0 ; * (  2 bytes)
;gap
      vss1_an          = bits,    U08,   785,[0:5], $PIN_ADCS
      vss1_can_id      = scalar, U08,    786,            "",        1.00000,   0.00000,  0.00,  255,      0 ;
      tsw_pin_ob       = bits,   U08,    787,      [0:5], $PIN_DIGIN_OFF
      vss1_can_offset  = scalar, U16,    788,            "",        1.00000,   0.00000,  0.00,  65535,      0 ;
      vss2_can_offset  = scalar, U16,    790,            "",        1.00000,   0.00000,  0.00,  65535,      0 ;
      MapThreshXTD     = scalar, U08,    792,    "-kpa/sec", 1.00000,   0.00000,  0.00,  255.00,      0  ;
      MapThreshXTD2    = scalar, U08,    793,    "-kpa/sec", 1.00000,   0.00000,  0.00,  255.00,      0  ;
      vss_opt0_1       = bits,   U08,    794, [0:1], "Off", "Digital", "Analogue", "INVALID"
      vss_opt0_2       = bits,   U08,    794, [2:3], "Off", "Digital", "Analogue", "INVALID"
      vss_opt0_3       = bits,   U08,    794, [4:4], "Off", "On"
      vss_opt0_4       = bits,   U08,    794, [6:6], "Off", "On"
    ; 1 gap
      ss_opt1          = bits,   U08,    796, [0:3], $SS_OPTS_OFF1
    ss_opt1_spd      = bits,    U08,   796, [7:7], "Off", "On"
      vss2_an          = bits,    U08,   797,[0:5], $PIN_ADCS
      ss1_pwmseq   =   scalar,  U08,    798,      "",    1.00000,   0.00000,     1,   4,       0
      ss2_pwmseq   =   scalar,  U08,    799,      "",    1.00000,   0.00000,     1,   4,       0
      gear_can_offset   = scalar, U16,    800,            "",        1.00000,   0.00000,  0.00,  65535,      0 ;
      mapsample_opt1  = bits,    U08,    802,      [0:1], "1", "2", "4", "INVALID"
      mapsample_opt2  = bits,    U08,    802,      [2:2], "Use timed min", "Use event average"
      map2port      = bits,   U08,  803, [0:5], $PIN_ADCS_OFF
      n2o1n_pins       = bits,   U08, 804, [0:6], $PIN_DIGOUT
      n2o1f_pins       = bits,   U08, 805, [0:6], $PIN_DIGOUT, 0="Same"
      n2o2n_pins       = bits,   U08, 806, [0:6], $PIN_DIGOUT
      n2o2f_pins       = bits,   U08, 807, [0:6], $PIN_DIGOUT, 0="Same"
; these an_max did use msToPrefUnitsScale, but that didn't change the values in real time
      vss1_an_max      = scalar, U16,   808, { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { prefSpeedUnits == 0 ?  0.22369 :  0.36 },   0.00000,  0.00,  1000, 0 
      vss2_an_max      = scalar, U16,   810, { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { prefSpeedUnits == 0 ?  0.22369 :  0.36 },   0.00000,  0.00,  1000, 0 
      tsw_pin_rf       = bits,   U08,    812,      [0:5], $PIN_DIGIN_OFF
      tsw_pin_afr      = bits,   U08,    813,      [0:5], $PIN_DIGIN_OFF, 14="Blend curve(5)"
      tsw_pin_stoich   = bits,   U08,    814,      [0:5], $PIN_DIGIN_OFF
      boost_vss        = bits,   U08,    815,      [0:2], "Off", "VSS1", "VSS2", "Gear", "Time since launch", "INVALID", "INVALID", "INVALID"
      boost_vss_biasgear = bits, U08,    815,      [3:3], "Off", "On"
      ReqFuel_alt      = scalar,  U16,    816,             "ms",       0.001,   0.00000,  0.00,  65.535,      2
      stoich_alt       = scalar,  S16,    818,             "AFR",      0.10000,   0.00000,  0.00,  25.5,        1
      
      water_pins_pump  = bits,      U08, 820, [0:6], $PIN_DIGOUT_CANOUT_OFF
      water_pins_valve = bits,      U08, 821, [0:6], $PIN_DIGOUT_OFF
      water_pins_in_shut = bits,    U08, 822,      [0:5], $PIN_DIGIN_OFF
      water_freq_on     = bits,     U08, 823,[0:0], "Off", "On"
      water_freq        = bits,     U08, 823,[1:4], "INVALID", "INVALID", "250Hz", "225Hz", "200Hz", "175Hz", "150Hz", "125Hz", "100Hz", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
      water_freq_type   = bits,     U08, 823,[5:6], "Off", "Fast", "Slow", "INVALID"
      boost_vss_tps     = scalar,   U16, 824, "%", 0.1, 0, 0, 100, 0
      water_tps         = scalar,   S16, 826, "%", 0.1, 0, 0, 100, 0
      water_rpm         = scalar,   U16, 828, "RPM", 1, 0, 0, 20000, 0
      water_map         = scalar,   S16, 830, "kPa", 0.1, 0, 0, 500, 1
#if CELSIUS
      water_mat         = scalar,   S16, 832, "°C", 0.05555, -320, -40, 150.00, 1
#else
      water_mat         = scalar,   S16, 832, "°F", 0.10000, 0.00000, -40, 300, 1
#endif
      boost_ctl_lowerlimit =      scalar, S16, 836, "kPa",0.10000, 0.00000, 5, 500, 1

          enable_pollADC =  bits,    U08,    838,      [0:0], "Disable", "Enable" ; enable_poll
          enable_pollPWM =  bits,    U08,    838,      [1:2], "Disable", "16bit", "32bit", "INVALID"
          enable_pollports_digin = bits, U08,838,      [3:3], "Disable", "Enable"
          enable_pollports_digout = bits,U08,838,      [4:5], "Disable", "One", "Two", "INVALID"
          enable_pwmout           = bits,U08,838,      [6:6], "Disable", "Enable"
          enable_pwmout255        = bits,U08,838,      [7:7], "Disable", "Enable"

          poll_table_rtc =   scalar,  U08,    839,             "",         1.00000,   0.00000,     0,     15,       0
          poll_tablePWM =   scalar,  U08,    840,             "",         1.00000,   0.00000,     0,     15,       0 ; * (  1 byte)
          poll_tableports = scalar,  U08,    841,             "",         1.00000,   0.00000,     0,     15,       0 ; * (  1 byte)
          poll_offset_rtc =  scalar,  S16,    842,             "bytes",    1.00000,   0.00000,     0,   4095,       0
          poll_offsetPWM =  scalar,  S16,    844,             "bytes",    1.00000,   0.00000,     0,   4095,       0 ;
          can_poll_digin_offset = scalar, S16, 846,             "bytes",    1.00000,   0.00000,     0,   4095,       0 ;
          can_poll_digout_offset = scalar, S16, 848,             "bytes",    1.00000,   0.00000,     0,   4095,       0 ;

      egt_num =         bits,    U08,    850,      [0:4], "Off", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
      accXport       =   bits,  U08,    851,    [0:5], $PIN_ADCS_OFF
      accYport       =   bits,  U08,    852,    [0:5], $PIN_ADCS_OFF
      accZport       =   bits,  U08,    853,    [0:5], $PIN_ADCS_OFF
      accXcal1       = scalar,  S16,    854,    "ADC", 1, 0, 0, 4095, 0
      accXcal2       = scalar,  S16,    856,    "ADC", 1, 0, 0, 4095, 0
      accYcal1       = scalar,  S16,    858,    "ADC", 1, 0, 0, 4095, 0
      accYcal2       = scalar,  S16,    860,    "ADC", 1, 0, 0, 4095, 0
      accZcal1       = scalar,  S16,    862,    "ADC", 1, 0, 0, 4095, 0
      accZcal2       = scalar,  S16,    864,    "ADC", 1, 0, 0, 4095, 0

      accxyzLF       = scalar,  U08,    866,    "%",   1, 0, 10,  100, 0
      egt1port       =   bits,  U08,    867,    [0:5], $PIN_ADCS_OFF
      egt2port       =   bits,  U08,    868,    [0:5], $PIN_ADCS_OFF
      egt3port       =   bits,  U08,    869,    [0:5], $PIN_ADCS_OFF
      egt4port       =   bits,  U08,    870,    [0:5], $PIN_ADCS_OFF
      egt5port       =   bits,  U08,    871,    [0:5], $PIN_ADCS_OFF
      egt6port       =   bits,  U08,    872,    [0:5], $PIN_ADCS_OFF
      egt7port       =   bits,  U08,    873,    [0:5], $PIN_ADCS_OFF
      egt8port       =   bits,  U08,    874,    [0:5], $PIN_ADCS_OFF
      egt9port       =   bits,  U08,    875,    [0:5], $PIN_ADCS_OFF
      egt10port       =   bits,  U08,    876,    [0:5], $PIN_ADCS_OFF
      egt11port       =   bits,  U08,    877,    [0:5], $PIN_ADCS_OFF
      egt12port       =   bits,  U08,    878,    [0:5], $PIN_ADCS_OFF
      egt13port       =   bits,  U08,    879,    [0:5], $PIN_ADCS_OFF
      egt14port       =   bits,  U08,    880,    [0:5], $PIN_ADCS_OFF
      egt15port       =   bits,  U08,    881,    [0:5], $PIN_ADCS_OFF
      egt16port       =   bits,  U08,    882,    [0:5], $PIN_ADCS_OFF
      egt_conf_action = bits,    U08,    883,  [0:0], "Off", "On"
      egt_conf_shutdown = bits,  U08,    883,  [1:1], "Off", "On"
      egt_conf_bank     = bits,  U08,    883,  [2:3], "INVALID", "Bank 1", "Bank 2", "Both"
      egt_conf_percyl   = bits,  U08,    883,  [4:4], "Off", "On"
      egt_conf_input    = bits,  U08,    883,  [5:5], "Manual", "CANEGT broadcast"
      egt_conf_numbering= bits,  U08,    883,  [6:6], "1234", "1357"
;EGT calibration
#if CELSIUS
      egtcal_temp0  =   scalar,  S16,    884,     "°C",  0.05555, -320, -40,  1500,      0
      egtcal_tempmax=   scalar,  S16,    886,     "°C",  0.05555, -320, -40,  1500,      0
      egt_warn      =   scalar,  S16,    888,     "°C",  0.05555, -320, -40,  1500,      0
      egt_max       =   scalar,  S16,    890,     "°C",  0.05555, -320, -40,  1500,      0
#else
      egtcal_temp0  =   scalar,  S16,    884,     "°F",  0.1,        0, -40,  2700,      0
      egtcal_tempmax=   scalar,  S16,    886,     "°F",  0.1,        0, -40,  2700,      0
      egt_warn      =   scalar,  S16,    888,     "°F",  0.1,        0, -40,  2700,      0
      egt_max       =   scalar,  S16,    890,     "°F",  0.1,        0, -40,  2700,      0
#endif
      egt_time      =   scalar,  U16,    892,     "s",   0.001,       0,   0,  10,        2
      vss1_can_scale=   scalar,  U16,    894,     "%",   0.1, 0, 0, 6553, 1
      vss1_can_scale_pulse=   scalar,  U16,    894,     "",   1, 0, 0, 65535, 0
      vss2_can_scale=   scalar,  U16,    896,     "%",   0.1, 0, 0, 6553, 1
      vss2_can_scale_pulse=   scalar,  U16,    896,     "",   1, 0, 0, 65535, 0
      vss1_pwmseq   =   scalar,  U08,    898,      "",    1.00000,   0.00000,     1,   4,       0
      vss2_pwmseq   =   scalar,  U08,    899,      "",    1.00000,   0.00000,     1,   4,       0
      MAFOption     =   bits,   U08,  900, [0:5], $PIN_ADCS
      MAFOption_t    =   bits,   U08,  900, [6:7], "Voltage", "Frequency", "Off", "INVALID"
      enginesize     =   scalar,  U16,    901,    "cc",   1.00000,    0.00000,     0,   65536,    0
      vssout_opt    =   bits,    U08,    903, [0:6], $PIN_DIGOUT_OFF
    vss3_can_offset  = scalar, U16,    904,            "",        1.00000,   0.00000,  0.00,  65535,      0 ;
    vss1_can_size    =   bits,    U08,    906, [0:0], "8bit", "16bit"
    vss2_can_size    =   bits,    U08,    906, [1:1], "8bit", "16bit"
;vssout_optunits in vss_can_size byte
    vssout_optunits=  bits,    U08,    906, [2:3], "Time", "Pulses per mile", "Pulses per km", "INVALID"
;MAF Freq options in vss_can_size byte
      MAFOption_f    =   bits,   U08,  906, [6:7], $PIN_HWFREQIN
    canpwm_clk  =   scalar,  U08,    907, "MHz", 1,0,0,100,0
    canpwm_pre  =   scalar,  U08,    908, "", 1,0,0,255,0
    canpwm_div  =   scalar,  U08,    909, "", 1,0,0,255,0
    vss1_can_table = scalar, U08,  910, "", 1,0,0,255,0
    feature7_mafmat = bits,  U08,  911, [0:0], "Off", "On"
    feature7_maftrim = bits, U08,  911, [1:1], "Off", "On"
    feature7_aeevents= bits, U08,  911, [3:3], "Time", "Events"
    feature7_aetpswot= bits, U08,  911, [4:4], "Off", "On"
    feature7_batchcrank= bits,U08, 911, [5:5], "Off", "On"
    feature7_cranktaper= bits,U08, 911, [6:6], "Off", "On"
    feature7_crtpunits= bits, U08, 911, [7:7], "Time", "Events"
    vss1LF         = scalar, U08,  912, "", 1,0,10,100,0
    vss2LF         = scalar, U08,  913, "", 1,0,10,100,0
    ss1LF          = scalar, U08,  914, "", 1,0,10,100,0
    ss2LF          = scalar, U08,  915, "", 1,0,10,100,0
    egt_addfuel    = scalar, U16,  916,             "ms",       0.001,   0.00000,  0.00,  65.535,      2
    launch_fcut_rpm= scalar, U16,  918, "RPM", 1, 0, 1000, 65000, 0
;gear ratios
    gear1ratio    = scalar,  U16,      920,      ":1",      0.01,   0.00000,  0.40,  5.0,      2 ; * (  2 bytes)
    gear2ratio    = scalar,  U16,      922,      ":1",      0.01,   0.00000,  0.40,  5.0,      2 ; * (  2 bytes)
    gear3ratio    = scalar,  U16,      924,      ":1",      0.01,   0.00000,  0.40,  5.0,      2 ; * (  2 bytes)
    gear4ratio    = scalar,  U16,      926,      ":1",      0.01,   0.00000,  0.40,  5.0,      2 ; * (  2 bytes)
    gear5ratio    = scalar,  U16,      928,      ":1",      0.01,   0.00000,  0.40,  5.0,      2 ; * (  2 bytes)
    gear6ratio    = scalar,  U16,      930,      ":1",      0.01,   0.00000,  0.40,  5.0,      2 ; * (  2 bytes)
    gear_method   = bits, U08, 932, [0:1], "Off", "VSS/RPM", "Analogue", "CAN Gear#"
    gear_port_an  = bits, U08, 933, [0:5], $PIN_ADCS_OFF
    gear0v        = scalar,  U16,      934,      "V",      0.01,   0.00000,  0.00,  5.0,      2 ; * (  2 bytes)
    gear1v        = scalar,  U16,      936,      "V",      0.01,   0.00000,  0.00,  5.0,      2 ; * (  2 bytes)
    gear2v        = scalar,  U16,      938,      "V",      0.01,   0.00000,  0.00,  5.0,      2 ; * (  2 bytes)
    gear3v        = scalar,  U16,      940,      "V",      0.01,   0.00000,  0.00,  5.0,      2 ; * (  2 bytes)
    gear4v        = scalar,  U16,      942,      "V",      0.01,   0.00000,  0.00,  5.0,      2 ; * (  2 bytes)
    gear5v        = scalar,  U16,      944,      "V",      0.01,   0.00000,  0.00,  5.0,      2 ; * (  2 bytes)
    gear6v        = scalar,  U16,      946,      "V",      0.01,   0.00000,  0.00,  5.0,      2 ; * (  2 bytes)
    gear_no       = scalar,  U08,      948,      "",        1, 0, 1, 6, 0
    vssdotLF      = scalar,  U08,      949, "", 1,0,10,100,0
    vssdot_int    = scalar,  U08,      950,      "ms",     10,   0      ,  10,  2000,     0
    ac_idleup_io_in = bits, U08,       951, [0:5], $PIN_DIGIN
    ac_idleup_settings_inv = bits, U08,951, [6:6], "Normal", "Inverted"
    ac_idleup_settings = bits, U08,    951, [7:7], "Off", "On"

    ac_idleup_io_out = bits, U08,      952, [0:6], $PIN_DIGOUT_CANOUT_OFF
    ac_idleup_delay = scalar, U16,     953,      "ms",     1.0000, 0.00000, 0.00, 1000, 0
    ac_idleup_adder_duty = scalar, U08,     955,      "%",      0.392, 0.00000, 0, 100, 1
    ac_idleup_adder_steps = scalar, U08,    955,      "steps",  1, 0, 0, 255, 0
    fanctl_settings_pin = bits, U08, 956, [0:6], $PIN_DIGOUT_CANOUT_INVALID
    fanctl_idleup_delay = scalar, U16,  957, "ms",       1.0000, 0.00000, 0.00, 1000, 0
    fanctl_idleup_adder_duty = scalar, U08,  959, "%",     0.392, 0.00000, 0, 100, 1
    fanctl_idleup_adder_steps = scalar, U08, 959, "steps", 1.000, 0.00000, 0, 255, 0
#if CELSIUS
    fanctl_ontemp =scalar,  S16, 960,  "°C",   0.05555,  -320.000,-40.00,  150.00,      1 
    fanctl_offtemp =scalar,  S16, 962,  "°C",   0.05555,  -320.000,-40.00,  150.00,      1
#else
    fanctl_ontemp =scalar,  S16, 960,  "°F",       0.10000,   0.00000,-40.00,  300.00,      1
    fanctl_offtemp =scalar,  S16, 962,  "°F",       0.10000,   0.00000,-40.00,  300.00,      1
#endif
    canadc_opt1 = bits, U08, 964, [0:0], "Off", "On"
    canadc_opt2 = bits, U08, 964, [1:1], "Off", "On"
    canadc_opt3 = bits, U08, 964, [2:2], "Off", "On"
    canadc_opt4 = bits, U08, 964, [3:3], "Off", "On"
    canadc_opt5 = bits, U08, 964, [4:4], "Off", "On"
    canadc_opt6 = bits, U08, 964, [5:5], "Off", "On"
; these next bits now grouped together. Names don't reflect firmware variable names.
    fanctl_opt2_engineoff = bits, U08, 965, [0:0], "No", "Yes"
    fan_ctl_settings_acfan = bits, U08, 965, [1:1], "Leave Fan off", "Turn fan on"
    fanctl_opt2_tps = bits, U08, 965, [2:2], "Off", "On"
    fanctl_opt2_vss = bits, U08, 965, [3:3], "Off", "On"
    fanctl_settings_idleup = bits, U08, 965, [6:6], "No", "Yes"
    fanctl_settings_on = bits, U08, 965, [7:7], "Off", "On"

    canadc_id1  = scalar, U08,  966, "", 1, 0, 0, 14, 0
    canadc_id2  = scalar, U08,  967, "", 1, 0, 0, 14, 0
    canadc_id3  = scalar, U08,  968, "", 1, 0, 0, 14, 0
    canadc_id4  = scalar, U08,  969, "", 1, 0, 0, 14, 0
    canadc_id5  = scalar, U08,  970, "", 1, 0, 0, 14, 0
    canadc_id6  = scalar, U08,  971, "", 1, 0, 0, 14, 0
    canadc_tab1 = scalar, U08,  972, "", 1, 0, 0, 31, 0
    canadc_tab2 = scalar, U08,  973, "", 1, 0, 0, 31, 0
    canadc_tab3 = scalar, U08,  974, "", 1, 0, 0, 31, 0
    canadc_tab4 = scalar, U08,  975, "", 1, 0, 0, 31, 0
    canadc_tab5 = scalar, U08,  976, "", 1, 0, 0, 31, 0
    canadc_tab6 = scalar, U08,  977, "", 1, 0, 0, 31, 0
    canadc_off1 = scalar, U16,  978, "", 1, 0, 0, 1023, 0
    canadc_off2 = scalar, U16,  980, "", 1, 0, 0, 1023, 0
    canadc_off3 = scalar, U16,  982, "", 1, 0, 0, 1023, 0
    canadc_off4 = scalar, U16,  984, "", 1, 0, 0, 1023, 0
    canadc_off5 = scalar, U16,  986, "", 1, 0, 0, 1023, 0
    canadc_off6 = scalar, U16,  988, "", 1, 0, 0, 1023, 0
    ac_idleup_cl_targetadder = scalar, S16, 990, "rpm", 1, 0, 0, 700, 0
    fan_idleup_cl_targetadder = scalar, S16, 992, "rpm", 1, 0, 0, 700, 0
#if CELSIUS
    boost_ctl_clt_threshold = scalar, S16, 994, "°C", 0.05555, -320, -40, {clthighlim}, 1
        #else
    boost_ctl_clt_threshold = scalar, S16, 994, "°F", 0.10000, 0.00000, -40, {clthighlim}, 1
#endif
    ac_idleup_set2_tps = bits, U08, 996, [0:0], "Off", "On"
    ac_idleup_set2_vss = bits, U08, 996, [1:1], "Off", "On"
    ac_idleup_set2_rpm = bits, U08, 996, [2:2], "Off", "On"
    ac_idleup_set2_outinv = bits, U08, 996, [3:3], "Normal", "Inverted"
#if LAMBDA
    ego_upper_bound    = scalar, U08,    997, "Lambda",  { 0.1 / stoich },   0.00000,  0.0476,    1.7,      3
    ego_lower_bound    = scalar, U08,    998, "Lambda",  { 0.1 / stoich },   0.00000,  0.0476,    1.7,      3
#else
    ego_upper_bound    = scalar, U08,    997, "AFR",  0.10000,   0.00000,  1,    25,      1 
    ego_lower_bound    = scalar, U08,    998, "AFR",  0.10000,   0.00000,  1,    25,      1 
#endif
      ss_opt2          = bits,   U08,    999, [0:3], $SS_OPTS_OFF2
    ss_opt2_spd      = bits,    U08,   999, [7:7], "Off", "On"
      launch_maxvss = scalar,  U16,    1000,      { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale },   0.00000,  0.00,   { maxspeed },      0 ; * (  2 bytes)

    maf_range               = bits,  U08, 1002, [0:1], "650g/s", "1300g/s", "1950g/s", "2600g/s"
    ac_delay_since_last_on = scalar, U08, 1003, "s", 1.00000, 0.00000, 0, 30, 0
      reluctorteeth3   = scalar, U16,    1004,      "",        0.01, 0,0,255,2 ; this is SS1
      reluctorteeth4   = scalar, U16,    1006,      "",        0.01, 0,0,255,2 ; this is SS2
    boost_gear_switch = scalar, U08,  1008, "gear", 1, 0, 1, 7, 0
    staged_extended_opts_use_v3 = bits, U08, 1009, [0:0], "Use Inj A-H (if possible)", "Use Inj I/J"
    staged_extended_opts_simult = bits, U08, 1009, [1:1], "Alternating (2 squirts)", "Simultaneous (1 squirt)"
    staged_extended_opts_pw1off = bits, U08, 1009, [2:2], "Off", "On"

    can_pwmout_id     = scalar, U08, 1010,             "",         1.00000,   0.00000,     0,     15,       0 ; * (  1 byte)
    can_pwmout_tab    = scalar, U08, 1011,             "",         1.00000,   0.00000,     0,     15,       0 ; * (  1 byte)
    can_pwmout_offset = scalar, S16, 1012,             "bytes",    1.00000,   0.00000,     0,   4095,       0 ;

      n2o_timing_delay = scalar, U16, 1014, "s", 0.000128, 0, 0.0, 2, 3
      n2o_timing_taper = scalar, U16, 1016, "s", 0.000128, 0, 0.0, 2, 3
      spare1018 = scalar, U16, 1018, "", 1, 0, 0, 65535, 0
#if CELSIUS
    idleve_clt = scalar, S16, 1020, "°C", 0.05555, -320, -40, {clthighlim}, 1
        #else
    idleve_clt = scalar, S16, 1020, "°F", 0.10000, 0.00000, -40, {clthighlim}, 1
#endif 
    idleve_delay = scalar, U08, 1022, "s", 1.00000, 0.0000, 0, 10, 0
;gap

page = 2
      pwm_testio   = bits, U08, 0, [0:2], "INVALID", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
      duty_testio  = scalar,   U08,    1,   "%", 1, 0, 0, 100, 1
      testop_0    = scalar, U08, 2, "", 1,0,0,255,0
      testop_coil = bits, U08, 2, [0:1], "Off", "One", "Sequence", "INVALID"
      testop_fp   = bits, U08, 2, [4:4], "Off", "On"
      testop_inj  = bits, U08, 2, [5:6], "Off", "One", "Sequence", "All"
      testop_pwm  = bits, U08, 2, [7:7], "Standard", "As below"

      testdwell    = scalar, U08, 3, "ms", 0.1,0,0,25.5,1
      testint      = scalar, U16, 4, "ms", 0.128,0,1,8388,1
;this depend on single coil or seq etc.
      testrpm      = scalar, U16, 4, "RPM", 1.0, {  (120000/testint) - (testint/ 0.128) },0,937500,0
      testpw       = scalar, U16, 6,             "ms",       0.001,   0.00000,  0,   65.535,      3
      testinjcnt   = scalar, U16, 8, "", 1,0,0,65535,0
;gap
      testinjPwmT     = scalar,  U08,    11,             "ms",       0.12800,   0.12800,  0.00,   32.64,      1
      testinjPwmPd    = scalar,  U08,    12,             "us",       1.00000,   0.00000, 40.00,  100.00,      0
      testinjPwmP     = scalar,  U08,    13,             "%",        1.00000,   0.00000,  0.00,  100.00,      0
      testsel_inj     = bits,  U08,    14, [0:3], "InjA", "InjB", "InjC", "InjD", "InjE", "InjF", "InjG", "InjH", "InjI", "InjJ" ,"InjK", "InjL", "INVALID", "INVALID", "INVALID", "INVALID"
      testsel_coil     = bits, U08,     14, [4:7], "CoilA", "CoilB", "CoilC", "CoilD", "CoilE", "CoilF", "CoilG", "CoilH", "CoilI", "CoilJ", "CoilK", "CoilL", "INVALID", "INVALID", "INVALID", "INVALID"
      dbgtooth    = scalar, U08, 15, "tooth", 1,0,0,255,0
      iacpostest  = scalar, S16, 16, "steps", 1,0,0,32767,0
      iachometest      = scalar, S16, 18, "steps", 1,0,0,32767,0
      iactest_0       = scalar, U08, 20, "", 1,0,0,255,0
      flashlock       = bits, U08, 21, [0:0], "Locked", "Unlocked" ; tables 0-3
      boost_ctl_settings_on2    = bits,   U08, 22, [3:3], "Off","On"
      boost_ctl_settings_cl2    = bits,   U08, 22, [4:4], "Open-loop", "Closed-loop"
      boost_ctl_pins2           = bits,   U08, 23, [0:6], $PIN_DIGOUT
      boost_ctl_Kp2             = scalar, U08, 24, "%", 1, 0.00000, 0, 200, 0
      boost_ctl_Ki2             = scalar, U08, 25, "%", 1, 0.00000, 0, 200, 0
      boost_ctl_Kd2             = scalar, U08, 26, "%", 1, 0.00000, 0, 200, 0
      boost_ctl_closeduty2      = scalar, U08, 27, "%", 1, 0.00000, 0, 100, 0
      boost_ctl_openduty2       = scalar, U08, 28, "%", 1, 0.00000, 0, 100, 0
      boost_ctl_pins_pwm2       = bits,   U08, 29, [0:2], $PIN_HWPWMOUT
      boost_ctl_lowerlimit2 =      scalar, S16, 30, "kPa",0.10000, 0.00000, 5, 500, 1
      boost_ctl_sensor2 =  bits, U08, 32, [0:3], "Sensor 1", "Sensor 2","Sensor 3","Sensor 4","Sensor 5","Sensor 6","Sensor 7","Sensor 8","Sensor 9","Sensor 10","Sensor 11","Sensor 12","Sensor 13","Sensor 14","Sensor 15","Sensor 16"
;gap
      vss3_an          = bits,    U08,   34,[0:5], $PIN_ADCS
      vss4_an          = bits,    U08,   35,[0:5], $PIN_ADCS
      vss3_pwmseq   =   scalar,  U08,    36,      "",    1.00000,   0.00000,     1,   4,       0
      vss4_pwmseq   =   scalar,  U08,    37,      "",    1.00000,   0.00000,     1,   4,       0
    u08_debug38 = scalar, U08, 38, "", 1, 0.00000, 0, +255, 0
;    u08_debug38_0 = bits, U08, 38, [0:0], "Normal", "Loopback"
    u08_debug38_1 = bits, U08, 38, [1:1], "Off", "On"
    u08_debug38_2 = bits, U08, 38, [2:2], "Useful data", "Whole file"
; pad gap

    egoport1    = bits,   U08,  40, [0:5], $PIN_ADCS_EGO, 7="CAN EGO", 38="INVALID"
    egoport2    = bits,   U08,  41, [0:5], $PIN_ADCS_EGO, 7="CAN EGO", 38="INVALID"
    egoport3    = bits,   U08,  42, [0:5], $PIN_ADCS_EGO, 7="CAN EGO", 38="INVALID"
    egoport4    = bits,   U08,  43, [0:5], $PIN_ADCS_EGO, 7="CAN EGO", 38="INVALID"
    egoport5    = bits,   U08,  44, [0:5], $PIN_ADCS_EGO, 7="CAN EGO", 38="INVALID"
    egoport6    = bits,   U08,  45, [0:5], $PIN_ADCS_EGO, 7="CAN EGO", 38="INVALID"
    egoport7    = bits,   U08,  46, [0:5], $PIN_ADCS_EGO, 7="CAN EGO", 38="INVALID"
    egoport8    = bits,   U08,  47, [0:5], $PIN_ADCS_EGO, 7="CAN EGO", 38="INVALID"
    egoport9    = bits,   U08,  48, [0:5], $PIN_ADCS_EGO, 7="CAN EGO", 38="INVALID"
    egoport10   = bits,   U08,  49, [0:5], $PIN_ADCS_EGO, 7="CAN EGO", 38="INVALID"
    egoport11   = bits,   U08,  50, [0:5], $PIN_ADCS_EGO, 7="CAN EGO", 38="INVALID"
    egoport12   = bits,   U08,  51, [0:5], $PIN_ADCS_EGO, 7="CAN EGO", 38="INVALID"
;    egoport13   = bits,   U08,  52, [0:5], $PIN_ADCS_EGO, 7="CAN EGO", 38="INVALID"
;    egoport14   = bits,   U08,  53, [0:5], $PIN_ADCS_EGO, 7="CAN EGO", 38="INVALID"
;    egoport15   = bits,   U08,  54, [0:5], $PIN_ADCS_EGO, 7="CAN EGO", 38="INVALID"
;    egoport16   = bits,   U08,  55, [0:5], $PIN_ADCS_EGO, 7="CAN EGO", 38="INVALID"

#define EGOMAP = "EGO1", "EGO2", "EGO3", "EGO4", "EGO5", "EGO6", "EGO7", "EGO8", "EGO9", "EGO10", "EGO11", "EGO12", "EGO13", "EGO14", "EGO15", "EGO16"

    egomap1     = bits,   U08,  56, [0:3], $EGOMAP
    egomap2     = bits,   U08,  57, [0:3], $EGOMAP
    egomap3     = bits,   U08,  58, [0:3], $EGOMAP
    egomap4     = bits,   U08,  59, [0:3], $EGOMAP
    egomap5     = bits,   U08,  60, [0:3], $EGOMAP
    egomap6     = bits,   U08,  61, [0:3], $EGOMAP
    egomap7     = bits,   U08,  62, [0:3], $EGOMAP
    egomap8     = bits,   U08,  63, [0:3], $EGOMAP
    egomap9     = bits,   U08,  64, [0:3], $EGOMAP
    egomap10    = bits,   U08,  65, [0:3], $EGOMAP
    egomap11    = bits,   U08,  66, [0:3], $EGOMAP
    egomap12    = bits,   U08,  67, [0:3], $EGOMAP
;    egomap13    = bits,   U08,  68, [0:3], $EGOMAP
;    egomap14    = bits,   U08,  69, [0:3], $EGOMAP
;    egomap15    = bits,   U08,  70, [0:3], $EGOMAP
;    egomap16    = bits,   U08,  71, [0:3], $EGOMAP
;egomap?t is not presently implemented in the code
    egomap1t    = bits,   U08,  56, [4:4], "1", "2"
    egomap2t    = bits,   U08,  57, [4:4], "1", "2"
    egomap3t    = bits,   U08,  58, [4:4], "1", "2"
    egomap4t    = bits,   U08,  59, [4:4], "1", "2"
    egomap5t    = bits,   U08,  60, [4:4], "1", "2"
    egomap6t    = bits,   U08,  61, [4:4], "1", "2"
    egomap7t    = bits,   U08,  62, [4:4], "1", "2"
    egomap8t    = bits,   U08,  63, [4:4], "1", "2"
    egomap9t    = bits,   U08,  64, [4:4], "1", "2"
    egomap10t   = bits,   U08,  65, [4:4], "1", "2"
    egomap11t   = bits,   U08,  66, [4:4], "1", "2"
    egomap12t   = bits,   U08,  67, [4:4], "1", "2"
;    egomap13t   = bits,   U08,  68, [4:4], "1", "2"
;    egomap14t   = bits,   U08,  69, [4:4], "1", "2"
;    egomap15t   = bits,   U08,  70, [4:4], "1", "2"
;    egomap16t   = bits,   U08,  71, [4:4], "1", "2"

      tc_opt_on     = bits, U08, 72, [0:0], "Off", "On"
      tc_opt_method = bits, U08, 72, [1:3], "Perfect Run", "VSS %slip", "Perfect Run RPM", "Switch input", "INVALID", "INVALID", "INVALID", "None"
      tc_opt_slipcurve=bits,U08, 72, [4:4], "Fixed value", "Adjustable"
      tc_opt_n2o    = bits, U08, 72, [5:5], "On/Off", "INVALID"
      tc_opt_bank   = bits, U08, 72, [6:7], "INVALID", "Bank 1", "Bank 2", "Both"
      tc_slipthresh = scalar, U08, 73, "%",  1, 0.00000, 0, 100, 0
      tc_minvss     = scalar, U16, 74, { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale }, 0.00000, 0, { maxspeed }, 1
      tc_maxvss     = scalar, U16, 76, { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale }, 0.00000, 0, { maxspeed }, 1
      tc_mintps     = scalar, S16, 78, "%",  0.10000, 0.00000, 0, 100, 1
      tc_enin       = bits, U08, 80, [0:5], $PIN_DIGIN_OFF
    knock_bpass = bits, U08, 81, [0:5], "1.22", "1.26", "1.31", "1.35", "1.40", "1.45", "1.51", "1.57", "1.63", "1.71", "1.78", "1.87", "1.96", "2.07", "2.18", "2.31", "2.46", "2.54", "2.62", "2.71", "2.81", "2.92", "3.03", "3.15", "3.28", "3.43", "3.59", "3.76", "3.95", "4.16", "4.39", "4.66", "4.95", "5.12", "5.29", "5.48", "5.68", "5.90", "6.12", "6.37", "6.64", "6.94", "7.27", "7.63", "8.02", "8.46", "8.95", "9.50", "10.12", "10.46", "10.83", "11.22", "11.65", "12.10", "12.60", "13.14", "13.72", "14.36", "15.07", "15.84", "16.71", "17.67", "18.76", "19.98"
    knock_conf_num = bits, U08, 82, [0:0], "1", "2"
    knock_conf_debug = bits, U08, 82, [4:4], "Off", "On"
    knock_conf_percylact = bits, U08, 82, [5:5], "Off", "On"
    knock_conf_launch = bits, U08, 82, [6:6], "Off", "On"
    knock_conf_percyl = bits, U08, 82, [7:7], "Off", "On"
    knock_int      = bits, U08, 83, [0:4], "40", "45", "50", "55", "60", "65", "70", "75", "80", "90", "100", "110", "120", "130", "140", "150", "160", "180", "200", "220", "240", "260", "280", "300", "320", "360", "400", "440", "480", "520", "560", "600"

    ff_tpw0        = scalar, U08, 84, "ms", 0.05, 0, 0, 12.7, 2
    ff_tpw1        = scalar, U08, 85, "ms", 0.05, 0, 0, 12.7, 2
#if CELSIUS
    ff_temp0   = scalar, S16, 86, "°C", 0.05555, -320, -40, 150.00, 1
    ff_temp1   = scalar, S16, 88, "°C", 0.05555, -320, -40, 150.00, 1
#else
    ff_temp0   = scalar, S16, 86, "°F", 0.10000, 0.00000, -40, 300, 1
    ff_temp1   = scalar, S16, 88, "°F", 0.10000, 0.00000, -40, 300, 1
#endif
    fueltemp1  = bits, U08,   90, [0:4], "Off", "Flex fuel", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Sensor 1", "Sensor 2","Sensor 3","Sensor 4","Sensor 5","Sensor 6","Sensor 7","Sensor 8","Sensor 9","Sensor 10","Sensor 11","Sensor 12","Sensor 13","Sensor 14","Sensor 15","Sensor 16"
    fueltemp1_corr = bits, U08, 90, [7:7], "Off", "On"
    tc_knob   = bits,   U08,  91, [0:5], $PIN_ADCS_OFF
    maf_freq0  = scalar, U16, 92, "Hz", 0.25, 0.00000, 0, 16383,1
    maf_freq1  = scalar, U16, 94, "Hz", 0.25, 0.00000, 0, 16383,1
    map_freq0  = scalar, U16, 96, "Hz", 0.2, 0.00000, 0, 13107,1
    map_freq1  = scalar, U16, 98, "Hz", 0.2, 0.00000, 0, 13107,1

#define KNOCK_GAIN = "2.000", "1.882", "1.778", "1.684", "1.600", "1.523", "1.455", "1.391", "1.333", "1.280", "1.231", "1.185", "1.143", "1.063", "1.000", "0.944", "0.895", "0.85", "0.81", "0.773", "0.739", "0.708", "0.680", "0.654", "0.630", "0.607", "0.586", "0.567", "0.548", "0.500", "0.471", "0.444", "0.421", "0.400", "0.381", "0.364", "0.348", "0.333", "0.320", "0.308", "0.296", "0.286", "0.276", "0.267", "0.258", "0.250", "0.236", "0.222", "0.211", "0.200", "0.190", "0.182", "0.174", "0.167", "0.160", "0.154", "0.148", "0.143", "0.138", "0.133", "0.129", "0.125", "0.118", "0.111"

    knock_gain01 = bits, U08, 100, [0:5], $KNOCK_GAIN   
    knock_gain02 = bits, U08, 101, [0:5], $KNOCK_GAIN   
    knock_gain03 = bits, U08, 102, [0:5], $KNOCK_GAIN   
    knock_gain04 = bits, U08, 103, [0:5], $KNOCK_GAIN   
    knock_gain05 = bits, U08, 104, [0:5], $KNOCK_GAIN   
    knock_gain06 = bits, U08, 105, [0:5], $KNOCK_GAIN   
    knock_gain07 = bits, U08, 106, [0:5], $KNOCK_GAIN   
    knock_gain08 = bits, U08, 107, [0:5], $KNOCK_GAIN   
    knock_gain09 = bits, U08, 108, [0:5], $KNOCK_GAIN   
    knock_gain10 = bits, U08, 109, [0:5], $KNOCK_GAIN   
    knock_gain11 = bits, U08, 110, [0:5], $KNOCK_GAIN   
    knock_gain12 = bits, U08, 111, [0:5], $KNOCK_GAIN   
    knock_gain13 = bits, U08, 112, [0:5], $KNOCK_GAIN   
    knock_gain14 = bits, U08, 113, [0:5], $KNOCK_GAIN   
    knock_gain15 = bits, U08, 114, [0:5], $KNOCK_GAIN   
    knock_gain16 = bits, U08, 115, [0:5], $KNOCK_GAIN   

    knock_sens01 = bits, U08, 116, [0:0], "1", "2"
    knock_sens02 = bits, U08, 117, [0:0], "1", "2"
    knock_sens03 = bits, U08, 118, [0:0], "1", "2"
    knock_sens04 = bits, U08, 119, [0:0], "1", "2"
    knock_sens05 = bits, U08, 120, [0:0], "1", "2"
    knock_sens06 = bits, U08, 121, [0:0], "1", "2"
    knock_sens07 = bits, U08, 122, [0:0], "1", "2"
    knock_sens08 = bits, U08, 123, [0:0], "1", "2"
    knock_sens09 = bits, U08, 124, [0:0], "1", "2"
    knock_sens10 = bits, U08, 125, [0:0], "1", "2"
    knock_sens11 = bits, U08, 126, [0:0], "1", "2"
    knock_sens12 = bits, U08, 127, [0:0], "1", "2"
    knock_sens13 = bits, U08, 128, [0:0], "1", "2"
    knock_sens14 = bits, U08, 129, [0:0], "1", "2"
    knock_sens15 = bits, U08, 130, [0:0], "1", "2"
    knock_sens16 = bits, U08, 131, [0:0], "1", "2"
    s16_debug = scalar, S16, 132, "", 1, 0.00000, -32768, +32767, 0
    u08_debug134 = scalar, U08, 134, "", 1, 0.00000, 0, +255, 0
    AE_options = bits, U08, 135, [0:0], "Time-based AE", "Accel-pump AE"
    MAP_fastsample = bits, U08, 135, [1:1], "Use normal sample setting", "Fast sample"
    accel_blend_percent = scalar, S16, 136, "%", 0.1, 0.0, 0, 100, 1
    accel_tpsdot_threshold = scalar, U16, 138, "%/sec", 0.1, 0, 0, 3276, 0
    accel_mapdot_threshold = scalar, U16, 140, "kpa/sec", 1, 0, 0, 20000, 0
    ae_lorpm2        = scalar,  U16,    142,             "rpm",      1.0,       0.0,      0.0,   20000,       0
    ae_hirpm2        = scalar,  U16,    144,             "rpm",      1.0,       0.0,      0.0,   20000,       0
    accel_blend_percent2 = scalar, S16, 146, "%", 0.1, 0.0, 0, 100, 1
    accel_tpsdot_threshold2 = scalar, U16, 148, "%/sec", 0.1, 0, 0, 3276, 0
    accel_mapdot_threshold2 = scalar, U16, 150, "kpa/sec", 1, 0, 0, 20000, 0
    tpsThresh2       = scalar,  S16,    152,             "%/s",      0.10000,   0.00000,  0.00,  3276.0,      1
    mapThresh2       = scalar,  S16,    154,             "kPa/s",    1.00000,   0.00000,  0.00,  10000.0,      0
    aeEndPW2         = scalar,  S16,    156,             "%ReqFuel",       1,   0.00000,  0.00, 100,      0
    taeColdA2        = scalar,  U08,    158,             "%ReqFuel",       1,   0.00000,  0,  255,      0
    taeColdM2        = scalar,  U08,    159,             "%",        1.00000,   0.00000,  100,  255.00,      0
    taeTime2         = scalar,  U08,    160,             "s",        0.010000,   0.00000,  0.00,   1.00,      2
    taeTime_events2 = scalar,  U08,    160,             "events",        1,   0.00000,  0.00,   255,      0
    tdePct2          = scalar,  U08,    161,             "",         1.00000,   0.00000,  50.00, 100.00,      0
    aeTaperTime2     = scalar,  U08,    162,             "s",        0.010000,   0.00000,  0.00,   1.00,      2
    aeTaperTime_events2= scalar,  U08,    162,             "events",        1,   0.00000,  0.00,   255,      0
    tpsProportion2   = scalar,  U08,    163,             "%",        1.00000,   0.00000,  0.00,  100.00,      0
    accel_CLT_multiplier2 = scalar, S16, 164, "%", 0.1, 0, 100, 255, 1
    tc_led_out = bits, U08, 166, [0:6], $PIN_DIGOUT_CANOUT_OFF
    tc_opt_driven = bits, U08, 167, [0:2], "VSS1", "VSS3", "Avg VSS1+VSS3", "Max VSS1+VSS3", "Side2side", "Avg VSS1-4", "Max VSS1-4", "INVALID"
    tc_opt_undriven = bits, U08, 168, [0:2], "VSS2", "VSS4", "Avg VSS2+VSS4", "Max VSS2+VSS4", "Side2side", "GPS Speed", "INVALID", "INVALID"
    tc_opt3_vssdiff = bits, U08, 169, [0:0], "Off", "On"
;gap
;gap 36 bytes
;gap
    accel_CLT_multiplier = scalar, S16, 206, "%", 0.1, 0, 100, 255, 1
    cl_idle_timing_target_deltas = array, S16, 208, [8], "rpm", 1, 0, -1000, 1000, 0
    cl_idle_timing_advance_deltas = array, S16, 224, [8], "deg", 0.1, 0, -90, 90, 0

    ltt_opt_on = bits, U08, 240, [0:0], "Off", "On"
    ltt_opt_mode = bits, U08, 240, [1:1], "Timed", "Button"
    ltt_opt_feedback = bits, U08, 240, [2:2], "Off", "On"
    ltt_but_in    = bits, U08, 241, [0:5], $PIN_DIGIN
    ltt_int = scalar, U08, 242, "min", 1, 0.00000, 5, 30, 0
    ltt_led_out = bits, U08, 243, [0:6], $PIN_DIGOUT_CANOUT_OFF
    ltt_thresh = scalar, U16, 244, "%", 0.1, 0.0, 10, 65535, 1

    tc_minmap     = scalar, S16, 246, "kPa",  0.10000, 0.00000, 0, 700, 1
      can_bcast1_on    = bits,     U08,    248,           [0:0], "Off", "On"
      can_bcast1_280x4 = bits,     U08,    248,           [1:1], "Off", "On"
      can_bcast1_280x1 = bits,     U08,    248,           [2:2], "Off", "On"
      can_bcast1_289   = bits,     U08,    248,           [3:3], "Off", "On"
      can_bcast1_316   = bits,     U08,    248,           [4:4], "Off", "On"
      can_bcast1_329   = bits,     U08,    248,           [5:5], "Off", "On"
      can_bcast1_561   = bits,     U08,    248,           [6:6], "Off", "On"
      can_bcast1_361   = bits,     U08,    248,           [7:7], "Off", "On"

      can_bcast2_041   = bits,     U08,    249,           [0:0], "Off", "On"
      can_bcast2_he351 = bits,     U08,    249,           [1:1], "Off", "On"
      can_bcast2_23d   = bits,     U08,    249,           [2:2], "Off", "On"
      can_bcast2_lotus0407 = bits, U08,    249,           [3:3], "Off", "On"
      can_bcast2_lotus0815 = bits, U08,    249,           [4:4], "Off", "On"
      can_bcast2_xxx   = bits,     U08,    249,           [7:7], "Off", "On"

      can_bcast_int    = scalar, U16, 250, "ms", 0.128, 0.00000, 10, 1000,1

    timedout1_in    = bits, U08, 252, [0:5], $PIN_DIGIN_OFF, 15="Same as launch"

    timedout1_out   = bits, U08, 253, [0:6], $PIN_DIGOUT_CANOUT_OFF
    timedout1_offdelay   = scalar, U16,    254,  "s", 0.001, 0, 0, 15, 3
    tstop_out    = bits, U08, 256, [0:6], $PIN_DIGOUT_CANOUT_OFF
    can_enable_on = bits, U08,    257,           [0:0], "Off", "On"
    can_enable_alcan = bits, U08, 257,           [1:1], "Off", "On"
    can_enable_baud = bits, U08,  257,           [2:3], "500k", "250k", "1M", "INVALID"
    can_enable_outpc = bits, U08, 257,           [4:4], "Off", "On"
    can_enable_tuning = bits, U08, 257,           [5:5], "Off", "On"
    tstop_delay = scalar, U16,    258,    "s", 0.001, 0, 0, 15, 3
    tstop_hold  = scalar, U16,    260,    "s", 0.001, 0, 0, 15, 3
    oddfireangs1 = scalar, U16,    262,             "",         0.10000,   0.00000,  0.00,  720.00,      1 ; * (  2 byte)
    oddfireangs2 = scalar, U16,    264,             "",         0.10000,   0.00000,  0.00,  720.00,      1 ; * (  2 byte)
    oddfireangs3 = scalar, U16,    266,             "",         0.10000,   0.00000,  0.00,  720.00,      1 ; * (  2 byte)
    oddfireangs4 = scalar, U16,    268,             "",         0.10000,   0.00000,  0.00,  720.00,      1 ; * (  2 byte)
    oddfireangs5 = scalar, U16,    270,             "",         0.10000,   0.00000,  0.00,  720.00,      1 ; * (  2 byte)
    oddfireangs6 = scalar, U16,    272,             "",         0.10000,   0.00000,  0.00,  720.00,      1 ; * (  2 byte)

    cel_opt_on =    bits, U08, 274, [0:0], "Off", "On"
    cel_opt_stat =  bits, U08, 274, [1:3], "Off", "MAP", "MAT", "CLT", "TPS", "Batt", "EGO", "EGT1"
    cel_opt_adc  =  bits, U08, 274, [5:5], "Fluctuation", "ADC counts"
    cel_opt_flash = bits, U08, 274, [6:6], "Solid", "Flash-codes"
    cel_opt_when =  bits, U08, 274, [7:7], "Off", "On"

    cel_port =      bits, U08, 275, [0:6], $PIN_DIGOUT_CANOUT_OFF
    afr_min =          scalar,  U08,    276,             "AFR",      0.10000,   0.00000,  0.00,  25.5,        1 ;
    afr_max =          scalar,  U08,    277,             "AFR",      0.10000,   0.00000,  0.00,  25.5,        1 ;
    afr_var_upper = scalar, U16,    278,             "",         1,   0,  0.00,  65535,     0
    afr_var_lower = scalar, U16,    280,             "",         1,   0,  0.00,  65535,     0
    map_minadc = scalar,    U16,    282,             "",         1,   0,  0.00,  1023,      0
    map_maxadc = scalar,    U16,    284,             "",         1,   0,  0.00,  1023,      0
    map_var_upper = scalar, U16,    286,             "",         1,   0,  0.00,  65535,     0
    mat_minadc = scalar,    U16,    288,             "",         1,   0,  0.00,  1023,      0
    mat_maxadc = scalar,    U16,    290,             "",         1,   0,  0.00,  1023,      0
    mat_var_upper = scalar, U16,    292,             "",         1,   0,  0.00,  65535,     0
    clt_minadc = scalar,    U16,    294,             "",         1,   0,  0.00,  1023,      0
    clt_maxadc = scalar,    U16,    296,             "",         1,   0,  0.00,  1023,      0
    clt_var_upper = scalar, U16,    298,             "",         1,   0,  0.00,  65535,     0
    tps_minadc = scalar,    U16,    300,             "",         1,   0,  0.00,  1023,      0
    tps_maxadc = scalar,    U16,    302,             "",         1,   0,  0.00,  1023,      0
    tps_var_upper = scalar, U16,    304,             "",         1,   0,  0.00,  65535,     0
    batt_minv = scalar,    U08,    306,             "",         0.1,   0,  7.00,  23.0,      1
    batt_maxv = scalar,    U08,    307,             "",         0.1,   0,  7.00,  23.0,      1
    batt_var_upper = scalar, U16,    308,             "",         1,   0,  0.00,  65535,     0
    cel_opt2_map =    bits, U08,    310, [0:0], "Off", "On"
    cel_opt2_mat =    bits, U08,    310, [1:1], "Off", "On"
    cel_opt2_clt =    bits, U08,    310, [2:2], "Off", "On"
    cel_opt2_tps =    bits, U08,    310, [3:3], "Off", "On"
    cel_opt2_batt =   bits, U08,    310, [4:4], "Off", "On"
    cel_opt2_afr0 =   bits, U08,    310, [5:5], "Off", "On"
    cel_opt2_sync =   bits, U08,    310, [6:6], "Off", "On"
    cel_opt2_egt =    bits, U08,    310, [7:7], "Off", "On"
    cel_action1_map = bits, U08,    311, [0:0], "Off", "On"
    cel_action1_mat = bits, U08,    311, [1:1], "Off", "On"
    cel_action1_clt = bits, U08,    311, [2:2], "Off", "On"
    cel_action1_tps = bits, U08,    311, [3:3], "Off", "On"
    cel_action1_batt= bits, U08,    311, [4:4], "Off", "On"
    cel_action1_ego = bits, U08,    311, [5:5], "Off", "On"
    cel_action1_sync = bits, U08,    311, [6:6], "Off", "On"
    cel_action1_map_an = bits, U08,    311, [7:7], "Off", "On"
#if CELSIUS
        cel_clt_cold       = scalar,  S16,    312,    "°C",       0.05555,  -320.000,-40.00,  {clthighlim},      1
        cel_clt_warm       = scalar,  S16,    314,    "°C",       0.05555,  -320.000,-40.00,  {clthighlim},      1
#else
        cel_clt_cold       = scalar,  S16,    312,    "°F",       0.10000,   0.00000,-40.00,  {clthighlim},      1
        cel_clt_warm       = scalar,  S16,    314,    "°F",       0.10000,   0.00000,-40.00,  {clthighlim},      1
#endif
    cel_warmtime     = scalar,  U16,    316,     "mins",     0.01666,   9, 1, 20,1
#if CELSIUS
        cel_mat_default    = scalar,  S16,    318,    "°C",       0.05555,  -320.000,-40.00,  {clthighlim},      1
#else
        cel_mat_default    = scalar,  S16,    318,    "°F",       0.10000,   0.00000,-40.00,  {clthighlim},      1
#endif
    cel_revlim         = scalar,  S16,    320,    "RPM",      1.00000,   0.00000,  0.00,20000,      0
    cel_overboost      = scalar,  S16,    322,    "kPa",      0.10000,   0.00000,  0.00,  700,        1
    cel_boost_duty       = scalar, U08, 324, "%", 1, 0.00000, 0, 100, 0
    cel_boost_duty2      = scalar, U08, 325, "%", 1, 0.00000, 0, 100, 0
    cel_synctol     = scalar, U08, 326, "", 1, 0.00000, 0, 100, 0
    cel_opt3_flex =    bits, U08,    327, [0:0], "Off", "On"

    cel_retard   = scalar,  S16,    328,     "deg",      0.10000,   0.00000,0.00,   10.00,      1
    map_var_lower = scalar, U16,    330,             "",         1,   0,  0.00,  65535,     0
#if CELSIUS
        egt_minvalid    = scalar,  S16,    332,    "°C",       0.05555,  -320.000,-40.00,  1500,      1
        egt_maxvalid    = scalar,  S16,    334,    "°C",       0.05555,  -320.000,-40.00,  1500,      1
#else
        egt_minvalid    = scalar,  S16,    332,    "°F",       0.10000,   0.00000,-40.00,  2700,      1
        egt_maxvalid    = scalar,  S16,    334,    "°F",       0.10000,   0.00000,-40.00,  2700,      1
#endif
    egt_var_upper = scalar, U16,    336,             "",         1,   0,  0.00,  65535,     0
    egt_var_lower = scalar, U16,    338,             "",         1,   0,  0.00,  65535,     0
    cel_runtime      = scalar, U08, 340, "s", 1, 0.00000, 5, 100, 0
    cel_action2_flex = bits, U08,    341, [0:0], "Off", "On"
    cel_action2_egt = bits, U08,    341, [1:1], "Off", "On"
    cel_action2_oil = bits, U08,    341, [2:2], "Off", "On"

      blend_opt1 =  bits, U08, 342, [0:4], "TPS", "MAP", "RPM", "MAFload", "Flex%", "VSS1", "Gear", "RPM*load/100", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Sensor 1", "Sensor 2","Sensor 3","Sensor 4","Sensor 5","Sensor 6","Sensor 7","Sensor 8","Sensor 9","Sensor 10","Sensor 11","Sensor 12","Sensor 13","Sensor 14","Sensor 15","Sensor 16"
      blend_opt2 =  bits, U08, 343, [0:4], "TPS", "MAP", "RPM", "MAFload", "Flex%", "VSS1", "Gear", "RPM*load/100", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Sensor 1", "Sensor 2","Sensor 3","Sensor 4","Sensor 5","Sensor 6","Sensor 7","Sensor 8","Sensor 9","Sensor 10","Sensor 11","Sensor 12","Sensor 13","Sensor 14","Sensor 15","Sensor 16"
      blend_opt3 =  bits, U08, 344, [0:4], "TPS", "MAP", "RPM", "MAFload", "Flex%", "VSS1", "Gear", "RPM*load/100", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Sensor 1", "Sensor 2","Sensor 3","Sensor 4","Sensor 5","Sensor 6","Sensor 7","Sensor 8","Sensor 9","Sensor 10","Sensor 11","Sensor 12","Sensor 13","Sensor 14","Sensor 15","Sensor 16"
      blend_opt4 =  bits, U08, 345, [0:4], "TPS", "MAP", "RPM", "MAFload", "Flex%", "VSS1", "Gear", "RPM*load/100", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Sensor 1", "Sensor 2","Sensor 3","Sensor 4","Sensor 5","Sensor 6","Sensor 7","Sensor 8","Sensor 9","Sensor 10","Sensor 11","Sensor 12","Sensor 13","Sensor 14","Sensor 15","Sensor 16"
      blend_opt5 =  bits, U08, 346, [0:4], "TPS", "MAP", "RPM", "MAFload", "Flex%", "VSS1", "Gear", "RPM*load/100", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Sensor 1", "Sensor 2","Sensor 3","Sensor 4","Sensor 5","Sensor 6","Sensor 7","Sensor 8","Sensor 9","Sensor 10","Sensor 11","Sensor 12","Sensor 13","Sensor 14","Sensor 15","Sensor 16"
      blend_opt6 =  bits, U08, 347, [0:4], "TPS", "MAP", "RPM", "MAFload", "Flex%", "VSS1", "Gear", "RPM*load/100", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Sensor 1", "Sensor 2","Sensor 3","Sensor 4","Sensor 5","Sensor 6","Sensor 7","Sensor 8","Sensor 9","Sensor 10","Sensor 11","Sensor 12","Sensor 13","Sensor 14","Sensor 15","Sensor 16"
      blend_opt7 =  bits, U08, 348, [0:4], "TPS", "MAP", "RPM", "MAFload", "Flex%", "VSS1", "Gear", "RPM*load/100", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Sensor 1", "Sensor 2","Sensor 3","Sensor 4","Sensor 5","Sensor 6","Sensor 7","Sensor 8","Sensor 9","Sensor 10","Sensor 11","Sensor 12","Sensor 13","Sensor 14","Sensor 15","Sensor 16"
;gap in case of more blend curve options
    fp_opt_mode = bits, U08, 350, [0:1], "On/Off", "Open-Loop PWM", "Closed-Loop PWM", "INVALID"
    fp_opt_reg  = bits, U08, 350, [4:5], "Vac referenced", "Fixed pressure", "Custom correction", "INVALID"
    fp_opt_inv  = bits, U08, 350, [6:6], "Normal", "Inverted"
    fp_opt_safety  = bits, U08, 350, [7:7], "Off", "On"
    fp_out1 = bits, U08,      351, [0:6], $PIN_DIGOUT, 0="Fuel Pump"
    rail_pressure_psig = scalar, U16, 352, "psi.g", 0.014504, 0.00000, 0, 100, 1
    rail_pressure_kpag = scalar, U16, 352, "kPa.g", 0.1, 0.00000, 0, 680, 1
    fp_Kp               = scalar, U16, 354, "%", 0.1, 0.00000, 0, 200, 1 
    fp_Ki               = scalar, U16, 356, "%", 0.1, 0.00000, 0, 200, 1
    fp_Kd               = scalar, U16, 358, "%", 0.1, 0.00000, 0, 200, 1
    fp_prime_duty   = scalar,  U08,    360, "%", 0.392, 0.00000, 0, 100, 1
    fp_press_in = bits, U08, 361, [0:3], "Off","Sensor 1", "Sensor 2","Sensor 3","Sensor 4","Sensor 5","Sensor 6","Sensor 7","Sensor 8","Sensor 9","Sensor 10","Sensor 11","Sensor 12","Sensor 13","Sensor 14","Sensor 15" ; note off by 1
    fp_press_type = bits, U08, 361, [6:7], "Gauge", "Absolute", "Differential", "INVALID"
    fp_freq         = bits, U08, 362, [0:3], "INVALID", "INVALID", "250Hz", "225Hz", "200Hz", "175Hz", "150Hz", "125Hz", "100Hz", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
;spare
    alternator_opt_mode = bits, U08, 364, [0:2], "Off", "On-Off", "Open-loop frequency", "Open-loop duty", "Closed-loop field control", "High-speed feedback field control", "INVALID", "INVALID"
; possible application specific option bits
    alternator_freq         = bits, U08, 365, [0:3], "INVALID", "INVALID", "250Hz", "225Hz", "200Hz", "175Hz", "150Hz", "125Hz", "100Hz", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
  alternator_controlout = bits, U08,      366, [0:6], $PIN_DIGOUT
    alternator_control_inv  = bits, U08, 366, [7:7], "Normal", "Inverted"
  alternator_lampout = bits, U08,      367, [0:6], $PIN_DIGOUT_CANOUT_OFF
    alternator_Kp               = scalar, U16, 368, "%", 0.1, 0.00000, 0, 200, 1 
    alternator_Ki               = scalar, U16, 370, "%", 0.1, 0.00000, 0, 200, 1 
    alternator_Kd               = scalar, U16, 372, "%", 0.1, 0.00000, 0, 200, 1
    alternator_startdelay       = scalar, U08, 374, "s", 0.1, 0.00000, 0, 25.5, 1
    alternator_ramptime         = scalar, U08, 375, "s", 0.1, 0.00000, 0, 25.5, 1
    alternator_wot              = scalar, U16, 376, "%", 0.1, 0.00000, 0, 110, 1
    alternator_wotv             = scalar, U08, 378, "V", 0.1, 0.00000, 10.0, 16.0, 1
    alternator_overrv           = scalar, U08, 379, "V", 0.1, 0.00000, 10.0, 16.0, 1
    alternator_wottimeout       = scalar, U08, 380, "s", 1, 0.00000, 0, 30, 0
    alternator_tempin           = bits, U08, 381, [0:3], "Off","Sensor 1", "Sensor 2","Sensor 3","Sensor 4","Sensor 5","Sensor 6","Sensor 7","Sensor 8","Sensor 9","Sensor 10","Sensor 11","Sensor 12","Sensor 13","Sensor 14","Sensor 15" ; note off by 1
    alternator_freq_monin    = bits,   U08,  382, [0:5], $PIN_DIGIN_OFF
    alternator_freq_moninv  = bits, U08, 382, [6:6], "Normal", "Inverted"
    alternator_targv           = scalar, U08, 383, "V", 0.1, 0.00000, 10.0, 16.0, 1
    alternator_ctl_ms          = scalar, U16, 384, "ms", 0.128, 0.00000, 10, 500, 0
    fp_ctl_ms                  = scalar, U16, 386, "ms", 0.128, 0.00000, 10, 500, 0
    alternator_freq_currin    = bits,   U08,  388, [0:5], $PIN_DIGIN_OFF
    alternator_freq_currinv  = bits, U08, 388, [6:6], "Normal", "Inverted"
    alternator_chargetime         = scalar, U08, 389, "min", 1, 0.00000, 0, 30, 0
    alternator_targvr           = scalar, U08, 390, "V", 0.1, 0.00000, 10.0, 16.0, 1
    alternator_diff             = scalar, U08, 391, "V", 0.1, 0.00000, 0.1, 3.0, 1
    alternator_maxload          = scalar, U08, 392, "%", 1, 0.00000, 75, 101, 0
    hpte_opt_on                 = bits,   U08, 393, [0:0], "Off","On"
    hpte_load                   = scalar, S16, 394, "%",    0.10000, 0,       0,      500,   1
    hpte_rpm                    = scalar, U16, 396, "rpm",  1,       0,       0,      20000, 0
    shiftlight_opt_pins = bits, U08,      398, [0:6], $PIN_DIGOUT_CANOUT_OFF
    fc_trans_time_ret   = scalar, U08, 399,  "s",        0.1, 0, 0.5, 5.0, 1
    shiftlight_limit1   = scalar, U16, 400, "rpm",  1,       0,       0,      20000, 0
    shiftlight_limit2   = scalar, U16, 402, "rpm",  1,       0,       0,      20000, 0
    shiftlight_limit3   = scalar, U16, 404, "rpm",  1,       0,       0,      20000, 0
    shiftlight_limit4   = scalar, U16, 406, "rpm",  1,       0,       0,      20000, 0
    shiftlight_limit5   = scalar, U16, 408, "rpm",  1,       0,       0,      20000, 0
    shiftlight_limit6   = scalar, U16, 410, "rpm",  1,       0,       0,      20000, 0
    ltt_samp_time       = scalar, U08, 412,   "s",  1,       0,       0,      255, 0
    ltt_agg             = scalar, U08, 413,    "",  1,       0,       10,     255, 0
    oilpress_in        = bits,   U08, 414, [0:3], "Off","Sensor 1", "Sensor 2","Sensor 3","Sensor 4","Sensor 5","Sensor 6","Sensor 7","Sensor 8","Sensor 9","Sensor 10","Sensor 11","Sensor 12","Sensor 13","Sensor 14","Sensor 15" ; note off by 1
    oilpress_in_safety = bits,   U08, 414, [7:7], "Off", "On"
    oilpress_out = bits, U08,      415, [0:6], $PIN_DIGOUT_CANOUT_OFF
    fuelcalctime   = scalar, U16, 416, "ms",  0.128,       0,       100,  8000, 0
    alternator_sensitivity = scalar, U16, 420, "", 0.1, 0.00000, 0, 20, 0
      idleminvss = scalar,  U16,    422,      { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale },   0.00000,  0.00,   { maxspeed },      0

    flex_baseline  = scalar, U16, 424, "%", 0.1, 0.00000, 0, 100,1
    fc_transition_time = scalar,  U08,    426,  "s",        0.1, 0, 0.5, 5.0, 1
    fc_ae_time = scalar,  U08,    427,  "s",        0.01, 0, 0, 0.5, 2
    fc_timing = scalar, S16,     428, "deg",      0.10000,   0.00000, -90.0,  180.00,      2
    fc_ae_pct       = scalar,  U08,    430,             "%ReqFuel",       1,   0.00000,  0,  255,      0
    fp_off_duty   = scalar,  U08,    431, "%", 0.392, 0.00000, 0, 100, 1
    fp_min_duty   = scalar,  U08,    432, "%", 0.392, 0.00000, 0, 100, 1
    fp_max_duty   = scalar,  U08,    433, "%", 0.392, 0.00000, 0, 100, 1

    tcs_in    = bits, U08, 434, [0:5], $PIN_DIGIN_OFF
    tcs_moves   = scalar, U08, 435, "", 1, 0, 1, 50, 0
    tcs_offtime = scalar, U16, 436, "s", 0.001, 0, 0.001, 0.200, 3
    tcs_ontime  = scalar, U16, 438, "s", 0.001, 0, 0.001, 0.300, 3

    boost_geartarg1 = scalar,  S16,    440,    "kPa",      0.10000,   0.00000,  0.00,  500,        1
    boost_geartarg2 = scalar,  S16,    442,    "kPa",      0.10000,   0.00000,  0.00,  500,        1
    boost_geartarg3 = scalar,  S16,    444,    "kPa",      0.10000,   0.00000,  0.00,  500,        1
    boost_geartarg4 = scalar,  S16,    446,    "kPa",      0.10000,   0.00000,  0.00,  500,        1
    boost_geartarg5 = scalar,  S16,    448,    "kPa",      0.10000,   0.00000,  0.00,  500,        1
    boost_geartarg6 = scalar,  S16,    450,    "kPa",      0.10000,   0.00000,  0.00,  500,        1

    fp_drop_psig = scalar, U16, 452, "psi.g", 0.014504, 0.00000, 0, 100, 1
    fp_drop_kpag = scalar, U16, 452, "kPa.g", 0.1, 0.00000, 0, 680, 1
    fp_drop_load = scalar, U16, 454,     "%", 0.1, 0,       0, 500,   1
    fp_drop_rpm  = scalar, U16, 456,   "rpm",   1, 0,       0, 20000, 0
    fp_drop_time = scalar, U16, 458,     "s", 0.001,0,      0, 10, 2

    pwm_opt_load_a_offset = scalar, U16, 460, "", 1, 0,  0, 65535, 0
    pwm_opt_load_b_offset = scalar, U16, 462, "", 1, 0,  0, 65535, 0
    pwm_opt_load_c_offset = scalar, U16, 464, "", 1, 0,  0, 65535, 0
    pwm_opt_load_d_offset = scalar, U16, 466, "", 1, 0,  0, 65535, 0
    pwm_opt_load_e_offset = scalar, U16, 468, "", 1, 0,  0, 65535, 0
    pwm_opt_load_f_offset = scalar, U16, 470, "", 1, 0,  0, 65535, 0
    pwm_opt_load_a_size = scalar, U08, 472, "", 1, 0,  0, 255, 0
    pwm_opt_load_b_size = scalar, U08, 473, "", 1, 0,  0, 255, 0
    pwm_opt_load_c_size = scalar, U08, 474, "", 1, 0,  0, 255, 0
    pwm_opt_load_d_size = scalar, U08, 475, "", 1, 0,  0, 255, 0
    pwm_opt_load_e_size = scalar, U08, 476, "", 1, 0,  0, 255, 0
    pwm_opt_load_f_size = scalar, U08, 477, "", 1, 0,  0, 255, 0

    can_gps_id      = scalar,  U08,    478,            "",        1.00000,   0.00000,  0.00,  14,      0 ;
    can_gps_table   = scalar,  U08,    479,             "",         1.00000,   0.00000,     0,     15,       0 ; * (  1 byte)
    can_gps_offset  = scalar,  U16,    480,             "bytes",    1.00000,   0.00000,     0,   4095,       0
    spkadj_max  = scalar,  S16,    482,             "deg",      0.10000,   0.00000,0,   45,      1
    spkadj_min  = scalar,  S16,    484,             "deg",      0.10000,   0.00000,-45,  0,      1

    can_outpc_msg = scalar,  U16,    486,          "",      1,   0.00000, 1,  2047,      0
    can_outpc_gp00_master = bits, U08, 488, [7:7], "Off", "On"
#define CAN_OUTPC_FREQ = "Off", "1Hz", "2Hz", "5Hz", "10Hz", "20Hz", "50Hz", "100Hz"
    can_outpc_gp00 = bits, U08, 488, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp01 = bits, U08, 489, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp02 = bits, U08, 490, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp03 = bits, U08, 491, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp04 = bits, U08, 492, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp05 = bits, U08, 493, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp06 = bits, U08, 494, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp07 = bits, U08, 495, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp08 = bits, U08, 496, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp09 = bits, U08, 497, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp10 = bits, U08, 498, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp11 = bits, U08, 499, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp12 = bits, U08, 500, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp13 = bits, U08, 501, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp14 = bits, U08, 502, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp15 = bits, U08, 503, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp16 = bits, U08, 504, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp17 = bits, U08, 505, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp18 = bits, U08, 506, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp19 = bits, U08, 507, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp20 = bits, U08, 508, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp21 = bits, U08, 509, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp22 = bits, U08, 510, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp23 = bits, U08, 511, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp24 = bits, U08, 512, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp25 = bits, U08, 513, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp26 = bits, U08, 514, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp27 = bits, U08, 515, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp28 = bits, U08, 516, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp29 = bits, U08, 517, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp30 = bits, U08, 518, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp31 = bits, U08, 519, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp32 = bits, U08, 520, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp33 = bits, U08, 521, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp34 = bits, U08, 522, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp35 = bits, U08, 523, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp36 = bits, U08, 524, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp37 = bits, U08, 525, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp38 = bits, U08, 526, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp39 = bits, U08, 527, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp40 = bits, U08, 528, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp41 = bits, U08, 529, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp42 = bits, U08, 530, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp43 = bits, U08, 531, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp44 = bits, U08, 532, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp45 = bits, U08, 533, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp46 = bits, U08, 534, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp47 = bits, U08, 535, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp48 = bits, U08, 536, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp49 = bits, U08, 537, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp50 = bits, U08, 538, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp51 = bits, U08, 539, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp52 = bits, U08, 540, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp53 = bits, U08, 541, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp54 = bits, U08, 542, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp55 = bits, U08, 543, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp56 = bits, U08, 544, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp57 = bits, U08, 545, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp58 = bits, U08, 546, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp59 = bits, U08, 547, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp60 = bits, U08, 548, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp61 = bits, U08, 549, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp62 = bits, U08, 550, [0:2], $CAN_OUTPC_FREQ
    can_outpc_gp63 = bits, U08, 551, [0:2], $CAN_OUTPC_FREQ

    can_rcv_opt_on = bits,    U08,    552, [0:0], "Off", "On"
    can_rcv_opt_share = bits,    U08,    552, [1:1], "Off", "On"
;    engine_state_accel_fast_thresh = scalar, S16, 553, "rpm/sec", 10, 0, 0, 20000, 0
    engine_state_accel_slow_thresh = scalar, S16, 555, "rpm/sec", 10, 0, 0, 20000, 0
;    engine_state_decel_fast_thresh = scalar, S16, 557, "rpm/sec", 10, 0, -20000, 0, 0
    engine_state_decel_slow_thresh = scalar, S16, 559, "rpm/sec", 10, 0, -20000, 0, 0
    engine_state_tps_closed_thresh = scalar, S16, 561, "%", 0.1, 0, 0, 5, 1
    engine_state_overrun_map_thresh = scalar, S16, 563, "kPa", 0.1, 0, 0, 100, 1
    engine_state_overrun_rpm_thresh = scalar, U16, 565, "rpm", 1, 0, 0, 20000, 0
    engine_state_flags_use_vss = bits, U08, 567, [0:0], "Off", "Use VSS"
    vss_samp_int = scalar, U16, 568, "ms", 0.05, 0, 10, 50, 2
    engine_state_vss_thresh = scalar, U16, 570, { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale }, 0, 0, 300, 0 
    engine_state_tps_wot_thresh = scalar, S16, 572, "%", 0.1, 0, 80, 100, 1
    oilpress_time = scalar, U16, 574,     "s", 0.001,0,      0, 10, 2
    can_bcast_lotus_fuel = bits, U08, 576, [0:3], "Sensor 1", "Sensor 2","Sensor 3","Sensor 4","Sensor 5","Sensor 6","Sensor 7","Sensor 8","Sensor 9","Sensor 10","Sensor 11","Sensor 12","Sensor 13","Sensor 14","Sensor 15","Sensor 16"
    tbrake_opt1_creep = bits, U08, 577, [0:0], "Single steps", "Creep mode"
    launch_debounce = scalar, U08, 578,     "s", 0.001, 0,      0.001, 0.020, 3
	shiftlight_opt2_test= bits, U08, 579, [0:0], "Off", "On"
    shiftlight_opt_gear = bits, U08, 579, [7:7], "Off", "On"

; somewhat big gap here
;                       ######   ###   #####          #####      #     ######   
;                       #     #   #   #     #        #     #    # #    #     #  
;                       #     #   #   #              #         #   #   #     #  
;                       ######    #   #  ####        #  ####  #     #  ######   
;                       #     #   #   #     #        #     #  #######  #        
;                       #     #   #   #     #        #     #  #     #  #        
;                       ######   ###   #####          #####   #     #  #        
;
; big pad
    dummyfield = bits, U08, 637, [0:0], "",""

    staged_out2 = bits, U08,      638, [0:6], $PIN_DIGOUT_CANOUT_OFF
    staged_out2_inv = bits, U08, 638, [7:7], "Normal", "Inverted"
    staged_out2_time = scalar, U08, 639, "s", 0.1, 0, 0, 1, 1
    u16_debug640 = scalar, U16, 640, "", 1, 0.00000, 0, 65536, 0
    staged_out1 = bits, U08,      642, [0:6], $PIN_DIGOUT_CANOUT_OFF
    staged_out1_inv = bits, U08, 642, [7:7], "Normal", "Inverted"
    log_style4_opt      = bits,   U08, 643, [0:1], "RPM", "TPS", "MAP", "INVALID"
    log_trig_rpm        = scalar, U16, 644, "RPM", 1, 0, 0, 20000, 0
    log_trig_tps        = scalar, U16, 646, "%", 0.1, 0, 0, 100, 0

    baudhigh            = scalar,  U32,    648,             "",         1.00000,   0.00000,9600.0,500000.0,      0 ; x (  4 bytes)
    fuelCorr_default    = scalar,  U08,    652,             "%",        1.00000,   0.00000,  50,     255,      0
    sdpulse_out = bits, U08,      653, [0:6], $PIN_DIGOUT_CANOUT_OFF
    fuelSpkDel_default  = scalar,  S16,    654,             "deg",      0.10000,   0.00000,-45.00,   45.00,      1
    map_phase_thresh = scalar,  S16,    656,    "kPa",      0.10000,   0.00000,  0.00,  500,        1

    flex_pct0  = scalar, U16, 658, "%", 0.1, 0.00000, 0, 100,1
    flex_pct1  = scalar, U16, 660, "%", 0.1, 0.00000, 0, 100,1

;generic sensors
    sensor01_source = bits,   U08,  662, [0:5], $PIN_ADCS_OFF
    sensor02_source = bits,   U08,  663, [0:5], $PIN_ADCS_OFF
    sensor03_source = bits,   U08,  664, [0:5], $PIN_ADCS_OFF
    sensor04_source = bits,   U08,  665, [0:5], $PIN_ADCS_OFF
    sensor05_source = bits,   U08,  666, [0:5], $PIN_ADCS_OFF
    sensor06_source = bits,   U08,  667, [0:5], $PIN_ADCS_OFF
    sensor07_source = bits,   U08,  668, [0:5], $PIN_ADCS_OFF
    sensor08_source = bits,   U08,  669, [0:5], $PIN_ADCS_OFF
    sensor09_source = bits,   U08,  670, [0:5], $PIN_ADCS_OFF
    sensor10_source = bits,   U08,  671, [0:5], $PIN_ADCS_OFF
    sensor11_source = bits,   U08,  672, [0:5], $PIN_ADCS_OFF
    sensor12_source = bits,   U08,  673, [0:5], $PIN_ADCS_OFF
    sensor13_source = bits,   U08,  674, [0:5], $PIN_ADCS_OFF
    sensor14_source = bits,   U08,  675, [0:5], $PIN_ADCS_OFF
    sensor15_source = bits,   U08,  676, [0:5], $PIN_ADCS_OFF
    sensor16_source = bits,   U08,  677, [0:5], "INVALID", "ECU temp", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"

#define GEN_SENSOR_OPTS = "Raw", "Linear", "Same as MAP", "Same as CLT", "Same as MAT", "Same as EGO", "Custom#1", "GM calibration", "INVALID", "Linear 0.5-4.5V", "Raw/10", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
    sensor01_trans  = bits,   U08,  678, [0:3], $GEN_SENSOR_OPTS
    sensor02_trans  = bits,   U08,  679, [0:3], $GEN_SENSOR_OPTS
    sensor03_trans  = bits,   U08,  680, [0:3], $GEN_SENSOR_OPTS
    sensor04_trans  = bits,   U08,  681, [0:3], $GEN_SENSOR_OPTS
    sensor05_trans  = bits,   U08,  682, [0:3], $GEN_SENSOR_OPTS
    sensor06_trans  = bits,   U08,  683, [0:3], $GEN_SENSOR_OPTS
    sensor07_trans  = bits,   U08,  684, [0:3], $GEN_SENSOR_OPTS
    sensor08_trans  = bits,   U08,  685, [0:3], $GEN_SENSOR_OPTS
    sensor09_trans  = bits,   U08,  686, [0:3], $GEN_SENSOR_OPTS
    sensor10_trans  = bits,   U08,  687, [0:3], $GEN_SENSOR_OPTS
    sensor11_trans  = bits,   U08,  688, [0:3], $GEN_SENSOR_OPTS
    sensor12_trans  = bits,   U08,  689, [0:3], $GEN_SENSOR_OPTS
    sensor13_trans  = bits,   U08,  690, [0:3], $GEN_SENSOR_OPTS
    sensor14_trans  = bits,   U08,  691, [0:3], $GEN_SENSOR_OPTS
    sensor15_trans  = bits,   U08,  692, [0:3], $GEN_SENSOR_OPTS
    sensor16_trans  = bits,   U08,  693, [0:3], "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Default calibration", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
    sensor01_val0   = scalar, S16,  694,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor02_val0   = scalar, S16,  696,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor03_val0   = scalar, S16,  698,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor04_val0   = scalar, S16,  700,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor05_val0   = scalar, S16,  702,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor06_val0   = scalar, S16,  704,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor07_val0   = scalar, S16,  706,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor08_val0   = scalar, S16,  708,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor09_val0   = scalar, S16,  710,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor10_val0   = scalar, S16,  712,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor11_val0   = scalar, S16,  714,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor12_val0   = scalar, S16,  716,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor13_val0   = scalar, S16,  718,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor14_val0   = scalar, S16,  720,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor15_val0   = scalar, S16,  722,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor16_val0   = scalar, S16,  724,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor01_max    = scalar, S16,  726,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor02_max    = scalar, S16,  728,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor03_max    = scalar, S16,  730,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor04_max    = scalar, S16,  732,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor05_max    = scalar, S16,  734,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor06_max    = scalar, S16,  736,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor07_max    = scalar, S16,  738,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor08_max    = scalar, S16,  740,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor09_max    = scalar, S16,  742,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor10_max    = scalar, S16,  744,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor11_max    = scalar, S16,  746,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor12_max    = scalar, S16,  748,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor13_max    = scalar, S16,  750,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor14_max    = scalar, S16,  752,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor15_max    = scalar, S16,  754,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor16_max    = scalar, S16,  756,             "",      0.10000,   0.00000, -3276.7, 3276.7,      1 ; * (  2 bytes)
    sensor01LF      = scalar, U08,  758, "", 1,0,10,100,0
    sensor02LF      = scalar, U08,  759, "", 1,0,10,100,0
    sensor03LF      = scalar, U08,  760, "", 1,0,10,100,0
    sensor04LF      = scalar, U08,  761, "", 1,0,10,100,0
    sensor05LF      = scalar, U08,  762, "", 1,0,10,100,0
    sensor06LF      = scalar, U08,  763, "", 1,0,10,100,0
    sensor07LF      = scalar, U08,  764, "", 1,0,10,100,0
    sensor08LF      = scalar, U08,  765, "", 1,0,10,100,0
    sensor09LF      = scalar, U08,  766, "", 1,0,10,100,0
    sensor10LF      = scalar, U08,  767, "", 1,0,10,100,0
    sensor11LF      = scalar, U08,  768, "", 1,0,10,100,0
    sensor12LF      = scalar, U08,  769, "", 1,0,10,100,0
    sensor13LF      = scalar, U08,  770, "", 1,0,10,100,0
    sensor14LF      = scalar, U08,  771, "", 1,0,10,100,0
    sensor15LF      = scalar, U08,  772, "", 1,0,10,100,0
    sensor16LF      = scalar, U08,  773, "", 1,0,10,100,0
    sensor_temp     = bits, U08,  774, [0:0], "degF", "degC" 
;pad
;    injOpen1         = scalar,  U16,    776,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
;    injOpen2         = scalar,  U16,    778,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
;    injOpen3         = scalar,  U16,    780,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
;    injOpen4         = scalar,  U16,    782,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
;    injOpen5         = scalar,  U16,    784,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
;    injOpen6         = scalar,  U16,    786,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
;    injOpen7         = scalar,  U16,    788,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
;    injOpen8         = scalar,  U16,    790,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
;    injOpena         = scalar,  U16,    792,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
;    injOpenb         = scalar,  U16,    794,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
;next 8 not yet used
;    injOpen11         = scalar,  U16,    796,             "ms",       0.001,   0.00000,  0.00,   25.50,      3
;    injOpen12         = scalar,  U16,    798,             "ms",       0.001,   0.00000,  0.00,   25.50,      3
;    injOpen13         = scalar,  U16,    800,             "ms",       0.001,   0.00000,  0.00,   25.50,      3
;    injOpen14         = scalar,  U16,    802,             "ms",       0.001,   0.00000,  0.00,   25.50,      3
;    injOpen15         = scalar,  U16,    804,             "ms",       0.001,   0.00000,  0.00,   25.50,      3
;    injOpen16         = scalar,  U16,    806,             "ms",       0.001,   0.00000,  0.00,   25.50,      3
;    injOpen17         = scalar,  U16,    808,             "ms",       0.001,   0.00000,  0.00,   25.50,      3
;    injOpen18         = scalar,  U16,    810,             "ms",       0.001,   0.00000,  0.00,   25.50,      3

    shift_cut_on    = bits, U08, 812, [0:0], "Off", "On"
    shift_cut_auto  = bits, U08, 812, [1:1], "Button", "Auto"
    shift_cut_gear  = bits, U08, 812, [2:2], "Off", "On"
    shift_cut_fuel  = bits, U08, 812, [3:3], "Off", "On"
    shift_cut_in    = bits, U08, 813, [0:5], $PIN_DIGIN
    shift_cut_out   = bits, U08, 814, [0:6], $PIN_DIGOUT_OFF
    shift_cut_rpm    = scalar, U16, 815, "RPM", 1, 0, 0, 20000, 0
    shift_cut_tps    = scalar, U16, 817, "%", 0.1, 0, 0, 100, 0
    shift_cut_delay  = scalar, U08, 819, "s", 0.01024, 0, 0, 2.55, 2
    shift_cut_time   = scalar, U08, 820, "s", 0.01024, 0, 0, 2.55, 2
    shift_cut_add12  = scalar, U08, 821, "s", 0.01024, 0, 0, 2.55, 2
    shift_cut_add23  = scalar, U08, 822, "s", 0.01024, 0, 0, 2.55, 2
    shift_cut_add34  = scalar, U08, 823, "s", 0.01024, 0, 0, 2.55, 2
    shift_cut_add45  = scalar, U08, 824, "s", 0.01024, 0, 0, 2.55, 2
    shift_cut_add56  = scalar, U08, 825, "s", 0.01024, 0, 0, 2.55, 2
    shift_cut_soldelay=scalar, U08, 826, "s", 0.01024, 0, 0, 2.55, 2
    shift_cut_rpm12  = scalar, U16, 827, "RPM", 1, 0, 0, 20000, 0
    shift_cut_rpm23  = scalar, U16, 829, "RPM", 1, 0, 0, 20000, 0
    shift_cut_rpm34  = scalar, U16, 831, "RPM", 1, 0, 0, 20000, 0
    shift_cut_rpm45  = scalar, U16, 833, "RPM", 1, 0, 0, 20000, 0
    shift_cut_rpm56  = scalar, U16, 835, "RPM", 1, 0, 0, 20000, 0
    shift_cut_reshift= scalar, U08, 837, "s", 0.01024, 0, 0, 2.55, 2
;open-loop PWM. all arrays
    pwm_opt_on_a      = bits, U08, 838, [0:0], "Off", "On"
    pwm_opt_freq_a    = bits, U08, 838, [1:4], "On-Off", "Variable Freq", "250Hz", "225Hz", "200Hz", "175Hz", "150Hz", "125Hz", "100Hz", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
    pwm_opt_load_a    = bits, U08, 838, [5:7], "RPM", "MAP", "% baro", "TPS", "MAFload", "CLT", "BattV", "MAT" ; ITB hidden
    pwm_opt_on_b      = bits, U08, 839, [0:0], "Off", "On"
    pwm_opt_freq_b    = bits, U08, 839, [1:4], "On-Off", "Variable Freq", "250Hz", "225Hz", "200Hz", "175Hz", "150Hz", "125Hz", "100Hz", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
    pwm_opt_load_b    = bits, U08, 839, [5:7], "RPM", "MAP", "% baro", "TPS", "MAFload", "CLT", "BattV", "MAT"
    pwm_opt_on_c      = bits, U08, 840, [0:0], "Off", "On"
    pwm_opt_freq_c    = bits, U08, 840, [1:4], "On-Off", "Variable Freq", "250Hz", "225Hz", "200Hz", "175Hz", "150Hz", "125Hz", "100Hz", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
    pwm_opt_load_c    = bits, U08, 840, [5:7], "RPM", "MAP", "% baro", "TPS", "MAFload", "CLT", "BattV", "MAT"
    pwm_opt_on_d      = bits, U08, 841, [0:0], "Off", "On"
    pwm_opt_freq_d    = bits, U08, 841, [1:4], "On-Off", "Variable Freq", "250Hz", "225Hz", "200Hz", "175Hz", "150Hz", "125Hz", "100Hz", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
    pwm_opt_load_d    = bits, U08, 841, [5:7], "RPM", "MAP", "% baro", "TPS", "MAFload", "CLT", "BattV", "MAT"
    pwm_opt_on_e      = bits, U08, 842, [0:0], "Off", "On"
    pwm_opt_freq_e    = bits, U08, 842, [1:4], "On-Off", "Variable Freq", "250Hz", "225Hz", "200Hz", "175Hz", "150Hz", "125Hz", "100Hz", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
    pwm_opt_load_e    = bits, U08, 842, [5:7], "RPM", "MAP", "% baro", "TPS", "MAFload", "CLT", "BattV", "MAT"
    pwm_opt_on_f      = bits, U08, 843, [0:0], "Off", "On"
    pwm_opt_freq_f    = bits, U08, 843, [1:4], "On-Off", "Variable Freq", "250Hz", "225Hz", "200Hz", "175Hz", "150Hz", "125Hz", "100Hz", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
    pwm_opt_load_f    = bits, U08, 843, [5:7], "RPM", "MAP", "% baro", "TPS", "MAFload", "CLT", "BattV", "MAT"

    pwm_opt2_a        = bits, U08, 844, [0:6], $PIN_DIGOUT_CANPWM
    pwm_opt2_b        = bits, U08, 845, [0:6], $PIN_DIGOUT_CANPWM
    pwm_opt2_c        = bits, U08, 846, [0:6], $PIN_DIGOUT_CANPWM
    pwm_opt2_d        = bits, U08, 847, [0:6], $PIN_DIGOUT_CANPWM
    pwm_opt2_e        = bits, U08, 848, [0:6], $PIN_DIGOUT_CANPWM
    pwm_opt2_f        = bits, U08, 849, [0:6], $PIN_DIGOUT_CANPWM

    pwm_onabove_a     = scalar, U08, 850, "%", 1, 0, 0, 100, 0
    pwm_onabove_b     = scalar, U08, 851, "%", 1, 0, 0, 100, 0
    pwm_onabove_c     = scalar, U08, 852, "%", 1, 0, 0, 100, 0
    pwm_onabove_d     = scalar, U08, 853, "%", 1, 0, 0, 100, 0
    pwm_onabove_e     = scalar, U08, 854, "%", 1, 0, 0, 100, 0
    pwm_onabove_f     = scalar, U08, 855, "%", 1, 0, 0, 100, 0
    pwm_offbelow_a    = scalar, U08, 856, "%", 1, 0, 0, 100, 0
    pwm_offbelow_b    = scalar, U08, 857, "%", 1, 0, 0, 100, 0
    pwm_offbelow_c    = scalar, U08, 858, "%", 1, 0, 0, 100, 0
    pwm_offbelow_d    = scalar, U08, 859, "%", 1, 0, 0, 100, 0
    pwm_offbelow_e    = scalar, U08, 860, "%", 1, 0, 0, 100, 0
    pwm_offbelow_f    = scalar, U08, 861, "%", 1, 0, 0, 100, 0

    dualfuel_sw_on = bits,  U08, 862, [0:0], "Off", "On"
    dualfuel_sw_fuel = bits,U08, 862, [1:1], "Off", "On"
    dualfuel_sw_spk = bits, U08, 862, [2:2], "Off", "On"
    dualfuel_sw_afr = bits, U08, 862, [3:3], "Off", "On"
    dualfuel_sw_rf = bits,  U08, 862, [4:4], "Off", "On"
    dualfuel_sw_stoich=bits,U08, 862, [5:5], "Off", "On"
    dualfuel_sw_wue = bits, U08, 862, [6:6], "Off", "On"
    dualfuel_sw_ase = bits, U08, 862, [7:7], "Off", "On"
    dualfuel_sw2_prime=bits,U08, 863, [0:0], "Off", "On"
    dualfuel_sw2_crank=bits,U08, 863, [1:1], "Off", "On"
    dualfuel_sw2_injp =bits,U08, 863, [2:2], "Off", "On"
    dualfuel_sw2_smpw =bits,U08, 863, [3:3], "Off", "On"
    dualfuel_sw2_ob =bits  ,U08, 863, [4:4], "Off", "On"
    dualfuel_sw2_boosw=bits,U08, 863, [5:5], "Off", "On"
    dualfuel_sw2_ae   =bits,U08, 863, [6:6], "Off", "On"
    opentime2_opt1_master = bits, U08, 864, [7:7], "Same", "Individual"
    opentime2_opt1    = bits, U08, 864, [0:1], $OPENTIME_OPTS
    opentime2_opt2    = bits, U08, 865, [0:1], $OPENTIME_OPTS
    opentime2_opt3    = bits, U08, 866, [0:1], $OPENTIME_OPTS
    opentime2_opt4    = bits, U08, 867, [0:1], $OPENTIME_OPTS
    opentime2_opt5    = bits, U08, 868, [0:1], $OPENTIME_OPTS
    opentime2_opt6    = bits, U08, 869, [0:1], $OPENTIME_OPTS
    opentime2_opt7    = bits, U08, 870, [0:1], $OPENTIME_OPTS
    opentime2_opt8    = bits, U08, 871, [0:1], $OPENTIME_OPTS
    opentime2_opta    = bits, U08, 872, [0:1], $OPENTIME_OPTS
    opentime2_opta_pwm= bits, U08, 872, [4:4], "Off", "On"
    opentime2_optb    = bits, U08, 873, [0:1], $OPENTIME_OPTS
    opentime2_optb_pwm= bits, U08, 873, [4:4], "Off", "On"
    opentime2_optb_own= bits, U08, 873, [5:5], "Off", "On"

    opentime2_opt11   = bits, U08, 874, [0:1], $OPENTIME_OPTS
    opentime2_opt12   = bits, U08, 875, [0:1], $OPENTIME_OPTS
    opentime2_opt13   = bits, U08, 876, [0:1], $OPENTIME_OPTS
    opentime2_opt14   = bits, U08, 877, [0:1], $OPENTIME_OPTS
    opentime2_opt15   = bits, U08, 878, [0:1], $OPENTIME_OPTS
    opentime2_opt16   = bits, U08, 879, [0:1], $OPENTIME_OPTS
;    opentime2_opt17   = bits, U08, 880, [0:1], $OPENTIME_OPTS
;    opentime2_opt18   = bits, U08, 881, [0:1], $OPENTIME_OPTS

    smallpw2_opt1_master = bits, U08, 864, [7:7], "Off", "On"
    smallpw2_opt1    = bits, U08, 882, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
    smallpw2_opt2    = bits, U08, 883, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
    smallpw2_opt3    = bits, U08, 884, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
    smallpw2_opt4    = bits, U08, 885, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
    smallpw2_opt5    = bits, U08, 886, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
    smallpw2_opt6    = bits, U08, 887, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
    smallpw2_opt7    = bits, U08, 888, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
    smallpw2_opt8    = bits, U08, 889, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
    smallpw2_opta    = bits, U08, 890, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
    smallpw2_optb    = bits, U08, 891, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"

    smallpw2_opt11    = bits, U08, 892, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
    smallpw2_opt12    = bits, U08, 893, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
    smallpw2_opt13    = bits, U08, 894, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
    smallpw2_opt14    = bits, U08, 895, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
    smallpw2_opt15    = bits, U08, 896, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
    smallpw2_opt16    = bits, U08, 897, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
;    smallpw2_opt17    = bits, U08, 898, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"
;    smallpw2_opt18    = bits, U08, 899, [0:1], "Curve 1", "Curve 2", "Curve 3", "Curve 4"

    dualfuel_pin     = bits, U08, 900, [0:5], $PIN_DIGIN
    dualfuel_opt_temp= bits, U08, 901, [0:0], "Off", "On"
    dualfuel_opt_press=bits, U08, 901, [1:1], "Off", "On"
    dualfuel_opt_mode = bits,U08, 901, [2:3], "Switching", "Dual table", "Flex blend", "INVALID"
    dualfuel_opt_out  = bits,U08, 901, [4:4], "Shared outputs+relay", "Different outputs"

    inj2Open1         = scalar,  U16,    902,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
    inj2Open2         = scalar,  U16,    904,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
    inj2Open3         = scalar,  U16,    906,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
    inj2Open4         = scalar,  U16,    908,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
    inj2Open5         = scalar,  U16,    910,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
    inj2Open6         = scalar,  U16,    912,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
    inj2Open7         = scalar,  U16,    914,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
    inj2Open8         = scalar,  U16,    916,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
    inj2Opena         = scalar,  U16,    918,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
    inj2Openb         = scalar,  U16,    920,             "ms",       0.001,   0.00000,  0.00,   25.50,      3 ; * (  1 byte)
;next 8 not yet used
    inj2Open11         = scalar,  U16,    922,             "ms",       0.001,   0.00000,  0.00,   25.50,      3
    inj2Open12         = scalar,  U16,    924,             "ms",       0.001,   0.00000,  0.00,   25.50,      3
    inj2Open13         = scalar,  U16,    926,             "ms",       0.001,   0.00000,  0.00,   25.50,      3
    inj2Open14         = scalar,  U16,    928,             "ms",       0.001,   0.00000,  0.00,   25.50,      3
    inj2Open15         = scalar,  U16,    930,             "ms",       0.001,   0.00000,  0.00,   25.50,      3
    inj2Open16         = scalar,  U16,    932,             "ms",       0.001,   0.00000,  0.00,   25.50,      3

    inj2Open17         = scalar,  U16,    934,             "ms",       0.001,   0.00000,  0.00,   25.50,      3
    inj2Open18         = scalar,  U16,    936,             "ms",       0.001,   0.00000,  0.00,   25.50,      3

      inj2PwmT        = scalar,  U08,    938,             "ms",       0.12800,   0.128,  0.00,   32.64,      1 ; * (  1 byte)
      inj2PwmPd       = scalar,  U08,    939,             "us",       1.00000,   0.00000, 40.00,  100.00,      0 ; * (  1 byte)
      inj2PwmP        = scalar,  U08,    940,             "%",        1.00000,   0.00000,  0.00,  100.00,      0 ; * (  1 byte)
      inj2PwmT2       = scalar,  U08,    941,             "ms",       0.12800,   0.128,  0.00,   32.64,      1 ; * (  1 byte)
      inj2PwmPd2      = scalar,  U08,    942,             "us",       1.00000,   0.00000, 40.00,  100.00,      0 ; * (  1 byte)
      inj2PwmP2       = scalar,  U08,    943,             "%",        1.00000,   0.00000,  0.00,  100.00,      0 ; * (  1 byte)
    dualfuel_temp_sens =  bits, U08, 944, [0:3], "Off", "Sensor 1", "Sensor 2","Sensor 3","Sensor 4","Sensor 5","Sensor 6","Sensor 7","Sensor 8","Sensor 9","Sensor 10","Sensor 11","Sensor 12","Sensor 13","Sensor 14","Sensor 15"
    dualfuel_press_sens = bits, U08, 945, [0:3], "Off", "Sensor 1", "Sensor 2","Sensor 3","Sensor 4","Sensor 5","Sensor 6","Sensor 7","Sensor 8","Sensor 9","Sensor 10","Sensor 11","Sensor 12","Sensor 13","Sensor 14","Sensor 15"
    dualfuel_press_type = bits, U08, 945, [6:7], "Gauge", "Absolute", "Differential", "INVALID"
;     Leave these unused variables matching MS2 in case trans controller erroneously adjusts them
;      FuelAdj 946
;      SpkAdj, 948
;      IdleAdj, 950
;      SprAdj; 952

    pwm_opt_curve_a = bits, U08, 954, [0:0], "Table", "Curve"
    pwm_opt_curve_b = bits, U08, 954, [1:1], "Table", "Curve"
    pwm_opt_curve_c = bits, U08, 954, [2:2], "Table", "Curve"
    pwm_opt_curve_d = bits, U08, 954, [3:3], "Table", "Curve"
    pwm_opt_curve_e = bits, U08, 954, [4:4], "Table", "Curve"
    pwm_opt_curve_f = bits, U08, 954, [5:5], "Table", "Curve"
;gap
    ITB_load_mappoint = scalar, S16, 956, "% baro", 0.1000, 0, 30, 100.0, 1
    ITB_load_idletpsthresh = scalar, S16, 958, "%", 0.1000, 0, -10, 100, 0
    idle_voltage_comp_voltage = array, S16, 960, [6], "V", 0.1000, 0, 9, 17, 1
    idle_voltage_comp_delta = array, S16, 972, [6], "%", 0.392, 0.00000, -20, 20, 1
    ac_idleup_max_rpm           = scalar, U16, 984, "rpm", 1, 0, 1000, 20000, 0
      llstg_in = bits,  U08,    986,  [0:5], $PIN_DIGIN_OFF
      llstg_out     = bits,    U08,    987, [0:6], $PIN_DIGOUT
      kickdelay       = scalar,  U16,    988,     "ms", 0.001,0.00000,0.1,35.00,3
    log_trig_map        = scalar, S16, 990, "%", 0.1, 0, 0, 500, 0
    flexpct_default  = scalar, U16, 992, "%", 0.1, 0.00000, 0, 100,1
    inpshare_test2 = scalar, U16, 994, "", 1, 0, 0, 65535, 0, controllerPriority
    inpshare_test1 = scalar, U08, 996, "", 1, 0, 0, 255, 0, controllerPriority

   page = 3 ; 8
      boost_ctl_load_targets   = array,  S16, 0, [8x8], "kPa", 0.1, 0, 0, 700, 1
      boost_ctl_loadtarg_tps_bins=array, S16, 128, [8], "%", 0.1, 0, 0, 100, 1
      boost_ctl_loadtarg_rpm_bins=array, U16, 144, [8], "rpm", 1, 0, 0, 20000, 0
      boost_ctl_pwm_targets    = array,  U08, 160, [8x8], "%", 1, 0, 0, 100, 0
      boost_ctl_pwmtarg_tps_bins=array,  S16, 224, [8], "%", 0.1, 0, 0, 100, 1
      boost_ctl_pwmtarg_rpm_bins=array,  U16, 240, [8], "rpm", 1, 0, 0, 20000, 0
      primePWTable = array, S16, 256, [ 10], "ms", 0.10000, 0.00000, 0.00, 65.00, 1 ; * ( 20 bytes)
      crankPctTable             =array,  U16, 276,    [   10], "%",       1,   1,  1,   10000,      0 ; * ( 20 bytes)
      asePctTable               =array,  S16, 296,    [   10], "%",        1.00000,   0.00000,  0.00,  400.00,      0 ; * (  2 bytes)
      aseCntTable               =array,  S16, 316,    [   10], "cycles",   1.00000,   0.00000,  0.00, 2500.00,      0 ; * (  2 bytes)

#if CELSIUS
      matTemps                  =array,  S16, 336,    [    6], "°C",       0.05555,  -320.000,-40.00,  150.00,      1 ; * ( 12 bytes)
#else
      matTemps                  =array,  S16, 336,    [    6], "°F",       0.10000,   0.00000,-40.00,  300.00,      1
#endif
      matRetard                 =array,  U08, 348,    [    6], "deg",      0.10000,   0.00000,  0.00,    25.5,      1 ; * (  6 bytes)
      EAEAWCRPMbins   = array,   U16,    354,    [   12], "rpm",      1.00000,   0.00000,0,       20000,       0 ; * (24 bytes)
      EAESOCRPMbins   = array,   U16,    378,    [   12], "rpm",      1.00000,   0.00000,0,       20000,       0 ; * (24 bytes)
      EAEAWCKPAbins   = array,   U16,    402,    [   12], { bitStringValue( algorithmUnits ,  (eaeload ? eaeload : algorithm) ) },      0.10000,   0.00000,0,       500,         0 ; * (24 bytes)
      EAESOCKPAbins   = array,   U16,    426,    [   12], { bitStringValue( algorithmUnits ,  (eaeload ? eaeload : algorithm) ) },      0.10000,   0.00000,0,       500,         0 ; * (24 bytes)
      EAEBAWC         = array,   U08,    450,    [   12], "%",        1.00000,   0.00000,0,       100,         0 ; * (12 bytes)
      EAEBSOC         = array,   U08,    462,    [   12], "%",        0.10000,   0.00000,0,       25.5,         1 ; * (12 bytes)
      EAEAWN          = array,   U08,    474,    [   12], "%",        1.00000,   0.00000,0,       200,         0 ; * (12 bytes)
      EAESON          = array,   U08,    486,    [   12], "%",        1.00000,   0.00000,0,       200,         0 ; * (12 bytes)
      EAEAWW          = array,   U08,    498,    [   12], "%",        1.00000,   0.00000,0,       200,         0
      EAESOW          = array,   U08,    510,    [   12], "%",        1.00000,   0.00000,0,       200,         0

      ; Supplemental corrections for barometer and MAT.
      baroCorrVals    = array ,  S16,    522,    [    9], "kPa",      0.10000,   0.00000,  0.00,  110.00,      1 ; * ( 24 bytes)
#if CELSIUS
      matCorrTemps2    = array ,  S16,    540,    [    9], "°C",       0.05555,  -320.000,-40.00,  150.00,      1 ; * ( 12 bytes)
#else
      matCorrTemps2    = array ,  S16,    540,    [    9], "°F",       0.10000,   0.00000,-40.00,  300.00,      1
#endif

#if CELSIUS
      temp_table_p5   = array,  S16,     558,    [   10], "°C",       0.05555,   -320.000, -40.00, {clthighlim},     0
#else
      temp_table_p5   = array,  S16,     558,    [   10], "°F",       0.10000,   0.000,-40.00, {clthighlim},      1
#endif

#if CELSIUS
      EAEAWWCLTbins   = array,  S16,     578,    [   12], "deg",       0.05555,   -320.000, -40.00, {clthighlim},     0
      EAESOWCLTbins   = array,  S16,     602,    [   12], "deg",       0.05555,   -320.000, -40.00, {clthighlim},     0
        #else
      EAEAWWCLTbins   = array,  S16,     578,    [   12], "deg",       0.10000,   0.000,-40.00, {clthighlim},      1
      EAESOWCLTbins   = array,  S16,     602,    [   12], "deg",       0.10000,   0.000,-40.00, {clthighlim},      1
#endif

      pwmidle_target_rpms = array, U16, 626,    [ 8 ], "rpms",      1, 0.00000, 0.00, 2000, 0;
#if CELSIUS
      pwmidle_clt_temps = array,  S16, 642,   [8],  "°C",   0.05555,  -320.000,-40.00,  {clthighlim},      1 ;
        #else
      pwmidle_clt_temps = array,  S16, 642,   [8],  "°F",       0.10000,  0.00000,-40.00,  {clthighlim},      1
#endif
;gap 20 bytes
#if CELSIUS
      RevLimLookup    = array ,  S16,    678,    [    8], "°C",       0.05555,  -320.000,-40.00,  {clthighlim},      1 ; * ( 16 bytes) 
        #else
      RevLimLookup    = array ,  S16,    678,    [    8], "°F",       0.10000,   0.00000,-40.00,  {clthighlim},      1 ; * ( 16 bytes) 
#endif
      RevLimRpm1      = array ,  U16,    694,    [    8], "RPM",      1.00000,   0.00000,  0.00,20000,      0 ; * ( 16 bytes
;gap 24 bytes
      RotarySplitTable = array, S16,  734,    [8x8], "deg",  0.10000, 0.00000, -60, 20, 1
      RotarySplitLoad = array, U16,   862, [ 8 ], { bitStringValue( algorithmUnits ,  IgnAlgorithm  ) }, 0.10000, 0.00000, 0, 500, 0
      RotarySplitRPM = array, U16,  878, [ 8 ], "RPM", 1, 0.00000, 0, 20000, 0

      NoiseFilterRpm = array, U16, 894, [  4], "RPM",      1, 0.00000, 0.00, 20000,  0
      NoiseFilterLen = array, U16, 902, [  4], "usec",     1.0, 0.00000, 0.00, 43000, 1

      VariableLagTPSBins = array,  U08,  910, [4], "%/sec", 1, 0.000000, 0.00, 255.00, 0
      VariableLagMapLags = array,  U08,  914, [4], "Lag", 1, 0.000000, 0.00, 255.00, 0
      pwmidle_crank_dutyorsteps_duty = array, U16, 918, [4], "%", 0.392, 0.00000, 0, 100, 1
      pwmidle_crank_dutyorsteps_steps = array, U16, 918, [4], "steps", 1, 0, 0, 512, 0

#if CELSIUS
      pwmidle_crank_clt_temps = array, S16, 926, [4], "°C", 0.05555,  -320.000,-40.00,  {clthighlim},      1
        #else
      pwmidle_crank_clt_temps = array, S16, 926, [4], "°F",       0.10000,   0.00000,-40.00,  {clthighlim},      1
#endif
      matclt_pct    = array, U16,    934,    [6],    "%",    0.010, 0,       0,      100,   1
      matclt_flow   = array, U16,    946,    [6],    "load*rpm",  100,       0,       0,      6553500, 0
      ;user defined
; these are not used by the code and are provided for users to use and learn from
; if you want to add more... you also have to make matching changes in ms2_extra.h
; and ms2_extra_main.c
; note that it you add an 'int' that two bytes are consumed and two of the following
; spare array will need to be removed!
    user_value1      = scalar, U16, 958, "",   1, 0, 0, 65535, 0
    user_value2      = scalar, U16, 960, "",   1, 0, 0, 65535, 0
    user_conf0       = bits, U08, 962, [0:0], "Off", "On"
    user_conf1       = bits, U08, 962, [1:2], "Mode 0", "Mode 1", "Mode 2", "Mode 3"
;spare 10 bytes
;end user defined
;pad1
      baroCorrDelta   = array ,  S16,    974,    [    9], "%",        0.10000,   0.00000,-200.0,   200.0,      1 ; * (  6 bytes)
      matCorrDelta2    = array ,  S16,    992,    [    9], "%",        0.10000,   0.00000,-120.0,   150.0,      1 ; * (  6 bytes)
; space

page = 4 ; 9   - injector channel trims
      inj_trima   = array ,  S08,    000,    [6x6], "%",      0.50000,   0.00000, -63.5,   63.5,      1 ; * (36 bytes)
      inj_trimb   = array ,  S08,    036,    [6x6], "%",      0.50000,   0.00000, -63.5,   63.5,      1 ; * (36 bytes)
      inj_trimc   = array ,  S08,    072,    [6x6], "%",      0.50000,   0.00000, -63.5,   63.5,      1 ; * (36 bytes)
      inj_trimd   = array ,  S08,    108,    [6x6], "%",      0.50000,   0.00000, -63.5,   63.5,      1 ; * (36 bytes)
      inj_trime   = array ,  S08,    144,    [6x6], "%",      0.50000,   0.00000, -63.5,   63.5,      1 ; * (36 bytes)
      inj_trimf   = array ,  S08,    180,    [6x6], "%",      0.50000,   0.00000, -63.5,   63.5,      1 ; * (36 bytes)
      inj_trimg   = array ,  S08,    216,    [6x6], "%",      0.50000,   0.00000, -63.5,   63.5,      1 ; * (36 bytes)
      inj_trimh   = array ,  S08,    252,    [6x6], "%",      0.50000,   0.00000, -63.5,   63.5,      1 ; * (36 bytes)
      inj_trimi   = array ,  S08,    288,    [6x6], "%",      0.50000,   0.00000, -63.5,   63.5,      1 ; * (36 bytes)
      inj_trimj   = array ,  S08,    324,    [6x6], "%",      0.50000,   0.00000, -63.5,   63.5,      1 ; * (36 bytes)
      inj_trimk   = array ,  S08,    360,    [6x6], "%",      0.50000,   0.00000, -63.5,   63.5,      1 ; * (36 bytes)
      inj_triml   = array ,  S08,    396,    [6x6], "%",      0.50000,   0.00000, -63.5,   63.5,      1 ; * (36 bytes)
      inj_trimm   = array ,  S08,    432,    [6x6], "%",      0.50000,   0.00000, -63.5,   63.5,      1 ; * (36 bytes)
      inj_trimn   = array ,  S08,    468,    [6x6], "%",      0.50000,   0.00000, -63.5,   63.5,      1 ; * (36 bytes)
      inj_trimo   = array ,  S08,    504,    [6x6], "%",      0.50000,   0.00000, -63.5,   63.5,      1 ; * (36 bytes)
      inj_trimp   = array ,  S08,    540,    [6x6], "%",      0.50000,   0.00000, -63.5,   63.5,      1 ; * (36 bytes)

      inj_trim_rpm = array,  U16,    576,    [6], "rpm",      1,   0.00000, 0,   20000,      0 ; * (12 bytes)
      inj_trim_load  =array, U16,    588,    [6], { bitStringValue( algorithmUnits ,  algorithm  ) }, 0.1,   0.0000, 0,   500, 1
      inj_timing = array, S16,       600,    [12x12], "deg",  0.10000, 0.00000, -360.0, 720.0, 1
      inj_timing_rpm = array, U16,   888,    [12],    "rpm",  1,       0,       0,      20000, 0
      inj_timing_load = array, S16,  912,    [12],    "%",    0.10000, 0,       0,      500,   1
      maxafr1_load   = array, U16,    936,    [6],    "%",    0.10000, 0,       0,      500,   1
      maxafr1_rpm    = array, U16,    948,    [6],    "rpm",  1,       0,       0,      20000, 0
#if LAMBDA
      maxafr1_diff    = array, U08,    960,    [6x6], "Lambda",  { 0.1 / stoich },   0.00000,  0.00,    0.14,      3
#else
      maxafr1_diff    = array, U08,    960,    [6x6], "AFR",      0.10000,   0.00000,  0.00,   2.00,      1
#endif
      dwellrpm_dwell = array, U08,    996,    [6], "ms", 0.1, 0, 1, 8, 1
      dwellrpm_rpm   = array, U16,   1002,    [6], "RPM", 1, 0, 0, 15000, 0

page = 5   ; 10
      boost_ctl_load_targets2   = array,  S16, 0, [8x8], "kPa", 0.1, 0, 0, 700, 1
      boost_ctl_loadtarg_tps_bins2=array, S16, 128, [8], "%", 0.1, 0, 0, 100, 1
      boost_ctl_loadtarg_rpm_bins2=array, U16, 144, [8], "rpm", 1, 0, 0, 20000, 0
      boost_ctl_pwm_targets2    = array,  U08, 160, [8x8], "%", 1, 0, 0, 100, 0
      boost_ctl_pwmtarg_tps_bins2=array,  S16, 224, [8], "%", 0.1, 0, 0, 100, 1
      boost_ctl_pwmtarg_rpm_bins2=array,  U16, 240, [8], "rpm", 1, 0, 0, 20000, 0
;      boost_timed_pct = array,  U08,    256, [ 6 ], "%", 1, 0, 0, 100, 0 
;      boost_timed_time= array,  U16,    262, [ 6 ], "s", 0.001, 0, 0, 15, 1
;      boostvss_duty   = array,  U08,    274, [ 6 ], "%", 1, 0, 0, 100, 0
;      boostvss_target = array,  U16,    280, [ 6 ], "kPa", 0.1, 0, 0, 700, 1
;      boostvss_speed  = array,  U16,    292, [ 6 ], { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale }, 0, 0, { maxspeed }, 0
;      boostvss_time  = array,  U16,    292, [ 6 ], "s", 0.001, 0, 0, 65, 3 ; Same data space as _speed
      map_sample_rpms = array, U16, 304, [ 8 ], "rpm", 1, 0, 0, 20000, 0 
      map_sample_timing = array, S16, 320, [ 8 ], "deg", 0.10000, 0, -360, 720, 1
#if LAMBDA
      afrTable1       = array ,  U08,    336,    [12x12], "Lambda",  { 0.1 / stoich },   0.00000,  0.00,    2.00,      3 ; * (144 bytes)
      afrTable2       = array ,  U08,    480,    [12x12], "Lambda",  { 0.1 / stoich },   0.00000,  0.00,    2.00,      3 ; * (144 bytes)
#else
      afrTable1       = array ,  U08,    336,    [12x12], "AFR",      0.10000,   0.00000,  1.00,   25.00,      1
      afrTable2       = array ,  U08,    480,    [12x12], "AFR",      0.10000,   0.00000,  1.00,   25.00,      1
#endif
      wueBins         = array ,  U08,    624,    [   10], "%",        1.00000,   0.00000,  { wue_lpg?50:100 },  255.00,      0 ; * ( 10 bytes)
;gap 8 bytes
      iacstepTable    = array ,  S16,    642,    [   10], "steps",    1.00000,   0.00000,  0.00,  500.00,      0 ; * ( 20 bytes)
      arpm_table1     = array ,  U16,    662,    [   12], "RPM",      1.00000,   0.00000,  0.00,20000,      0 ; * ( 24 bytes)
      arpm_table2     = array ,  U16,    686,    [   12], "RPM",      1.00000,   0.00000,  0.00,20000,      0 ; * ( 24 bytes)
      amap_table1     = array ,  S16,    710,    [   12], { bitStringValue( algorithmUnits ,  (afrload ? afrload : algorithm) ) },      0.10000,   0.00000,  0.00,  500,      1 ; * ( 24 bytes)
      amap_table2     = array ,  S16,    734,    [   12], { bitStringValue( algorithmUnits ,  (afrload ? afrload : algorithm) ) },      0.10000,   0.00000,  0.00,  500,      1 ; * ( 24 bytes)
#if CELSIUS
      tempTable       = array ,  S16,    758,    [   10], "°C",       0.05555,  -320.000,-40.00,  {clthighlim},      1 ; * ( 20 bytes) Temperature bins for cranking, cold AE and WUE ; temp_table
  #else
      tempTable       = array ,  S16,    758,    [   10], "°F",       0.10000,   0.00000,-40.00,  {clthighlim},      1
  #endif
;gap
      dwellvolts      = array ,  U08,    794,    [    6], "V",        0.10000,   0.00000,6,   18,      1 ; * (  6 bytes)
      dwellcorr       = array ,  U08,    800,    [    6], "%",       2,   0.00000,20,   512,      0 ; * (  6 bytes)
      cold_adv_table  = array ,  S16,    806,    [   10], "deg",      0.10000,   0.00000,-10.00,   10.00,      1 ; * ( 20 bytes)
      ipwmTable       = array ,  S16,    826,    [   10], "%",        0.392,   0.00000,  0.00,  100.00,      1
;846
;      opentimepct0       = array,   U16,    846,    [    6], "%",       0.1,   0.00000,  0.00,   500,      1
;      opentimepct1       = array,   U16,    858,    [    6], "%",       0.1,   0.00000,  0.00,   500,      1
;      opentimepct2       = array,   U16,    870,    [    6], "%",       0.1,   0.00000,  0.00,   500,      1
;      opentimepct3       = array,   U16,    882,    [    6], "%",       0.1,   0.00000,  0.00,   500,      1
;      opentimev       = array,   U16,    894,    [    6], "V",        0.100,   0.00000,  6,      19.2,         1

      smallpw0       = array,   U16,    906,    [    6], "ms",       0.001,   0.00000,  0.00,   2,      3
      smallpw1       = array,   U16,    918,    [    6], "ms",       0.001,   0.00000,  0.00,   2,      3
      smallpw2       = array,   U16,    930,    [    6], "ms",       0.001,   0.00000,  0.00,   2,      3
      smallpw3       = array,   U16,    942,    [    6], "ms",       0.001,   0.00000,  0.00,   2,      3
      smallpwpw      = array,   U16,    954,    [    6], "ms",       0.001,   0.00000,  0.00,   2,      3

      waterinj_rpm      = array,   U16,    966,    [    8], "RPM",      1,   0.00000,  0.00,   20000,      0
      waterinj_map      = array,   U16,    982,    [    4], "kPa",      0.1, 0.00000,  0.00,   500,        0
      waterinj_duty     = array,   U08,    990,    [8 x 4], "%",        1,   0,        0,      100,        0

page = 6 ; 11   - spark channel trims
      spk_trima   = array ,  S08,    000,    [6x6], "%",      0.10000,   0.00000, -12.7,   12.7,      1 ; * (36 bytes)
      spk_trimb   = array ,  S08,    036,    [6x6], "%",      0.10000,   0.00000, -12.7,   12.7,      1 ; * (36 bytes)
      spk_trimc   = array ,  S08,    072,    [6x6], "%",      0.10000,   0.00000, -12.7,   12.7,      1 ; * (36 bytes)
      spk_trimd   = array ,  S08,    108,    [6x6], "%",      0.10000,   0.00000, -12.7,   12.7,      1 ; * (36 bytes)
      spk_trime   = array ,  S08,    144,    [6x6], "%",      0.10000,   0.00000, -12.7,   12.7,      1 ; * (36 bytes)
      spk_trimf   = array ,  S08,    180,    [6x6], "%",      0.10000,   0.00000, -12.7,   12.7,      1 ; * (36 bytes)
      spk_trimg   = array ,  S08,    216,    [6x6], "%",      0.10000,   0.00000, -12.7,   12.7,      1 ; * (36 bytes)
      spk_trimh   = array ,  S08,    252,    [6x6], "%",      0.10000,   0.00000, -12.7,   12.7,      1 ; * (36 bytes)
      spk_trimi   = array ,  S08,    288,    [6x6], "%",      0.10000,   0.00000, -12.7,   12.7,      1 ; * (36 bytes)
      spk_trimj   = array ,  S08,    324,    [6x6], "%",      0.10000,   0.00000, -12.7,   12.7,      1 ; * (36 bytes)
      spk_trimk   = array ,  S08,    360,    [6x6], "%",      0.10000,   0.00000, -12.7,   12.7,      1 ; * (36 bytes)
      spk_triml   = array ,  S08,    396,    [6x6], "%",      0.10000,   0.00000, -12.7,   12.7,      1 ; * (36 bytes)
      spk_trimm   = array ,  S08,    432,    [6x6], "%",      0.10000,   0.00000, -12.7,   12.7,      1 ; * (36 bytes)
      spk_trimn   = array ,  S08,    468,    [6x6], "%",      0.10000,   0.00000, -12.7,   12.7,      1 ; * (36 bytes)
      spk_trimo   = array ,  S08,    504,    [6x6], "%",      0.10000,   0.00000, -12.7,   12.7,      1 ; * (36 bytes)
      spk_trimp   = array ,  S08,    540,    [6x6], "%",      0.10000,   0.00000, -12.7,   12.7,      1 ; * (36 bytes)
      spk_trim_rpm  = array, U16,    576,    [6], "rpm",      1,   0.00000, 0,   20000,      0 ; * (12 bytes)
      spk_trim_load = array, U16,    588,    [6], { bitStringValue( algorithmUnits ,  IgnAlgorithm  ) },        0.1,   0.0000, 0,   500,        1 ; * (12 bytes)
      XAcc           =array, U16,    600,    [5], "%",  0.10000,   0.00000, 5.00, 90,        1 ; * ( 10 bytes)
      TauAcc         =array, U16,    610,    [5], "ms",1.00000,  0.00000, 2.00, 20000,     0 ; * ( 10 bytes)
      XDec           =array, U16,    620,    [5], "%",   0.10000,  0.00000, 5.00,    90,     1 ; * ( 10 bytes)
      TauDec         =array, U16,    630,    [5], "ms",1.00000,  0.00000, 2.00, 20000,     0 ; * ( 10 bytes)
      XTrpms         =array, U16,    640,    [5], "rpm",1.00000,   0.00000, 0.00, 20000,     0 ; * ( 10 bytes)
      XClt           =array, U16,    650,    [10], "%", 1.00000,   0.00000, 0.00,   600,     0 ; * ( 20 bytes)
      TauClt         =array, U16,    670,    [10], "%", 1.00000,   0.00000, 0.00,   600,     0 ; * ( 20 bytes)
#if CELSIUS
      XClt_temps   = array,  S16,    690,    [   10], "°C",        0.05555,   -320.000, -40.00, {clthighlim},     0
      TauClt_temps = array,  S16,    710,    [   10], "°C",        0.05555,   -320.000, -40.00, {clthighlim},     0
#else
      XClt_temps   = array,  S16,    690,    [   10], "°F",      0.10000,   0.000,-40.00, {clthighlim},      1
      TauClt_temps = array,  S16,    710,    [   10], "°F",      0.10000,   0.000,-40.00, {clthighlim},      1
#endif
      launch_time   = array, U16,    730,    [10], "s", 0.001, 0, 0, 15, 2
      launch_retard = array, U16,    750,    [10], "deg", 0.1, 0, 0, 30, 1
;gap 770 (68 bytes)
; staged tables
      staged_percents=array, U08,    838,  [8x8], "%", 1, 0, 0, 100, 0
      staged_rpms   = array, U16,    902,  [8], "rpm", 1, 0, 0, 20000, 0
      staged_loads  = array, S16,    918,  [8], "%",   0.1, 0, 0, 250, 1
;gap 934 (60 bytes)
      cranktaper_time=array, U16,    994,    [6], "s", 0.1, 0, 0, 15, 1
      cranktaper_timeevents=array,U16,   994,    [6], "events", 1, 0, 0, 1000, 0 ; same again, different units
      cranktaper_pct =array, U16,   1006,    [6], "%", 0.1, 0, 0, 500, 0

page = 7 ; 12
      veTable1        = array ,  U16,    000,    [16x16], "%",        0.10000,   0.00000,  0.00,  400,      1 ; * (512 bytes)
      veTable2        = array ,  U16,    512,    [16x16], "%",        0.10000,   0.00000,  0.00,  400,      1 ;

page = 8 ; 13
      advanceTable1   = array ,  S16,    000,    [16x16], "deg",      0.10000,   0.00000,-10.00,   90.00,      1 ; * (512 bytes)
      advanceTable2   = array ,  S16,    512,    [16x16], "deg",      0.10000,   0.00000,-10.00,   90.00,      1 ; * (512 bytes)

page = 9 ; 18
      veTable3        = array ,  U16,    000,    [16x16], "%",        0.10000,   0.00000,  0.00,  400,      1 ;
      advanceTable3   = array ,  S16,    512,    [16x16], "deg",      0.10000,   0.00000,-10.00,   90.00,      1 ; * (288 bytes)

page = 10 ; 19
      frpm_table1     = array ,  U16,    000,    [   16], "RPM",      1.00000,   0.00000,  0.00,20000,      0 ; * ( 24 bytes)
      frpm_table2     = array ,  U16,    032,    [   16], "RPM",      1.00000,   0.00000,  0.00,20000,      0 ; * ( 24 bytes)
      frpm_table3     = array ,  U16,    064,    [   16], "RPM",      1.00000,   0.00000,  0.00,20000,      0 ; * ( 24 bytes)

      fmap_table1     = array ,  S16,    096,    [   16], { bitStringValue( algorithmUnits ,  algorithm  ) },        0.10000,   0.00000,  0.00,  500,      1 ; * ( 24 bytes)
      fmap_table2     = array ,  S16,    128,    [   16], { bitStringValue( algorithmUnits ,  algorithm2  ) },        0.10000,   0.00000,  0.00,  500,      1 ; * ( 24 bytes)
      fmap_table3     = array ,  S16,    160,    [   16], { bitStringValue( algorithmUnits ,  algorithm  ) },        0.10000,   0.00000,  0.00,  500,      1 ; * ( 24 bytes)

      srpm_table1     = array ,  U16,    192,    [   16], "RPM",      1.00000,   0.00000,  0.00,20000,      0 ; * ( 24 bytes)
      srpm_table2     = array ,  U16,    224,    [   16], "RPM",      1.00000,   0.00000,  0.00,20000,      0 ; * ( 24 bytes)
      srpm_table3     = array ,  U16,    256,    [   16], "RPM",      1.00000,   0.00000,  0.00,20000,      0 ; * ( 24 bytes)

      smap_table1     = array ,  S16,    288,    [   16], { bitStringValue( algorithmUnits ,  IgnAlgorithm  ) },        0.10000,   0.00000,  0.00,  500,      1 ; * ( 24 bytes)
      smap_table2     = array ,  S16,    320,    [   16], { bitStringValue( algorithmUnits ,  IgnAlgorithm2  ) },        0.10000,   0.00000,  0.00,  500,      1 ; * ( 24 bytes)
      smap_table3     = array ,  S16,    352,    [   16], { bitStringValue( algorithmUnits ,  IgnAlgorithm  ) },        0.10000,   0.00000,  0.00,  500,      1 ; * ( 24 bytes)
      EAEAWCRPMbins2  = array,   U16,    384,    [   12], "rpm",      1.0000,    0.00000,  0.00,  20000,       0 ; * ( 24 bytes)
      EAESOCRPMbins2  = array,   U16,    408,    [   12], "rpm",      1.0000,    0.00000,  0.00,  20000,       0 ; * ( 24 bytes)
      EAEAWCKPAbins2  = array,   U16,    432,    [   12], { bitStringValue( algorithmUnits ,  (eaeload ? eaeload : algorithm) ) },        0.1000,    0.00000,  0.00,  500,      1
      EAESOCKPAbins2  = array,   U16,    456,    [   12], { bitStringValue( algorithmUnits ,  (eaeload ? eaeload : algorithm) ) },        0.1000,    0.00000,  0.00,  500,      1
      EAEBAWC2 = array,          U08,    480,    [   12], "%",        1.0000,    0.00000,  0.00,  100.00,      0
      EAEBSOC2 = array,          U08,    492,    [   12], "%",        0.10000,   0.00000,  0.00,  25.5,        1
      EAEAWN2      = array,   U08,       504,    [   12], "%",        1.00000,   0.00000,0,       200,         0 ; * (12 bytes)
      EAESON2      = array,   U08,       516,    [   12], "%",        1.00000,   0.00000,0,       200,         0
      EAEAWW2 =  array,          U08,    528,    [   12], "%",        1.0000,    0.00000,  0.00,  100,         0
      EAESOW2 =  array,          U08,    540,    [   12], "%",        1.0000,    0.00000,  0.00,  100,         0

#if CELSIUS
      EAEAWWCLTbins2   = array,  S16,     552,    [   12], "deg",       0.05555,   -320.000, -40.00, {clthighlim},     0
      EAESOWCLTbins2   = array,  S16,     576,    [   12], "deg",       0.05555,   -320.000, -40.00, {clthighlim},     0
        #else
      EAEAWWCLTbins2   = array,  S16,     552,    [   12], "deg",       0.10000,   0.000,-40.00, {clthighlim},      1
      EAESOWCLTbins2   = array,  S16,     576,    [   12], "deg",       0.10000,   0.000,-40.00, {clthighlim},      1
#endif
      ITB_load_loadvals= array,  S16,     600,    [   12], "%",         0.10000,   0.000, 0,     100.00,      1
      ITB_load_switchpoints = array,S16,  624,  [   12], "%",         0.10000,   0.000, 0,     100.00,      1
      ITB_load_rpms = array,     U16,     648,    [   12], "rpm",       1.0000,    0.000, 0,     20000,       0 
      idleve_table1 = array,     U16,     672,  [4x4], "%",           0.10000,    0.000, 0,   200,    1
      idleve_table2 = array,     U16,     704,  [4x4], "%",           0.10000,    0.000, 0,   200,    1
      idleve_loads1 = array,     S16,     736,  [4 ],  "%",           0.10000,    0.000, 0,   255,    1
      idleve_loads2 = array,     S16,     744,  [4 ],  "%",           0.10000,    0.000, 0,   255,    1
      idleve_rpms1 = array,      U16,     752,  [4 ],  "rpm",         1.00000,    0.000, 0,   20000,  0
      idleve_rpms2 = array,      U16,     760,  [4 ],  "rpm",         1.00000,    0.000, 0,   20000,  0 
;TC
      tc_perfect_vss  = array, U16, 768, [ 10 ], { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale }, 0.00000, 0, { maxspeed }, 1 
      tc_perfect_time = array, U16, 788, [ 10 ],  "s", 0.001024, 0.00000, 0, 30, 1
      tc_react_x      = array, U16, 808, [ 4 ],  "slip% x 0.01s", 0.1, 0.00000, 0, 10000, 1 
      tc_retard       = array, U16, 816, [ 4 ],  "deg", 0.1, 0.00000, 0, 30, 1 
      tc_spkcut       = array, U08, 824, [ 4 ],  "cut%", 1, 0.00000, 0, 100, 0 
      tc_addfuel      = array, U08, 828, [ 4 ],  "add%", 1, 0.00000, 0, 100, 1 
      tc_nitrous      = array, U08, 832, [ 4 ],  "cut%", 1, 0.00000, 0, 100, 1 
      tc_boost        = array, U08, 836, [ 4 ],  "cut%", 1, 0.00000, 0, 100, 1 
;840
      knock_rpms  = array, U16, 840, [10], "rpm", 1, 0, 0, 20000, 0
      knock_thresholds= array, U16, 860, [10], "%", 0.1, 0, 0, 100, 1
      knock_starts= array, S16, 880, [10], "deg", 0.1, 0, -50, 50, 1
      knock_durations  = array, S16, 900, [10], "deg", 0.1, 0, 0, 50, 1
;920
      pwmidle_cl_initialvalue_rpms = array, U16, 920, [5], "rpm", 1, 0, 0, 20000, 0
#if CELSIUS
      pwmidle_cl_initialvalue_matorclt = array, S16, 930, [5], "°C", 0.05555, -320, -40, 230, 0
#else
      pwmidle_cl_initialvalue_matorclt = array, S16, 930, [5], "°F", 0.10000, 0.000, -40, 450, 0
#endif
      pwmidle_cl_initialvalues_duties = array, U08, 940, [5 x 5], "%", 0.392, 0.00000, 0, 100, 1
      pwmidle_cl_initialvalues_steps = array, U08, 940, [5 x 5], "steps", 1, 0, 0, 255, 0
;pad
#if CELSIUS
      knock_clts   = array,  S16,     966,    [   4], "°C",           0.05555,   -320.000, -40.00, {clthighlim},     0
#else
      knock_clts   = array,  S16,     966,    [   4], "°F",       0.10000,   0.000,-40.00, {clthighlim},      1
#endif
      knock_upscale  = array, U16, 974, [4], "%", 0.1, 0, 100, 600, 1
      tc_perfect_rpm  = array, U16, 982, [ 10 ],  "rpm", 1.0000, 0.00000, 0, 20000, 0
      tc_boost_duty_delta  = array, S08, 1002, [ 4 ],  "+/-duty", 1, 0.00000, -100, 100, 0 

page = 11 ; 21
      pwm_rpms_a     = array,  S16, 0,  [6], "rpm",{ pwm_opt_curve_a == 0 ? 1 : getChannelScaleByOffset(pwm_opt_load_a_offset) } , { pwm_opt_curve_a == 0 ? 0 : getChannelTranslateByOffset(pwm_opt_load_a_offset) }, { pwm_opt_curve_a == 0 ? 0 : getChannelMinByOffset(pwm_opt_load_a_offset) }, { pwm_opt_curve_a == 0 ? 20000 : getChannelMaxByOffset(pwm_opt_load_a_offset) }, { pwm_opt_curve_a == 0 ? 0 : getChannelDigitsByOffset(pwm_opt_load_a_offset) }
      pwm_loadvals_a = array,  S16, 12, [6], "%", { getChannelScaleByOffset(pwm_opt_load_a_offset) } , { getChannelTranslateByOffset(pwm_opt_load_a_offset) }, { getChannelMinByOffset(pwm_opt_load_a_offset) }, { getChannelMaxByOffset(pwm_opt_load_a_offset) }, { getChannelDigitsByOffset(pwm_opt_load_a_offset) }
      pwm_xaxis_a    = array,  S16, 0,  [12], "", { getChannelScaleByOffset(pwm_opt_load_a_offset) } , { getChannelTranslateByOffset(pwm_opt_load_a_offset) }, { getChannelMinByOffset(pwm_opt_load_a_offset) }, { getChannelMaxByOffset(pwm_opt_load_a_offset) }, { getChannelDigitsByOffset(pwm_opt_load_a_offset) }

      pwm_rpms_b     = array,  S16, 24, [6], "rpm",{ pwm_opt_curve_b == 0 ? 1 : getChannelScaleByOffset(pwm_opt_load_b_offset) } , { pwm_opt_curve_b == 0 ? 0 : getChannelTranslateByOffset(pwm_opt_load_b_offset) }, { pwm_opt_curve_b == 0 ? 0 : getChannelMinByOffset(pwm_opt_load_b_offset) }, { pwm_opt_curve_b == 0 ? 20000 : getChannelMaxByOffset(pwm_opt_load_b_offset) }, { pwm_opt_curve_b == 0 ? 0 : getChannelDigitsByOffset(pwm_opt_load_b_offset) }
      pwm_loadvals_b = array,  S16, 36, [6], "%", { getChannelScaleByOffset(pwm_opt_load_b_offset) } , { getChannelTranslateByOffset(pwm_opt_load_b_offset) }, { getChannelMinByOffset(pwm_opt_load_b_offset) }, { getChannelMaxByOffset(pwm_opt_load_b_offset) }, { getChannelDigitsByOffset(pwm_opt_load_b_offset) }
      pwm_xaxis_b    = array,  S16, 24, [12], "", { getChannelScaleByOffset(pwm_opt_load_b_offset) } , { getChannelTranslateByOffset(pwm_opt_load_b_offset) }, { getChannelMinByOffset(pwm_opt_load_b_offset) }, { getChannelMaxByOffset(pwm_opt_load_b_offset) }, { getChannelDigitsByOffset(pwm_opt_load_b_offset) }

      pwm_rpms_c     = array,  S16, 48, [6], "rpm",{ pwm_opt_curve_c == 0 ? 1 : getChannelScaleByOffset(pwm_opt_load_c_offset) } , { pwm_opt_curve_c == 0 ? 0 : getChannelTranslateByOffset(pwm_opt_load_c_offset) }, { pwm_opt_curve_c == 0 ? 0 : getChannelMinByOffset(pwm_opt_load_c_offset) }, { pwm_opt_curve_c == 0 ? 20000 : getChannelMaxByOffset(pwm_opt_load_c_offset) }, { pwm_opt_curve_c == 0 ? 0 : getChannelDigitsByOffset(pwm_opt_load_c_offset) }
      pwm_loadvals_c = array,  S16, 60, [6], "%", { getChannelScaleByOffset(pwm_opt_load_c_offset) } , { getChannelTranslateByOffset(pwm_opt_load_c_offset) }, { getChannelMinByOffset(pwm_opt_load_c_offset) }, { getChannelMaxByOffset(pwm_opt_load_c_offset) }, { getChannelDigitsByOffset(pwm_opt_load_c_offset) }
      pwm_xaxis_c    = array,  S16, 48, [12], "", { getChannelScaleByOffset(pwm_opt_load_c_offset) } , { getChannelTranslateByOffset(pwm_opt_load_c_offset) }, { getChannelMinByOffset(pwm_opt_load_c_offset) }, { getChannelMaxByOffset(pwm_opt_load_c_offset) }, { getChannelDigitsByOffset(pwm_opt_load_c_offset) }

      pwm_rpms_d     = array,  S16, 72, [6], "rpm",{ pwm_opt_curve_d == 0 ? 1 : getChannelScaleByOffset(pwm_opt_load_d_offset) } , { pwm_opt_curve_d == 0 ? 0 : getChannelTranslateByOffset(pwm_opt_load_d_offset) }, { pwm_opt_curve_d == 0 ? 0 : getChannelMinByOffset(pwm_opt_load_d_offset) }, { pwm_opt_curve_d == 0 ? 20000 : getChannelMaxByOffset(pwm_opt_load_d_offset) }, { pwm_opt_curve_d == 0 ? 0 : getChannelDigitsByOffset(pwm_opt_load_d_offset) }
      pwm_loadvals_d = array,  S16, 84, [6], "%", { getChannelScaleByOffset(pwm_opt_load_d_offset) } , { getChannelTranslateByOffset(pwm_opt_load_d_offset) }, { getChannelMinByOffset(pwm_opt_load_d_offset) }, { getChannelMaxByOffset(pwm_opt_load_d_offset) }, { getChannelDigitsByOffset(pwm_opt_load_d_offset) }
      pwm_xaxis_d    = array,  S16, 72, [12], "", { getChannelScaleByOffset(pwm_opt_load_d_offset) } , { getChannelTranslateByOffset(pwm_opt_load_d_offset) }, { getChannelMinByOffset(pwm_opt_load_d_offset) }, { getChannelMaxByOffset(pwm_opt_load_d_offset) }, { getChannelDigitsByOffset(pwm_opt_load_d_offset) }

      pwm_rpms_e     = array,  S16, 96, [6], "rpm",{ pwm_opt_curve_e == 0 ? 1 : getChannelScaleByOffset(pwm_opt_load_e_offset) } , { pwm_opt_curve_e == 0 ? 0 : getChannelTranslateByOffset(pwm_opt_load_e_offset) }, { pwm_opt_curve_e == 0 ? 0 : getChannelMinByOffset(pwm_opt_load_e_offset) }, { pwm_opt_curve_e == 0 ? 20000 : getChannelMaxByOffset(pwm_opt_load_e_offset) }, { pwm_opt_curve_e == 0 ? 0 : getChannelDigitsByOffset(pwm_opt_load_e_offset) }
      pwm_loadvals_e = array,  S16, 108,[6], "%", { getChannelScaleByOffset(pwm_opt_load_e_offset) } , { getChannelTranslateByOffset(pwm_opt_load_e_offset) }, { getChannelMinByOffset(pwm_opt_load_e_offset) }, { getChannelMaxByOffset(pwm_opt_load_e_offset) }, { getChannelDigitsByOffset(pwm_opt_load_e_offset) }
      pwm_xaxis_e    = array,  S16, 96, [12], "", { getChannelScaleByOffset(pwm_opt_load_e_offset) } , { getChannelTranslateByOffset(pwm_opt_load_e_offset) }, { getChannelMinByOffset(pwm_opt_load_e_offset) }, { getChannelMaxByOffset(pwm_opt_load_e_offset) }, { getChannelDigitsByOffset(pwm_opt_load_e_offset) }

      pwm_rpms_f     = array,  S16, 120, [6], "rpm",{ pwm_opt_curve_f == 0 ? 1 : getChannelScaleByOffset(pwm_opt_load_f_offset) } , { pwm_opt_curve_f == 0 ? 0 : getChannelTranslateByOffset(pwm_opt_load_f_offset) }, { pwm_opt_curve_f == 0 ? 0 : getChannelMinByOffset(pwm_opt_load_f_offset) }, { pwm_opt_curve_f == 0 ? 20000 : getChannelMaxByOffset(pwm_opt_load_f_offset) }, { pwm_opt_curve_f == 0 ? 0 : getChannelDigitsByOffset(pwm_opt_load_f_offset) }
      pwm_loadvals_f = array,  S16, 132, [6], "%", { getChannelScaleByOffset(pwm_opt_load_f_offset) } , { getChannelTranslateByOffset(pwm_opt_load_f_offset) }, { getChannelMinByOffset(pwm_opt_load_f_offset) }, { getChannelMaxByOffset(pwm_opt_load_f_offset) }, { getChannelDigitsByOffset(pwm_opt_load_f_offset) }
      pwm_xaxis_f    = array,  S16, 120, [12], "", { getChannelScaleByOffset(pwm_opt_load_f_offset) } , { getChannelTranslateByOffset(pwm_opt_load_f_offset) }, { getChannelMinByOffset(pwm_opt_load_f_offset) }, { getChannelMaxByOffset(pwm_opt_load_f_offset) }, { getChannelDigitsByOffset(pwm_opt_load_f_offset) }

      pwm_duties_a   = array,  U08, 144, [6x6], "%", 1, 0, 0, 250, 0
      pwm_yaxis_a    = array,  U08, 144, [12],  "%", 1, 0, 0, 250, 0

      pwm_duties_b   = array,  U08, 180, [6x6], "%", 1, 0, 0, 250, 0
      pwm_yaxis_b    = array,  U08, 180, [12],  "%", 1, 0, 0, 250, 0

      pwm_duties_c   = array,  U08, 216, [6x6], "%", 1, 0, 0, 250, 0
      pwm_yaxis_c    = array,  U08, 216, [12],  "%", 1, 0, 0, 250, 0

      pwm_duties_d   = array,  U08, 252, [6x6], "%", 1, 0, 0, 250, 0
      pwm_yaxis_d    = array,  U08, 252, [12],  "%", 1, 0, 0, 250, 0

      pwm_duties_e   = array,  U08, 288, [6x6], "%", 1, 0, 0, 250, 0
      pwm_yaxis_e    = array,  U08, 288, [12],  "%", 1, 0, 0, 250, 0

      pwm_duties_f   = array,  U08, 324, [6x6], "%", 1, 0, 0, 250, 0
      pwm_yaxis_f    = array,  U08, 324, [12],  "%", 1, 0, 0, 250, 0

      primePWTable2  = array,  S16, 360,    [   10], "ms",       0.10000,   0.00000,  0.00,   65.00,      1 ; * ( 20 bytes)
      crankPctTable2 = array,  U16, 380,    [   10], "%",       1,   1,  1,   10000,      0 ; * ( 20 bytes)
      asePctTable2   = array,  S16, 400,    [   10], "%",        1.00000,   0.00000,  0.00,  400.00,      0 ; * (  2 bytes)
      aseCntTable2   = array,  S16, 420,    [   10], "cycles",   1.00000,   0.00000,  0.00, 2500.00,      0 ; * (  2 bytes)
      wueBins2       = array,  U08, 440,    [   10], "%",        1.00000,   0.00000,  { wue_lpg?50:100 },  255.00,      0 ; * ( 10 bytes)
#if CELSIUS
      temp_table_p21   = array,  S16,     450,    [   10], "°C",              0.05555,   -320.000, -40.00, {clthighlim},     0
#else
      temp_table_p21   = array,  S16,     450,    [   10], "°F",       0.10000,   0.000,-40.00, {clthighlim},      1
#endif
      frpm_table4     = array ,  U16,    470,    [   16], "RPM",      1.00000,   0.00000,  0.00,20000,      0 ; * ( 24 bytes)
      fmap_table4     = array ,  S16,    502,    [   16], { bitStringValue( algorithmUnits ,  algorithm2  ) },        0.10000,   0.00000,  0.00,  500,      1 ; * ( 24 bytes)
      srpm_table4     = array ,  U16,    534,    [   16], "RPM",      1.00000,   0.00000,  0.00,20000,      0 ; * ( 24 bytes)
      smap_table4     = array ,  S16,    566,    [   16], { bitStringValue( algorithmUnits ,  IgnAlgorithm2  ) },        0.10000,   0.00000,  0.00,  500,      1 ; * ( 24 bytes)
#if CELSIUS
      dualfuel_temp   = array,  S16,     598,    [   10], "°C",       0.05555,   -320.000, -40.00, {clthighlim},     0
#else
      dualfuel_temp   = array,  S16,     598,    [   10], "°F",       0.10000,   0.000,-40.00, {clthighlim},      1
#endif
      dualfuel_temp_adj=array,  S16,     618,    [   10], "%",       0.10000,   0.000,-200.00, 200.00,      1
      dualfuel_press  = array,  S16,     638,    [   10], "kPa",     0.10000,   0.000, 70.00, 600.00,      1
      dualfuel_press_adj=array, S16,     658,    [   10], "%",       0.10000,   0.000,-200.00, 200.00,      1
      inj_timing_sec=array, S16,         678,    [12x12], "deg",     0.10000,   0.000,   -360,    720,      1
      inj_timing_sec_load=array, S16,    966,    [   12], "%",       0.10000,   0.000,      0,    500,      1
      inj_timing_sec_rpm=array,  U16,    990,    [   12], "rpm",     1,         0,          0,  20000,      0

page = 12 ; 22
      veTable4        = array ,  U16,    000,    [16x16], "%",        0.10000,   0.00000,  0.00,  400,      1 ;
      advanceTable4   = array ,  S16,    512,    [16x16], "deg",      0.10000,   0.00000,-10.00,   90.00,      1 ; * (288 bytes)

page = 13 ; 23
      ; Generic on/off outputs "Spare Port Settings"
      psEnabled       = array ,  U08,      0,    [   51], "",  1, 0,      0,     1, 0, noSizeMutation
      psCondition     = array ,  U08,     51,    [ 51x2], "",  1, 0,     32,   124, 0, noSizeMutation
      psConnector     = array ,  U08,    153,    [   51], "",  1, 0,     32,   124, 0, noSizeMutation
      psInitValue     = array ,  U08,    204,    [   51], "",  1, 0       0,     1, 0, noSizeMutation
      psPortValue     = array ,  U08,    255,    [   51], "",  1, 0,      0,     1, 0, noSizeMutation
      psOutSize       = array ,  U08,    306,    [ 51x2], "",  1, 0,      0,   255, 0, noSizeMutation
      psOutOffset     = array ,  U16,    408,    [ 51x2], "",  1, 0,      0,  1024, 0, noSizeMutation
      psThreshold     = array ,  S16,    612,    [ 51x2], "",  1, 0, -32768, 32767, 0, noSizeMutation
      psHysteresis    = array ,  S16,    816,    [ 51x2], "",  1, 0, -32768, 32767, 0, noSizeMutation
    ;next is 1020
    vvt_softout1        = bits, U08, 1020, [0:6], $PIN_DIGOUT_CANPWM
    vvt_softout2        = bits, U08, 1021, [0:6], $PIN_DIGOUT_CANPWM
    vvt_softout3        = bits, U08, 1022, [0:6], $PIN_DIGOUT_CANPWM
    vvt_softout4        = bits, U08, 1023, [0:6], $PIN_DIGOUT_CANPWM

page = 14 ; 24
      narrowband_tgts = array, U16,      0,       [12x12], "V",       0.00488,   0.00000,       0,      1,     3
      narrowband_tgts_rpms = array, U16, 288,     [   12], "rpm",      1.00000,   0.00000,       0,  20000,     0
      narrowband_tgts_loads = array, S16,312,     [   12], "%",       0.10000,   0.00000,       0,  500,       1
      als_opt_fc    = bits,     U08,    336,    [0:0], "Off", "On"
      als_opt_sc    = bits,     U08,    336,    [1:1], "Off", "On"
      als_opt_idle  = bits,     U08,    336,    [2:2], "Off", "On"
      als_opt_fuel  = bits,     U08,    336,    [3:3], "Off", "On"
      als_opt_pwmout= bits,     U08,    336,    [4:4], "Off", "On"
      als_opt_ri    = bits,     U08,    336,    [5:5], "Off", "On"
      als_maxtime   = scalar,   U08,    337,    "s",         0.1, 0, 1, 25.5, 1
      vvt_startdelay= scalar,   U08,    338,    "s",         0.1, 0, 1, 25.5, 1
;gap 1 byte
      als_maxtps    = scalar,   S16,    340,    "%",    0.10000,   0.00000, 0,      100,         1
      als_iac_duty  = scalar,   U08,    342,    "%",      0.392, 0.00000, 0, 100, 1
      als_iac_steps = scalar,   U08,    342,    "steps",  1, 0, 0, 255, 0
      als_in_pin     = bits,    U08,    343, [0:5], $PIN_DIGIN_OFF
      als_out_pin    = bits,    U08,    344, [0:6], $PIN_DIGOUT_CANOUT_OFF
      als_pwm_duty  = scalar,   U08,    345,   "%", 1, 0, 0, 100, 0
      als_pausetime = scalar,   U08,    346,    "s",         0.1, 0, 0, 25.5, 1
      vvt_slew      = scalar,   U08,    347,    "deg",       0.1, 0, 0.1, 25.5, 1
#if CELSIUS
      als_minclt    = scalar,   S16,    348,    "°C",      0.05555,   -320.000, -40.00, 150.00,     1
      als_maxclt    = scalar,   S16,    350,    "°C",      0.05555,   -320.000, -40.00, 150.00,     1
#else
      als_minclt    = scalar,   S16,    348,    "°F",       0.10000,   0.000,-40.00, 300.00,      1
      als_maxclt    = scalar,   S16,    350,    "°F",       0.10000,   0.000,-40.00, 300.00,      1
#endif
;ALS tables
      als_rpms      = array,    U16,    352, [6], "rpm", 1, 0, 0, 20000, 0
      als_tpss      = array,    U16,    364, [6], "%", 0.1, 0, 0, 100, 0
      als_timing    = array,    S16,    376, [6x6], "degrees", 0.10000,0.00000,-50.00, 50.00,1;
      als_addfuel   = array,    S16,    448, [6x6], "%", 0.1, 0, 0, 100, 1
      als_fuelcut   = array,    U08,    520, [6x6], "%", 1, 0, 0, 100, 0
      als_sparkcut  = array,    U08,    556, [6x6], "%", 1, 0, 0, 100, 0
      als_minrpm    = scalar,    U16,    592, "rpm", 1, 0, 0, 20000, 0
      als_maxrpm    = scalar,    U16,    594, "rpm", 1, 0, 0, 20000, 0
#if CELSIUS
      als_maxmat    = scalar,   S16,    596,    "°C",      0.05555,   -320.000, -40.00, 150.00,     1
#else
      als_maxmat    = scalar,   S16,    596,    "°F",       0.10000,   0.000,-40.00, 300.00,      1
#endif
    vvt_onoff_ang   = scalar,   S16,    598, "degrees", 0.10000,0.00000,0, 720.00,1;
    vvt_opt1_on     = bits,     U08,    600, [0:1], "Off", "1", "2", "4"
    vvt_opt1_filter = bits,     U08,    600, [2:2], "Off", "On"
    vvt_opt1_int    = bits,     U08,    600, [3:3], "Synced to cam", "Timed"
    vvt_opt1_tst    = bits,     U08,    600, [4:6], "Off", "VVT1", "VVT2", "VVT3", "VVT4", "INVALID", "INVALID", "INVALID" ; 0, 1, 2, 3, 4
    vvt_opt1_dir_exhaust   = bits,     U08,    600, [7:7], "Advance", "Retard"
    vvt_hold_duty  = scalar,   U08,    601,   "%", 0.392, 0, 0, 100, 1
    vvt_out1       = bits,     U08,    602, [0:3], $PIN_HWPWMOUT_VVT
    vvt_out2       = bits,     U08,    603, [0:3], $PIN_HWPWMOUT_VVT
    vvt_out3       = bits,     U08,    604, [0:3], $PIN_HWPWMOUT_VVT
    vvt_out4       = bits,     U08,    605, [0:3], $PIN_HWPWMOUT_VVT

    vvt_out1_dir     = bits,     U08,    602, [7:7], "Advance", "Retard"
    vvt_out2_dir     = bits,     U08,    603, [7:7], "Advance", "Retard"
    vvt_out3_dir     = bits,     U08,    604, [7:7], "Advance", "Retard"
    vvt_out4_dir     = bits,     U08,    605, [7:7], "Advance", "Retard"
    vvt_ctl_ms             = scalar, U16, 606, "ms", 1, 0.00000, 10, 500, 0
    vvt_ctl_Kp             = scalar, U08, 608, "%", 1, 0.00000, 0, 200, 0
    vvt_ctl_Ki             = scalar, U08, 609, "%", 1, 0.00000, 0, 200, 0
    vvt_ctl_Kd             = scalar, U08, 610, "%", 1, 0.00000, 0, 200, 0
    vvt_test_duty   = scalar,   U08,    611,   "%", 0.392, 0.00000, 0, 100, 1
    vvt_min_ang1     = scalar,    S16,   612, "abs.deg.", 0.10000,0.00000,0, 720.00,1;
    vvt_min_ang2     = scalar,    S16,   614, "abs.deg.", 0.10000,0.00000,0, 720.00,1;
    vvt_min_ang3     = scalar,    S16,   616, "abs.deg.", 0.10000,0.00000,0, 720.00,1;
    vvt_min_ang4     = scalar,    S16,   618, "abs.deg.", 0.10000,0.00000,0, 720.00,1;
    vvt_max_ang1     = scalar,    S16,   620, "abs.deg.", 0.10000,0.00000,0, 720.00,1;
    vvt_max_ang2     = scalar,    S16,   622, "abs.deg.", 0.10000,0.00000,0, 720.00,1;
    vvt_max_ang3     = scalar,    S16,   624, "abs.deg.", 0.10000,0.00000,0, 720.00,1;
    vvt_max_ang4     = scalar,    S16,   626, "abs.deg.", 0.10000,0.00000,0, 720.00,1;
    vvt_opt2_pid    = bits,     U08,    628, [0:0], "On/off", "PID"
    vvt_opt2_pid2   = bits,     U08,    628, [0:0], "On/Off", "Variable"
    vvt_opt2_use_hold_intake = bits,   U08,    628, [1:1], "Off", "On"
    vvt_opt2_use_hold_exhaust = bits,  U08,    628, [2:2], "Off", "On"
    vvt_opt2_cam2pol = bits,    U08,    628, [4:4], "Falling Edge", "Rising Edge"
    vvt_opt2_cam3pol = bits,    U08,    628, [5:5], "Falling Edge", "Rising Edge"
    vvt_opt2_cam4pol = bits,    U08,    628, [6:6], "Falling Edge", "Rising Edge"
    vvt_opt2_cam1pol = bits,    U08,    628, [7:7], "Falling Edge", "Rising Edge"
      vvt_opt3_cam2 = bits,     U08,    629, [0:1], $PIN_HWFREQIN
      vvt_opt3_cam3 = bits,     U08,    629, [2:3], $PIN_HWFREQIN
      vvt_opt3_cam4 = bits,     U08,    629, [4:5], $PIN_HWFREQIN
      vvt_opt3_cam1 = bits,     U08,    629, [6:6], "Main cam", "INVALID" ; for display only
      vvt_timing_load   = array, S16,    630,    [   8], "%",       0.10000,   0.000,      0,    500,      1
      vvt_timing_rpm    = array, U16,    646,    [   8], "rpm",     1,         0,          0,  20000,      0
      vvt_timing1       = array, S16,    662,    [8x8], "deg",     0.10000,   0.000,   -360,    720,      1
      vvt_timing2       = array, S16,    790,    [8x8], "deg",     0.10000,   0.000,   -360,    720,      1
      vvt_tth1          = scalar, U08,    918,   "",     1,         0,          0,     24,      0
      vvt_tth2          = scalar, U08,    919,   "",     1,         0,          0,     24,      0
      vvt_tth3          = scalar, U08,    920,   "",     1,         0,          0,     24,      0
      vvt_tth4          = scalar, U08,    921,   "",     1,         0,          0,     24,      0

      vvt_coldpos1         = scalar,    S16,   922, "degrees", 0.10000,0.00000,0, 720.00,1;
      vvt_coldpos2         = scalar,    S16,   924, "degrees", 0.10000,0.00000,0, 720.00,1;

      tclu_opt_vss        = bits,     U08,    926, [0:1], "Off", "VSS1", "VSS2", "INVALID"
      tclu_opt_gear       = bits,     U08,    926, [2:2], "Off", "On"
      tclu_brakepin       = bits,    U08,    927, [0:5], $PIN_DIGIN_OFF
      tclu_enablepin      = bits,    U08,    928, [0:5], $PIN_DIGIN_OFF
      tclu_outpin         = bits,     U08,    929, [0:6], $PIN_DIGOUT_CANOUT_OFF
      tclu_gearmin        = scalar, U08,    930,   "",     1,         0,          0,     8,      0
      tclu_delay        = scalar,   U08,    931, "s", 0.1, 0, 0, 10, 1
      tclu_vssmin       = scalar,  U16,    932, { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale }, 0, 0, { maxspeed }, 0
      tclu_tpsmin      = scalar,   S16,    934, "%", 0.1, 0, 0, 110, 1
      tclu_tpsmax      = scalar,   S16,    936, "%", 0.1, 0, 0, 110, 1
      tclu_mapmin      = scalar,   S16,    938, "%", 0.1, 0, 0, 500, 1
      tclu_mapmax      = scalar,   S16,    940, "%", 0.1, 0, 0, 500, 1
      vvt_opt4_decode  = bits,     U08,    942, [0:2], "Standard", "BMW V10", "BMW S54", "Hemi VVT", "Ford Coyote", "Ford Duratec 4 cyl", "Barra", "INVALID"
      vvt_opt5_add1    = bits,     U08,    943, [0:1], "Off", "Cam 1", "Cam 2", "INVALID"
      vvt_opt5_add2    = bits,     U08,    943, [2:2], "Commanded", "Actual"
      vvt_opt5_err   = bits,     U08,    943, [3:3], "Yes","No"
      vvt_opt5_vvt1  = bits,     U08,    943, [4:4], "Intake","Exhaust"
      vvt_opt5_vvt2  = bits,     U08,    943, [5:5], "Intake","Exhaust"
      vvt_opt5_vvt3  = bits,     U08,    943, [6:6], "Intake","Exhaust"
      vvt_opt5_vvt4  = bits,     U08,    943, [7:7], "Intake","Exhaust"
      vvt_hold_duty_exh  = scalar,   U08,    944,   "%", 0.392, 0, 0, 100, 1
      vvt_ctl_Kp_exh   = scalar, U08, 945, "%", 1, 0.00000, 0, 200, 0
      vvt_ctl_Ki_exh   = scalar, U08, 946, "%", 1, 0.00000, 0, 200, 0
      vvt_ctl_Kd_exh   = scalar, U08, 947, "%", 1, 0.00000, 0, 200, 0
      vvt_cam1tth1      = scalar, U08, 948, "", 1, 0.00000, 0, 255, 0
      vvt_cam1tth2      = scalar, U08, 949, "", 1, 0.00000, 0, 255, 0
      vvt_cam2tth1      = scalar, U08, 950, "", 1, 0.00000, 0, 255, 0
      vvt_cam2tth2      = scalar, U08, 951, "", 1, 0.00000, 0, 255, 0
      vvt_cam3tth1      = scalar, U08, 952, "", 1, 0.00000, 0, 255, 0
      vvt_cam3tth2      = scalar, U08, 953, "", 1, 0.00000, 0, 255, 0
      vvt_cam4tth1      = scalar, U08, 954, "", 1, 0.00000, 0, 255, 0
      vvt_cam4tth2      = scalar, U08, 955, "", 1, 0.00000, 0, 255, 0
      vvt_opt6_freq     = bits,   U08, 956, [0:3], "1021Hz", "766Hz", "613Hz", "511Hz", "383Hz", "306Hz", "204Hz", "153Hz", "99Hz", "75Hz", "50Hz", "48Hz", "30Hz", "20Hz", "15Hz", "12Hz"
      vvt_opt7_yaxis  =  bits, U08, 957, [0:2], "Fuelload", "MAP", "% baro", "TPS", "MAFload", "INVALID", "INVALID", "INVALID"
      als_rifuelcut   = array,    U08,    958, [6x6], "%", 1, 0, 0, 100, 0
      als_rirpms      = array,    U16,    994, [6], "rpm", 1, 0, 0, 20000, 0
      als_ritpss      = array,    U16,    1006, [6], "%", 0.1, 0, 0, 100, 0
    als_pwm_opt_freq    = bits, U08, 1018, [1:4], "On-Off", "INVALID", "250Hz", "225Hz", "200Hz", "175Hz", "150Hz", "125Hz", "100Hz", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
    als_pwm_opt2        = bits, U08, 1019, [0:6], $PIN_DIGOUT_CANPWM
#if CELSIUS
      vvt_minclt    = scalar,   S16,    1020,    "°C",      0.05555,   -320.000, -40.00, 150.00,     1
#else
      vvt_minclt    = scalar,   S16,    1020,    "°F",       0.10000,   0.000,-40.00, 300.00,      1
#endif
    vvt_minduty1   = scalar,   U08,    1022,   "%", 0.392, 0.00000, 0, 100, 1
    vvt_maxduty1   = scalar,   U08,    1023,   "%", 0.392, 0.00000, 0, 100, 1

page = 15 ; 25
      mafv      = array, U16,    0,  [64], "V", 0.001,   0.00000,  0.00,   5,      3
      maff      = array, U16,    0,  [64], "Hz", { (maf_freq1 - maf_freq0) / 5000 },  { maf_freq0 * 5000 / (maf_freq1 - maf_freq0) },  {maf_freq0},   { maf_freq1 }, 0
      mafflow    = array, U16,    128,  [64], "g/sec", {0.01 * (maf_range + 1)},   -8192,  {-81 * (maf_range + 1)},   {573 * (maf_range + 1)},      2
      alphaMAPtable   = array ,  S16,    256,    [ 6x 6], "kPa",      0.10000,   0.00000,  0.00,  200.00,      1 ; * ( 72 bytes)
      amap_tps        = array ,  S16,    328,    [    6], "%",        0.10000,   0.00000,   0.0,  100.00,      1 ; * ( 12 bytes)
      amap_rpm        = array ,  U16,    340,    [    6], "RPM",      1.00000,   0.00000,  0.00,20000,      0 ; * ( 12 bytes)
      tpswot_tps      = array ,  S16,    352,    [    6], "%",        0.10000,   0.00000,   0.0,  100.00,      1 ; * ( 12 bytes)
      tpswot_rpm      = array ,  U16,    364,    [    6], "RPM",      1.00000,   0.00000,  0.00,20000,      0 ; * ( 12 bytes)
#if CELSIUS
      matCorrTemps    = array ,  S16,    376,    [    6], "°C",       0.05555,  -320.000,-40.00,  150.00,      1 ; * ( 12 bytes)
#else
      matCorrTemps    = array ,  S16,    376,    [    6], "°F",       0.10000,   0.00000,-40.00,  300.00,      1
#endif
      matCorrDelta    = array ,  S16,    388,    [    6], "%",        0.10000,   0.00000,-120.0,   120.0,      1 ; * (  6 bytes)
;next is 400
      Xboost_ctl_cl_pwm_targs1 = array, U08, 400, [8x8], "%", 1.000, 0.00000, 0.00, 100, 0 
      Xboost_ctl_cl_pwm_targs2 = array, U08, 464, [8x8], "%", 1.000, 0.00000, 0.00, 100, 0 
      Xboost_ctl_cl_pwm_rpms1 = array, U16, 528, [8], "rpm", 1, 0, 0, 25000, 0
      Xboost_ctl_cl_pwm_rpms2 = array, U16, 544, [8], "rpm", 1, 0, 0, 25000, 0
      Xboost_ctl_cl_pwm_targboosts1 = array, S16, 560, [8], "kPa", 0.10000, 0, 0, 600, 0
      Xboost_ctl_cl_pwm_targboosts2 = array, S16, 576, [8], "kPa", 0.10000, 0, 0, 600, 0
      blendx1 = array, S16, 592, [9], "X", 1, 0, -32767, 32767, 0
      blendx2 = array, S16, 610, [9], "X", 1, 0, -32767, 32767, 0
      blendx3 = array, S16, 628, [9], "X", 1, 0, -32767, 32767, 0
      blendx4 = array, S16, 646, [9], "X", 1, 0, -32767, 32767, 0
      blendx5 = array, S16, 664, [9], "X", 1, 0, -32767, 32767, 0
      blendx6 = array, S16, 682, [9], "X", 1, 0, -32767, 32767, 0
      blendx7 = array, S16, 700, [9], "X", 1, 0, -32767, 32767, 0
      blendx8 = array, S16, 718, [9], "Flex%", 0.1, 0, 0, 100, 1
      blendy1 = array, U08, 736, [9], "VE2", 1, 0, 0, 100, 0
      blendy2 = array, U08, 745, [9], "Spk2", 1, 0, 0, 100, 0
      blendy3 = array, U08, 754, [9], "VE3/4", 1, 0, 0, 100, 0
      blendy4 = array, U08, 763, [9], "Spk3/4", 1, 0, 0, 100, 0
      blendy5 = array, U08, 772, [9], "AFR2", 1, 0, 0, 100, 0
      blendy6 = array, U08, 781, [9], "Boost2", 1, 0, 0, 100, 0
      blendy7 = array, U08, 790, [9], "Crank%2", 1, 0, 0, 100, 0
      blendy8 = array, U08, 799, [9], "Blend%", 1, 0, 0, 100, 0
      fpd_duty= array, U08, 808, [6x6], "%", 0.392, 0.00000, 0, 100, 1 
      fpd_load= array, S16, 844, [6], "%",     0.10000,   0.00000,   0.0,500,    1
      fpd_rpm = array, U16, 856, [6], "RPM",   1.00000,   0.00000,  0.00,20000,    0
#if CELSIUS
      fp_temps      = array, S16,     868,    [   10], "°C",          0.05555,   -320.000, -40.00, {clthighlim},     0
#else
      fp_temps      = array, S16,     868,    [   10], "°F",       0.10000,   0.000,-40.00, {clthighlim},      1
#endif
      fp_temp_adj   = array, S16,     888,    [   10], "%",       0.10000,   0.000,-200.00, 200.00,      1
      fp_presss     = array, S16,     908,    [   10], "kPa",     0.10000,   0.000, 70.00, 600.00,      1
      fp_press_adj  = array, S16,     928,    [   10], "%",       0.10000,   0.000,-200.00, 200.00,      1
      hpte_times    = array, S16,     948,    [    6], "s",       0.10000,   0.000,   0.00,  25.5,       1
      hpte_afrs     = array, U08,     960,    [    6], "AFR",     0.10000,   0.000,   0.00,  5.0,       1
      oil_rpm = array, U16, 966, [6], "RPM",   1.00000,   0.00000,  0.00,20000,    0
      oil_press_min = array, S16, 978, [6], "",     0.10000,   0.00000,   0.0,3276,    1
      oil_press_max = array, S16, 990, [6], "",     0.10000,   0.00000,   0.0,3276,    1
      alt_dutyin    = array, U16, 1002, [7], "%", 1, 0, 0, 100, 0
      alt_dutyout   = array, U08, 1016, [7], "%", 1, 0, 0, 100, 0

page = 16 ; 26 ; this is a RAM only page with no burnable flash
; Quickform realtime data. Lower part of data is offset into outpc. Upper 3 bits are size. 0 = nothing, 1 = 1 byte, 2 = 2 bytes, 3 = 4 bytes
      qfrtfielddata= array,   U16,      0,    [   256], "",      1.0000,   0.00000,  0.00,  65535,       0, noMsqSave
      ltt_table1   = array ,  S08,    512,    [16x16], "%",        0.10000,   0.00000,  -12.7,  12.7,      1, noMsqSave,controllerPriority ; * (512 bytes)
      ltt_rpms     = array ,  U16,    768,    [   16], "RPM",      1.00000,   0.00000,  0.00, 20000,    0, noMsqSave,controllerPriority ; * ( 24 bytes)
      ltt_loads    = array ,  S16,    800,    [   16], "%",        0.10000,   0.00000,  0.00, 500,   1, noMsqSave,controllerPriority ; * ( 24 bytes)

      portusage  = array,  U08,     832,    [ 148], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_a  = array,  U08,     832,    [ 8], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_b  = array,  U08,     840,    [ 8], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_e  = array,  U08,     848,    [ 8], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_h  = array,  U08,     856,    [ 8], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_j  = array,  U08,     864,    [ 8], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_k  = array,  U08,     872,    [ 8], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_m  = array,  U08,     880,    [ 8], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_p  = array,  U08,     888,    [ 8], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_t  = array,  U08,     896,    [ 8], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_ad0h=array,  U08,     904,    [ 8], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_ad0l=array,  U08,     912,    [ 8], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_canin=array, U08,     920,    [ 8], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_canout=array,U08,     928,    [16], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_canadc=array,U08,     944,    [24], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_canpwm=array,U08,     968,    [ 8], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_pwmscl=array,U08,     976,    [ 4], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_loop =array, U08,     980,    [ 8], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_s  = array,  U08,     988,    [ 8], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_canin_src   = scalar, U08, 996,     "", 1, 0, 0, 255, 0, noMsqSave
      portusage_canout1_src = scalar, U08, 997,     "", 1, 0, 0, 255, 0, noMsqSave
      portusage_canout2_src = scalar, U08, 998,     "", 1, 0, 0, 255, 0, noMsqSave
      portusage_canadc_src  = array,  U08, 999,[6], "", 1, 0, 0, 255, 0, noMsqSave
      portusage_canpwm_src  = scalar, U08, 1005,    "", 1, 0, 0, 255, 0, noMsqSave

page = 17 ; 27
      ego_auth_table    = array,  U08,    0,    [12x12], "%",      0.10000,   0.00000,  0,   25.5,      1
      ego_auth_rpms     = array,  U16,    144,  [   12], "RPM",      1.00000,   0.00000,  0.00,20000,      0
      ego_auth_loads    = array,  S16,    168,  [   12], { bitStringValue( algorithmUnits ,  (afrload ? afrload : algorithm) ) },      0.10000,   0.00000,  0.00,  500,      1
      vsslaunch_vss     = array,  U16,    192,  [   10], { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) },      { msToPrefUnitsScale },   0.00000,  0.00, { maxspeed },      0
      vsslaunch_rpm     = array,  U16,    212,  [   10], "RPM",      1.00000,   0.00000,  0.00,20000,      0
      vsslaunch_retard  = array,  U16,    232,  [   10], "deg",      0.10000,   0.00000,  0.00, 50,      1
      ego_delay_table   = array, U08,     252,  [12x12], "ms",       10.00000,   0, 0, 2550, 0
      ego_delay_rpms    = array, U16,     396,  [   12], "rpm",      1.00000,   0, 0, 20000, 0
      ego_delay_loads   = array, S16,     420,  [   12], "%",        0.10000,   0, 0, 500, 0 
      ego_sensor_delay  = scalar,U08,     444,  "ms", 2, 0, 0, 510, 0

; 2 Generic PID channels
      generic_pid_flags_a_on = bits,U08,   445, [0:0], "Off", "On"
      generic_pid_flags_a_type = bits, U08, 445, [1:2], "INVALID","Type B","Type C", "INVALID"
      generic_pid_flags_a_direction = bits, U08, 445, [3:3], "Normal (higher duty = higher PV)", "Inverted (lower duty = higher PV)"
      generic_pid_flags_a_output_type = bits, U08, 445, [4:4], "PWM", "Stepper"
      generic_pid_flags_a_lookup_type = bits, U08, 445, [5:5], "Table", "Curve" 
      generic_pid_flags_b_on = bits,U08,   446, [0:0], "Off", "On"
      generic_pid_flags_b_type = bits, U08, 446, [1:2], "INVALID","Type B","Type C", "INVALID"
      generic_pid_flags_b_direction = bits, U08, 446, [3:3], "Normal (higher duty = higher PV)", "Inverted (lower duty = higher PV)"
      generic_pid_flags_b_output_type = bits,U08, 446, [4:4], "PWM", "Stepper"
      generic_pid_flags_b_lookup_type = bits, U08, 446, [5:5], "Table", "Curve"

      generic_pid_pwm_opts_freq_a    = bits, U08, 447, [1:4], "INVALID", "Variable Freq", "250Hz", "225Hz", "200Hz", "175Hz", "150Hz", "125Hz", "100Hz", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
      generic_pid_pwm_opts_load_a    = bits, U08, 447, [5:7], "RPM", "MAP", "% baro", "TPS", "MAFload", "CLT", "BattV", "MAT" ; ITB hidden
      generic_pid_pwm_opts_freq_b    = bits, U08, 448, [1:4], "INVALID", "Variable Freq", "250Hz", "225Hz", "200Hz", "175Hz", "150Hz", "125Hz", "100Hz", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
      generic_pid_pwm_opts_load_b    = bits, U08, 448, [5:7], "RPM", "MAP", "% baro", "TPS", "MAFload", "CLT", "BattV", "MAT"

    generic_pid_pwm_outs_a        = bits, U08, 449, [0:6], $PIN_DIGOUT_CANPWM
    generic_pid_pwm_outs_b        = bits, U08, 450, [0:6], $PIN_DIGOUT_CANPWM
      generic_pid_load_offset_a = scalar, U16, 451, "", 1, 0, 0, 65535, 0
      generic_pid_load_offset_b = scalar, U16, 453, "", 1, 0, 0, 65535, 0
      generic_pid_load_size_a =   scalar, U08, 455, "", 1, 0, 0, 255,   0
      generic_pid_load_size_b =   scalar, U08, 456, "", 1, 0, 0, 255,   0

; These are positioned here so that TS reads them in the correct order and the autoscaling on the next block function
      generic_pid_PV_offset_a = scalar, U16, 469, "", 1, 0, 0, 65535, 0
      generic_pid_PV_offset_b = scalar, U16, 471, "", 1, 0, 0, 65535, 0
      generic_pid_PV_size_a =   scalar, U08, 473, "", 1, 0, 0, 255,   0
      generic_pid_PV_size_b =   scalar, U08, 474, "", 1, 0, 0, 255,   0

      generic_pid_upper_inputlim_a = scalar, S16, 457, "",  { getChannelScaleByOffset(generic_pid_PV_offset_a) } , { getChannelTranslateByOffset(generic_pid_PV_offset_a) }, { getChannelMinByOffset(generic_pid_PV_offset_a) }, { getChannelMaxByOffset(generic_pid_PV_offset_a) }, { getChannelDigitsByOffset(generic_pid_PV_offset_a) } 
      generic_pid_upper_inputlim_b = scalar, S16, 459, "", { getChannelScaleByOffset(generic_pid_PV_offset_b) } , { getChannelTranslateByOffset(generic_pid_PV_offset_b) }, { getChannelMinByOffset(generic_pid_PV_offset_b) }, { getChannelMaxByOffset(generic_pid_PV_offset_b) }, { getChannelDigitsByOffset(generic_pid_PV_offset_b) } 
      generic_pid_lower_inputlim_a = scalar, S16, 461, "", { getChannelScaleByOffset(generic_pid_PV_offset_a) } , { getChannelTranslateByOffset(generic_pid_PV_offset_a) }, { getChannelMinByOffset(generic_pid_PV_offset_a) }, { getChannelMaxByOffset(generic_pid_PV_offset_a) }, { getChannelDigitsByOffset(generic_pid_PV_offset_a) } 
      generic_pid_lower_inputlim_b = scalar, S16, 463, "", { getChannelScaleByOffset(generic_pid_PV_offset_b) } , { getChannelTranslateByOffset(generic_pid_PV_offset_b) }, { getChannelMinByOffset(generic_pid_PV_offset_b) }, { getChannelMaxByOffset(generic_pid_PV_offset_b) }, { getChannelDigitsByOffset(generic_pid_PV_offset_b) } 
      generic_pid_output_upperlim_a = scalar, U08, 465, "%", 0.392, 0.00000, 0, 100, 1
      generic_pid_output_upperlim_b = scalar, U08, 466, "%", 0.392, 0.00000, 0, 100, 1
      generic_pid_output_lowerlim_a = scalar, U08, 467, "%", 0.392, 0.00000, 0, 100, 1
      generic_pid_output_lowerlim_b = scalar, U08, 468, "%", 0.392, 0.00000, 0, 100, 1
    ;
    ; not a gap!
    ;
      generic_pid_rpms_a     = array,  S16, 475,  [8], "rpm", 1, 0, 0, 20000, 0 
      generic_pid_loadvals_a = array,  S16, 491, [8], "%", { getChannelScaleByOffset(generic_pid_load_offset_a) } , { getChannelTranslateByOffset(generic_pid_load_offset_a) }, { getChannelMinByOffset(generic_pid_load_offset_a) }, { getChannelMaxByOffset(generic_pid_load_offset_a) }, { getChannelDigitsByOffset(generic_pid_load_offset_a) }
      generic_pid_rpms_b     = array,  S16, 507, [8], "rpm", 1, 0, 0, 20000, 0 
      generic_pid_loadvals_b = array,  S16, 523, [8], "%", { getChannelScaleByOffset(generic_pid_load_offset_b) } , { getChannelTranslateByOffset(generic_pid_load_offset_b) }, { getChannelMinByOffset(generic_pid_load_offset_b) }, { getChannelMaxByOffset(generic_pid_load_offset_b) }, { getChannelDigitsByOffset(generic_pid_load_offset_b) }

      generic_pid_targets_a = array, S16, 539, [8x8], "", { getChannelScaleByOffset(generic_pid_PV_offset_a) } , { getChannelTranslateByOffset(generic_pid_PV_offset_a) }, { getChannelMinByOffset(generic_pid_PV_offset_a) }, { getChannelMaxByOffset(generic_pid_PV_offset_a) }, { getChannelDigitsByOffset(generic_pid_PV_offset_a) } 
      generic_pid_targets_b = array, S16, 667, [8x8], "", { getChannelScaleByOffset(generic_pid_PV_offset_b) } , { getChannelTranslateByOffset(generic_pid_PV_offset_b) }, { getChannelMinByOffset(generic_pid_PV_offset_b) }, { getChannelMaxByOffset(generic_pid_PV_offset_b) }, { getChannelDigitsByOffset(generic_pid_PV_offset_b) } 

      generic_pid_control_interval_a = scalar, U08, 795, "ms", 1, 0, 10, 255, 0
      generic_pid_control_interval_b = scalar, U08, 796, "ms", 1, 0, 10, 255, 0

      generic_pid_P_a = scalar, U08, 797, "%", 1, 0, 0, 255, 0
      generic_pid_P_b = scalar, U08, 798, "%", 1, 0, 0, 255, 0
      generic_pid_I_a = scalar, U08, 799, "%", 1, 0, 0, 255, 0
      generic_pid_I_b = scalar, U08, 800, "%", 1, 0, 0, 255, 0
      generic_pid_D_a = scalar, U08, 801, "%", 1, 0, 0, 255, 0
      generic_pid_D_b = scalar, U08, 802, "%", 1, 0, 0, 255, 0
;gap
      tcslipx = array, U16, 804, [9], "Knob%", 0.0978, 0, 0, 100, 0
      tcslipy = array, U08, 822, [9], "Slip threshold %", 1, 0, 0, 100, 0
;gap
; 4 outmsg
     outmsg1_offset01 = scalar, U16,  832, "", 1, 0, 0, 512, 0
     outmsg1_offset02 = scalar, U16,  834, "", 1, 0, 0, 512, 0
     outmsg1_offset03 = scalar, U16,  836, "", 1, 0, 0, 512, 0
     outmsg1_offset04 = scalar, U16,  838, "", 1, 0, 0, 512, 0
     outmsg1_offset05 = scalar, U16,  840, "", 1, 0, 0, 512, 0
     outmsg1_offset06 = scalar, U16,  842, "", 1, 0, 0, 512, 0
     outmsg1_offset07 = scalar, U16,  844, "", 1, 0, 0, 512, 0
     outmsg1_offset08 = scalar, U16,  846, "", 1, 0, 0, 512, 0
     outmsg1_offset09 = scalar, U16,  848, "", 1, 0, 0, 512, 0
     outmsg1_offset10 = scalar, U16,  850, "", 1, 0, 0, 512, 0
     outmsg1_offset11 = scalar, U16,  852, "", 1, 0, 0, 512, 0
     outmsg1_offset12 = scalar, U16,  854, "", 1, 0, 0, 512, 0
     outmsg1_offset13 = scalar, U16,  856, "", 1, 0, 0, 512, 0
     outmsg1_offset14 = scalar, U16,  858, "", 1, 0, 0, 512, 0
     outmsg1_offset15 = scalar, U16,  860, "", 1, 0, 0, 512, 0
     outmsg1_offset16 = scalar, U16,  862, "", 1, 0, 0, 512, 0
     outmsg1_size01   = scalar, U08,  864, "", 1, 0, 0,   8, 0
     outmsg1_size02   = scalar, U08,  865, "", 1, 0, 0,   8, 0
     outmsg1_size03   = scalar, U08,  866, "", 1, 0, 0,   8, 0
     outmsg1_size04   = scalar, U08,  867, "", 1, 0, 0,   8, 0
     outmsg1_size05   = scalar, U08,  868, "", 1, 0, 0,   8, 0
     outmsg1_size06   = scalar, U08,  869, "", 1, 0, 0,   8, 0
     outmsg1_size07   = scalar, U08,  870, "", 1, 0, 0,   8, 0
     outmsg1_size08   = scalar, U08,  871, "", 1, 0, 0,   8, 0
     outmsg1_size09   = scalar, U08,  872, "", 1, 0, 0,   8, 0
     outmsg1_size10   = scalar, U08,  873, "", 1, 0, 0,   8, 0
     outmsg1_size11   = scalar, U08,  874, "", 1, 0, 0,   8, 0
     outmsg1_size12   = scalar, U08,  875, "", 1, 0, 0,   8, 0
     outmsg1_size13   = scalar, U08,  876, "", 1, 0, 0,   8, 0
     outmsg1_size14   = scalar, U08,  877, "", 1, 0, 0,   8, 0
     outmsg1_size15   = scalar, U08,  878, "", 1, 0, 0,   8, 0
     outmsg1_size16   = scalar, U08,  879, "", 1, 0, 0,   8, 0
     outmsg2_offset01 = scalar, U16,  880, "", 1, 0, 0, 512, 0
     outmsg2_offset02 = scalar, U16,  882, "", 1, 0, 0, 512, 0
     outmsg2_offset03 = scalar, U16,  884, "", 1, 0, 0, 512, 0
     outmsg2_offset04 = scalar, U16,  886, "", 1, 0, 0, 512, 0
     outmsg2_offset05 = scalar, U16,  888, "", 1, 0, 0, 512, 0
     outmsg2_offset06 = scalar, U16,  890, "", 1, 0, 0, 512, 0
     outmsg2_offset07 = scalar, U16,  892, "", 1, 0, 0, 512, 0
     outmsg2_offset08 = scalar, U16,  894, "", 1, 0, 0, 512, 0
     outmsg2_offset09 = scalar, U16,  896, "", 1, 0, 0, 512, 0
     outmsg2_offset10 = scalar, U16,  898, "", 1, 0, 0, 512, 0
     outmsg2_offset11 = scalar, U16,  900, "", 1, 0, 0, 512, 0
     outmsg2_offset12 = scalar, U16,  902, "", 1, 0, 0, 512, 0
     outmsg2_offset13 = scalar, U16,  904, "", 1, 0, 0, 512, 0
     outmsg2_offset14 = scalar, U16,  906, "", 1, 0, 0, 512, 0
     outmsg2_offset15 = scalar, U16,  908, "", 1, 0, 0, 512, 0
     outmsg2_offset16 = scalar, U16,  910, "", 1, 0, 0, 512, 0
     outmsg2_size01   = scalar, U08,  912, "", 1, 0, 0,   8, 0
     outmsg2_size02   = scalar, U08,  913, "", 1, 0, 0,   8, 0
     outmsg2_size03   = scalar, U08,  914, "", 1, 0, 0,   8, 0
     outmsg2_size04   = scalar, U08,  915, "", 1, 0, 0,   8, 0
     outmsg2_size05   = scalar, U08,  916, "", 1, 0, 0,   8, 0
     outmsg2_size06   = scalar, U08,  917, "", 1, 0, 0,   8, 0
     outmsg2_size07   = scalar, U08,  918, "", 1, 0, 0,   8, 0
     outmsg2_size08   = scalar, U08,  919, "", 1, 0, 0,   8, 0
     outmsg2_size09   = scalar, U08,  920, "", 1, 0, 0,   8, 0
     outmsg2_size10   = scalar, U08,  921, "", 1, 0, 0,   8, 0
     outmsg2_size11   = scalar, U08,  922, "", 1, 0, 0,   8, 0
     outmsg2_size12   = scalar, U08,  923, "", 1, 0, 0,   8, 0
     outmsg2_size13   = scalar, U08,  924, "", 1, 0, 0,   8, 0
     outmsg2_size14   = scalar, U08,  925, "", 1, 0, 0,   8, 0
     outmsg2_size15   = scalar, U08,  926, "", 1, 0, 0,   8, 0
     outmsg2_size16   = scalar, U08,  927, "", 1, 0, 0,   8, 0
     outmsg3_offset01 = scalar, U16,  928, "", 1, 0, 0, 512, 0
     outmsg3_offset02 = scalar, U16,  930, "", 1, 0, 0, 512, 0
     outmsg3_offset03 = scalar, U16,  932, "", 1, 0, 0, 512, 0
     outmsg3_offset04 = scalar, U16,  934, "", 1, 0, 0, 512, 0
     outmsg3_offset05 = scalar, U16,  936, "", 1, 0, 0, 512, 0
     outmsg3_offset06 = scalar, U16,  938, "", 1, 0, 0, 512, 0
     outmsg3_offset07 = scalar, U16,  940, "", 1, 0, 0, 512, 0
     outmsg3_offset08 = scalar, U16,  942, "", 1, 0, 0, 512, 0
     outmsg3_offset09 = scalar, U16,  944, "", 1, 0, 0, 512, 0
     outmsg3_offset10 = scalar, U16,  946, "", 1, 0, 0, 512, 0
     outmsg3_offset11 = scalar, U16,  948, "", 1, 0, 0, 512, 0
     outmsg3_offset12 = scalar, U16,  950, "", 1, 0, 0, 512, 0
     outmsg3_offset13 = scalar, U16,  952, "", 1, 0, 0, 512, 0
     outmsg3_offset14 = scalar, U16,  954, "", 1, 0, 0, 512, 0
     outmsg3_offset15 = scalar, U16,  956, "", 1, 0, 0, 512, 0
     outmsg3_offset16 = scalar, U16,  958, "", 1, 0, 0, 512, 0
     outmsg3_size01   = scalar, U08,  960, "", 1, 0, 0,   8, 0
     outmsg3_size02   = scalar, U08,  961, "", 1, 0, 0,   8, 0
     outmsg3_size03   = scalar, U08,  962, "", 1, 0, 0,   8, 0
     outmsg3_size04   = scalar, U08,  963, "", 1, 0, 0,   8, 0
     outmsg3_size05   = scalar, U08,  964, "", 1, 0, 0,   8, 0
     outmsg3_size06   = scalar, U08,  965, "", 1, 0, 0,   8, 0
     outmsg3_size07   = scalar, U08,  966, "", 1, 0, 0,   8, 0
     outmsg3_size08   = scalar, U08,  967, "", 1, 0, 0,   8, 0
     outmsg3_size09   = scalar, U08,  968, "", 1, 0, 0,   8, 0
     outmsg3_size10   = scalar, U08,  969, "", 1, 0, 0,   8, 0
     outmsg3_size11   = scalar, U08,  970, "", 1, 0, 0,   8, 0
     outmsg3_size12   = scalar, U08,  971, "", 1, 0, 0,   8, 0
     outmsg3_size13   = scalar, U08,  972, "", 1, 0, 0,   8, 0
     outmsg3_size14   = scalar, U08,  973, "", 1, 0, 0,   8, 0
     outmsg3_size15   = scalar, U08,  974, "", 1, 0, 0,   8, 0
     outmsg3_size16   = scalar, U08,  975, "", 1, 0, 0,   8, 0
     outmsg4_offset01 = scalar, U16,  976, "", 1, 0, 0, 512, 0
     outmsg4_offset02 = scalar, U16,  978, "", 1, 0, 0, 512, 0
     outmsg4_offset03 = scalar, U16,  980, "", 1, 0, 0, 512, 0
     outmsg4_offset04 = scalar, U16,  982, "", 1, 0, 0, 512, 0
     outmsg4_offset05 = scalar, U16,  984, "", 1, 0, 0, 512, 0
     outmsg4_offset06 = scalar, U16,  986, "", 1, 0, 0, 512, 0
     outmsg4_offset07 = scalar, U16,  988, "", 1, 0, 0, 512, 0
     outmsg4_offset08 = scalar, U16,  990, "", 1, 0, 0, 512, 0
     outmsg4_offset09 = scalar, U16,  992, "", 1, 0, 0, 512, 0
     outmsg4_offset10 = scalar, U16,  994, "", 1, 0, 0, 512, 0
     outmsg4_offset11 = scalar, U16,  996, "", 1, 0, 0, 512, 0
     outmsg4_offset12 = scalar, U16,  998, "", 1, 0, 0, 512, 0
     outmsg4_offset13 = scalar, U16, 1000, "", 1, 0, 0, 512, 0
     outmsg4_offset14 = scalar, U16, 1002, "", 1, 0, 0, 512, 0
     outmsg4_offset15 = scalar, U16, 1004, "", 1, 0, 0, 512, 0
     outmsg4_offset16 = scalar, U16, 1006, "", 1, 0, 0, 512, 0
     outmsg4_size01   = scalar, U08, 1008, "", 1, 0, 0,   8, 0
     outmsg4_size02   = scalar, U08, 1009, "", 1, 0, 0,   8, 0
     outmsg4_size03   = scalar, U08, 1010, "", 1, 0, 0,   8, 0
     outmsg4_size04   = scalar, U08, 1011, "", 1, 0, 0,   8, 0
     outmsg4_size05   = scalar, U08, 1012, "", 1, 0, 0,   8, 0
     outmsg4_size06   = scalar, U08, 1013, "", 1, 0, 0,   8, 0
     outmsg4_size07   = scalar, U08, 1014, "", 1, 0, 0,   8, 0
     outmsg4_size08   = scalar, U08, 1015, "", 1, 0, 0,   8, 0
     outmsg4_size09   = scalar, U08, 1016, "", 1, 0, 0,   8, 0
     outmsg4_size10   = scalar, U08, 1017, "", 1, 0, 0,   8, 0
     outmsg4_size11   = scalar, U08, 1018, "", 1, 0, 0,   8, 0
     outmsg4_size12   = scalar, U08, 1019, "", 1, 0, 0,   8, 0
     outmsg4_size13   = scalar, U08, 1020, "", 1, 0, 0,   8, 0
     outmsg4_size14   = scalar, U08, 1021, "", 1, 0, 0,   8, 0
     outmsg4_size15   = scalar, U08, 1022, "", 1, 0, 0,   8, 0
     outmsg4_size16   = scalar, U08, 1023, "", 1, 0, 0,   8, 0

page = 18 ; 28
    etc_opt_on              = bits,  U08,     0, [0:1], "Off", "Idle control", "INVALID", "DBW"
    etc_opt_follow          = bits,  U08,     0, [4:4], "Off", "On"
;spare bits
;gap
    etc_canbase             = scalar,U16,     2,  "", 1, 0, 0, 2047, 0
    etc_app_min             = scalar,U16,     4,  "", 1, 0, 0, 65535, 0
    etc_app_max             = scalar,U16,     6,  "", 1, 0, 0, 65535, 0
    etc_tp_min              = scalar,U16,     8,  "", 1, 0, 0, 65535, 0
    etc_tp_max              = scalar,U16,     10,  "", 1, 0, 0, 65535, 0
    etc_tp_act_min          = scalar,U16,     12,  "", 1, 0, 0, 65535, 0
    etc_tp_act_max          = scalar,U16,     14,  "", 1, 0, 0, 65535, 0
;gap
    etc_testpos             = scalar,U16,     18, "%", 0.01, 0, 0, 100.0, 2
    etc_pedal_pos           = array, S16,     20,  [10], "%", 0.01, 0, 0, 100.0, 2
    etc_rpms                = array, S16,     40,  [10], "", 1, 0, 0, 20000, 0
    etc_targ_pos            = array, U16,     60,  [10x10], "%", 0.01, 0, 0, 100.0, 2
    etc_idlescale           = scalar,U16,     260, "%", 0.01, 0, 0, 100, 2
    dwell_table_values      = array,  U08,    262,    [8x8], "%",      0.10000,   0.00000,  0.5,   25.5,      1
    dwell_table_rpms        = array,  U16,    326,  [   8], "RPM",      1.00000,   0.00000,  0.00,20000,      0
    dwell_table_loads       = array,  S16,    342,  [   8], { bitStringValue( algorithmUnits ,  IgnAlgorithm  ) },      0.10000,   0.00000,  0.00,  500,      1

    launch_var_maps        = array,  U16,    358,  [   6], "kPa",      0.1,   0.0,  0.0,700.0,      1
    launch_var_rpms        = array,  U16,    370,  [   6], "RPM",      1.0,   0,  0, 20000,      0

;8bytes gap here
#define CAN_RCV_VARS = "Off", "CAN VSS1", "CAN VSS2", "CAN VSS3", "CAN VSS4", "CANIN 1-8", "gear", "status5", "CAN ADC01", "CAN ADC02", "CAN ADC03", "CAN ADC04", "CAN ADC05", "CAN ADC06", "CAN ADC07", "CAN ADC08", "CAN ADC09", "CAN ADC10", "CAN ADC11", "CAN ADC12", "CAN ADC13", "CAN ADC14", "CAN ADC15", "CAN ADC16", "CAN ADC17", "CAN ADC18", "CAN ADC19", "CAN ADC20", "CAN ADC21", "CAN ADC22", "CAN ADC23", "CAN ADC24", "CAN EGO01", "CAN EGO02", "CAN EGO03", "CAN EGO04", "CAN EGO05", "CAN EGO06", "CAN EGO07", "CAN EGO08", "CAN EGO09", "CAN EGO10", "CAN EGO11", "CAN EGO12", "INVALID", "INVALID", "INVALID", "INVALID", "CAN PWMin 1", "CAN PWMin 2", "CAN PWMin 3", "CAN PWMin 4", "FuelAdj", "SpkAdj", "IdleAdj", "INVALID", "gps_latdeg", "gps_latmin", "gps_latmmin", "gps_londeg", "gps_lonmin", "gps_lonmmin", "gps_outstatus", "gps_altk", "gps_altm", "gps_speedkm", "gps_course", "shutdowncode", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
    can_rcv_var1 = bits,    U08,    390, [0:6], $CAN_RCV_VARS
    can_rcv_var2 = bits,    U08,    391, [0:6], $CAN_RCV_VARS
    can_rcv_var3 = bits,    U08,    392, [0:6], $CAN_RCV_VARS
    can_rcv_var4 = bits,    U08,    393, [0:6], $CAN_RCV_VARS
    can_rcv_var5 = bits,    U08,    394, [0:6], $CAN_RCV_VARS
    can_rcv_var6 = bits,    U08,    395, [0:6], $CAN_RCV_VARS
    can_rcv_var7 = bits,    U08,    396, [0:6], $CAN_RCV_VARS
    can_rcv_var8 = bits,    U08,    397, [0:6], $CAN_RCV_VARS
    can_rcv_var9 = bits,    U08,    398, [0:6], $CAN_RCV_VARS
    can_rcv_var10 = bits,    U08,    399, [0:6], $CAN_RCV_VARS
    can_rcv_var11 = bits,    U08,    400, [0:6], $CAN_RCV_VARS
    can_rcv_var12 = bits,    U08,    401, [0:6], $CAN_RCV_VARS
    can_rcv_var13 = bits,    U08,    402, [0:6], $CAN_RCV_VARS
    can_rcv_var14 = bits,    U08,    403, [0:6], $CAN_RCV_VARS
    can_rcv_var15 = bits,    U08,    404, [0:6], $CAN_RCV_VARS
    can_rcv_var16 = bits,    U08,    405, [0:6], $CAN_RCV_VARS

    can_rcv_off1 = scalar, U08,    406, "",      1,   0.00000, 0,  7,      0 
    can_rcv_off2 = scalar, U08,    407, "",      1,   0.00000, 0,  7,      0 
    can_rcv_off3 = scalar, U08,    408, "",      1,   0.00000, 0,  7,      0 
    can_rcv_off4 = scalar, U08,    409, "",      1,   0.00000, 0,  7,      0 
    can_rcv_off5 = scalar, U08,    410, "",      1,   0.00000, 0,  7,      0 
    can_rcv_off6 = scalar, U08,    411, "",      1,   0.00000, 0,  7,      0 
    can_rcv_off7 = scalar, U08,    412, "",      1,   0.00000, 0,  7,      0 
    can_rcv_off8 = scalar, U08,    413, "",      1,   0.00000, 0,  7,      0 
    can_rcv_off9 = scalar, U08,    414, "",      1,   0.00000, 0,  7,      0 
    can_rcv_off10 = scalar, U08,    415, "",      1,   0.00000, 0,  7,      0 
    can_rcv_off11 = scalar, U08,    416, "",      1,   0.00000, 0,  7,      0 
    can_rcv_off12 = scalar, U08,    417, "",      1,   0.00000, 0,  7,      0 
    can_rcv_off13 = scalar, U08,    418, "",      1,   0.00000, 0,  7,      0 
    can_rcv_off14 = scalar, U08,    419, "",      1,   0.00000, 0,  7,      0 
    can_rcv_off15 = scalar, U08,    420, "",      1,   0.00000, 0,  7,      0 
    can_rcv_off16 = scalar, U08,    421, "",      1,   0.00000, 0,  7,      0 

#define CAN_RCV_SIZES = "1U", "1S", "B2U", "B2S", "B4U", "B4S", "L2U", "L2S", "L4U", "L4S","INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
    can_rcv_size1 = bits, U08,    422, [0:3],  $CAN_RCV_SIZES
    can_rcv_size2 = bits, U08,    423, [0:3],  $CAN_RCV_SIZES
    can_rcv_size3 = bits, U08,    424, [0:3],  $CAN_RCV_SIZES
    can_rcv_size4 = bits, U08,    425, [0:3],  $CAN_RCV_SIZES
    can_rcv_size5 = bits, U08,    426, [0:3],  $CAN_RCV_SIZES
    can_rcv_size6 = bits, U08,    427, [0:3],  $CAN_RCV_SIZES
    can_rcv_size7 = bits, U08,    428, [0:3],  $CAN_RCV_SIZES
    can_rcv_size8 = bits, U08,    429, [0:3],  $CAN_RCV_SIZES
    can_rcv_size9 = bits, U08,    430, [0:3],  $CAN_RCV_SIZES
    can_rcv_size10 = bits, U08,    431, [0:3],  $CAN_RCV_SIZES
    can_rcv_size11 = bits, U08,    432, [0:3],  $CAN_RCV_SIZES
    can_rcv_size12 = bits, U08,    433, [0:3],  $CAN_RCV_SIZES
    can_rcv_size13 = bits, U08,    434, [0:3],  $CAN_RCV_SIZES
    can_rcv_size14 = bits, U08,    435, [0:3],  $CAN_RCV_SIZES
    can_rcv_size15 = bits, U08,    436, [0:3],  $CAN_RCV_SIZES
    can_rcv_size16 = bits, U08,    437, [0:3],  $CAN_RCV_SIZES
    ; same locations repeated
    can_rcv_size_ext1 = bits, U08,    422, [7:7], "Std", "Ext"
    can_rcv_size_ext2 = bits, U08,    423, [7:7], "Std", "Ext"
    can_rcv_size_ext3 = bits, U08,    424, [7:7], "Std", "Ext"
    can_rcv_size_ext4 = bits, U08,    425, [7:7], "Std", "Ext"
    can_rcv_size_ext5 = bits, U08,    426, [7:7], "Std", "Ext"
    can_rcv_size_ext6 = bits, U08,    427, [7:7], "Std", "Ext"
    can_rcv_size_ext7 = bits, U08,    428, [7:7], "Std", "Ext"
    can_rcv_size_ext8 = bits, U08,    429, [7:7], "Std", "Ext"
    can_rcv_size_ext9 = bits, U08,    430, [7:7], "Std", "Ext"
    can_rcv_size_ext10 = bits, U08,    431, [7:7], "Std", "Ext"
    can_rcv_size_ext11 = bits, U08,    432, [7:7], "Std", "Ext"
    can_rcv_size_ext12 = bits, U08,    433, [7:7], "Std", "Ext"
    can_rcv_size_ext13 = bits, U08,    434, [7:7], "Std", "Ext"
    can_rcv_size_ext14 = bits, U08,    435, [7:7], "Std", "Ext"
    can_rcv_size_ext15 = bits, U08,    436, [7:7], "Std", "Ext"
    can_rcv_size_ext16 = bits, U08,    437, [7:7], "Std", "Ext"

    can_rcv_mult1 = scalar, S16,    438,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_mult2 = scalar, S16,    440,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_mult3 = scalar, S16,    442,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_mult4 = scalar, S16,    444,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_mult5 = scalar, S16,    446,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_mult6 = scalar, S16,    448,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_mult7 = scalar, S16,    450,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_mult8 = scalar, S16,    452,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_mult9 = scalar, S16,    454,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_mult10 = scalar, S16,    456,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_mult11 = scalar, S16,    458,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_mult12 = scalar, S16,    460,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_mult13 = scalar, S16,    462,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_mult14 = scalar, S16,    464,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_mult15 = scalar, S16,    466,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_mult16 = scalar, S16,    468,          "",      1,   0.00000, -32767,  32767,0

    can_rcv_div1 = scalar,  U16,    470,          "",      1,   0.00000, 1,  32767,0
    can_rcv_div2 = scalar,  U16,    472,          "",      1,   0.00000, 1,  32767,0
    can_rcv_div3 = scalar,  U16,    474,          "",      1,   0.00000, 1,  32767,0
    can_rcv_div4 = scalar,  U16,    476,          "",      1,   0.00000, 1,  32767,0
    can_rcv_div5 = scalar,  U16,    478,          "",      1,   0.00000, 1,  32767,0
    can_rcv_div6 = scalar,  U16,    480,          "",      1,   0.00000, 1,  32767,0
    can_rcv_div7 = scalar,  U16,    482,          "",      1,   0.00000, 1,  32767,0
    can_rcv_div8 = scalar,  U16,    484,          "",      1,   0.00000, 1,  32767,0
    can_rcv_div9 = scalar,  U16,    486,          "",      1,   0.00000, 1,  32767,0
    can_rcv_div10 = scalar, U16,    488,          "",      1,   0.00000, 1,  32767,0
    can_rcv_div11 = scalar,  U16,    490,          "",      1,   0.00000, 1,  32767,0
    can_rcv_div12 = scalar,  U16,    492,          "",      1,   0.00000, 1,  32767,0
    can_rcv_div13 = scalar,  U16,    494,          "",      1,   0.00000, 1,  32767,0
    can_rcv_div14 = scalar,  U16,    496,          "",      1,   0.00000, 1,  32767,0
    can_rcv_div15 = scalar,  U16,    498,          "",      1,   0.00000, 1,  32767,0
    can_rcv_div16 = scalar,  U16,    500,          "",      1,   0.00000, 1,  32767,0

    can_rcv_add1 = scalar,  S16,    502,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_add2 = scalar,  S16,    504,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_add3 = scalar,  S16,    506,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_add4 = scalar,  S16,    508,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_add5 = scalar,  S16,    510,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_add6 = scalar,  S16,    512,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_add7 = scalar,  S16,    514,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_add8 = scalar,  S16,    516,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_add9 = scalar,  S16,    518,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_add10 = scalar,  S16,    520,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_add11 = scalar,  S16,    522,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_add12 = scalar,  S16,    524,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_add13 = scalar,  S16,    526,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_add14 = scalar,  S16,    528,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_add15 = scalar,  S16,    530,          "",      1,   0.00000, -32767,  32767,0
    can_rcv_add16 = scalar,  S16,    532,          "",      1,   0.00000, -32767,  32767,0
      can_bcast_user_id = scalar, U16, 534, "", 1, 0, 1, 2047, 0
      can_bcast_user_d0 = scalar, U08, 536, "", 1, 0, 0, 255, 0
      can_bcast_user_d1 = scalar, U08, 537, "", 1, 0, 0, 255, 0
      can_bcast_user_d2 = scalar, U08, 538, "", 1, 0, 0, 255, 0
      can_bcast_user_d3 = scalar, U08, 539, "", 1, 0, 0, 255, 0
      can_bcast_user_d4 = scalar, U08, 540, "", 1, 0, 0, 255, 0
      can_bcast_user_d5 = scalar, U08, 541, "", 1, 0, 0, 255, 0
      can_bcast_user_d6 = scalar, U08, 542, "", 1, 0, 0, 255, 0
      can_bcast_user_d7 = scalar, U08, 543, "", 1, 0, 0, 255, 0

    iobox_opta1      = bits, U08,    544, [0:0], "Off", "On"
    iobox_opta1adv   = bits, U08,    544, [1:1], "Automatic", "Advanced"
    iobox_opta1canin = bits, U08,    544, [2:3], "CANIN1", "CANIN4", "CANIN7", "Off"
    iobox_opta1canout= bits, U08,    544, [4:5], "CANOUT1", "CANOUT9", "Off", "INVALID"
    iobox_opta1canadc= bits, U08,    544, [6:7], "CANADC1", "CANADC9", "CANADC17", "INVALID"
    iobox_opta2      = bits, U08,    545, [0:0], "Off", "On"
    iobox_opta2adv   = bits, U08,    545, [1:1], "Automatic", "Advanced"
    iobox_opta2canin = bits, U08,    545, [2:3], "CANIN1", "CANIN4", "CANIN7", "Off"
    iobox_opta2canout= bits, U08,    545, [4:5], "CANOUT1", "CANOUT9", "Off", "INVALID"
    iobox_opta2canadc= bits, U08,    545, [6:7], "CANADC1", "CANADC9", "CANADC17", "INVALID"
    iobox_opta3      = bits, U08,    546, [0:0], "Off", "On"
    iobox_opta3adv   = bits, U08,    546, [1:1], "Automatic", "Advanced"
    iobox_opta3canin = bits, U08,    546, [2:3], "CANIN1", "CANIN4", "CANIN7", "Off"
    iobox_opta3canout= bits, U08,    546, [4:5], "CANOUT1", "CANOUT9", "Off", "INVALID"
    iobox_opta3canadc= bits, U08,    546, [6:7], "CANADC1", "CANADC9", "CANADC17", "INVALID"
    iobox_opta4      = bits, U08,    547, [0:0], "Off", "INVALID"
    iobox_opta4adv   = bits, U08,    547, [1:1], "Automatic", "Advanced"
    iobox_opta4canin = bits, U08,    547, [2:3], "CANIN1", "CANIN4", "CANIN7", "Off"
    iobox_opta4canout= bits, U08,    547, [4:5], "CANOUT1", "CANOUT9", "Off", "INVALID"
    iobox_opta4canadc= bits, U08,    547, [6:7], "CANADC1", "CANADC9", "CANADC17", "INVALID"

    iobox_optb1tachrate= bits, U08,    548, [0:1], "50Hz", "100Hz", "INVALID", "INVALID"
    iobox_optb1inrate  = bits, U08,    548, [2:3], "10Hz", "20Hz", "50Hz", "100Hz"
    iobox_optb1outrate = bits, U08,    548, [4:5], "10Hz", "20Hz", "50Hz", "100Hz"
    iobox_optb1vss     = bits, U08,    548, [6:7], "Off", "Speed in 1,2", "Speed in 3,4", "Speed in 1,2,3,4"

    iobox_optb2tachrate= bits, U08,    549, [0:1], "50Hz", "100Hz", "INVALID", "INVALID"
    iobox_optb2inrate  = bits, U08,    549, [2:3], "10Hz", "20Hz", "50Hz", "100Hz"
    iobox_optb2outrate = bits, U08,    549, [4:5], "10Hz", "20Hz", "50Hz", "100Hz"
    iobox_optb2vss     = bits, U08,    549, [6:7], "Off", "Speed in 1,2", "Speed in 3,4", "Speed in 1,2,3,4"

    iobox_optb3tachrate= bits, U08,    550, [0:1], "50Hz", "100Hz", "INVALID", "INVALID"
    iobox_optb3inrate  = bits, U08,    550, [2:3], "10Hz", "20Hz", "50Hz", "100Hz"
    iobox_optb3outrate = bits, U08,    550, [4:5], "10Hz", "20Hz", "50Hz", "100Hz"
    iobox_optb3vss     = bits, U08,    550, [6:7], "Off", "INVALID", "INVALID", "INVALID"

    iobox_optb4tachrate= bits, U08,    551, [0:1], "50Hz", "100Hz", "INVALID", "INVALID"
    iobox_optb4inrate  = bits, U08,    551, [2:3], "10Hz", "20Hz", "50Hz", "100Hz"
    iobox_optb4outrate = bits, U08,    551, [4:5], "10Hz", "20Hz", "50Hz", "100Hz"
    iobox_optb4vss     = bits, U08,    551, [6:7], "Off", "INVALID", "INVALID", "INVALID"

    iobox_id1       = scalar,   U16,    552,         "",      1,   0.00000, 0,  2047,      0 
    iobox_id2       = scalar,   U16,    554,         "",      1,   0.00000, 0,  2047,      0 
    iobox_id3       = scalar,   U16,    556,         "",      1,   0.00000, 0,  2047,      0 
    iobox_id4       = scalar,   U16,    558,         "",      1,   0.00000, 0,  2047,      0 
    pitlim_opt_on   = bits, U08,    560, [0:0], "Off", "On"
    pitlim_opt_mode = bits, U08,    560, [1:1], "Fixed", "Holding"
    pitlim_opt_retard=bits, U08,    560, [2:2], "Off", "On"
    pitlim_opt_spkcut=bits, U08,    560, [3:3], "Off", "On"
    pitlim_opt_fuelcut=bits,U08,    560, [4:4], "Off", "On"
    pitlim_opt_fuelprog=bits,U08,   560, [5:5], "Off", "On"
    pitlim_opt_vssrpm= bits,U08,    560, [6:6], "VSS", "RPM"
      pitlim_enin       = bits, U08, 561, [0:5], $PIN_DIGIN_OFF
    pitlim_speed    = scalar,   U16,    562, { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) },      { msToPrefUnitsScale },   0.00000,  0.00, { maxspeed },      0
    pitlim_retardmax= scalar,   S16,    564, "deg", 0.1, 0.00000, 0, 30, 1
    pitlim_sensitivity=scalar,  U16,    566, "", 0.1, 0.00000, 0, 20, 0
    pitlim_speed_range=scalar,  U16,    568, { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) },      { msToPrefUnitsScale },   0.00000,  0.00, { maxspeed },      1
    pitlim_rpm_range=scalar,    U16,    570, "RPM",      1.00000,   0.00000,  200, 1000,      0
;accel wizard mini tables  
      taeBins         = array ,  U08,    572,    [    4], "%",       1,   0.00000,  0.00,   255,      0 ; * (  4 bytes)
      maeBins         = array ,  U08,    576,    [    4], "%",       1,   0.00000,  0.00,   255,      0 ; * (  4 bytes)
      taeRates        = array ,  S16,    580,    [    4], "%/s",      0.10000,   0.00000,  0.00, 3276.00,      1 ; * (  8 bytes) tpsDot bins used for AE: x for TAE interpolation
      maeRates        = array ,  S16,    588,    [    4], "kPa/s",    1.00000,   0.00000,  0.00, 32767.0,      0 ; * (  8 bytes) mapDot bins used for AE: x for MAE
;accel wizard #2
      taeBins2         = array ,  U08,    596,    [    4], "%",       1,   0.00000,  0.00,   255,      0 ; * (  4 bytes)
      maeBins2         = array ,  U08,    600,    [    4], "%",       1,   0.00000,  0.00,   255,      0 ; * (  4 bytes)
      taeRates2        = array ,  S16,    604,    [    4], "%/s",      0.10000,   0.00000,  0.00, 3276.00,      1 ; * (  8 bytes) tpsDot bins used for AE: x for TAE interpolation
      maeRates2        = array ,  S16,    612,    [    4], "kPa/s",    1.00000,   0.00000,  0.00, 32767.0,      0 ; * (  8 bytes) mapDot bins used for AE: x for MAE
    accel_mapdots = array, S16, 620, [8], "kpa/sec", 1, 0, -5000, 5000, 0
    accel_tpsdots = array, S16, 636, [8], "%/sec", 0.1, 0, -3000, 3000, 1
    accel_mapdot_amts = array, S16,  652, [8], "%", 0.1, 0, -500, 500, 1
    accel_tpsdot_amts = array, S16, 668, [8], "%",  0.1, 0, -500, 500, 1
    accel_mapdots2 = array, S16, 684, [8], "kpa/sec", 1, 0, -5000, 5000, 0
    accel_tpsdots2 = array, S16, 700, [8], "%/sec", 0.1, 0, -3000, 3000, 1
    accel_mapdot_amts2 = array, S16,  716, [8], "%", 0.1, 0, -500, 500, 1
    accel_tpsdot_amts2 = array, S16, 732, [8], "%",  0.1, 0, -500, 500, 1
    dashbcast_id1       = scalar,   U16,    748,         "",      1,   0.00000, 0,  2047,      0
    dashbcast_opta1      = bits, U08,    750, [0:0], "Off", "On"
    dashbcast_opta1adv   = bits, U08,    750, [1:1], "Automatic", "Advanced"
    dashbcast_opta4outrate=bits, U08,    750, [4:5], "10Hz", "20Hz", "50Hz", "100Hz"
    canrx1_opt_accel  = bits,     U08,    751, [0:1], "Off", "Race Technology 11bit", "Kia IMU", "INVALID"
    canrx1_rt_gps_base   = scalar,   U16,    752,         "",      1,   0.00000, 0,  2047,      0
    canrx1_rt_accel_base = scalar,   U16,    754,         "",      1,   0.00000, 0,  2047,      0

    can_rcv_id1 = scalar,   U32,    756,         "",      1,   0.00000, 0,  536870912,      0 
    can_rcv_id2 = scalar,   U32,    760,         "",      1,   0.00000, 0,  536870912,      0 
    can_rcv_id3 = scalar,   U32,    764,         "",      1,   0.00000, 0,  536870912,      0 
    can_rcv_id4 = scalar,   U32,    768,         "",      1,   0.00000, 0,  536870912,      0 
    can_rcv_id5 = scalar,   U32,    772,         "",      1,   0.00000, 0,  536870912,      0 
    can_rcv_id6 = scalar,   U32,    776,         "",      1,   0.00000, 0,  536870912,      0 
    can_rcv_id7 = scalar,   U32,    780,         "",      1,   0.00000, 0,  536870912,      0 
    can_rcv_id8 = scalar,   U32,    784,         "",      1,   0.00000, 0,  536870912,      0 
    can_rcv_id9 = scalar,   U32,    788,         "",      1,   0.00000, 0,  536870912,      0 
    can_rcv_id10= scalar,   U32,    792,         "",      1,   0.00000, 0,  536870912,      0 
    can_rcv_id11= scalar,   U32,    796,         "",      1,   0.00000, 0,  536870912,      0 
    can_rcv_id12= scalar,   U32,    800,         "",      1,   0.00000, 0,  536870912,      0 
    can_rcv_id13= scalar,   U32,    804,         "",      1,   0.00000, 0,  536870912,      0 
    can_rcv_id14= scalar,   U32,    808,         "",      1,   0.00000, 0,  536870912,      0 
    can_rcv_id15= scalar,   U32,    812,         "",      1,   0.00000, 0,  536870912,      0 
    can_rcv_id16= scalar,   U32,    816,         "",      1,   0.00000, 0,  536870912,      0 

;next is 820
      ego_auth_table2    = array,  U08,    820,    [12x12], "%",      0.10000,   0.00000,  0,   25.5,      1
    can_accelx_offset = scalar, S16, 964, "ms-2", 0.001, 0, -20, 20, 3
    can_accely_offset = scalar, S16, 966, "ms-2", 0.001, 0, -20, 20, 3
    can_accelz_offset = scalar, S16, 968, { bitStringValue( accel_vs_yaw_units ,  accel_vs_yaw ) }, 0.001, 0, -20, 20, 3

   page = 19 ; 29

; dome settings
      boost_dome_targets1 =       array,  U16, 0,   [ 8x8 ], "kPa",   0.1, 0, 0, 700,      0
      boost_dome_targets2 =       array,  U16, 128, [ 8x8 ], "kPa",   0.1, 0, 0, 700,      0
      boost_dome_target_rpms1 =   array,  U16, 256, [ 8 ],   "RPM",   1,   0, 0, 20000, 0
      boost_dome_target_rpms2 =   array,  U16, 272, [ 8 ],   "RPM",   1,   0, 0, 20000, 0
      boost_dome_target_kpas1 =   array,  U16, 288, [ 8 ],   "kPa", 0.1, 0, 0, 700,  0
      boost_dome_target_kpas2 =   array,  U16, 304, [ 8 ],   "kPa", 0.1, 0, 0, 700,  0
      boost_dome_Kp1 =           scalar,  S16, 320,          "%",     0.1, 0, 0, 200,       1
      boost_dome_Kp2 =           scalar,  S16, 322,          "%",     0.1, 0, 0, 200,       1
      boost_dome_Ki1 =           scalar,  S16, 324,          "%",     0.1, 0, 0, 200,       1
      boost_dome_Ki2 =           scalar,  S16, 326,          "%",     0.1, 0, 0, 200,       1
      boost_dome_Kd1 =           scalar,  S16, 328,          "%",     0.1, 0, 0, 200,       1
      boost_dome_Kd2 =           scalar,  S16, 330,          "%",     0.1, 0, 0, 200,       1
    boost_dome_outputs_fill1 = bits,    U08, 332, [0:6], $PIN_DIGOUT
    boost_dome_outputs_fill2 = bits,    U08, 333, [0:6], $PIN_DIGOUT
;      boost_dome_settings1_on = bits,    U08, 334, [0:0], "Off", "On"
      boost_dome_settings1_emptydome_offboost = bits, U08, 334, [1:1], "Do not empty", "Empty"
      boost_dome_settings1_advanced = bits, U08, 334, [2:2], "Basic mode", "Advanced mode"
      boost_dome_settings1_mode = bits, U08, 334, [4:4], "Simple", "PID"
      boost_dome_settings1_biasen = bits, U08, 334, [5:5], "Bias table", "Max dome target"
      boost_dome_settings1_range = bits, U08, 334, [6:6], "Range", "Min/max"
;      boost_dome_settings2_on = bits,    U08, 335, [0:0], "Off", "On"
;      boost_dome_settings2_emptydome_offboost = bits, U08, 335, [1:1], "Do not empty", "Empty"
;      boost_dome_settings2_advanced = bits, U08, 335, [2:2], "Basic mode", "Advanced mode"
;      boost_dome_settings2_mode = bits, U08, 335, [4:4], "Simple", "PID"
      boost_dome_empty_out_mins1 = scalar, S08, 336,         "%",      1, 0, 0, 100,      0
      boost_dome_empty_out_mins2 = scalar, S08, 337,         "%",      1, 0, 0, 100,      0
      boost_dome_empty_out_maxs1 = scalar, S08, 338,         "%",      1, 0, 0, 100,      0
      boost_dome_empty_out_maxs2 = scalar, S08, 339,         "%",      1, 0, 0, 100,      0
      boost_dome_hyst1 =       scalar,  U16, 340, "kPa",   0.1, 0, 0, 500,      1
      boost_dome_hyst2 =       scalar,  U16, 342, "kPa",   0.1, 0, 0, 500,      1
      boost_dome_testtarg =    scalar,  U16, 344, "kPa",   0.1, 0, 0, 500,      1
;progressive nitrous tables
      n2o1_time     = array, U16,    346,    [10], "s", 0.001, 0, 0, 15, 2
      n2o1_rpm      = array, U16,    366,    [10], "RPM", 1, 0, 0, 20000, 0
      n2o1_vss      = array, U16,    386,    [10], { bitStringValue( prefSpeedUnits, prefSpeedUnits ) }, { msToPrefUnitsScale },   0.00000, 0.00, { maxspeed }, 1     
      n2o1_duty     = array, U08,    406,    [10], "%", 1, 0, 0, 100, 1
      n2o1_pw       = array, S16,    416,    [10], "ms", 0.001, 0, -20, 20, 3
      n2o1_retard   = array, U16,    436,    [10], "deg", 0.1, 0, 0, 30, 1
      n2o2_time     = array, U16,    456,    [10], "s", 0.001, 0, 0, 15, 2
      n2o2_rpm      = array, U16,    476,    [10], "RPM", 1, 0, 0, 20000, 0
      n2o2_vss      = array, U16,    496,    [10], { bitStringValue( prefSpeedUnits, prefSpeedUnits ) }, { msToPrefUnitsScale },   0.00000, 0.00, { maxspeed }, 1
      n2o2_duty     = array, U08,    516,    [10], "%", 1, 0, 0, 100, 1
      n2o2_pw       = array, S16,    526,    [10], "ms", 0.001, 0, -20, 20, 3
      n2o2_retard   = array, U16,    546,    [10], "deg", 0.1, 0, 0, 30, 1
      alternator_pvolts    = array ,  U16,    566,    [    6], "V",        0.10000,   0.00000,6,   18,      1 ; * (  6 bytes)
      alternator_periodv   = array ,  U08,    578,    [    6], "ms",     0.128,   0.00000,0,   32,      1 ; * (  6 bytes)
#if CELSIUS
      alternator_temp   = array,  S16,     584,    [   6], "°C",              0.05555,   -320.000, -40.00, {clthighlim},     0
#else
      alternator_temp   = array,  S16,     584,    [   6], "°F",       0.10000,   0.000,-40.00, {clthighlim},      1
#endif
      alternator_targvolts  = array ,  U08,    596,    [    6], "V",   0.10000, 0.00000,6,   18,      1 ; * (  6 bytes)
      alternator_dvolts     = array ,  U16,    602,    [    6], "V",   0.10000, 0.00000,6,   18,      1 ; * (  6 bytes)
      alternator_dutyv      = array ,  U08,    614,    [    6], "",    1,   0.00000,0,  255,      1 ; * (  6 bytes)
; next is 620
      boost_dome_sensitivities1 = scalar, S16, 620,             "",    0.1,  0, 0, 500, 0
      boost_dome_sensitivities2 = scalar, S16, 622,             "",    0.1,  0, 0, 500, 0
      boost_dome_fill_out_mins1 = scalar, S08, 624,             "%",   1, 0, 0, 100, 0
      boost_dome_fill_out_mins2 = scalar, S08, 625,             "%",   1, 0, 0, 100, 0
      boost_dome_fill_out_maxs1 = scalar, S08, 626,             "%",   1, 0, 0, 100, 0
      boost_dome_fill_out_maxs2 = scalar, S08, 627,             "%",   1, 0, 0, 100, 0
      boost_ctl_dome_min =       scalar,  U16, 628, "kPa",   0.1, 0, 90, 700,      1
      boost_ctl_dome_max =       scalar,  U16, 630, "kPa",   0.1, 0, 90, 700,      1
      boost_dome_freqs1 =         bits,   U08, 632, [0:2],      "INVALID", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
      boost_dome_freqs2 =         bits,   U08, 633, [0:2],      "INVALID", "78Hz", "39Hz", "26Hz", "19.5Hz", "15.6Hz", "13Hz", "11.1Hz"
      boost_dome_inputs1 =        bits,   U08, 634, [0:3], "INVALID","Sensor 1", "Sensor 2","Sensor 3","Sensor 4","Sensor 5","Sensor 6","Sensor 7","Sensor 8","Sensor 9","Sensor 10","Sensor 11","Sensor 12","Sensor 13","Sensor 14","Sensor 15" ; note off by 1
      boost_dome_inputs2 =        bits,   U08, 635, [0:3], "INVALID","Sensor 1", "Sensor 2","Sensor 3","Sensor 4","Sensor 5","Sensor 6","Sensor 7","Sensor 8","Sensor 9","Sensor 10","Sensor 11","Sensor 12","Sensor 13","Sensor 14","Sensor 15" ; note off by 1
    boost_dome_outputs_empty1 = bits,   U08, 636, [0:6], $PIN_DIGOUT
    boost_dome_outputs_empty2 = bits,    U08, 637, [0:6], $PIN_DIGOUT
     vvt_onoff_rpms =   array, U16, 638, [   8], "rpm", 1, 0, 0, 20000, 0
     vvt_onoff_loads =  array, S16, 654, [   8], "%", 0.1, 0, 0, 500, 1
     boost_dome_testopt = bits, U08, 670, [0:1], "Off", "Channel 1", "INVALID", "INVALID"
     map_predict_on =     bits, U08, 671, [0:0], "Off", "On"
      n2o1_fuelpct     = array, U08,    672,    [10], "%", 1, 0, 0, 255, 1
      n2o2_fuelpct     = array, U08,    682,    [10], "%", 1, 0, 0, 255, 1
      boost_dome_bias_range1 = scalar,  U16, 692, "kPa",   0.1, 0, 0, 500,      1
    map_predict_lookup_table = array, S16, 696, [8x8], "%", 0.1, 0, 0, 500,      1
    map_predict_lookup_table2 = array, S16, 824, [8x8], "%", 0.1, 0, 0, 500,      1
    map_predict_tps = array, S16, 952, [8], "%", 0.1, 0, 0, 100, 0
    map_predict_rpm = array, S16, 968, [8], "rpm", 1, 0, 0, rpmhigh, 0
    map_predict_tps2 = array, S16, 984, [8], "%", 0.1, 0, 0, 100, 0
    map_predict_rpm2 = array, S16, 1000, [8], "rpm", 1, 0, 0, rpmhigh, 0
    map_predict_tpsdot = scalar, S16, 1016, "%/sec", 0.1, 0, 0, 2000, 0

   page = 20 ; 30
      ; Generic on/off outputs "Spare Port Settings" 2
      psEnabled_2       = array ,  U08,      0,    [   24], "",  1, 0,      0,     1, 0, noSizeMutation
      psCondition_2     = array ,  U08,     24,    [ 24x2], "",  1, 0,     32,   124, 0, noSizeMutation
      psConnector_2     = array ,  U08,     72,    [   24], "",  1, 0,     32,   124, 0, noSizeMutation
      psInitValue_2     = array ,  U08,     96,    [   24], "",  1, 0       0,     1, 0, noSizeMutation
      psPortValue_2     = array ,  U08,    120,    [   24], "",  1, 0,      0,     1, 0, noSizeMutation
      psOutSize_2       = array ,  U08,    144,    [ 24x2], "",  1, 0,      0,   255, 0, noSizeMutation
      psOutOffset_2     = array ,  U16,    192,    [ 24x2], "",  1, 0,      0,  1024, 0, noSizeMutation
      psThreshold_2     = array ,  S16,    288,    [ 24x2], "",  1, 0, -32768, 32767, 0, noSizeMutation
      psHysteresis_2    = array ,  S16,    384,    [ 24x2], "",  1, 0, -32768, 32767, 0, noSizeMutation

      logFieldOffset    = array ,  U16,    480,    [  100], "",      1.0000,   0.00000,  0.00,  65535,      0, noSizeMutation ; * ( 100 words)
      logFieldLength    = array ,  U08,    680,    [  100], "",      1.0000,   0.00000,  0.00,  255.00,     0, noSizeMutation ; * ( 100 bytes)

      vss_diff_vss1     = array ,  S16,    780,    [10], { bitStringValue( prefSpeedUnits, prefSpeedUnits ) }, { msToPrefUnitsScale },   0.00000, 0.00, { maxspeed }, 1
      vss_diff_vss2     = array ,  S16,    800,    [10], { bitStringValue( prefSpeedUnits, prefSpeedUnits ) }, { msToPrefUnitsScale },   0.00000, 0.00, { maxspeed }, 1
      vss_diff_table    = array ,  S16,    820,    [10x10], "deg", 0.1,   0.00000, 0.00, 40, 1
; pad1020 4

   page = 21 ; 31
      inj_deadtime_volts1     = array ,  S16,    0,    [    6], "V",   0.10000, 0.00000,6,   18,      1
      inj_deadtime_volts2     = array ,  S16,    12,    [    6], "V",   0.10000, 0.00000,6,   18,      1
      inj_deadtime_volts3     = array ,  S16,    24,    [    6], "V",   0.10000, 0.00000,6,   18,      1
      inj_deadtime_volts4     = array ,  S16,    36,    [    6], "V",   0.10000, 0.00000,6,   18,      1
      inj_deadtime_pressure1  = array ,  S16,    48,    [    6], { bitStringValue( prefFuelPressUnits ,  prefFuelPressUnits ) },   { kpadToPrefFuelPressUnitsScale }, 0.00000, 0,   700,      1
      inj_deadtime_pressure2  = array ,  S16,    60,    [    6], { bitStringValue( prefFuelPressUnits ,  prefFuelPressUnits ) },   { kpadToPrefFuelPressUnitsScale }, 0.00000, 0,   700,      1
      inj_deadtime_pressure3  = array ,  S16,    72,    [    6], { bitStringValue( prefFuelPressUnits ,  prefFuelPressUnits ) },   { kpadToPrefFuelPressUnitsScale }, 0.00000, 0,   700,      1
      inj_deadtime_pressure4  = array ,  S16,    84,    [    6], { bitStringValue( prefFuelPressUnits ,  prefFuelPressUnits ) },   { kpadToPrefFuelPressUnitsScale }, 0.00000, 0,   700,      1
      inj_deadtime_table1     = array ,  S16,    96,    [  6x6], "us",   1, 0.00000, 0,   3000,      0
      inj_deadtime_table2     = array ,  S16,    168,    [  6x6], "us",   1, 0.00000, 0,   3000,      0
      inj_deadtime_table3     = array ,  S16,    240,    [  6x6], "us",   1, 0.00000, 0,   3000,      0
      inj_deadtime_table4     = array ,  S16,    312,    [  6x6], "us",   1, 0.00000, 0,   3000,      0
; First row of above four tables re-defined for curves.
      inj_deadtime_curve1     = array ,  S16,    96,    [  6], "us",   1, 0.00000, 0,   3000,      0
      inj_deadtime_curve2     = array ,  S16,    168,    [  6], "us",   1, 0.00000, 0,   3000,      0
      inj_deadtime_curve3     = array ,  S16,    240,    [  6], "us",   1, 0.00000, 0,   3000,      0
      inj_deadtime_curve4     = array ,  S16,    312,    [  6], "us",   1, 0.00000, 0,   3000,      0
;384
      boost_timed_pct = array,  U08,    384, [ 12 ], "%", 1, 0, 0, 100, 0 
      boost_timed_time= array,  U16,    396, [ 12 ], "s", 0.001, 0, 0, 15, 1
      boostvss_duty   = array,  U08,    420, [ 12 ], "%", 1, 0, 0, 100, 0
      boostvss_target = array,  U16,    432, [ 12 ], "kPa", 0.1, 0, 0, 700, 1
      boostvss_speed  = array,  U16,    456, [ 12 ], { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale }, 0, 0, { maxspeed }, 0
      boostvss_time  = array,  U16,    456, [ 12 ], "s", 0.001, 0, 0, 65, 3 ; Same data space as _speed
; 480
      boost_ctl_cl_pwm_rpms = array, U16, 480, [8], "rpm", 1, 0, 0, 25000, 0
      boost_ctl_cl_pwm_targboosts = array, S16, 496, [8], "kPa", 0.10000, 0, 0, 600, 0
      boost_ctl_cl_pwm_targs1 = array, U08, 512, [8x8], "%", 1.000, 0.00000, 0.00, 100, 0 
      boost_ctl_cl_pwm_targs2 = array, U08, 576, [8x8], "%", 1.000, 0.00000, 0.00, 100, 0 
      boost_ctl_cl_pwm_targs3 = array, U08, 640, [8x8], "%", 1.000, 0.00000, 0.00, 100, 0 
      boost_ctl_cl_pwm_targs4 = array, U08, 704, [8x8], "%", 1.000, 0.00000, 0.00, 100, 0 
      boost_ctl_cl_pwm_targs5 = array, U08, 768, [8x8], "%", 1.000, 0.00000, 0.00, 100, 0 
      boost_ctl_cl_pwm_targs6 = array, U08, 832, [8x8], "%", 1.000, 0.00000, 0.00, 100, 0 


[ConstantsExtensions]
    requiresPowerCycle = nCylinders
    requiresPowerCycle = ICIgnCapture
    requiresPowerCycle = engineType
    requiresPowerCycle = divider
    requiresPowerCycle = spkout_hi_lo2
;    requiresPowerCycle = triggerOffset
    requiresPowerCycle = triggerTeeth
    requiresPowerCycle = No_Miss_Teeth
    requiresPowerCycle = IdleCtl
    requiresPowerCycle = IdleCtl_alg
    requiresPowerCycle = IACcurlim
    requiresPowerCycle = IAC_tinitial_step
    requiresPowerCycle = hardware_spk
    requiresPowerCycle = hardware_cam
    requiresPowerCycle = hardware_fuel
    requiresPowerCycle = baroCorr
    requiresPowerCycle = egoType
;    requiresPowerCycle = alternate
    requiresPowerCycle = twoStroke
    requiresPowerCycle = nInjectors
    requiresPowerCycle = OddFireang
    requiresPowerCycle = algorithm
    requiresPowerCycle = algorithm2
    requiresPowerCycle = IgnAlgorithm
    requiresPowerCycle = IgnAlgorithm2
    requiresPowerCycle = AfrAlgorithm
    requiresPowerCycle = opt142_rtc
    requiresPowerCycle = mycan_id
    requiresPowerCycle = flexFuel
    requiresPowerCycle = flexport
    requiresPowerCycle = dwellmode
    requiresPowerCycle = knk_option
    requiresPowerCycle = knkDirection
    requiresPowerCycle = knkpull
    requiresPowerCycle = knk_option_an
    requiresPowerCycle = knkport
    requiresPowerCycle = spk_conf2_gmtfi
    requiresPowerCycle = spk_conf2_oddodd
    requiresPowerCycle = spk_conf2_dli
    requiresPowerCycle = spk_config_campol
    requiresPowerCycle = spk_config_camcrank
    requiresPowerCycle = spk_config_trig2
    requiresPowerCycle = spk_config_trig2l
    requiresPowerCycle = spk_config_resetcam
    requiresPowerCycle = spk_mode0
    requiresPowerCycle = spk_mode3
    requiresPowerCycle = spk_mode3_hirespol
    requiresPowerCycle = rtbaroport
    requiresPowerCycle = map2port
    requiresPowerCycle = ego2port
    requiresPowerCycle = mapport
    requiresPowerCycle = mapport_t
    requiresPowerCycle = mapport_f
    requiresPowerCycle = knkport_an

	requiresPowerCycle = shiftlight_opt_pins

    requiresPowerCycle = feature4_0igntrig
    requiresPowerCycle = tsw_pin_f
    requiresPowerCycle = tsw_pin_s
    requiresPowerCycle = tsw_pin_rf
    requiresPowerCycle = tsw_pin_ob
    requiresPowerCycle = tsw_pin_afr
    requiresPowerCycle = tsw_pin_stoich
    requiresPowerCycle = f5_0_tsf
    requiresPowerCycle = f5_0_tsf_opt
    requiresPowerCycle = f5_0_tss
    requiresPowerCycle = f5_0_tss_opt

    requiresPowerCycle = tacho_opt3f
    requiresPowerCycle = tacho_optvar
    requiresPowerCycle = launch_opt_on
    requiresPowerCycle = launch_opt_pins
    requiresPowerCycle = launch_opt_vss
    requiresPowerCycle = N2Oopt_2
    requiresPowerCycle = N2Oopt_3
    requiresPowerCycle = N2Oopt_pins
    requiresPowerCycle = n2o_enable2_pin
    requiresPowerCycle = pwmidle_freq_scale
    requiresPowerCycle = boost_ctl_pins_pwm
    requiresPowerCycle = boost_ctl_pins
    requiresPowerCycle = boost_ctl_pwm_scale
    requiresPowerCycle = boost_ctl_pwm
    requiresPowerCycle = boost_ctl_settings_invert_new
    requiresPowerCycle = boost_ctl_settings_dome
    requiresPowerCycle = afrload
    requiresPowerCycle = eaeload
    requiresPowerCycle = log_style_led
    requiresPowerCycle = log_style2_but
    requiresPowerCycle = log_style_on2
    requiresPowerCycle = log_style3_adc
    requiresPowerCycle = sequential
    requiresPowerCycle = boost_feats_tsw
    requiresPowerCycle = launch_3step_in
    requiresPowerCycle = maxafr_opt1_led
    requiresPowerCycle = vss1_pos
    requiresPowerCycle = vss2_pos
    requiresPowerCycle = launch_var_on
    requiresPowerCycle = reluctorteeth1
    requiresPowerCycle = reluctorteeth2
    requiresPowerCycle = vss_opt1
    requiresPowerCycle = vss_opt2
    requiresPowerCycle = vss1_an
    requiresPowerCycle = vss2_an
    requiresPowerCycle = vss1_can_scale
    requiresPowerCycle = vss2_can_scale
    requiresPowerCycle = ss_opt1
    requiresPowerCycle = ss_opt2
    requiresPowerCycle = wheeldia1
    requiresPowerCycle = wheeldia2
    requiresPowerCycle = fdratio1
    requiresPowerCycle = vss1_can_id
    requiresPowerCycle = vss1_can_offset
    requiresPowerCycle = vss2_can_offset
    requiresPowerCycle = vss3_can_offset
    requiresPowerCycle = vss4_can_offset
    requiresPowerCycle = vss_opt0_1
    requiresPowerCycle = vss_opt0_2
    requiresPowerCycle = vss_opt0_3
    requiresPowerCycle = vss_opt0_4
    requiresPowerCycle = ss_opt1_spd 
    requiresPowerCycle = ss1_pwmseq
    requiresPowerCycle = ss2_pwmseq 
    requiresPowerCycle = gear_can_offset
    requiresPowerCycle = n2o1n_pins
    requiresPowerCycle = n2o1f_pins
    requiresPowerCycle = n2o2n_pins
    requiresPowerCycle = n2o2f_pins
    requiresPowerCycle = water_freq_on
    requiresPowerCycle = water_pins_pump
    requiresPowerCycle = water_pins_valve
    requiresPowerCycle = water_pins_in_shut
    requiresPowerCycle = egt_num
    requiresPowerCycle = accXport
    requiresPowerCycle = accYport
    requiresPowerCycle = accZport
    requiresPowerCycle = egt1port
    requiresPowerCycle = egt2port
    requiresPowerCycle = egt3port
    requiresPowerCycle = egt4port
    requiresPowerCycle = egt5port
    requiresPowerCycle = egt6port
    requiresPowerCycle = egt7port
    requiresPowerCycle = egt8port
    requiresPowerCycle = egt9port
    requiresPowerCycle = egt10port
    requiresPowerCycle = egt11port
    requiresPowerCycle = egt12port
;    requiresPowerCycle = egt13port
;    requiresPowerCycle = egt14port
;    requiresPowerCycle = egt15port
;    requiresPowerCycle = egt16port
    requiresPowerCycle = MAFOption
    requiresPowerCycle = MAFOption_t
    requiresPowerCycle = MAFOption_f
    requiresPowerCycle = vssout_opt
    requiresPowerCycle = vssout_optunits
    requiresPowerCycle = gear_method
    requiresPowerCycle = gear_port_an
    requiresPowerCycle = ac_idleup_io_in
    requiresPowerCycle = ac_idleup_settings
    requiresPowerCycle = ac_idleup_io_out
    requiresPowerCycle = fanctl_settings_on
    requiresPowerCycle = fanctl_settings_pin
    requiresPowerCycle = fanctl1_mode
    requiresPowerCycle = fanctl1_inv
    requiresPowerCycle = fanctl1_freq
    requiresPowerCycle = staged_extended_opts_use_v3
    requiresPowerCycle = staged_extended_opts_simult
    requiresPowerCycle = boost_ctl_settings_on2
    requiresPowerCycle = boost_ctl_settings_cl2
    requiresPowerCycle = boost_ctl_pins_pwm2
    requiresPowerCycle = boost_ctl_pins2
    requiresPowerCycle = boost_ctl_sensor2
    requiresPowerCycle = egoport1
    requiresPowerCycle = egoport2
    requiresPowerCycle = egoport3
    requiresPowerCycle = egoport4
    requiresPowerCycle = egoport5
    requiresPowerCycle = egoport6
    requiresPowerCycle = egoport7
    requiresPowerCycle = egoport8
    requiresPowerCycle = egoport9
    requiresPowerCycle = egoport10
    requiresPowerCycle = egoport11
    requiresPowerCycle = egoport12
;    requiresPowerCycle = egoport13
;    requiresPowerCycle = egoport14
;    requiresPowerCycle = egoport15
;    requiresPowerCycle = egoport16
    requiresPowerCycle = tc_opt_on
    requiresPowerCycle = tc_led_out
    requiresPowerCycle = tc_opt_method
    requiresPowerCycle = tc_enin
    requiresPowerCycle = fueltemp1
    requiresPowerCycle = sensor01_source
    requiresPowerCycle = sensor02_source
    requiresPowerCycle = sensor03_source
    requiresPowerCycle = sensor04_source
    requiresPowerCycle = sensor05_source
    requiresPowerCycle = sensor06_source
    requiresPowerCycle = sensor07_source
    requiresPowerCycle = sensor08_source
    requiresPowerCycle = sensor09_source
    requiresPowerCycle = sensor10_source
    requiresPowerCycle = sensor11_source
    requiresPowerCycle = sensor12_source
    requiresPowerCycle = sensor13_source
    requiresPowerCycle = sensor14_source
    requiresPowerCycle = sensor15_source
    requiresPowerCycle = sensor16_source
    requiresPowerCycle = shift_cut_on
    requiresPowerCycle = shift_cut_gear
    requiresPowerCycle = shift_cut_in
    requiresPowerCycle = shift_cut_out
    requiresPowerCycle = shift_cut_fuel
    requiresPowerCycle = pwm_opt_on_a
    requiresPowerCycle = pwm_opt_on_b
    requiresPowerCycle = pwm_opt_on_c
    requiresPowerCycle = pwm_opt_on_d
    requiresPowerCycle = pwm_opt_on_e
    requiresPowerCycle = pwm_opt_on_f
    requiresPowerCycle = pwm_opt2_a
    requiresPowerCycle = pwm_opt2_b
    requiresPowerCycle = pwm_opt2_c
    requiresPowerCycle = pwm_opt2_d
    requiresPowerCycle = pwm_opt2_e
    requiresPowerCycle = pwm_opt2_f
    requiresPowerCycle = dualfuel_sw_on
    requiresPowerCycle = dualfuel_pin
    requiresPowerCycle = dualfuel_opt_mode
    requiresPowerCycle = dualfuel_opt_out
    requiresPowerCycle = dualfuel_temp_sens
    requiresPowerCycle = dualfuel_press_sens

    requiresPowerCycle = dualfuel_sw_fuel
    requiresPowerCycle = dualfuel_sw_spk
    requiresPowerCycle = dualfuel_sw_afr
    requiresPowerCycle = dualfuel_sw_rf
    requiresPowerCycle = dualfuel_sw_stoich
    requiresPowerCycle = dualfuel_sw_wue
    requiresPowerCycle = dualfuel_sw_ase
    requiresPowerCycle = dualfuel_sw2_prime
    requiresPowerCycle = dualfuel_sw2_crank
    requiresPowerCycle = dualfuel_sw2_injp
    requiresPowerCycle = dualfuel_sw2_smpw
    requiresPowerCycle = dualfuel_sw2_ob
    requiresPowerCycle = dualfuel_sw2_boosw
    requiresPowerCycle = dualfuel_sw2_ae

    requiresPowerCycle = als_opt_pwmout
    requiresPowerCycle = als_in_pin
    requiresPowerCycle = als_out_pin
    requiresPowerCycle = als_pwm_opt_freq
    requiresPowerCycle = als_pwm_opt2
    requiresPowerCycle = vvt_opt1_on
    requiresPowerCycle = vvt_out1
    requiresPowerCycle = vvt_out2
    requiresPowerCycle = vvt_out3
    requiresPowerCycle = vvt_out4
    requiresPowerCycle = vvt_opt2_cam1pol
    requiresPowerCycle = vvt_opt2_cam2pol
    requiresPowerCycle = vvt_opt2_cam3pol
    requiresPowerCycle = vvt_opt2_cam4pol
    requiresPowerCycle = vvt_opt3_cam2
    requiresPowerCycle = vvt_opt3_cam3
    requiresPowerCycle = vvt_opt3_cam4
    requiresPowerCycle = tclu_brakepin
    requiresPowerCycle = tclu_enablepin
    requiresPowerCycle = tclu_outpin
    requiresPowerCycle = vvt_opt4_decode
    requiresPowerCycle = vvt_opt6_freq
    requiresPowerCycle = vvt_softout1
    requiresPowerCycle = vvt_softout2
    requiresPowerCycle = vvt_softout3
    requiresPowerCycle = vvt_softout4
    requiresPowerCycle = knk_pin_out
    requiresPowerCycle = ltt_opt_on
    requiresPowerCycle = ltt_but_in
    requiresPowerCycle = ltt_led_out
    requiresPowerCycle = timedout1_in
    requiresPowerCycle = timedout1_out
    requiresPowerCycle = tstop_out
    requiresPowerCycle = NoiseFilterOpts
    requiresPowerCycle = map_phase_thresh
    requiresPowerCycle = staged_extended_opts_use_v3
    requiresPowerCycle = staged_extended_opts_simult
    requiresPowerCycle = staged_extended_opts_pw1off
    requiresPowerCycle = staged_first_param
    requiresPowerCycle = staged_second_param
    requiresPowerCycle = staged_transition_on
    requiresPowerCycle = staged_pw1_0
    requiresPowerCycle = staged_out1
    requiresPowerCycle = fp_opt_mode
    requiresPowerCycle = fp_opt_inv
    requiresPowerCycle = fp_out1
    requiresPowerCycle = alternator_opt_mode
    requiresPowerCycle = alternator_controlout
    requiresPowerCycle =  alternator_control_inv
    requiresPowerCycle =  alternator_freq
    requiresPowerCycle = alternator_lampout
    requiresPowerCycle =  alternator_freq_monin
    requiresPowerCycle =  alternator_freq_moninv
    requiresPowerCycle =  alternator_freq_currin
    requiresPowerCycle = alternator_freq_currinv
    requiresPowerCycle = oilpress_in
    requiresPowerCycle = oilpress_out
    requiresPowerCycle = cel_port
    requiresPowerCycle = generic_pid_flags_a_on
    requiresPowerCycle = generic_pid_flags_b_on
    requiresPowerCycle = generic_pid_flags_a_direction
    requiresPowerCycle = generic_pid_flags_b_direction
    requiresPowerCycle = generic_pid_pwm_opts_freq_a
    requiresPowerCycle = generic_pid_pwm_opts_freq_b
    requiresPowerCycle = generic_pid_pwm_outs_a
    requiresPowerCycle = generic_pid_pwm_outs_b
    requiresPowerCycle = can_rcv_opt_on
    requiresPowerCycle = iobox_opta1
    requiresPowerCycle = iobox_opta2
    requiresPowerCycle = iobox_opta3
    requiresPowerCycle = iobox_opta4
    requiresPowerCycle = iobox_optb1vss
    requiresPowerCycle = iobox_optb2vss
    requiresPowerCycle = iobox_optb3vss
    requiresPowerCycle = iobox_optb4vss
    requiresPowerCycle = dashbcast_opta1
    requiresPowerCycle = pitlim_opt_on
    requiresPowerCycle = pitlim_enin
    requiresPowerCycle = boost_dome_outputs_fill1
    requiresPowerCycle = boost_dome_outputs_empty1
    requiresPowerCycle = boost_dome_settings1_mode
;    requiresPowerCycle = boost_dome_settings1_on
;    requiresPowerCycle = boost_dome_settings2_on
;    requiresPowerCycle = boost_dome_outputs_fill2
;    requiresPowerCycle = boost_dome_outputs_empty2
;    requirePowerCycle = boost_dome_settings2_mode

    requiresPowerCycle = can_rcv_id1
    requiresPowerCycle = can_rcv_id2
    requiresPowerCycle = can_rcv_id3
    requiresPowerCycle = can_rcv_id4
    requiresPowerCycle = can_rcv_id5
    requiresPowerCycle = can_rcv_id6
    requiresPowerCycle = can_rcv_id7
    requiresPowerCycle = can_rcv_id8
    requiresPowerCycle = can_rcv_id9
    requiresPowerCycle = can_rcv_id10
    requiresPowerCycle = can_rcv_id11
    requiresPowerCycle = can_rcv_id12
    requiresPowerCycle = can_rcv_id13
    requiresPowerCycle = can_rcv_id14
    requiresPowerCycle = can_rcv_id15
    requiresPowerCycle = can_rcv_id16
    requiresPowerCycle = can_poll2_ego2
    requiresPowerCycle = can_enable_alcan
    requiresPowerCycle = can_enable_baud
    requiresPowerCycle = canrx1_opt_accel
    requiresPowerCycle = egt_conf_input

    defaultValue = tsCanId, "CAN ID 0"
    defaultValue = rpmhigh, 9000
    defaultValue = rpmwarn, 3000
    defaultValue = rpmdang, 5000
    defaultValue = loadhigh, 400
    defaultValue = wue_lpg, "No"
    defaultValue = clt_exp, 0
    defaultValue = sensor01Alias, "Sensor 01"
    defaultValue = sensor02Alias, "Sensor 02"
    defaultValue = sensor03Alias, "Sensor 03"
    defaultValue = sensor04Alias, "Sensor 04"
    defaultValue = sensor05Alias, "Sensor 05"
    defaultValue = sensor06Alias, "Sensor 06"
    defaultValue = sensor07Alias, "Sensor 07"
    defaultValue = sensor08Alias, "Sensor 08"
    defaultValue = sensor09Alias, "Sensor 09"
    defaultValue = sensor10Alias, "Sensor 10"
    defaultValue = sensor11Alias, "Sensor 11"
    defaultValue = sensor12Alias, "Sensor 12"
    defaultValue = sensor13Alias, "Sensor 13"
    defaultValue = sensor14Alias, "Sensor 14"
    defaultValue = sensor15Alias, "Sensor 15"
    defaultValue = sensor16Alias, "Sensor 16"
    defaultValue = prefSpeedUnits, 0
    defaultValue = prefLengthUnits, 0
    defaultValue = scatterRuntimeEnabled, 1

[SettingContextHelp]
; constantName = "Help Text"
; tool tips tooltips
;Ensure all settings are defined as some MS2/BG words shipped with TS are not applicable.
    nCylinders = "The number of cylinders or rotors in your engine."
    engineType = "Most engines are Even Fire. Typical odd-fire engines are V-twin, some V4, Vmax, some V6, V10." 
    reqFuel = "Global fuel constant. Use the ReqFuel calculator. (Technically related to a pulsewidth at 100%VE)\n\nFirst, fill in all settings below and then click the [Required Fuel] button."
    tempTable = ""
    map0 = "MAP reading at 0V, typically pick a sensor from 'common MAP sensors.'"
    mapmax = "MAP reading at 5V, typically pick a sensor from 'common MAP sensors.'"
    clt0 = ""
    cltmult = ""
    mat0 = ""
    matmult = ""
    tpsMin = "With engine off, set TPS at minimum (foot off pedal) then click 'get current'"
    tpsMax = "With engine off, set TPS at maximum (foot to floor) then click 'get current'"
    batt0 = "Can be used to correct battery voltage readings."
    battmax = "Can be used to correct battery voltage readings."
    ego0 = ""
    egomult = ""
    baro0 = "Baro reading at 0V, typically pick a sensor from 'common Baro sensors.'"
    baromax = "Baro reading at 5V, typically pick a sensor from 'common Baro sensors.'"
    bcor0 = "The barometeric correction to fuel at a total vacuum.\nFor new installs set these two settings to zero and tune the barometric correction curve to correct for altitude.\nImported settings from older code versions use a vacuum of 147, a rate of -47 and tune the barometric correction curve to correct for altitude.\nRead the baro curve tooltip also."
    bcormult = "The rate of change of correction.\nFor new installs set these two settings to zero and tune the barometric correction curve to correct for altitude.\nImported settings from older code versions use a vacuum of 147, a rate of -47 and tune the barometric correction curve to correct for altitude.\nRead the baro curve tooltip also."
;    crankTolerance      = "Percentage tolerance for next input pulse while cranking."
;    asTolerance         = "Percentage tolerance for next input pulse during after start period."
;    pulseTolerance      = "Percentage tolerance for next input pulse while running."

    IdleCtl = "Selects method of idle control.\nNone = no idle control valve.\nOn/Off valve = basic open or closed valve (rare)\nPWM valve (2,3 wire) = common from Ford or Bosch.\nStepper (4,6 wire) = common with GM, Subaru\nDBW - no separate idle valve."
    IdleCtl_alg = "Open-Loop controls the valve purely based on temperature.\nClosed-Loop adjusts the valve position to achieve a target RPM"
    IACtstep = "Time between each stepper motor step.\nIncrease this if the motor appears to behave intermittently."
    IAC_tinitial_step = "The length of the first motor step. Typically set a little longer to improve reliability."
    IACminstep = "Minimum number of steps to move in one go."
    IACStart = "On startup the stepper motor will move this many steps to ensure it has reached the home position. Set the value to a number larger than the number of steps required for full travel. (This was formerly called 'Start Value')"
    IdleCtl_home = "Whether to home the valve to the fully closed or fully open position."
    IACcurlim = "Stepper motor current control when not stepping.\nMoving only: turns off power between steps, motor stays cooler but may be unreliable.\nHold current: a holding current is applied between steps.\nAlways on: full current is always applied. Most heat, but reliable."
    iacfullopen = "Number of steps from closed to full open. Homing steps must be set to a larger number."
    IdleHyst    = "Amount the coolant temperature must move before idle position is changed."
    IACcrankxt = "After the engine starts, the idle valve moves from the 'cranking position' to the 'run' position. This setting controls how long that transition takes."
    pwmidlecranktaper = "After the engine starts, the idle valve moves from the 'cranking position' to the 'run' position. This setting controls how long that transition takes. Enable initial values for best results."
    pwmidleset_inv = "Most valves work with 0% = closed. A few valve may work in the opposite direction."
    pwmidle_freq_pin = "Output for idle valve."
    pwmidle_freq_pin3 = "Second output for idle valve in 3-wire mode."
    pwmidle_freq_scale = "Frequency to operate at. This varies with valve type. Ford/Bosch valves typically operate 50-100Hz. Miata valves are closer to 300Hz."
    pwmidle_freq_koeo = "Determines whether the idle valve runs during Key-On-Engine-Off. This can potentially help starting by giving additional air during the first few engine rotations."
    fastIdleT = "Open the idle valve below this temperature for fast-idle."
    divider = ""
    alternate = "Sets injector staging in non-sequential modes. For Sequential set 2 Squirts/Alternating or 1 Squirt/Simultaneous."
    twoStroke = "Four-Stroke (most engines), Two-stroke or Rotary."
;    injType = "Not used presently."
    nInjectors = "Number of primary injectors i.e. not any secondary staged injectors you may have."
    rpmLF = "Smoothing factors. 100% = no smoothing. 10% = highly smoothed."
    mapLF = "Smoothing factors. 100% = no smoothing. 10% = highly smoothed."
    mafLF = "Smoothing factors. 100% = no smoothing. 10% = highly smoothed."
    tpsLF = "Smoothing factors. 100% = no smoothing. 10% = highly smoothed."
    egoLF = "Smoothing factors. 100% = no smoothing. 10% = highly smoothed."
    adcLF = "Smoothing factors. 100% = no smoothing. 10% = highly smoothed."
    blend4LF = "Lag/delay factor on input. 100% = no delay. 1% = highly delayed. Typical values around 10 will be useful."

    feature3_tps = "Automatically recalibrate TPS if negative TPS values are seen. This can be useful if the zero position on your TPS varies.\n(The temporary recalibration is not saved.)"
    feature3_battv = "Allows the additional filtering on battery voltage to be disabled for faster response to changes.\nOff = very smoothed readings.\nOn = more responsive readings."
    baud = "This should be set to 115200.\n\nDO NOT CHANGE IT WITHOUT GOOD REASON.\n\nIf you do change this, you must also change the baud rate under Communications->Settings."
    baudhigh = "Default = 115200.\n\nOptional faster baudrate for SDcard datalog readback.\nUseful options are 115200, 230400, 460800.\nUse the quickest that works reliably on your hardware. A direct USB cable is likely to work best."
; These tips for on/off outputs do not show up in 2.1.13, but added for the future
   psEnabled = "Enables this output for programmable control. Do NOT enable an output here that is already is use for another feature e.g. idle, boost etc. \nFor each output,'On' means the following:\nStepper Out 2 = 12V on IAC2A\nStepper Out 1 = 12V on IAC1A\nPWM Out 2 = Ground\nHigh Current Out 3 = Ground\nHigh Current Out 1 = Ground\nHigh Current Out 2 = Ground\nPWM Out 3 = Ground\nPWM / Idle Out 1 = Ground\nInjector Out I = Ground\nInjector Out J = Ground\nDigital Frequency In 2 = 5V\nTach Out = Ground\nInjector Out A = Ground\nInjector Out B = Ground\nInjector Out C = Ground\nInjector Out D = Ground\nInjector Out E = Ground\nInjector Out F = Ground\nInjector Out G = Ground\nInjector Out H = Ground\nSpark Out A = weak GND\nSpark Out B = weak GND\nSpark Out C = weak GND\nSpark Out D = weak GND\nSpark Out E = weak GND\nSpark Out F = weak GND\nSpark Out G = weak GND\nSpark Out H = weak GND\nDigital Output 1 LED = LED On"

    psCondition = "The variable to the left (like in a datalog) is compared with the target value, the output triggers if:\n> variable is greater than target.\n= variable equals target precisely (useless)\n< variable is less than target\nAnd logical bitwise AND with the target."
    psConnector = "Whether to include a second condition and whether condition 1 AND condition 2 must be true or condition 1 OR condition 2."
    psInitValue = "Typically this is set to 0 which means the output is off."
    psPortValue = "Typically this is set to 1 which means the output is on when triggered."
    psOutSize = ""
    psOutOffset = ""
    psThreshold = "This is the target value that the variable is compared against."
    psHysteresis = "A deadband to prevent the output bouncing on and off."

    firea = "Firing order is used for trim and per-cylinder corrections so the adjustment is applied to the correct cylinder number. Injectors and coils must still be wired in firing order sequence. i.e. InjA = cyl1, InjB = next cylinder to fire"
    enginesize = "Engine size or displacement in cc. Fill this in before using the ReqFuel calculator.\nTo convert from cu.in to cc, multiply by 16.39"
    staged_pri_size = "The size of each of your main/primary injectors in cc/min.\nTypical conversion from lbs/hr is multiply by 10.5"

      sequential = "Off - disables sequential fuel and runs batch fire. Semi-sequential - fires injectors in pairs spread over a crank rotation (Requires a crank wheel.) Fully-Sequential - fires each injector in turn spread over a full engine cycle (requires a cam sensor on 4-stroke for phase information.)"
      sequential_angle_spec = "Whether to time the injection by the start, middle or end of the pulse. End is most common and typically arranged so that injection has finished just before the inlet valve opens."
      sequential_trim_on_off = "Whether to enable per-cylinder trim tables. This allows each cylinder to be tuned individually if you have per-cylinder widebands or EGT."
    baroCorr = "Enables or disables fuel adjustment for barometer (altitude.)\nOff = ignore baro\nInitial MAP reading = take a sample from the MAP sensor at power-on. Not recommended as this can easily get an incorrect reading if you are quick on the key or powercycle while the engine is running.\nTwo independent sensors = use a second dedicated barometer sensor.\n\nIt is strongly recommended to use a dedicated baro sensor if your vehicle will see altitude changes."
      rtbaroport = "The connection to an external or internal barometer sensor."

      baro_upper = "Maximum possible barometer reading that the engine will see. (typ. 102kPa) Limits faulty readings."
      baro_lower = "Lowest possible barometer reading that the engine will see. (typ. 68-80kPa) Limits faulty readings."
      baro_default = "Fixed barometer reading for when barometric correction is disabled."
      mapport_t = "Selects voltage (common) or frequency (rare) type MAP sensor input.\nOff disables the MAP input. e.g. for pure Alpha-N or MAF installs."
      mapport = "The connection to an external or internal voltage MAP sensor."
      mapport_f = "The connection to an external or internal frequency MAP sensor."
      map_freq0 = "The low frequency corresponding to the least MAP."
      map_freq1 = "The high frequency corresponding to the most MAP."
      map2port  = "If fitted, the connection to a second voltage MAP sensor.\nDo not confuse this with baro sensing.\nThis is for a second sensor measuring manifold pressure. Typically this would only be used on engines with two runners or plenums and no balance tube."
      tempUnits = "Selects the temperature units displayed on the optional MegaView."

    algorithm = "The calculation method for fuel. The choices are:\nSpeed Density (uses MAP sensor)\nPercent Baro (Speed-Density but with barometric pressure difference included)\nAlpha-N (uses TPS)\nMAF (uses MAF)\nITB (a mode specifically for Independent Throttle Bodies)"
    algorithm2 = "Enables a second modifier or blended fuel table (VE2)\n\nAdvanced use only."
    loadCombine = "Selects the modifier or blend method"
    loadMult = "Normal Speed-Density should enable 'Multiply MAP'. In rare circumstances, this can be disabled. %baro works the same. With Alpha-N, enabling multiply MAP gives 'Hybrid Alpha-N' : disabling multiply MAP gives 'Pure Alpha-N'. MAF never multiplies in MAP."
    loadMult2 = "The same as Multiply MAP, but this setting controls the secondary blended tables VE2 and VE4 - allowing for example Speed-Density (with MAP) on VE1 to be blended with a Pure Alpha-N (without MAP) on VE2."
      loadStoich = "Including the AFR target with the speed-density algorithm allows the VE table to be a 'real' VE table and the desired AFR to be specified in the AFR table.\nWith AFR not included, the AFR table is for reference only and the 'VE' table takes full control.\n\nWith the MAF algorithm, this MUST be enabled to factor the target AFR into the fuel equation."
      loadopts_oldbaro = "Enables old-style compatability barometric calculations. Not recommended for new installs."
      stoich = "The stoichiometric (chemical ideal) AFR for the fuel in use. This is only used when 'incorporate AFR target' is enabled. For gasoline use 14.7. For alternate fuels, alter this number, alter the AFR target table and set your wideband calibration appropriately."
      IgnAlgorithm = "The load Y-axis for ignition table lookups"
      IgnAlgorithm2 = "Enables a second modifier or blended fuel table (Spk2)\n\nAdvanced use only."
      loadCombineign = "Selects the modifier or blend method"
      afrload = "The load Y-axis for AFR table lookups"
      eaeload = "The load Y-axis for EAE curve lookups"
    OvrRunC = "Over-run fuel cut is a method to totally cut off fuel during over-run situations such as coasting down a hill in gear. Be sure to set the parameters so that it is only triggered under true over-run conditions and not during regular driving."
    OvrRunC_progcut = "Allows sequential injectors to be cut progressively for a smoother activation."
    OvrRunC_progret = "Allows sequential injectors to be returned progressively for a smoother return. Does not make sense to use this with the accel-event option."
    OvrRunC_progign = "Allows ignition timing transition during fuel cut."
    OvrRunC_retign = "Allow ignition timing transition during fuel return."

    fc_clt = "Set this to prevent over-run operation on a cold engine."
    fc_delay = "The delay prevents jerky on/off operation during transients."
    fc_ego_delay = "Over-run will give a full-lean EGO reading and closed-loop EGO should be disabled until a sensible reading is available. Set this long enough so that the EGO sensor is returning a true reading."
    fc_rpm_upper = "Allows overrun fuel cut to be turned off (fuel to come back) at this RPM at high rates of deceleration."
    fc_rpm_lower = "Allows overrun fuel cut to be turned off (fuel to come back) at this RPM at low rates of deceleration. "
    fc_transition_time = "Once main fuel cut delay timer has run, this sets a transition time from normal spark advance to the advance during overrun. The timer is also used for the progressive fuel cut.\nTypically set a retarded timing for overrun with a second time for smooth activation."
    fc_trans_time_ret = "This sets a transition time from overrun to normal conditions and is used with progressive spark return and progressive fuel return.\nIf the throttle is applied above the threshold, the fuel and timing are immediately returned cancelling this timer."
    fc_ae_time = "The length of time that additional fuel is added after over-run ends to avoid a lean-spike."
    fc_timing = "The ignition advance during overrun. Typically set to a low number or ATDC timing."
    fc_ae_pct = "Fuel adder after over-run ends to avoid a lean-spike."

    RevLimOption_retard = "Options for spark retardation to limit revs.\nOff = no spark retard used\nProgressive Retard = timing is progressively retarded above the set RPM\nFixed angle = above the set RPM the timing is immediately changed to the angle you specify."
    RevLimMaxRtd = "Maximum timing retard."
    RevLimRtdAng = "Timing value used in Fixed angle."
    RevLimOption_spkcut = "Enables spark-cut limiting.\nCaution! This can cause catalyst damage and is noisy in operation.\nWill not work with EDIS, TFI or GMDIS"
    RevLimNormal2 = "Specifies the revlimiter max RPM.\nYou MUST also select a rev-limiter type below.\n\nSee the 'Gauge and Settings Limits' page to alter the maximum allowed RPM number."
    RevLimNormal2_hyst = "Sets an RPM deadband, soft limiters start this many RPM below the hard limit. If full fuel cut the RPMs must fall by this much before fuel is re-enabled. A number of hundred RPM is suggested."
    RevLimCLTbased = "Enables optional coolant based rev limiter, so that the rev limit can be lowered when the engine is cold. The curve itself sets the hard rev limit at your chosen temperatures."
    TpsBypassCLTRevlim = "Above this TPS% the coolant curve is ignored and the normal hard rev limit is used. This should be set to a high %age number, so that only in an emergency when you really need full throttle on a cold engine can you override the cold limit. Or set to over 100% so that the limit in the curve is always used whatever the throttle position."
    RevLimOption_fuelcut = "Whether fuel-cut rev limiting is enabled."
    RevLimOption_fuelprog = "Enables a progressive non-rotational fuel cut that drops cylinders as revs rise between the lower and hard fuel cut limits.\nMUST NOT be used with staged or throttle-body injection."

    tacho_opt80 = "Enables the tacho output"
    tacho_opt3f = "Selects the output pin"
    tacho_opt40 = "Normal - an output pulse is generated matching each cylinder event. i.e. 4 cylinder engines have 4 pulses per engine cycle.\nHalf speed - output runs at half speed. This can enable a 4-cyl tacho to be used on an 8-cyl engine."
    tacho_optvar = "Fixed = Use a fixed tachometer scaling of full speed or half speed.\nVariable = fully variable tachometer output.\nTypical settings are 'Fixed' and 'Normal'"
    tacho_scale = "Percentage scaling of tachometer output, 100% means a true output. Adjust up or down to correct inaccuracies in your tachometer."

    fanctl_settings_on = "Enables fan control" 
    fanctl_settings_idleup = "Whether the fan activation should also raise the idle"
    fanctl_settings_pin = "Selects the output pin for the fan relay"
    fanctl_idleup_delay = "How long to wait after raising idle before turning on fan"
    fanctl_idleup_adder_duty = "PWM open-loop duty cycle to increase by"
    fanctl_idleup_adder_steps = "Additional stepper idle steps to open"
    fan_idleup_cl_targetadder = "Target rpm to increase by"
    fanctl_ontemp = "Turn fan on above this temperature"
    fanctl_offtemp = "Turn fan off below this temperature (must be lower than "on" temperature)"
    fanctl1_temp_full = "Fan runs at full speed at or above this temperature."
    fanctl_opt2_engineoff = "Allows fan to run in key-on, engine-off situation"
    fan_ctl_settings_acfan = "Whether the fan should be automatically turned on to help cool the A/C radiator."
    fan_idleup_tps_offpoint = "Disable fan above this TPS% (reduces load on engine when max power desired.)"
    fan_idleup_tps_hyst = "Deadband of TPS% "
    fan_idleup_vss_offpoint = "Disable fan above this vehicle speed (at high speeds airflow through radiator may be sufficient on its own.)"
    fan_idleup_vss_hyst = "Deadband of VSS"
    fanctl_opt2_tps = "Whether TPS is used to shutdown the fan."
    fanctl_opt2_vss = "Whether VSS is used to shutdown the fan."
	fanctl1_mode = "Type of control:\r- 'On/Off' used with a relay\r'PWM variable' used with a solid-state-relay (SSR)."
	fanctl1_inv = "Some SSRs or fan modules require the opposite electrical duty cycle."
	fanctl1_freq = "SSRs typically prefer a higher frequency."
    fanctl1_duty_off = "Duty cycle for off. Straight SSRs will use 0%. Special modules may use another value e.g. 10%"
    fanctl1_duty_min = "Duty cycle for minimum speed. This will depend on your fan and SSR combination. Use the test mode to find a value that gives smooth operation and actually moves some air."
    fanctl1_duty_full = "Duty cycle for full speed. Straight SSRs will use 100%. Special modules may use another value e.g. 90%"
    tclu_outpin = "Selects output port to connect to lockup solenoid "
    tclu_enablepin = "Selects optional input port for enable switch (could be used for 4th gear pressure switch.) "
    tclu_brakepin = "Selects optional input port for brake light switch (brake light unlocks convertor.) "
    tclu_tpsmin = "Minimum TPS to enable lockup "
    tclu_tpsmax = "Maximum TPS to enable lockup "
    tclu_mapmin = "Minimum MAP to enable lockup "
    tclu_mapmax = "Maximum MAP to enable lockup "
    tclu_opt_vss = "Optionally allow VSS1 or VSS2 speed input as criteria "
    tclu_vssmin = "Sets minimum speed for lockup. (Requires VSS input in speed/gear sensors.) "
    tclu_opt_gear = "Optionally allows gear number as criteria. (Requires gear to be enable in speed/gear sensors.) "
    tclu_gearmin = "Minimum gear to enable lockup "
    tclu_delay = "Wait this long after conditions are met before locking up."
    MAFOption_t = "Selects between 0-5V voltage input (e.g. most MAFs) or frequency input (e.g. GM)\nOff disables the MAF input. "
    MAFOption = "Selects the hardware input pin where the voltage MAF is connected."
    MAFOption_f = "Selects from four possible frequency input pins."
    maf_freq0 = "The frequency the MAF outputs to indicate least air flow."
    maf_freq1 = "The frequency the MAF outputs to indicate greatest air flow."
    feature7_mafmat = "Optionally enables a trim curve based on MAT sensor input."
     feature7_maftrim = "Optionally enables VE table 1 as a trim table. Fill the table with 100% to begin with. "
    maf_range = "Sets the range to match your MAF sensor. Set this before loading a MAF calibration curve. On gasoline, 650g/s ~800hp; 1300g/s ~1600hp; 1950g/s ~2400hp and 2600g/s ~3200hp. Use the lowest range suitable for better low-end precision. "
    opentime_opt1_master = "Same = one dead-time across all injectors. Most common.\n\nIndividual = the dead time for each injector is set individually. Mostly useful for staged injection where different injector types are used."
	opentime_opt1_table = "Voltage curve: Injector deadtime (offset) is looked up vs. the battery voltage.\n\nVoltage/Pressure table: Injector deadtime is looked up vs. the battery voltage and injector differential pressure. This requires that a fuel pressure sensor is installed and the fuel pressure system is configured."
    opentime_opt1 = "You can choose one of the four battery voltage correction curves. (If in doubt pick curve 1 and leave the curve alone.)"
;    injOpen1 = "Injector dead time.\nTypically 0.9ms for high-z (~14ohm)"
    opentime_opta_pwm = "Enables PWM current limiting (peak and hold) for low ohm injectors."
    injPwmPd = "The period/frequency during the hold phase. Safe to leave at 66us."
    injPwmT = "This the 'peak' time and is typically set to 1-1.5ms"
    injPwmP = "This is the 'hold' percentage current. 30-50% is typical."
    opentime_optb_own = "Enables different settings for bank 2. Only applicable if physically different injectors are on the second bank. Could be used with staged injection.\nFor most engines, this should be set to Off."
    opentime_opta = "You can choose one of the four battery voltage correction curves. (If in doubt pick curve 1 and leave the curve alone.)"
    smallpw_opt1_master = "The Injector Small Pulsewidths feature allows the user to make a correction and make the non-linear region more linear in nature. Unless you have calibration data for your injectors measured on your ECU, this feature should be left turned off. "
    smallpw2_opt1_master = "The Injector Small Pulsewidths feature allows the user to make a correction and make the non-linear region more linear in nature. Unless you have calibration data for your injectors measured on your ECU, this feature should be left turned off. \n\nThis setting applies to table switched different injectors."
    staged_first_param = "This setting enables staged injection and sets the primary staging parameter, which is used to determine when to engage the secondary injectors.\nFor table-based staging, 0% means not staged at all, and 100% means fully staged, between is partially staged."
    staged_sec_size = "Size of secondary injectors in cc/min"

    staged_extended_opts_pw1off = "Off = when staged, primary and secondary pulse-widths are equal.\n\nOn = when staged, primaries are shut down completely and just secondary injectors are used."
    staged_extended_opts_use_v3 = "Whether the secondaries are connected to main injector (A-H) outputs or to the InjI/J batch fire outputs."
    staged_extended_opts_simult = "Whether the batch fire outputs alternate during an engine cycle or fire once together."
    staged_transition_on = "Allows a gradual transition into staging instead of a hard switch point."
    staged_transition_events = "how many ignition events it will take to go from no staging to fully staged."
    staged_primary_delay = "Delays the reduction of the primary pulse width by a number of ignition events after the secondaries start coming online."
    staged_secondary_enrichment = "This setting is used to inject more fuel on the secondaries than the fully staged calculation determines. This is useful when there is a small lean spot just after staged injection fully engages."
    staged_param_1 = "Used to determine when staged injection engages when using RPM, MAP, TPS, or Duty."
    staged_hyst_1 = "Used as a deadband to determine when staged injection shuts off."
    staged_second_param = "This setting is used to add a second method for determining when to stage."
    staged_param_2 = "Used to determine when staged injection engages when using RPM, MAP, TPS, or Duty."
    staged_hyst_2 = "Used as a deadband to determine when staged injection shuts off."
    staged_second_logic = "Whether both parameters or either parameter will enable staging."
    staged_out1 = "Use a relay output to enable secondary injectors (GM systems) where primary and secondary injectors are wired to the same injector output."
    staged_out2 = "Use a relay output earlier than secondary injectors (GM air-flaps)."
    staged_out1_inv = "Allows output polarity sense to be swapped"
    staged_out2_inv = "Allows output polarity sense to be swapped"
    staged_out2_time = "How long the pre-output is active before the staging transition begins."
    flexFuel = "This enables or disables the Flex Fuel system."
    flexport = "Selects where the sensor is connected."
    fueltemp1 = "If used, specifies a sensor input for fuel temperature."
    fuelFreq0 = "The low and high frequencies generated by the sensor (e.g. 50Hz, 150Hz for the GM sensor)"
    flex_pct0 = "The ethanol percentage corresponding to the low and high frequencies from the sensor. (e.g. 0% and 100% for the GM sensor.)"
    fuelCorr0 = "The fuel multiplier. 100% means no change. The default of 163% for E100 gives 63% additional fuel."
    fuelSpkDel0 = "The timing addition in degrees. E85 burns more slowly than pure gasoline and will require more advance."
    ff_tpw0 = "The pulsewidth from the sensor at low and high temperatures (1.0, 5.0ms for the GM sensor.)"
    ff_temp0 = "The low/high temperatures at low/high pulsewidths. (-40 deg, +125 degC/+257 degF for the GM sensor.)"
    fuelCorr_default = "Multiplier to be used if the sensor sends an out of range frequency. (Faulty sensor or an error condition.)"
    fuelSpkDel_default = "Timing to add under fault conditions. (Expected to be 0 or negative.)"
    fuelFreq1 = ""
    flex_pct1 = ""
    fuelCorr1 = ""
    fuelSpkDel1 = ""
    flex_baseline = "Ethanol percentage in regular fuel, assumes that the main fuel and spark tables are tuned for regular fuel. Allows flex-fuel system to be enabled without retuning base tables. e.g. if your fuel table was tuned with E10, setting the baseline to 10 and enabling flex will keep the same fuel pulsewidth. Set to 0 for backwards compatability."
    flexpct_default = "Sets the fallback Ethanol percentage to assume in error conditions when the sensor isn't reading correctly."

    egoAlgorithm = "None - no fuel changes are made in response to oxygen sensor readings.\nSimple - This method of closed-loop EGO control is well-suited to use with a narrowband O2 sensor. \nPID - This method incorporates a Proportional Integral Derivative control loop which tuned properly, adjusts the amount of fuel being injected to quickly get to the target, and then maintains the target without any oscillation."
    egoAlgorithm_auth = "Enables a table of EGO authority based on RPM/load. This allows greater control over when closed-loop EGO is operational and permits variable authority. An authority of zero means there will be no correction made. Normally the RPM and load axes should be set the same as the AFR tables."
    egoAlgorithm_auth2 = "Combined: sets a single authority table for authority in positive and negative direction.\nTwo: sets one table for positive authority (above 100%) and one table for negative authority (less than 100%.)"
    egoCount = "The number of ignition events between each correction."
    egoDelta = "controls how large each correction 'step' is."
    egoLimit = "The maximum amount of adjustment performed by the closed-loop algorithm."
    ego_lower_bound = "Only correct above this AFR"
    ego_upper_bound = "Only correct below this AFR"
    egoTemp = "Only correct above this temperature."
    egoRPM = "Only correct above this RPM."
    TPSOXLimit = "Only correct below this throttle position."
    MAPOXLimit = "Only correct below this load."
    MAPOXMin = "Only correct above this load."
    ego_startdelay = "Only correct when engine has been running at least this long."
    ego_limdelay = "When a fuel or spark cut limiter is active, EGO correction is stopped and frozen. This delay specifies the wait time after the limiter before correction resumes, to allow for exhaust gases to reach the sensor and the output to stabilise."
    egoKP = "Proportional term"
    egoKI = "Integral term"
    egoKD = "Derivative term"
    egoType = "Disabled - No EGO sensor enabled.\nNarrowband = Enable narrowband sensor/s.\nWideband = Enable wideband sensor/s"
    egonum = "Selects the number of oxygen sensors in use."
    egoport1 = "Selects where the sensor or controller is connected. For directly connected sensors, each channel must use a different input.\nFor CAN connected sensors, typically select 'CANEGO' for all inputs."
    egomap1 = "Selects which oxygen sensor applies to this cylinder if multiple sensors are used. When only a single sensor is fitted, ensure all cylinders are set to EGO1."

    spk_mode0 = "Sets the type of tach input pattern decoder to be used."
    triggerOffset = "In 'Basic Trigger' and 'Trigger Return' this specifies the engine angle BTDC that each trigger pulse is received. (0-19 or 50-80 degrees for best results.)\n\nIn 'Toothed Wheel' this should always be set to zero - use tooth#1 angle instead.\n\nIn other modes this setting can make a +/- 20 degree adjustment to the built-in reference angle."
    trigret_ang = "This is only used in CAS 4/1 mode and specifies the angular length of each tooth."
    OddFireang = "For oddfire engines this specifies the angle the engine must rotate from spark A output to spark B output."
    spk_conf2_gmtfi = "GM HEI, Ford TFI and Buick C3I specific options.\nWith HEI7/8 and GM-DIS, this setting enables the 'bypass' output on spark B.\nThe C3I mode enables the 'bypass' and also quick-sync after the cam signal is received.\n Signature PIP mode is used with 'Basic Trigger' and allows the ECU to use these distributors (where one vane is shorter than the others) for sequential fuel."
    spk_conf2_oddodd = "Alternate = most oddfires such as Ford V4, Chevy V6, Viper V10\n\nPaired = Yamaha Vmax\n\nCustom = set your own oddfire angles."
    no_skip_pulses = "The number of tach input pulses at start-up that are ignored before ignition calculations and wheel decoding begins. The default value of 3 is suitable for most applications."
    ICIgnCapture = "This must be matched to your tach input. If it is set incorrectly you can experience timing drift with rpms or misdetection of missing teeth on a missing tooth wheel. The tooth logger can be used to confirm polarity is correct."
    spkout_hi_lo2 = "This setting is CRITICAL or you will melt your ignition coils. For 99% of installs, this should be set to 'Going high'"
    spk_mode3 = "Specifies the type of ignition coils in use and automatically assigns spark output pins.\nSingle-coil: one spark output from ECU, either a single coil or an external module. TFI, HEI, EDIS, GMDIS must set 'single coil'.\nWasted-spark: one spark output per pair of cylinders.\nWasted-COP: one spark output per cylinder, fired in pairs.\nCoil on plug: one spark output per cylinder, fired individually.\nDual dizzy: two spark outputs, fired alternately." 
    hardware_spk = "Selects what outputs are used for ignition.\nSpark = normal logic spark outputs\nTacho = single channel output suitable for TFI and CDI boxes."
  hardware_cam = "Selects where the cam input is connected.\nDO NOT select 'MAP Sensor' unless you know why.\n\n'MAP Sensor' must ONLY be selected if you are using the MAP sensor for phase detection on a 1cyl engine or V-twin. Used with 'Dual wheel with missing tooth' only. Enable 'Timed min' MAP sampling. Set the MAP sensor phase threshold on the MAP Sample settings page.\n\nFor Optispark and Nissan CAS modes, selecting 'Cam' activates 'Digital Frequency In 1' as the hi-res input."
    spk_mode3_tach3 = "Selects where the tertiary tach input is connected"
    spk_mode3_hirespol = "Selects whether to flip polarity on cam or hi-res tach input.\n\nThe custom wheel decoders require that crank and cam signals are of the same input polarity, in cases where a mix of sensors makes this impossible, this setting can be used to flip the cam input. Does not apply to all decoders."
    spk_mode3_kick = "Primarily for kick-start engines, the enables a delayed spark during cranking. The dwell and spark are both scheduled at the trigger-return point for less chance of kick-back.\n\nCan only be used with \n-'Trigger-Return' or \n-'Basic Trigger' when the Trigger Angle < 20"
    kickdelay = "How long after the trigger-return to wait before starting the coil dwell in kick-start mode."

    timing_flags = "Fixed Advance = locks timing to the value set below. This is used for confirming timing with a strobe timing light during setup.\n\nUse table = normal operation where the spark advance table is used."

    use_prediction = "1st Deriv Prediction = engine accleration deceleration is allowed for in timing calculation. (Normal setting)\n\nNo Prediction = no allowance."
    fixed_timing  = "The timing to lock to in 'Fixed' mode"
    crank_dwell = "Specifies the base coil dwell time during cranking before battery correction is applied."
    crank_timing = "Specifies the ignition advance to be used while cranking. Typically 5-10 deg BTDC"
    spk_conf2_dli = "Enables specific multiplexed outputs for use with the Toyota ignition module such as used on the 7MGTE."
    dwellmode = "Standard Dwell - this is the setting to use for most installs.\nFixed Duty - locks the spark output to a constant duty cycle instead of controlling dwell. e.g. Ford's 'Push Start' TFI modules, Bosch 'smart' ignition modules, or MSD and other CD boxes.\n\nTime After Spark - only intended for Saab Tri-Ionic DI cassettes.\nCharge at trigger - rarely used. Could be used with MSD type CDI boxes when running Basic Trigger only."
    spk_conf2_dwell = "For time-after-spark, the dwell can be varied with rpm."
    spk_conf2_dwelltbl = "For 'standard dwell', a table of dwell values can be used. Normally a single dwell value is used."
    max_coil_dur = "The base dwell time before battery voltage correction. Typical values are 3-4 ms."
    max_spk_dur = "The time required for the spark to complete, typically in the order of 1 millisecond."
    dwelltime = "The backwards dwell time for Time-After-Spark"
    dwellduty = "For fixed duty, this specifies the %age duty cycle of the output signal."
    hw_latency = "If you notice a slight retarding of ignition timing with rpm while strobing with fixed timing, you can enter a small number in here to remedy it." 
    feature4_0igntrig = "This is not used on MS3-Pro."
    spk_mode3_trim = "Enables the adjustment of timing per individual cylinder."
    spk_mode3_wasted = "During startup on a dual wheel with missing tooth configuration, it is normal to start wasted-COP before the cam phase has been determined. This option disables that behaviour and requires that the cam pulse is seen before startup. This is not always reliable in cases of noise on the cam signal. Does not apply to any other wheel modes."
    feature4_0resyncdel = "Off: If RPM-sync is lost and then regained, fuel and spark return as soon as possible.\nOn: If RPM-sync is lost at higher RPMs, this makes the ECU wait a number of revolutions delay before fuel and spark return."
    resyncdel_rpm = "The delay strategy operates when sync was lost above this RPM. During a sync-loss the RPM may report a lower speed, so suggest setting this to just above idle RPM."

    spk_config_trig2 = "Single wheel with missing tooth = typically a crank wheel such as 36-1 or 60-2\n\nDual wheel = two wheels without missing teeth e.g. Nippodenso 24/1 CAS\n\nDual wheel with missing tooth = typically a 36-1, 60-2 crank wheel and an additional cam wheel."
    triggerTeeth = "The number of effective teeth, counting the missing teeth as if they existed. i.e. a 36-1 wheel has 35 physical teeth, but enter 36." 
    No_Miss_Teeth = "The number of missing teeth. Common are 1 for 36-1, or 2 for 60-2 or 36-2"
    Miss_ang = "See the 'Trigger Wheel' section of the manual for more detail on this important setting."
    spk_config_camcrank = "Does the main wheel rotate at crankshaft speed or camshaft (distributor) speed."
    spk_config_trig2l = "Like ignition input capture above, specifies which voltage level is considered 'active'" 
    spk_config_campol = "In 'Poll level' mode specifies which voltage level is used for each engine phase." 
    spk_config_resetcam = "How often are second trigger (e.g. cam) input pulses received."
    poll_level_tooth = "Which crank tooth number to poll the cam level at. Default is 1.\nRover 4.6 try 17.\nChanging the tooth no. may also change the phase."
    oddfireangs1 = "Number of crank degrees engine rotates from Spk A to Spk B"
    oddfireangs2 = "Number of crank degrees engine rotates from Spk B to next cyl"
    oddfireangs3 = "Number of crank degrees engine rotates from Spk C to next cyl"
    oddfireangs4 = "Number of crank degrees engine rotates from Spk D to next cyl"
    mapsample_opt2 = "'Use event average' is useful for most engines.\n\n'Use timed min' is intended for 1cyl, V twins with highly cyclic MAP signals."
    map_sample_duration = "How many degrees to sample over. The starting angle is set in the curve above."
    mapsample_opt1 = "How many ignition events to sample over. Typically set to 1 for large engines or 2 for 1,2 cylinder."
    map_phase_thresh = "When using the MAP sensor to detect engine phase, this sets a pressure threshold that can identify the intake vs. exhaust phases. Will be highly engine dependent, 80kPa worked on a small 1-cyl."

    fp_opt_mode = "On/Off is used for basic control where the ECU controls the negative side of a relay.\nOpen-Loop PWM provides a table based duty cycle for a fuel pump controller.\nClosed-Loop PWM monitors actual rail pressure and adjusts the duty cycle output to the pump controller to maintain a set differential pressure."
    fp_ctl_ms = "How often to run the control calculations"
    fp_out1 = "The output used to control the fuel pump (either to the relay or to a controller.)\nIt is recommended to leave the standard FP output controlling an on/off relay and to use a different output for the pump controller."
    fp_freq = "For PWM outputs, this sets the output frequency."
    fp_opt_inv = "Set to 'Normal' for On/Off. This setting is useful for PWM outputs and should be set to 'Invert' when using one of the mid-current ECU outputs as they invert the signal. The Spark or Digital outputs do not invert the signal and 'Normal' should be used. Note that the on/off fuel pump output is always a low-side driver and connects to the negative side of the relay - changing this setting will have no impact on that."
    fp_opt_reg = "By preference, fuel systems use a vacuum/boost referenced regulator that maintains line pressure Xbar above inlet pressure. Some GM fuel systems use a fixed fuel pressure referenced to ambient air pressure instead. The vac referenced systems give even injector flow across all inlet pressure conditions. The un-referenced systems give a varying flow and require a calculation within the ECU to compensate. Enabling 'Fixed' here turns on that automatic compensation."
    fp_opt_safety = "Enables fuel pressure safety system.\nIf the measured fuel pressure drops too low for more than a set time, the engine is shutdown."
    rail_pressure_psig = "The fuel rail pressure in PSI referenced to manifold pressure. Typically 43.5PSI for many installs."
    rail_pressure_kpag = "The fuel rail pressure in kPa referenced to manifold pressure. Typically 300kPa for many installs."
    fp_prime_duty = "The PWM duty cycle used during the priming pulse."
    fp_off_duty = "The PWM duty cycle used when the pump should be off. Set to 0 for most applications, or 75% for Ford FPDM modules."
    fp_min_duty = "The minimum PWM duty cycle to be used when running. Set to 0 for most applications, or 5% for Ford FPDM modules."
    fp_max_duty = "The maximum PWM duty cycle to be used when running. Set to 100 for most applications, or 50% for Ford FPDM modules."
    fp_press_in = "If used, specifies a Generic Sensor that is configured for fuel pressure in kPa.\n\nNOTE - You MUST use KPA in Generic Sensors, you can still log and display in psi or bar.\n\nTo convert from psi, multiply by 6.9 e.g. 100psi = 690kPa. To convert from bar, multiply by 100. e.g. 3bar = 300kPa."
    fp_press_type = "'Gauge' sensors are referenced to atmospheric pressure - with a normal vac/boost referenced regulator, the reported pressure will drop under vacuum and increase under boost.\n'Differential' sensors have two ports and are referenced to manifold vacuum/boost - this pressure will typically remain static e.g. 43psi, 3bar.\n'Absolute' sensors are referenced to true vaccum and will read about 14.7psi/1bar when there is no fuel pressure."
    fueltemp1_corr = "Enables fuel correction based on fuel temperature."
    fp_Kp = "Closed-loop Proportional term"
    fp_Ki = "Closed-loop Integral term"
    fp_Kd = "Closed-loop Derivative term"

    hpte_opt_on = "Allows richer mixture after prolonged high power operation to cool piston crown. The richer mixture is calculated by decreasing the AFR target using the number from the curve. The 'high power timer' counts up when above the load/rpm points and counts down below those points. The relevant enrichment is applied until the counter returns to zero."
    hpte_load = "Only enable above this fuel-load."
    hpte_rpm = "Only enable above this RPM."
    shiftlight_opt_pins = "Allows a specific output to be used to switch a shift light. (Do not also enable the same output in the generic on/off outputs.)"
    shiftlight_opt_gear = "Allows per-gear limits, can be useful to set a lower limit in lower gears to avoid overshooting."
	shiftlight_opt2_test = "Shiftlight is active for first half a second after power-on as a bulb test."
    shiftlight_limit1 = "Light is on above this RPM."
    ltt_opt_on = "Enables the long-term fuel trim. This is intended to automatically make minor corrections in fuelling AFTER the engine is fully tuned. It requires EGO control to be enabled and operational."
    ltt_opt_feedback = "Reports the total %change in 'sensor15' - mainly for testing."

    ltt_samp_time = "How often (in seconds) the code checks the current EGO correction."
    ltt_agg = "How softly the trim correction is applied. Larger numbers mean slower changes."
    ltt_opt_mode = "Timed - if needed, the trim table is automatically saved to flash\nButton - an external button is used to save the trim table to flash."
    ltt_but_in = "User operated button to burn trim table from RAM to flash so it is used at next power-on."
    ltt_int = "Minimum time between automatic burns to flash."
    ltt_led_out = "LED output is illuminated when RAM trim table exceeds change threshold. The user can then choose to Burn to flash." 
    ltt_thresh = "If the sum of all changes exceeds this threshold than a burn to flash is requested - either automatically or by lighting the LED for user intervention. The purpose is to only make permanent changes if there was a widespread change."
    pwmidle_closed_duty = "The duty below which changes in duty no longer have an effect on RPM"
    pwmidle_closed_steps = "The number of steps below which changes in duty no longer have an effect on RPM"
    pwmidle_open_duty = "The duty above which changes in duty no longer have an effect on RPM"
    pwmidle_open_steps = "The number of steps above which changes in duty no longer have an effect on RPM"
    pwmidle_dp_adder = "The amount to increase the idle valve duty/steps by when throttle is lifted. Should be set to a value that results in RPM being slightly above the target RPM."
    pwmidle_dp_adder_steps = "The amount to increase the idle valve duty/steps by when throttle is lifted. Should be set to a value that results in RPM being slightly above the target RPM."
    pwmidle_close_delay = "This setting controls the amount of time between pressing the throttle and closing the valve while driving. A value of 0 disables this setting. NOTE: The timer does not start until actual RPM is 200 RPM above the target."
    pwmidle_flags_wot = "This setting opens the idle valve on wide open throttle (WOT). If the valve is still closing from having just pressed the throttle, closing will be paused until after WOT."
    pwmidle_max_rpm_new = "Use this setting to tune how agressively the idle speed controller tries to reach the target RPM. Adjust the slider up until the idle speed starts oscillating, then back down until it stops. Wait 5-10 seconds between each adjustment to give the controller a chance to settle."
    pwmidle_cl_opts_initvaluetable = "This setting controls whether the initial duty value used upon entering closed-loop idle is taken from the last time in closed-loop or taken from the initial value table."
    pwmidle_cl_opts_initval_clt = "This setting is used to set whether the initial values table y-axis lookup is done using CLT or MAT."
    pwmidle_shift_lower_rpm = "The RPM above which the idle valve will remain closed when shifting gears."
    pwmidle_shift_open_time = "The longest amount of time that a shift takes. After this timer expires, the valve will follow normal dashpot behavior."
    pwmidle_cl_opts_display_pid = "Basic mode uses P=100, I=100, D=0\nAdvanced enables the ability to individually set PID gains for cases where the controller cannot be tuned to reach the target adequately in Basic."
    pwmidle_Kp_new = "Proportional gain for closed-loop idle PID loop. Reacts immediately to change in RPM."
    pwmidle_Ki_new = "Integral gain for closed-loop idle PID loop. Reacts to sustained difference between target RPM and actual RPM."
    pwmidle_Kd_new = "Derivative gain for closed-loop idle PID loop. Reacts to rate of change of RPM."
    pwmidle_pid_wait_timer = "Controls how long all conditions for entering closed-loop idle must be met for before entering closed-loop control."
    pwmidle_targ_ramptime = "How long after entering closed-loop idle it will take for actual RPM to match target RPM."
    pwmidle_ms = "Controls how often the closed-loop idle algorithm runs."
    IdleCtl_vss = "Controls whether the VSS activates closed-loop idle."
    idleminvss = "Closed-loop idle is disabled above this VSS."
    boost_ctl_settings_on = "Controls whether boost control is enabled."
    boost_ctl_settings_dome = "Whether to use OEM type single-solenoid control or twin solenoid CO2 dome control. (Dome control is mainly used in racing applications.)"
    boost_ctl_pwm = "Controls the frequency range allowed on the boost control output(s). Slow allows 11.1-78Hz. Most installs use Slow."
    boost_ctl_pwm_scale = "Frequencies available with Mid solenoid frequency range. Frequency is shared with other pins in the same PWM group\nPWM group A : High Current 1/2, InjI/J\nPWM group B : High Current Out 3, PWM Out 2, PWM / Idle Out 1, PWM Out 3"
    boost_ctl_pins_pwm = "Output pins available when using the Mid frequency range."
    boost_ctl_settings_freq = "Frequencies available when using the Slow frequency range."
    boost_ctl_pins = "Output pins available when using the Slow frequency range.\nThe 'Off' setting is only useful when using CAN broadcasting to send the turbo vane position."
    boost_ctl_settings_invert_new = "Set this so that higher duty yields higher boost."
    boost_ctl_settings_biasonly = "For more predictable operation at part throttle you can enable this setting to disable closed-loop control and use the bias table only at part throttle.\nNot relevant to drag racing.\nThe 'Engine State Settings' wide-open throttle threshold is used."
    boost_ctl_closeduty = "(Closed-loop) The duty below which changes in duty no longer cause changes in boost pressure."
    boost_ctl_openduty = "(Closed-loop) The duty above which changes in duty no longer cause changes in boost pressure."
    boost_ctl_clt_threshold = "Coolant temperature must be above this value before boost control will work."
    boost_ctl_lowerlimit = "(Closed-loop) Boost pressure must be within this many kPa of the target boost before closed-loop control will activate.\n\nOutside of this range the valve is held wide open (keeping the wastegate shut) for fastest spooling."
    boost_ctl_upperlimit = "(Closed-loop) If boost pressure goes above the target plus this many kPa, wastegate duty will drop to 0, and closed loop mode will be exited."
    boost_ctl_upperlimit2 = "(Closed-loop) If boost pressure goes above the target plus this many kPa, wastegate duty will drop to 0, and closed loop mode will be exited."
    boost_ctl_rate_disable = "(Closed-loop) If boost pressure is climbing faster than this rate, boost duty will be limited to the value found in the bias table."
    boost_ctl_rate_disable2 = "(Closed-loop) If boost pressure is climbing faster than this rate, boost duty will be limited to the value found in the bias table."
    boost_ctl_range1 = "Applies to closed-loop single solenoid only. How far away from the bias value the closed-loop algorithm may go. Should stop the closed-loop algorithm straying too far from known-good bias numbers when first coming into boost. Set to 100 to allow unlimited range."
    boost_ctl_settings_cl = "Controls whether open loop or closed-loop control algorithm is used.\nFor single-solenoid systems:\n* open-loop gives you a table of solenoid duties that will be used directly.\n* closed-loop gives you a table of target MAP kPas. The closed-loop system adjusts the solenoid duty to achieve the target MAP.\nFor dome control systems:\n* open-loop gives you a table of dome pressure targets, not referenced to actual MAP.\n* closed-loop gives you a table of target MAP kPas. The closed-loop system adjusts the dome target to achieve the target MAP. The dome control system adjusts its solenoids to achieve the dome target."
    boost_ctl_Kp = "Proportional gain for closed-loop control. Proportional control causes immediate changes to output duty with changes in boost error. (Default = 100.)"
    boost_ctl_Ki = "Integral gain for closed-loop control. Integral control causes changes in duty with boost error over time. The longer boost is off target, the stronger the reaction due to the integral term. (Default = 100.)"
    boost_ctl_Kd = "Derivative gain for closed-loop control. Derivative control causes larger reactions in boost duty with faster rate of change of boost error. The faster error changes, the more duty will change to counteract. (Default = 100.)"
    boost_ctl_flags = "Choose Setup mode to configure the closed-loop bias table.\nBasic mode allows tuning with only the sensitivity slider. In Basic mode, P=100, I=100, D=100.\nAdvanced mode starts with the sensitivity specified with the slider and allows fine-tuning of the individual PID gains."
    boost_ctl_flags2 = "Choose setup mode to configure the closed-loop bias table. Basic mode allows tuning with only the sensitivity slider. Advanced mode starts with the sensitivity specified with the slider and allows fine-tuning of the individual PID gains."
    boost_ctl_sensitivity = "Use this setting to tune how agressively the boost controller tries to reach the target boost. Adjust the slider up until the boost oscillates around the target, then back down until it stops."
    OverBoostOption = "Selection can be fuel cut, spark cut, or both. Fuel cut only cuts fuel, spark cut only cuts spark, both cuts both fuel and spark."
    OverBoostKpa = "Maximum desired MAP reading (absolute) before overboost protection cuts fuel/spark."
    OverBoostHyst = "After overboost protection is enabled, how far below the maximum boost must boost drop before spark/fuel are re-enabled."
    OverBoostOption_tol = "Trips the overboost protection if boost is a certain pressure above boost target. Allows overboost to track the boost target table."
    boosttol = "How far MAP can exceed the boost target before overboost cuts in."
    tsw_pin_ob = "Allows an input pin to toggle maximum boost to an alternate value."
    OverBoostKpa2 = "The alternate maximum desired MAP reading (absolute) before overboost protection cuts fuel/spark."
;    overboostcutx = "When using spark cut, controls the number of sparks to cut."
;    overboostcuty = "When using spark cut, controls the number of potential spark events from which to cut spark."
    boost_feats_tsw = "Allow boost tables to be switched when an input is toggled on/off."
    boost_gear_switch = "Selects which gear to switch tables on when gear-based boost table switching is enabled."
    boost_feats_timed = "Enables a percentage modifier curve for the amount of boost (above baro) from launch. e.g. if target is 250kPa (22psi), with 100kPa baro, 50% would result in a target of (((250-100) * 50%) + 100 = 175kPa (11psi)\nLaunch control must be enabled to use this feature.\n(As an alternative, see also Boost vs speed/gear/time which allows the boost target to be set directly. Do not enable both.) "
    boost_feats_launch = "Allow a specific target (closed-loop) or duty (open loop) to be specified when launch control is active." 
    boost_launch_duty = "Duty to use when launch is active."
    boost_launch_target = "Target to use when launch is active."
    boost_vss = "Allows boost target to be controlled based on vehicle speed, detected gear or time since launch.\nWhen active this overrides the target tables and directly sets the boost target. Gear is not an option for open-loop boost. (As an alternative, see also Boost Timed From Launch. Do not enable both.)"
    boost_vss_tps = "TPS must be above this value for the VSS target boost to be used."
    boost_vss_biasgear = "Enables a boost bias table per gear for single solenoid (not dome.)\nThis could be useful if you are seeing different required solenoid duty cycles in each gear and can allow you to set the open-loop 'best guess' bias to be closer to the most typical duty, if tuned correctly this gives the closed-loop less work to do."
    boost_geartarg1 = "Boost target for each gear.\n\nTo use these settings you need:\n Boost = On\nClosed-Loop Boost\nGear detection\n Boost vs speed/gear = Gear."
    boost_ctl_settings_on2 = "Controls whether the second channel of boost control is enabled."
    boost_ctl_pins_pwm2 = "Output for solenoid."
    boost_ctl_pins2 = "Output for solenoid."
    boost_ctl_closeduty2 = "The duty below which changes in duty no longer cause changes in boost pressure."
    boost_ctl_openduty2 = "The duty above which changes in duty no longer cause changes in boost pressure."
    boost_ctl_lowerlimit2 = "(Closed-loop) Boost pressure must be within this many kPa of the target boost before closed-loop control will activate.\n\nOutside of this range the valve is held wide open (keeping the wastegate shut) for fastest spooling."
    boost_ctl_settings_cl2 = "Controls whether open loop or closed-loop control algorithm is used."
    boost_ctl_Kp2 = "Proportional gain for closed-loop control. Proportional control causes immediate changes to output duty with changes in boost error."
    boost_ctl_Ki2 = "Integral gain for closed-loop control. Integral control causes changes in duty with boost error over time. The longer boost is off target, the stronger the reaction due to the integral term."
    boost_ctl_Kd2 = "Derivative gain for closed-loop control. Derivative control causes larger reactions in boost duty with faster rate of change of boost error. The faster error changes, the more duty will change to counteract."
    boost_ctl_sensor2 = "MAP sensor input to monitor."

    alternator_opt_mode = "Control mode for alternator.\nOff = disabled\nOn-Off = most basic control, typically on the 'L' lamp terminal\nOpen-loop frequency = Frequency applied sets target voltage (Ford)\nOpen-loop duty = Duty cycle applied sets target voltage (GM)\nClosed-loop field control = MS3 uses a closed-loop algorithm to control the alternator field to target a voltage\nHigh-speed feedback field switching = MS3 monitors the voltage at 20kHz and switches the field on or off to match the monitored voltage to the target voltage. (99-05 Miata and Chrysler)"
    alternator_ctl_ms = "How often to run the control calculations"
    alternator_controlout = "Output connection to the alternator"
    alternator_control_inv = "Whether a positive or negative active edge is used"
    alternator_freq = "Frequency used for control output signal"
    alternator_lampout = "Output for charge/warning light"
    alternator_freq_currin = "PWM digital input used for monitoring battery current. (Display only.)"
    alternator_diff = "Light warning lamp if actual voltage is too far away from target."
    alternator_freq_monin = "PWM digital input from alternator as load sense - often the 'F' terminal."
    alternator_freq_moninv = "Whether a positive or negative capture edge is used"
    alternator_maxload = "Light warning lamp if sensed load is above this limit."
    alternator_Kp = "Closed-loop Proportional term"
    alternator_Ki = "Closed-loop Integral term"
    alternator_Kd = "Closed-loop Derivative term"
    alternator_sensitivity = "Overall sensitivity"
    alternator_freq_currinv = "Whether a positive or negative capture edge is used"
    alternator_startdelay = "How long after start before alternator control is enabled. Allows engine to stabilise before alternator load is applied."
    alternator_ramptime = "Time to ramp up to target voltage"
    alternator_tempin = "If used, specifies a Generic Sensor that is configured for battery temperature. The temperature is then used to lookup a target charging voltage from the upper curve."
    alternator_targv = "Target voltage when in 'Charge' mode"
    alternator_chargetime = "How long after start is considered 'Charge' before transitioning to 'Run' mode."
    alternator_targvr = "Target voltage during 'Run' mode."
    alternator_wot = "TPS% to trigger Wide Open Throttle (WOT) mode"
    alternator_wotv = "Target voltage when in WOT mode, typically set lower than normal to free up some engine power."
    alternator_wottimeout = "Timeout before WOT mode ends and target voltage returns to charge or run mode."
    alternator_overrv = "Target voltage when over-run fuel cut is active. Setting a slightly higher voltage here will give a minor 'regenerative braking' effect."
    rpmhigh = "The maximum for RPM on gauges, tables, curves.\nAdjust to suit your engine."
    rpmwarn = "The RPM 'warning' on gauges - yellow"
    rpmdang = "The RPM 'danger' on gauges - red"
    loadhigh = "The maximum 'load' value e.g. kPa on gauges, tables, curves."
    wue_lpg = "For most installs, setting warmup enrichment (WUE) to below 100% indicates a tuning mistake and the code will flag up a 'Configuration Error' to alert the user. In rare conditions such as using LPG (propane) for fuel, it can be valid. This setting disables the Config Error warning message."
    prefSpeedUnits   =  "Chooses the speed units - either Mile-per-hour or Kilometres-per-hour\nClose the page and re-open after changing."
    prefLengthUnits  =  "Chooses the size units - either metres or inches\nClose the page and re-open after changing."
	prefFuelPressUnits = "Chooses fuel pressure units - kPa.d, psi.d, bar.d\n\nAll are differential pressure - the pressure in the fuel rail with manifold pressure subtracted. With the engine off, this will be the same pressure as a mechanical gauge."
    clt_exp = "Allows gauges and curves to use an expanded coolant temperature range for air-cooled engines using the CLT sensor to measure oil or head-temperature."
    maxafr_opt1_on = "Enables the AFR safety system"
    maxafr_opt1_led = "Sets an on/off warning output"
    maxafr_opt1_load = "Selects the load axis on the AFR difference table"
    maxafr_en_load = "Only check above this TPS/kPa"

    maxafr_en_rpm = "Only check above this RPM"
    maxafr_en_time = "Specifies a wait time before taking action, to prevent transients from tripping."
    maxafr_spkcut_time = "Cuts spark as the first stage in the system for this long."
    maxafr_ret_tps = "throttle is below this limit."
    maxafr_ret_map = "Fuel and spark remain cut until MAP (boost) is below this limit."
    maxafr_ret_rpm = "Fuel and spark remain cut until RPM is below this limit."
    feature3_3 = "Sequenced batch fire can be useful to give more repeatable engine operation on batch fire systems. On every startup the batch firing is aligned to the same ignition event (cylinder). Without this feature the alignment is random. Typically used with 2 squirts/alternating. This feature is not recommended for new installs and may not work correctly with large numbers of 'squirts'."
    trig_init = "Specifies the ignition 'trigger'. Typically try 0 or 1."
    dlyct = "Sets the CPU hardware based noise filter. Typically a small number or zero."
    NoiseFilterOpts = "Enables the noise filtering. Uses the curve to set the filter period. The filter measures the width of the tach-in pulse in order to reject short noise spikes and allow through valid wider tach-in pulses. Typically set to 1000us or more at low revs and 100us or more at high revs. Basic distributor setups can use far larger numbers."
    NoiseFilterOpts1 = "Enables ignoring of bogus tach pulses, they will still be recorded in the composite logger."
    NoiseFilterOpts2 = "The tach input is disabled for a short period of time after a valid tach pulse to mask out any bogus tach pulses."
    NoiseFilterOpts3 = "Filter crosstalk between sensors. Especially useful on NipponDenso 24+2 wheels with Ne, G1, G2, G- (shared -) wires."
    ICISR_tmask = "The absolute time after a valid tach pulse when new pulses are ignored. The time value here depends greatly on the type of tach input in use.\ne.g. a 60-2 wheel spinning at 10000rpm has a real tach pulse every 0.1ms. A distributor pickup on a 4-cyl at 600rpm has a real tach pulse every 50ms.\nThis value must be set to less than the shortest ever valid time on your install."
    ICISR_pmask = "This works as a percentage of the last valid tooth time. 30-50% are typical values."
    secondtrigopts = "Enables a simple noise filter on the cam tach input."
    TC5_required_width = "Equivalent to the time on the curve used for the crank input."
    secondtrigopts1 = "Enables ignoring of bogus tach pulses, they will still be recorded in the composite logger."
    secondtrigopts2 = "The tach input is disabled for a short period of time after a valid tach pulse to mask out any bogus tach pulses."
    IC2ISR_tmask = "The absolute time after a valid tach pulse when new pulses are ignored. The time value here depends greatly on the type of tach input in use.\ne.g. a 60-2 wheel spinning at 10000rpm has a real tach pulse every 0.1ms. A distributor pickup on a 4-cyl at 600rpm has a real tach pulse every 50ms.\nThis value must be set to less than the shortest ever valid time on your install."
    IC2ISR_pmask = "This works as a percentage of the last valid tooth time. 30-50% are typical values."

    crankingRPM = "Set this a few hundred RPM above your typical fast cranking speed."
    floodClear = "Above this throttle position no fuel will be injected during cranking to help clear a flood situation. It will also disable priming."
    feature7_batchcrank = "Allows fuel to be fired on each tach event in a batch-fire mode on a sequential install. Can be useful in cold climates to allow large cranking fuel flow."
    feature7_cranktaper = "Allows a taper curve on crank pulsewidth, either to reduce pulsewidth over time, or to allow an initial large shot of fuel."
    feature7_crtpunits = "Selects units of ignition events or 0.1 seconds."
    alternate_blend = "Enables a blend curve between cranking curves."
    altcrank = "Engines with many cylinders such as V12 may find that the injecting fuel on every tach event gives difficult hot starting due to small pulsewidths.\nThis option allows the fuel to be injected on alternate events (with twice the pulse width)"
    primedelay = "Delays the priming pulses to allow a lazy fuel pump to build pressure."
    feature3_matase = "Can be used to help with perceived heat-soak issues."
    feature3_aseunit = "Selects whether After Start Enrichment (ASE) uses Seconds or Ignition Events as the timer."

    shift_cut_on = "Enables the sequential / bike shift cut system."
    shift_cut_auto = "Whether the system operates from a pushbutton or automatically."
    shift_cut_fuel = "Whether to also cut fuel."
    shift_cut_in = "Input used for the button."
    shift_cut_out = "Output to the shift solenoid."
    shift_cut_rpm = "Minimum RPM to allow shifting."
    shift_cut_tps = "Minimum throttle to allow shifting."
    shift_cut_delay = "The solenoid is activated immediately, then wait this long before cutting spark."
    shift_cut_time = "How long to cut spark for."
    shift_cut_gear = "Option to add additional spark cut time per gear."
    shift_cut_add12 = "Additional time to cut spark for this shift."
    shift_cut_add23 = "Additional time to cut spark for this shift."
    shift_cut_add34 = "Additional time to cut spark for this shift."
    shift_cut_add45 = "Additional time to cut spark for this shift."
    shift_cut_add56 = "Additional time to cut spark for this shift."
    shift_cut_soldelay = "How long to keep the solenoid powered after the spark is returned."
    shift_cut_reshift = "Ignore button for this long after shifting - to prevent a false shift."
    shift_cut_rpm12 = "Shift at this rpm."
    shift_cut_rpm23 = "Shift at this rpm."
    shift_cut_rpm34 = "Shift at this rpm."
    shift_cut_rpm45 = "Shift at this rpm."
    shift_cut_rpm56 = "Shift at this rpm."

    ac_idleup_settings = "Enables the A/C idle-up feature."
    ac_idleup_settings_inv = "Sets the active state of the input.\nNormally, the idle-up switch input is a ground-switch and the 'Normal' settings should be used. In certain installations with appropriate wiring, the 'Inverted' setting can be required."
    ac_idleup_io_out = "Output to engage compressor."
    ac_idleup_io_in = "Switch input."
    ac_idleup_set2_tps = "Whether TPS is used to shutdown the AC."
    ac_idleup_set2_vss = "Whether VSS is used to shutdown the AC."
    ac_idleup_set2_rpm = "Whether the maximum RPM setting is used."
    ac_idleup_set2_outinv = "Allows output logical state to be inverted. (Doesn't change the voltage capability of the output.)"
    ac_idleup_delay = "Delay after switch is pressed before engaging compressor."
    ac_idleup_min_rpm = "Lowest RPM that AC compressor can be turned on."
    ac_delay_since_last_on = "Sets a delay to prevent rapid cycling on/off."
    ac_idleup_adder_duty = "Additional PWM idle duty cycle to add when A/C is active."
    ac_idleup_adder_steps= "Additional idle steps to add when A/C is active."
    ac_idleup_cl_targetadder= "Bump up RPM by this much when A/C is active."
    ac_idleup_tps_offpoint = "Disable A/C when TPS is above this. (Reduces load on engine when driver demands full power.)"
    ac_idleup_tps_hyst = "Deadband in TPS to prevent bouncing on/off."
    ac_idleup_vss_offpoint = "Disable A/C above this speed."
    ac_idleup_vss_hyst = "Deadband in VSS to prevent bouncing on/off."
    ac_idleup_max_rpm = "Maximum allowed RPM for AC."

    idleadvance_on = "Enables Idle-advance feature"
    idle_special_ops_timing_assist = "Enables additional advance curve linked to closed-loop idle target. This allows you to use timing control to assist with idle speed regulation."
    idleveadv_to_pid_idleadv = "Either links idle-advance with closed-loop idle or allows idle advance to have its own conditions."
    idleadvance_clt = "Only activate above this coolant temperature. (Typically idle-advance does not work too well during warmup.)"
    idleadvance_delay = "After the conditions are met, wait this long before enabling idle-advance. This helps reduce false activations."

    idleve_on = "Enables Idle-VE feature"
    idleveadv_to_pid_idleve = "Either links idle-advance with closed-loop idle or allows idle advance to have its own conditions."
    idleve_clt = "Only activate above this coolant temperature. (Typically idle-VE does not work too well during warmup.)"
    idleve_delay = "After the conditions are met, wait this long before enabling idle-advance. This helps reduce false activations."

    knk_option = "Disabled: do not use knock feedback for ignition advance control\nSafe Mode: use knock retard, but keep the advance below that which caused knock. This backs the advance 1 small step back and leaves it at that until TPS or MAP changes - or knock comes back. This is 'safe mode' scheme is the safest thing for a DIY set-up.\nAggressive Mode: use knock retard, but keep advance at threshold of knock occurring. That is, the program advances (up to the timing table value) if it doesn't see knock, and retards if does see knock. The difference from safe mode is that the timing can be advance all the way to the table value after knock, not just up to one step below knock. This may result in the knock returning, in which case the timing is retarded again, then advanced slowly, and so on."
    knk_option_an = "On/Off: basic on/off 'knock' or 'no-knock' external input.\nAnalogue: external analogue input proportional to knock signal level\nInternal: internal knock module."
    knkport = "Input for knock on/off signal"
    knkDirection = "The logic input level. i.e. when set to 'low' then a 0V signal means there is knock. This matches the GM module"
    knkpull = "Whether an internal pull-resistor should be applied. When using the suggested Datalog/Tableswitch/Launch input pin set to 'None'"
    knkport_an = "Input for knock analogue signal"
    knk_option_wind = "Either read single analogue value at end knock window or peak detect."
    knk_pin_out = "Optional digital output for knock window signal."
    knk_ndet = "Number of knock events detected before control is started."
    knk_maxmap = "Disable knock retard above this MAP."
    knk_lorpm = "Knock control is implemented above this RPM"
    knk_hirpm = "Knock control is implemented below this RPM"
    knk_maxrtd = "Maximum total retard when knock occurs."
    knk_trtd = "The time between knock retard corrections"
    knk_step1 = "How much to retard by on each correction step when knock is first detected. Make it large to quickly retard the timing and stop knock."
    knk_step2 = "How much to retard by on each correction step if knock restarts after it had stopped."
    knk_tadv = "The time between knock advance corrections (i.e. timing return to normal)"
    knk_step_adv = "The ignition advance step size after knock has stopped."
    knk_dtble_adv = "If ignition table timing changes by this much then return to normal timing as operating in different area."
    knock_bpass = "This should be adjusted to suit the resonant frequency of you engine."
    knock_int = "How long the signal is sampled for."
    knock_conf_num = "How many knock sensors (1 or 2)"
    knock_conf_launch = "Knock detection can be disabled when launch/flatshift or anti-lag are active to prevent false detection."
    knock_conf_percyl = "Enables linking of knock signal to cylinder number. This only works if coil-on-plug or sequential fuel are enabled."
    knock_conf_percylact = "Enables per-cylinder timing adjustment for knock.\nRequires a knock feedback system such as the internal one that reports knock per-cylinder."
    knock_conf_debug = "Debug option to record per-cylinder knock retards into 'sensors' variables. This will over-write the generic sensor values."
    knock_gain01 = "Compensate for sensor sensitivity and distance between cylinder and sensor."
    knock_sens01 =  "Pick which sensor to use for each cylinder."
    AE_options = "Selects between time-based accel enrichment or pump-style enrichment."
    EAEOption = "Enables a well-wetting transient system."
    feature7_aetpswot = "Enables a curve to model effective 100% TPS for a given RPM. This allows smaller throttle movements to be more responsive at lower RPMs and ignores changes in throttle above 'wide-open'."
    mapThresh = "Trigger enrichment above this MAPdot value."
    aeEndPW = "After main enrichment event, taper down to this amount of enrichment.\n0 is suggested."
    feature7_aeevents = "Length of enrichment pulse is measured in ignition events or seconds.\n(Primary and secondary fuel.)"
    tpsasync_events = "Length of enrichment pulse."
    tpsasync2_events = "Length of enrichment taper."
    taeTime = "Length of main enrichment pulse."
    aeTaperTime = "Length of 'taper' time after main enrichment pulse.\n0 is suggested."
    tpsThresh = "Trigger enrichment above this TPSdot value."
    tdePct = "Deceleration fuel cut amount in percent. 100% is no cut, 0% is complete cut of fuel.\n100% is suggested."
    taeColdA = "At full cold (-40C/F), add this amount to the enrichment."
    taeColdM = "At full cold (-40C/F), multiply the enrichment by this percentage."
    ae_lorpm2 = "Below this RPM full enrichment is enabled.\n(Second fuel.)"
    ae_hirpm2 = "Above this RPM, there is no enrichment. In between the enrichment is on a sliding scale.\n(Second fuel.)"
    tpsProportion = "The balance between MAPdot and TPSdot for accel enrichment. 0% is fully MAPdot, 100% is fully TPSdot."

    mapThresh2 = "Trigger enrichment above this MAPdot value.\n(Second fuel.)"
    aeEndPW2 = "After main enrichment event, taper down to this amount of enrichment.\n0 is suggested.\n(Second fuel.)"
    taeTime_events2 = "Length of enrichment pulse.\n(Second fuel.)"
    aeTaperTime_events2 = "Length of enrichment taper.\n(Second fuel.)"
    taeTime2 = "Length of main enrichment pulse.\n(Second fuel.)"
    aeTaperTime2 = "Length of 'taper' time after main enrichment pulse.\n0 is suggested.\n(Second fuel.)"
    tpsThresh2 = "Trigger enrichment above this TPSdot value.\n(Second fuel.)"
    tdePct2 = "Deceleration fuel cut amount in percent. 100% is no cut, 0% is complete cut of fuel.\n100% is suggested.\n(Second fuel.)"
    taeColdA2 = "At full cold (-40C/F), add this amount to the enrichment.\n(Second fuel.)"
    taeColdM2 = "At full cold (-40C/F), multiply the enrichment by this percentage.\n(Second fuel.)"
    ae_lorpm2 = "Below this RPM full enrichment is enabled.\n(Second fuel.)"
    ae_hirpm2 = "Above this RPM, there is no enrichment. In between the enrichment is on a sliding scale.\n(Second fuel.)"
    tpsProportion2 = "The balance between MAPdot and TPSdot for accel enrichment. 0% is fully MAPdot, 100% is fully TPSdot.\n(Second fuel.)"

    accel_mapdot_threshold = "Trigger enrichment above this MAPdot value."
    accel_tpsdot_threshold = "Trigger enrichment above this TPSdot value."
    accel_CLT_multiplier = "At full cold (-40C/F), multiply the enrichment by this percentage."
    accel_blend_percent = "The balance between MAPdot and TPSdot for accel enrichment. 0% is fully MAPdot, 100% is fully TPSdot."
    accel_mapdot_threshold2 = "Trigger enrichment above this MAPdot value.\n(Second fuel.)"
    accel_tpsdot_threshold2 = "Trigger enrichment above this TPSdot value.\n(Second fuel.)"
    accel_CLT_multiplier2 = "At full cold (-40C/F), multiply the enrichment by this percentage.\n(Second fuel.)"
    accel_blend_percent2 = "The balance between MAPdot and TPSdot for accel enrichment. 0% is fully MAPdot, 100% is fully TPSdot.\n(Second fuel.)"
    als_in_pin = "Enables the Anti-Lag system and selects the Enable input."
    als_maxtps = "Disable ALS above this TPS%."
    als_minrpm = "Disable ALS below this RPM."
    als_maxrpm = "Disable ALS above this RPM."
    als_maxmat = "Disable ALS above this manifold temperature."
    als_maxtime = "Only allow ALS to be active for this long to reduce temperature build-up."
    als_pausetime = "Enforce a minimum time between activations to reduce temperature build-up."
    als_minclt = "Disable ALS below this coolant temperature."
    als_maxclt = "Disable ALS above this coolant temperature."
    als_opt_fc = "Whether cyclic fuel cut should be used. ONLY for use with sequential fuel."
    als_opt_sc = "Whether cyclic spark cut should be used."
    als_opt_ri = "Whether roving idle fuel cut should be used."
    als_opt_idle = "Enables the idle valve in ALS mode."
    als_iac_duty = "What valve duty should be used to give the extra air needed for ALS."
    als_iac_steps = "What valve steps should be used to give the extra air needed for ALS."
    als_out_pin = "Enables an additional output in ALS mode for extra-air valve."
    als_opt_pwmout = "Enables an additional pulsed output in ALS mode."
    als_pwm_opt2 = "Pulsed output."
    als_pwm_duty = "Duty cycle on pulsed output when ALS is active."
    als_pwm_opt_freq = "Frequency on pulsed output."

    vvt_opt1_on = "Enables VVT control and selects number of cams to control."
    vvt_startdelay = "Optionally delays VVT activation after start to allow oil pressure to build up."
    vvt_opt1_filter = "Enables a filter on the VVT teeth to reject false triggers."
    vvt_opt4_decode = "Enables a special decoder if applicable.\n\nThe BMW S54 decoder also supports S62. Wire main VVT outputs to opening solenoids 1, wire the complementary outputs to closing solenoids 2. Use 20Hz."
    vvt_opt6_freq = "VVT solenoid PWM frequency."
    vvt_opt2_pid2 = "Chooses between basic on/off mode or variable position control."
    vvt_opt5_add1 = "Whether to adjust injection timing based on cam position and which cam."
    vvt_opt5_add2 = "If injector timing is being adjusted, whether to adjust it based on target or actual current position."
    vvt_onoff_ang = "Angle to advance injector timing by when VVT is active."
    vvt_opt7_yaxis = "The load unit used for the Y-axis on the lookup tables."
    vvt_opt1_int = "How often to run the calculations.\nSynced to cam is most typical meaning that the calculations are run as soon as new cam tooth passes the sensor." 
    vvt_ctl_ms = "Specifies a fixed calculation interval."
    vvt_opt5_err = "Whether error checking should be applied to the measured cam angles."
    vvt_opt1_tst = "Selects a cam output to test."
    vvt_test_duty = "What duty cycle to output to the VVT solenoid."
    vvt_opt2_use_hold_intake = "Some VVT systems will hold at a fixed position when a certain duty cycle is applied, enable this on those systems. Others have no specific hold-duty."
    vvt_hold_duty = "Specific hold duty."
    vvt_ctl_Kp = "Proportional gain for closed-loop control. Proportional control causes immediate changes to output duty with changes in VVT position difference."
    vvt_ctl_Ki = "Integral gain for closed-loop control. Integral control causes changes in duty with VVT position difference over time. The longer VVT is off target, the stronger the reaction due to the integral term."
    vvt_ctl_Kd = "Derivative gain for closed-loop control. Derivative control causes larger reactions in duty with faster rate of change of VVT position difference. The faster the difference changes, the more duty will change to counteract."
    vvt_opt2_use_hold_exhaust = "Some VVT systems will hold at a fixed position when a certain duty cycle is applied, enable this on those systems. Others have no specific hold-duty."
    vvt_hold_duty_exh = "Specific hold duty."
    vvt_ctl_Kp_exh = "Proportional gain for closed-loop control. Proportional control causes immediate changes to output duty with changes in VVT position difference."
    vvt_ctl_Ki_exh = "Integral gain for closed-loop control. Integral control causes changes in duty with VVT position difference over time. The longer VVT is off target, the stronger the reaction due to the integral term."
    vvt_ctl_Kd_exh = "Derivative gain for closed-loop control. Derivative control causes larger reactions in duty with faster rate of change of VVT position difference. The faster the difference changes, the more duty will change to counteract."
    vvt_opt1_dir_exhaust = "Whether the exhaust cam table is a table of advances (old method) or a table of retards (matches most exhaust VVTs.)"
    vvt_opt3_cam1 = "Cam1 is always the main cam input."
    vvt_opt2_cam1pol = "Cam1 capture polarity is defined on the Ignition Options page." 
    vvt_tth1 = "The number of effective teeth on the cam1 trigger wheel."
    vvt_out1 = "VVT1 solenoid output"
    vvt_min_ang1 = "The minimum absolute angle from the cam sensor."
    vvt_max_ang1 = "The maximum absolute angle from the cam sensor."
    vvt_opt5_vvt1 = "Whether this is an intake or exhaust cam."
    vvt_cam1tth1 = "Application specific, look for cam tooth after this crank tooth."
    vvt_cam1tth2 = "Application specific, look for cam tooth after this crank tooth."
    vvt_out1_dir = "What direction the cam moves with output duty."
    vvt_opt3_cam2 = "The input for cam2."
    vvt_opt2_cam2pol = "The capture polarity for cam2.\n(If reported cam angle changes unexpectedly with RPM while the cam is stationary, try swapping polarity." 
    vvt_tth2 = "The number of effective teeth on the cam2 trigger wheel."
    vvt_out2 = "VVT2 solenoid output"
    vvt_min_ang2 = "The minimum absolute angle from the cam sensor."
    vvt_max_ang2 = "The maximum absolute angle from the cam sensor."
    vvt_opt5_vvt2 = "Whether this is an intake or exhaust cam."
    vvt_cam2tth1 = "Application specific, look for cam tooth after this crank tooth."
    vvt_cam2tth2 = "Application specific, look for cam tooth after this crank tooth."
    vvt_out2_dir = "What direction the cam moves with output duty."
    vvt_opt3_cam3 = "The input for cam3."
    vvt_opt2_cam3pol = "The capture polarity for cam3.\n(If reported cam angle changes unexpectedly with RPM while the cam is stationary, try swapping polarity." 
    vvt_tth3 = "The number of effective teeth on the cam3 trigger wheel."
    vvt_out3 = "VVT3 solenoid output"
    vvt_min_ang3 = "The minimum absolute angle from the cam sensor."
    vvt_max_ang3 = "The maximum absolute angle from the cam sensor."
    vvt_opt5_vvt3 = "Whether this is an intake or exhaust cam."
    vvt_cam3tth1 = "Application specific, look for cam tooth after this crank tooth."
    vvt_cam3tth2 = "Application specific, look for cam tooth after this crank tooth."
    vvt_out3_dir = "What direction the cam moves with output duty."
    vvt_opt3_cam4 = "The input for cam4."
    vvt_opt2_cam4pol = "The capture polarity for cam4.\n(If reported cam angle changes unexpectedly with RPM while the cam is stationary, try swapping polarity." 
    vvt_tth4 = "The number of effective teeth on the cam4 trigger wheel."
    vvt_out4 = "VVT4 solenoid output"
    vvt_min_ang4 = "The minimum absolute angle from the cam sensor."
    vvt_max_ang4 = "The maximum absolute angle from the cam sensor."
    vvt_opt5_vvt4 = "Whether this is an intake or exhaust cam."
    vvt_cam4tth1 = "Application specific, look for cam tooth after this crank tooth."
    vvt_cam4tth2 = "Application specific, look for cam tooth after this crank tooth."
    vvt_out4_dir = "What direction the cam moves with output duty."
    vvt_minclt = "VVT only operates when coolant is above this temperature."
    vvt_minduty1 = "Minimum duty cycle for VVT solenoids"
    vvt_maxduty1 = "Maximum duty cycle for VVT solenoids"
    vvt_slew = "Limits rate of change of VVT target to minimise overshoot caused by rapid target changes or low oil pressure at low rpms.\nDefault is 2.0deg per cam event."
    vvt_softout1 = "Complementary (Closing) Solenoid Output for dual-solenoid VANOS systems S54, S62."
    vvt_softout2 = "Complementary (Closing) Solenoid Output for dual-solenoid VANOS systems S54, S62."
    vvt_softout3 = "Complementary (Closing) Solenoid Output for dual-solenoid VANOS systems S54, S62."
    vvt_softout4 = "Complementary (Closing) Solenoid Output for dual-solenoid VANOS systems S54, S62."

    f5_0_tsf = "Enables fuel table switching."
    f5_0_tsf_opt = "Hardware = Physical switch or blend curve\nRPM,kPa,TPS allow switching above threshold set below."
    tsw_pin_f = "Table switch input."
    tsf_rpm = "RPM threshold."
    tsf_kpa = "kPa threshold."
    tsf_tps = "TPS threshold."
    f5_0_tss = "Enables spark table switching."
    f5_0_tss_opt = "Hardware = Physical switch or blend curve\nRPM,kPa,TPS allow switching above threshold set below."
    tsw_pin_s = "Table switch input."
    tss_rpm = "RPM threshold."
    tss_kpa = "kPa threshold."
    tss_tps = "TPS threshold."
    tsw_pin_rf = "Enables ReqFuel switch input."
    ReqFuel_alt = "ReqFuel to use when switched."
    tsw_pin_afr = "Enables AFR table switch input."
    tsw_pin_stoich = "Enables Stoich switch input."
    stoich_alt = "Stoich to use when switched."
    dualfuel_sw_on = "Enables Dual Fuel support (e.g. LPG or secondary race fuel on a different system.)"
    dualfuel_opt_mode = "Switching = swaps from fuel 1 to fuel 2.\nDual Table = parallel fuel tables allowing simultaneous control of both fuels. e.g. mapped methanol under boost.\nFlex Blend = ethanol %age from flex fuel sensor is used to blend between two sets of tables."
    dualfuel_opt_out = "Shared outputs = used when two sets of injectors share one set of control wires from the ECU and have a relay to switch +12V.\nDifferent outputs = where each main and secondary injectors are wired to different outputs."
    dualfuel_pin = "Input for Dual Fuel switching."
    dualfuel_sw_fuel = "Whether to switch fuel tables."
    dualfuel_sw_spk = "Whether to switch spark tables."
    dualfuel_sw_afr = "Whether to switch AFR tables."
    dualfuel_sw_rf = "Whether to switch ReqFuel."
    dualfuel_sw_stoich = "Whether to switch Stoich."
    dualfuel_sw_wue = "Whether to switch warmup curves."
    dualfuel_sw_ase = "Whether to switch afterstart curves."
    dualfuel_sw2_prime = "Whether to switch priming curves."
    dualfuel_sw2_crank = "Whether to switch cranking pulse curves."
    dualfuel_sw2_injp = "Whether to switch injector parameters."
    dualfuel_sw2_smpw = "Whether to switch small pulsewidth curves."
    dualfuel_sw2_ob = "Whether to switch overboost limits."
    dualfuel_sw2_boosw = "Whether to switch boost tables."
    dualfuel_sw2_ae = "Whether to switch accel enrich settings and curves."
    dualfuel_opt_temp = "Enable secondary fuel temperature adjustment."
    dualfuel_temp_sens = "Secondary fuel temperature Generic Sensor input."
    dualfuel_opt_press = "Enable secondary fuel pressure adjustment."
    dualfuel_press_sens = "Secondary fuel pressure Generic Sensor input."
    dualfuel_press_type = "Sensor type: Gauge, Absolute, Differential"
    slew_opts_tss = "Enable spark slew rate limiting on increases in advance immediately after table switching. This can be useful to avoid sudden increases in engine torque."
    slew_rate_global = "The maximum increase in spark timing in degrees per tenth of a second when in slew control mode."

    vss_opt0_1 = "Type of speed sensor connection.\nDigital = any pulse input or capture from an expansion board.\nAnalogue = 0-5V input directly reporting speed (rare.)" 
    vss1_an = "Input for analogue 0-5V speed sensor."
    vss1_an_max = "Speed at 5V input."
    vss_opt1 = "Selects digital pulse input or input via CAN from expansion board."
    wheeldia1 = "Overall diameter of wheel and tyre."
    vss1_pos = "Whether speed sensor teeth are mounted\n-Directly on the wheel\n-on the driveline/trans\n-as pulses per mile\n-as pulse per km."
    reluctorteeth1 = "Number of teeth on speed pickup reluctor."
    vss1_pwmseq = "CAN PWM port for capturing from expansion board." 
    vss1_can_scale = "Scaler to convert from one unit system to another. (MS3 uses 0.1 ms-2 internally, so to convert from 0.1 mph use 45.6%" 
    vss1_can_scale_pulse = "Number of pulses per mile/km" 
    vss1LF = "Smoothing factor. 100% = no smoothing, 15% = maximum smoothing."
    vss_opt0_2 = "Type of speed sensor connection.\nDigital = any pulse input or capture from an expansion board.\nAnalogue = 0-5V input directly reporting speed (rare.)" 
    vss2_an = "Input for analogue 0-5V speed sensor."
    vss2_an_max = "Speed at 5V input."
    vss_opt2 = "Selects digital pulse input or input via CAN from expansion board."
    wheeldia2 = "Overall diameter of wheel and tyre."
    vss2_pos = "Whether speed sensor teeth are mounted\n-Directly on the wheel\n-on the driveline/trans\n-as pulses per mile\n-as pulse per km."
    reluctorteeth2 = "Number of teeth on speed pickup reluctor."
    vss2_pwmseq = "CAN PWM port for capturing from expansion board."
    vss2_can_scale = "Scaler to convert from one unit system to another. (MS3 uses 0.1 ms-2 internally, so to convert from 0.1 mph use 45.6%" 
    vss1_can_scale_pulse = "Number of pulses per mile/km" 
    vss2LF = "Smoothing factor. 100% = no smoothing, 15% = maximum smoothing."
    vss_opt0_3 = "Type of speed sensor connection.\nDigital = any pulse input or capture from an expansion board.\nAnalogue = 0-5V input directly reporting speed (rare.)" 
    vss3_an = "Input for analogue 0-5V speed sensor."
    vss_opt3 = "Selects digital pulse input or input via CAN from expansion board."
    vss3_pwmseq = "CAN PWM port for capturing from expansion board."
    vss_opt0_4 = "Type of speed sensor connection.\nDigital = any pulse input or capture from an expansion board.\nAnalogue = 0-5V input directly reporting speed (rare.)" 
    vss4_an = "Input for analogue 0-5V speed sensor."
    vss_opt4 = "Selects digital pulse input or input via CAN from expansion board."
    vss4_pwmseq = "CAN PWM port for capturing from expansion board."
    vssout_opt = "Digital pulsed output to drive a speedometer."
    vssout_optunits = "Type of output conversion."
    vssout_scale = "Scaling factor."
    vssdot_int = "How often to calculate VSSdot (acceleration.)"
    vssdotLF = "Smoothing factor on VSSdot. 100% = no smoothing, 15% = maximum smoothing."
    fdratio1 = "Final drive gear ratio."
    gear_method = "How to determine gear no.\nVSS/RPM - compares the vehicle speed with RPM and the gear ratio table.\nAnalogue - uses a 0-5V analogue gear-position-sensor input.\nCAN gear# - uses a gear number from an expansion board over CAN."
    gear_no = "How many gears."
    gear1ratio = "Ratio of each gear."
    gear_port_an = "Analogue input for gear-position-sensor."
    gear0v = "Nominal voltage in each position."
    vss_samp_int = "How often to sample/accumulate VSS teeth. Normally 50ms is ok and gives smoothing.\nHard accelerating vehicles will need to lower this number for improved zero-speed response."

    ss_opt1 = "Selects digital pulse input."
    reluctorteeth3 = "Number of pickup teeth on reluctor."
    ss_opt1_spd = "Where possible, configures this as a high-speed input."
    ss1LF = "Smoothing factor. 100% = no smoothing, 15% = maximum smoothing."
    ss_opt2 = "Selects digital pulse input."
    reluctorteeth4 = "Number of pickup teeth on reluctor."
    ss_opt2_spd = "Where possible, configures this as a high-speed input."
    ss2LF = "Smoothing factor. 100% = no smoothing, 15% = maximum smoothing."

    accXport = "Analogue 0-5V input for X-axis."
    accYport = "Analogue 0-5V input for Y-axis."
    accZport = "Analogue 0-5V input for Z-axis."
    accXcal1 = "Calibration value when X is -1g. See the manual."
    accXcal2 = "Calibration value when X is +1g. See the manual."
    accYcal1 = "Calibration value when Y is -1g. See the manual."
    accYcal2 = "Calibration value when Y is +1g. See the manual."
    accZcal1 = "Calibration value when Z is -1g. See the manual."
    accZcal2 = "Calibration value when Z is +1g. See the manual."
    accxyzLF = "Smoothing factor. 100% = no smoothing, 15% = maximum smoothing."

    log_style_on2 = "Enables SDcard datalogging.\nAlways - log always.\nButton - use a button to start and stop logs.\nTrigger - start logs when trigger condition is met."
    log_style2_but = "Digital switch input."
    log_style4_opt = "Type of trigger to start logging."
    log_trig_rpm = "Start logging above this RPM."
    log_trig_tps = "Start logging above this TPS or MAP kPa"
    log_trig_map = "Start logging above this MAP"
    sdpulse_out = "Typically used to synchronise a video camera recording, sends a low pulse at the start of a datalog."

    log_style_led = "Output for LED or indicator lamp."
    log_style_block = "Type of datalog to record.\n64byte = regular SDcard datalog.\n64byte+stream = datalog plus simulataneous audio soundtrack."
    log_style2_samp = "Timed = suitable for all installs.\nCycle/tooth = for developer use."
    log_int = "How often to record data.\nLower limit for most cards is 3ms."
    log_length = "How long each datalog file should be. After this time a new logfile is started."
    log_style3_adc = "Optional analogue (sound) stream input."
    log_style2_ledspd = "Unless advised otherwise, use 'Normal'"
    log_style2_cont = "Whether to start a new log or stop when a log is completed."
    log_style2_alwaysin = "Whether to assume SDcard is always present."
    log_style_gps = "Enables the recording of interleaved GPS data.\n\nRequires a CAN connected GPS module."

    egt_num = "Number of EGT channels to enable."
    egtcal_temp0 = "Temperature at 0V."
    egtcal_tempmax = "Temperature at 5V - depends on interface design."
    egt_conf_action = "EGT over-temperature reactions"
    egt_warn = "Turn on warning output above this temperature."
    egt_addfuel = "Bump up pulsewidth on over-temperature."
    egt_conf_bank = "Most installs should use 'Both' Bank1,2 only apply to Staged primary and secondaries."
    egt_conf_shutdown = "Enables engine shutdown if above max temperature or too long above warning limit."
    egt_conf_percyl = "For sequential fuel ONLY, allows fuel to be added per cylinder.\nRequires that EGT1 = #1, EGT2 = #2 etc."
    egt_conf_input = "Manual = each channel is selected in turn.\nCANEGT = listens to 11bit CAN broadcasts from CANEGT.\n** The CANEGT must be configured for this mode. **"
    egt_conf_numbering = "For V8 installs with two 4-channel boxes it is typical to use one box per side. Select the cylinder numbering that matches your engine."
    canegt_base = "Base CAN identifier, by default this is 1680 and should not need changing.\nFor CANEGT, EGT1-4 are on base, EGT5-8 are on base+1, EGO1-4 are on base+2, EGO5-8 are on base+3."
    canegt_base2 = "Base CAN identifier for channels 9-12, this will need changing to match your second CANEGT."
    canego_base = "Base CAN identifier, by default this is 80. Lambda 1 is on base, Lambda 2 is on base +1 etc."
    egt_time = "Shutdown if above warning temperature for this long."
    egt_max = "Shutdown if temperature exceeds this maximum (even for a split second.)"
    egt1port = "Analogue 0-5V input from thermocouple. (Note that an interface circuit is required.)"

    sensor01_source = "Analogue 0-5V input."
    sensor01Alias = "User defined name assigned to this sensor input. e.g. pre-intercooler air temperature."
    sensor01_trans = "Type of transformation from raw input to useful numbers.\nRaw = raw 0-1023 ADC count\nLinear = useful for many ratiometric sensors with a linear scale.\nSame as XXX applies the same transform as other sensors on your ECU.\nCustom#1 = uses calibration you programmed through Calibrate Thermistor Tables.\nGM calibration = same transform as GM air/coolant thermistor sensors."
    sensor01_val0 = "Sensor reading at low calibration point (e.g. 0V or 0.5V)"
    sensor01_max = "Sensor reading at high calibration point (e.g. 5V or 4.5V)"
    sensor01LF = "Smoothing factor. 100% = no smoothing, 15% = maximum smoothing."
    opt142_gs_share = "Normally each input can only be used by one feature. This setting allows inputs to be shared between generic sensors and other features. (Obviously you can still only connect one sensor to each input!)"
    sensor_temp = "Selects degF/degC for temperature units when using CLT/MAT calibrations. This is set on the Generic Sensors page."

    tc_opt_on = "Enables traction control"
    tc_led_out = "Light output when traction is active."
    tc_opt_method = "Traction control method:\nPerfect Run = a drag race strategy for a single pass comparing actual VSS against best possible.\nVSS %slip = compares VSS1 to VSS2 and detects slip%.\nPerfect Run RPM = similar to perfect run but without VSS for classes where that is not allowed.\nSwitch input = for use with an external slip detector.\nNone = Disables the primary traction methods, but allows the option of the speed difference table."
    tc_enin = "Optional digital switch input"
    tc_mintps = "Only enable traction control above this TPS%"
    tc_minmap = "Only enable traction control above this MAP"
    tc_minvss = "Only enable traction control above this VSS"
    tc_opt_slipcurve = "Whether to use a fixed slip% limit or an adjustable curve."
    tc_slipthresh = "Fixed slip% limit."
    tc_opt_n2o = "Only on/off control is presently supported."
    tc_opt_bank = "Which bank of injectors to add fuel to.\nNormally select 'Both'\nWhen staging bank 1 = primary, bank 2 = secondary"
    tc_opt_driven = "Which sensors are used as the 'driven' speed in calcs.\nSide2side compares VSS1 with VSS2 and compares VSS3 with VSS4. Whichever side has the most slip is then used for the remaining calculations."
    tc_opt_undriven = "Which sensors are used as the 'undriven' speed in calcs.\nSide2side compares VSS1 with VSS2 and compares VSS3 with VSS4. Whichever side has the most slip is then used for the remaining calculations."
	tc_opt3_vssdiff = "Enables VSS1 vs. VSS2 speed difference timing retard table - this works on top of any other traction method."
    launch_opt_on = "Off - all of launch is turned off\nLaunch - launch only, no flat shift\nLaunch/flatshift - launch and flat shift.\n(Flat shift is used on manual gearboxes for full throttle shifts with a clutch switch to engage the limiter.)"
    launch_opt2_ignorerpm = "Off: RPMs must reach the lower RPM limiter before launch is considered 'on' allowing timers to run when the button or switch is released.\nOn: RPMs are ignored, if button is pressed and other conditions are met, then timers will begin when button or switch is released. This can be useful if you stage incorrectly and don't bring the engine up to the limiter."
    launch_opt_vss = "Enables wheel speed based launch instead of switch input. Select the wheel-speed sensor for a non-driven wheel."
    launch_opt_pins = "Input for launch switch."
    launch_sft_zone = "The soft limit is this many rpm below the hard limit. (This is sometimes called the control range.) 200rpm is typical."
    launch_sft_deg = "The absolute timing to retard to. i.e. 5 gives 5 BTDC timing."
    launch_opt_bank = "Allows fuelling to be changed while the launch limiter is on."
    launch_addfuel = "The raw millisecond pulsewidth change to make (+/-)"
    launch_tps = "Launch is only active when the throttle is open a certain percentage. Most users can safely set this to a very low number."
    launch_hrd_lim = "Above this rpm the hard limiter methods are used when the launch conditions are met."
    launchlimopt = "-None - do not use \n-Spark cut - drop sparks, this is the most common limiter used. (Will not work with EDIS ignition.)\n-Fuel cut - cuts fuel.\n-Spark and fuel - both"
    launchlimopt_adv = "Basic = limiter type is automatically set\nAdvanced = Choice of hard limiter type and spark cut zone.\n\nApplies to launch and flat-shift."
    launchlimopt_cut = "Selects the spark cut limiter type.\nRandom Progressive = random cut that increases linearly across the spark cut zone.\nRandom Ramped = random cut that ramps up across the spark cut zone.\nFixed 5/7 = non-progressive rotational cut. 5 missed sparks, 2 actual sparks, repeat.\nFixed 4/5 = non-progressive rotational cut. 4 missed sparks, 1 actual spark, repeat."
    launchlimopt_map = "Enables a lookup curve for launch hard limit RPM based on MAP. This can be used to adjust limiter behaviour during turbo spool."
    launchvsstime = "Once you have been moving for this number of seconds, VSS based launch control is locked out until next stop.\nSet to zero to make it permanently active (no timeout.)"
    launch_fcut_rpm = "During the flat-shift up-shift and the revs are falling, the fuel is cut off until the revs have fallen below this set point to reduce exhaust explosions."
    launch_maxvss = "Prevents launch from activating once you are rolling."
    launchvss_minvss = "Below this speed the wheel speed launch is re-armed.\n\nTypically set to a very low number."
    launch_opt_vssgear = "Enables/disables checking of gear no.\n\n(Requires gear detection to be enabled.)"
    launchvss_maxgear = "Wheel speed launch is applied up to this gear number.\n\ne.g. 2 means launch can be used in 1st and 2nd."
    launchcutzone = "The RPM band below the hard limit where spark cutting begins.\nCan be set to 0 to apply spark cutting only at the hard limit when using the fixed limiter types.\nThe random cuts need an RPM band to operate across 200+ RPM suggested."
    launchcuttiming = "The ignition timing during the cut zone and at the hard limit.\nOnly applies to launch - not flat-shift."
    flats_minvss = "Prevents flat-shift from activating at low speeds e.g. just after launch"
    flats_arm = "This rpm set point is used to differentiate between a flat shift and launch condition, typically set to a few hundred RPM above idle."
    flats_deg = "The absolute timing to retard to. i.e. 5 gives 5 BTDC timing."
    flats_hrd = "Above this rpm the hard limiter methods are used when the flat-shift conditions are met."
    launch_opt_retard = "Enables feature to feed in timing after launch."
    launch_var_on = "Input for 0-5V potentiometer used to vary launch RPM."
    launch_var_low = "With a 0V input, the launch hard limit is set to this RPM."
    launch_var_up = "With a 5V input, the launch hard limit is set to this RPM."
    launch_3step_in = "Input for 3-step switch. Could be used as burnout limiter."
    launch_sft_deg3 = "The timing is retarded to this angle when the 3-step is on."
    launch_hrd_lim3 = "Sets the hard limit RPM when the 3-step is on."
    timedout1_in = "Input for transbrake button. Transbrake will not activate if VSS shows vehicle moving."
    timedout1_out = "Output for transbrake solenoid."
    timedout1_offdelay = "Delay between button release and transbrake release."
    tcs_in = "Push-button input for Turbo Staging control aka 'bump button'."
    tcs_offtime = "How long to release trans-brake for on each move step. This should be set long enough to move the car a little without gaining any speed."
    tcs_ontime = "How long the trans-brake should be re-activated for between each step. This should be set long enough to fully grab again."
    tcs_moves = "How many moves (trans-brake release steps) on the first press of the button. Each subsequent press of the button gives a single move." 
    tstop_out = "Output for throttle-stop solenoid."
    tstop_delay = "Delay after launch before solenoid is activated."
    tstop_hold = "How long to keep solenoid on for."
    tbrake_opt1_creep = "Single step: after first press, each additional press causes one bump/step.\n Creep mode: holding the button causes a continual series of bumps/steps."
    launch_debounce = "Debounce time on button release.\nButtons usually suffer from contact bounce. This time aims to clean up that electro-mechanical noise for a more repeatable launch or transbrake release. Default setting 0.010s.\nBracket racers may need to adjust transbrake delay."

    N2Oopt_2 = "Enables the feature."
    N2ORpm = "The minimum RPM to enable nitrous."
    N2OClt = "The minimum coolant temperature to enable nitrous."
    N2OTps = "The minimum throttle position to enable nitrous."
    N2ORpmMax = "The maximum RPM to enable nitrous."
    N2Oopt_01 = "Set to 'Both' for most installs. If 'dual table' or Staging are in use it selects which injector bank receives any additional fuel pulsewidth."
    N2Oopt2_prog = "Selects between On/Off or Progressive control mode."
    N2Oopt2_prog_time = "Chooses between Time, RPM or VSS as control factor."
    N2Oopt2_prog_freq = "Selects solenoid frequency. Typically around 13Hz."
    N2Oopt2_prog_freqf = "Allows a different fuel solenoid frequency if different fuel and nitrous outputs are used. Typically around 13Hz."
    N2Oopt2_fuel = "Whether the fuel adder percentage shares the N2O duty curve or uses its own curve. (The added fuel is a percentage of the Additional Fuel PW lookup between min and max RPMs.)"
    N2Oopt_4 = "Allows optional AFR safety system to use alternate AFR targets when nitrous is active."
    N2Oopt_5 = "Allows nitrous stage 1 during launch (2-step)."
    N2Olaunchmaxmap = "Maximimum MAP when nitrous is used during launch to build boost."
    n2o1n_pins = "Output for stage 1 nitrous solenoid."
    n2o1f_pins = "Output for stage 1 fuel solenoid."
    N2Oopt_pins = "Input to use to enable the nitrous system. (Most are ground-switch, one expects a 12V signal.)"
    n2o_enable2_pin = "Input to use to enable the second stage."
    N2OPWLo = "Fuel PW to add at the min RPM. (Tapers down between min and max.)"
    N2OPWHi = "Fuel PW to add at the max RPM. (Tapers down between min and max.)"
    N2OAngle = "Sets a fixed ignition retard when nitrous is active."
    N2Odel_launch = "Sets a minimum time after launch control is released before nitrous can activate."
    N2Odel_flat = "Sets a minimum time after flat-shift is released before nitrous can activate."
    N2Oopt_3 = "Enables the second stage."
    n2o2n_pins = "Output for stage 2 nitrous solenoid."
    n2o2f_pins = "Output for stage 2 fuel solenoid."
    N2O2Rpm = "The activation RPM for stage 2."
    N2O2RpmMax = "The maximum RPM for stage 2."
    N2O2delay = "Sets a minimum time delay after stage 1 activates before stage 2 can activate."
    N2O2Angle = "Sets an additional ignition retard when stage2 is active."
    N2O2PWLo = "Fuel PW to add at the min RPM. (Tapers down between min and max.)"
    N2O2PWHi = "Fuel PW to add at the max RPM. (Tapers down between min and max.)"
    n2o_timing_delay = "Delay after nitrous is turned off before nitrous retard is reduced. This is to allow solenoids to close and lines to empty before re-applying full timing. During this time the current nitrous retard is maintained."
    n2o_timing_taper = "Ramp time for nitrous retard after delay period. i.e. time to return from retarded to normal timing."
    n2o_opt3_pedal = "What to do if you pedal while nitrous is on:\nRe-start - the timer begins at zero again.\nContinue - timer continues where you left off."
    n2o_opt3_enable2 = "Allows for a switch input to allow or prevent the second stage.\nOff: no switch, second stage turns on per set parameters.\nOn: second stage only turns on when switch is on and per set parameters."
    n2o_pedal_time = "Maximum length of time pedalling to allow continuing timer."

    water_freq_on = "Enables the feature."
    water_pins_pump = "Output to pump relay."
    water_freq_type = "'Off' - no valve output (used fixed nozzle)\n'Slow' - slow speed valve output with chosen PWM duty cycle\n'Fast' - valve switches at injector speed with chosen PWM duty cycle."
    water_freq = "Valve operating frequency."
    water_pins_valve = "Output for valve."
    water_tps = "Only enable above this TPS%."
    water_rpm = "Only enable above this RPM."
    water_map = "Only enable above this MAP."
    water_mat = "Only enable above this MAT."
    water_pins_in_shut = "Allows a low fluid level sensor switch input.\n\nThe switch must be wired so that the input is grounded when the level is ok and no connection is made in low or fault conditions.\n\nIf fluid reserve is low when water injection is required, for safety the engine will be shutdown using the parameters in the AFR Safety System."

    oilpress_in = "Generic Sensor input channel used for oil pressure input."
    oilpress_out = "Output for warning lamp."
    oilpress_in_safety = "Enables engine shutdown on low pressure."
    oilpress_time = "If oil pressure stays too low for more than this time, the engine is shutdown using the AFR safety settings."

    fp_drop_load = "Only check for low pressure above this engine load (e.g. MAP, TPS, MAFload)"
    fp_drop_rpm = "Only check for low pressure above this RPM."
    fp_drop_psig = "Allowed drop in pressure below target."
    fp_drop_kpag = "Allowed drop in pressure below target."
    fp_drop_time = "If fuel pressure stays too low for more than this time, the engine is shutdown using the AFR safety settings."

    pwm_opt_on_a = "Enables Generic PWM feature.\n\nA table or curve is used to plot the desired output based on a lookup from the input variables."
; #define substitution doesn't work for tooltips
;#define PWM_OPT2_TEXT = "Output for relay/solenoid.\nFor each output,'100%' means the following:\nPM3 - Injection LED D14 = Ground at D14\nPM4 - Accel LED D16 = Ground at D16\nPM5 - Warmup LED D15 = Ground at D15\nPJ0 - IAC2 = 12V on IAC2A\nPJ1 - IAC1 = 12V on IAC1A\nPJ7 - JS11 = 5V\nPP2 - Idle = Ground\nPP3 - Boost = Ground\nPP4 - Nitrous 1 = Ground\nPP5 - Nitrous 2 = Ground\nPP6 - VVT = Ground\nPP7 - Fidle = Ground\nPT1 - V3 Inj 1 = Ground\nPT3 - V3 Inj 2 = Ground\nPT5 - JS10 = 5v\nPK0 - Tacho = Ground\nPA0 - Inj A = Ground\nPA1 - Inj B = Ground\nPA2 - Inj C = Ground\nPA3 - Inj D = Ground\nPA4 - Inj E = Ground\nPA5 - Inj F = Ground\nPA6 - Inj G = Ground\nPA7 - Inj H = Ground\nPB0 - Spk A = 5v\nPB1 - Spk B = 5v\nPB2 - Spk C = 5v\nPB3 - Spk D = 5v\nPB4 - Spk E = 5v\nPB5 - Spk F = 5v\nPB6 - Spk G = 5v\nPB7 - Spk H = 5v\nPK7 = 5v\nPM2 = 5v\nPK3 = 5v\nPK1 = 5v"
    pwm_opt2_a = "Output for relay/solenoid.\nFor each output,'100%' means the following:\n\nStepper Out 2 = 12V on IAC2A\nStepper Out 1 = 12V on IAC1A\nPWM Out 2 = Ground\nHigh Current Out 3 = Ground\nHigh Current Out 1 = Ground\nHigh Current Out 2 = Ground\nPWM Out 3 = Ground\nPWM / Idle Out 1 = Ground\nInjector Out I = Ground\nInjector Out J = Ground\nDigital Frequency In 2 = 5V\nTach Out = Ground\nInjector Out A = Ground\nInjector Out B = Ground\nInjector Out C = Ground\nInjector Out D = Ground\nInjector Out E = Ground\nInjector Out F = Ground\nInjector Out G = Ground\nInjector Out H = Ground\nSpark Out A = weak GND\nSpark Out B = weak GND\nSpark Out C = weak GND\nSpark Out D = weak GND\nSpark Out E = weak GND\nSpark Out F = weak GND\nSpark Out G = weak GND\nSpark Out H = weak GND\nDigital In Out 1 = 5V\nDigital In Out 2 = 5V\nDigital In Out 3 = 5V\nDigital In Out 4 = 5V\nDigital In Out 5 = 5V\nPWM Out 4 = Ground\nPWM Out 5 = Ground\nDigital Output 1 LED = LED On\nDigital Output 2 = Ground"

    pwm_opt_freq_a = "Selects:\nOn-Off - output is turned on or off based on the table/curve.\nVariable frequency - output runs at the frequency set by the table/curve with 50% duty.\nxxHz - output runs at a fixed frequency with duty set by the table/curve."
    pwm_onabove_a = "Output is on when the table/curve is above this number." 
    pwm_offbelow_a = "Output is off when the table/curve is below this number." 
    pwm_opt_load_a = "The variable used for the load axis on the table/curve."
    pwm_opt_curve_a = "Chooses between a 3D mapped table or a 2D curve."

    pwm_opt_on_b = "Enables Generic PWM feature.\n\nA table or curve is used to plot the desired output based on a lookup from the input variables."
    pwm_opt2_b = "Output for relay/solenoid.\nFor each output,'100%' means the following:\n\nStepper Out 2 = 12V on IAC2A\nStepper Out 1 = 12V on IAC1A\nPWM Out 2 = Ground\nHigh Current Out 3 = Ground\nHigh Current Out 1 = Ground\nHigh Current Out 2 = Ground\nPWM Out 3 = Ground\nPWM / Idle Out 1 = Ground\nInjector Out I = Ground\nInjector Out J = Ground\nDigital Frequency In 2 = 5V\nTach Out = Ground\nInjector Out A = Ground\nInjector Out B = Ground\nInjector Out C = Ground\nInjector Out D = Ground\nInjector Out E = Ground\nInjector Out F = Ground\nInjector Out G = Ground\nInjector Out H = Ground\nSpark Out A = weak GND\nSpark Out B = weak GND\nSpark Out C = weak GND\nSpark Out D = weak GND\nSpark Out E = weak GND\nSpark Out F = weak GND\nSpark Out G = weak GND\nSpark Out H = weak GND\nDigital In Out 1 = 5V\nDigital In Out 2 = 5V\nDigital In Out 3 = 5V\nDigital In Out 4 = 5V\nDigital In Out 5 = 5V\nPWM Out 4 = Ground\nPWM Out 5 = Ground\nDigital Output 1 LED = LED On\nDigital Output 2 = Ground"

    pwm_opt_freq_b = "Selects:\nOn-Off - output is turned on or off based on the table/curve.\nVariable frequency - output runs at the frequency set by the table/curve with 50% duty.\nxxHz - output runs at a fixed frequency with duty set by the table/curve."
    pwm_onabove_b = "Output is on when the table/curve is above this number." 
    pwm_offbelow_b = "Output is off when the table/curve is below this number." 
    pwm_opt_load_b = "The variable used for the load axis on the table/curve."
    pwm_opt_curve_b = "Chooses between a 3D mapped table or a 2D curve."

    pwm_opt_on_c = "Enables Generic PWM feature.\n\nA table or curve is used to plot the desired output based on a lookup from the input variables."
    pwm_opt2_c = "Output for relay/solenoid.\nFor each output,'100%' means the following:\n\nStepper Out 2 = 12V on IAC2A\nStepper Out 1 = 12V on IAC1A\nPWM Out 2 = Ground\nHigh Current Out 3 = Ground\nHigh Current Out 1 = Ground\nHigh Current Out 2 = Ground\nPWM Out 3 = Ground\nPWM / Idle Out 1 = Ground\nInjector Out I = Ground\nInjector Out J = Ground\nDigital Frequency In 2 = 5V\nTach Out = Ground\nInjector Out A = Ground\nInjector Out B = Ground\nInjector Out C = Ground\nInjector Out D = Ground\nInjector Out E = Ground\nInjector Out F = Ground\nInjector Out G = Ground\nInjector Out H = Ground\nSpark Out A = weak GND\nSpark Out B = weak GND\nSpark Out C = weak GND\nSpark Out D = weak GND\nSpark Out E = weak GND\nSpark Out F = weak GND\nSpark Out G = weak GND\nSpark Out H = weak GND\nDigital In Out 1 = 5V\nDigital In Out 2 = 5V\nDigital In Out 3 = 5V\nDigital In Out 4 = 5V\nDigital In Out 5 = 5V\nPWM Out 4 = Ground\nPWM Out 5 = Ground\nDigital Output 1 LED = LED On\nDigital Output 2 = Ground"

    pwm_opt_freq_c = "Selects:\nOn-Off - output is turned on or off based on the table/curve.\nVariable frequency - output runs at the frequency set by the table/curve with 50% duty.\nxxHz - output runs at a fixed frequency with duty set by the table/curve."
    pwm_onabove_c = "Output is on when the table/curve is above this number." 
    pwm_offbelow_c = "Output is off when the table/curve is below this number." 
    pwm_opt_load_c = "The variable used for the load axis on the table/curve."
    pwm_opt_curve_c = "Chooses between a 3D mapped table or a 2D curve."

    pwm_opt_on_d = "Enables Generic PWM feature.\n\nA table or curve is used to plot the desired output based on a lookup from the input variables."
    pwm_opt2_d = "Output for relay/solenoid.\nFor each output,'100%' means the following:\n\nStepper Out 2 = 12V on IAC2A\nStepper Out 1 = 12V on IAC1A\nPWM Out 2 = Ground\nHigh Current Out 3 = Ground\nHigh Current Out 1 = Ground\nHigh Current Out 2 = Ground\nPWM Out 3 = Ground\nPWM / Idle Out 1 = Ground\nInjector Out I = Ground\nInjector Out J = Ground\nDigital Frequency In 2 = 5V\nTach Out = Ground\nInjector Out A = Ground\nInjector Out B = Ground\nInjector Out C = Ground\nInjector Out D = Ground\nInjector Out E = Ground\nInjector Out F = Ground\nInjector Out G = Ground\nInjector Out H = Ground\nSpark Out A = weak GND\nSpark Out B = weak GND\nSpark Out C = weak GND\nSpark Out D = weak GND\nSpark Out E = weak GND\nSpark Out F = weak GND\nSpark Out G = weak GND\nSpark Out H = weak GND\nDigital In Out 1 = 5V\nDigital In Out 2 = 5V\nDigital In Out 3 = 5V\nDigital In Out 4 = 5V\nDigital In Out 5 = 5V\nPWM Out 4 = Ground\nPWM Out 5 = Ground\nDigital Output 1 LED = LED On\nDigital Output 2 = Ground"

    pwm_opt_freq_d = "Selects:\nOn-Off - output is turned on or off based on the table/curve.\nVariable frequency - output runs at the frequency set by the table/curve with 50% duty.\nxxHz - output runs at a fixed frequency with duty set by the table/curve."
    pwm_onabove_d = "Output is on when the table/curve is above this number." 
    pwm_offbelow_d = "Output is off when the table/curve is below this number." 
    pwm_opt_load_d = "The variable used for the load axis on the table/curve."
    pwm_opt_curve_d = "Chooses between a 3D mapped table or a 2D curve."

    pwm_opt_on_e = "Enables Generic PWM feature.\n\nA table or curve is used to plot the desired output based on a lookup from the input variables."
    pwm_opt2_e = "Output for relay/solenoid.\nFor each output,'100%' means the following:\n\nStepper Out 2 = 12V on IAC2A\nStepper Out 1 = 12V on IAC1A\nPWM Out 2 = Ground\nHigh Current Out 3 = Ground\nHigh Current Out 1 = Ground\nHigh Current Out 2 = Ground\nPWM Out 3 = Ground\nPWM / Idle Out 1 = Ground\nInjector Out I = Ground\nInjector Out J = Ground\nDigital Frequency In 2 = 5V\nTach Out = Ground\nInjector Out A = Ground\nInjector Out B = Ground\nInjector Out C = Ground\nInjector Out D = Ground\nInjector Out E = Ground\nInjector Out F = Ground\nInjector Out G = Ground\nInjector Out H = Ground\nSpark Out A = weak GND\nSpark Out B = weak GND\nSpark Out C = weak GND\nSpark Out D = weak GND\nSpark Out E = weak GND\nSpark Out F = weak GND\nSpark Out G = weak GND\nSpark Out H = weak GND\nDigital In Out 1 = 5V\nDigital In Out 2 = 5V\nDigital In Out 3 = 5V\nDigital In Out 4 = 5V\nDigital In Out 5 = 5V\nPWM Out 4 = Ground\nPWM Out 5 = Ground\nDigital Output 1 LED = LED On\nDigital Output 2 = Ground"

    pwm_opt_freq_e = "Selects:\nOn-Off - output is turned on or off based on the table/curve.\nVariable frequency - output runs at the frequency set by the table/curve with 50% duty.\nxxHz - output runs at a fixed frequency with duty set by the table/curve."
    pwm_onabove_e = "Output is on when the table/curve is above this number." 
    pwm_offbelow_e = "Output is off when the table/curve is below this number." 
    pwm_opt_load_e = "The variable used for the load axis on the table/curve."
    pwm_opt_curve_e = "Chooses between a 3D mapped table or a 2D curve."

    pwm_opt_on_f = "Enables Generic PWM feature.\n\nA table or curve is used to plot the desired output based on a lookup from the input variables."
    pwm_opt2_f = "Output for relay/solenoid.\nFor each output,'100%' means the following:\n\nStepper Out 2 = 12V on IAC2A\nStepper Out 1 = 12V on IAC1A\nPWM Out 2 = Ground\nHigh Current Out 3 = Ground\nHigh Current Out 1 = Ground\nHigh Current Out 2 = Ground\nPWM Out 3 = Ground\nPWM / Idle Out 1 = Ground\nInjector Out I = Ground\nInjector Out J = Ground\nDigital Frequency In 2 = 5V\nTach Out = Ground\nInjector Out A = Ground\nInjector Out B = Ground\nInjector Out C = Ground\nInjector Out D = Ground\nInjector Out E = Ground\nInjector Out F = Ground\nInjector Out G = Ground\nInjector Out H = Ground\nSpark Out A = weak GND\nSpark Out B = weak GND\nSpark Out C = weak GND\nSpark Out D = weak GND\nSpark Out E = weak GND\nSpark Out F = weak GND\nSpark Out G = weak GND\nSpark Out H = weak GND\nDigital In Out 1 = 5V\nDigital In Out 2 = 5V\nDigital In Out 3 = 5V\nDigital In Out 4 = 5V\nDigital In Out 5 = 5V\nPWM Out 4 = Ground\nPWM Out 5 = Ground\nDigital Output 1 LED = LED On\nDigital Output 2 = Ground"

    pwm_opt_freq_f = "Selects:\nOn-Off - output is turned on or off based on the table/curve.\nVariable frequency - output runs at the frequency set by the table/curve with 50% duty.\nxxHz - output runs at a fixed frequency with duty set by the table/curve."
    pwm_onabove_f = "Output is on when the table/curve is above this number." 
    pwm_offbelow_f = "Output is off when the table/curve is below this number." 
    pwm_opt_load_f = "The variable used for the load axis on the table/curve."
    pwm_opt_curve_f = "Chooses between a 3D mapped table or a 2D curve."

    mycan_id = "Set to 0 unless specifically wanting to configure this as a secondary data capture ECU."
    enable_pollPWM = "Enables capturing PWM (pulse/frequency) from expansion board."
    can_poll_id = "CANid of expansion board."
    poll_tablePWM = "Table number on expansion board."
    poll_offsetPWM= "Table number on expansion board."
    canpwm_clk = "Clock frequency on expansion board. See documentation."
    canpwm_pre = "Prescaler on expansion board. See documentation."
    canpwm_div = "Divider on expansion board. See documentation."
    enable_pollADC= "Enables capturing analogue inputs from expansion board."
    canadc_opt1 = "Enables this group of analogue inputs."
    canadc_id1 = "CANid of expansion board."
    canadc_tab1 = "Table number on expansion board."
    canadc_off1 = "Data offset on expansion board."
    can_poll_id_ports = "CANid of expansion board for digital inputs/outputs."
    poll_tableports = "Table number on expansion board."
    enable_pollports_digin = "Enables using digital inputs from expansion board. (CANIN1-8)"
    can_poll_digin_offset = "Data offset on expansion board."
    enable_pollports_digout = "Enables using on/off outputs on expansion board.\nOne = CANOUT1-8\nTwo = CANOUT1-8 and CANOUT9-16"
    can_poll_digout_offset = "Data offset on expansion board."
    enable_pwmout = "Enables sending PWM/pulsed outputs to expansion board."
    enable_pwmout255 = "Forces PWM duty cycle to 0-255 range.\ne.g. generic PWMs operate on a 0-100 scale, but your remote device might require a 0-255 scale."
    can_pwmout_id = "CANid of expansion board."
    can_pwmout_tab = "Table number on expansion board."
    can_pwmout_offset = "Data offset on expansion board."

    can_bcast1_on = "Enables broadcasting of parameters over CAN."
    can_bcast_int = "How often to broadcast."
    can_bcast1_280x4 = "Enables 0x280 'Motorsteuergerat 640 - engine control unit RPM is 4:1 ratio' message."
    can_bcast1_280x1 = "Enables 0x280 'Motorsteuergerat 640 - engine control unit RPM is 1:1 ratio' message."
    can_bcast1_289 = "Enables 0x289 'Motorsteuergerat 649 - Engine Temp' message."
    can_bcast1_316 = "Enables 0x316 'BMW E46 - engine control unit RPM is 6.42:1 ratio' message. Use 50ms interval."
    can_bcast1_329 = "Enables 0x329 'BMW coolant' message. Use 50ms interval."
    can_bcast1_561 = "Enables 0x561 'Alfa/Fiat/Lancia dash coolant, RPM' message."
    can_bcast1_361 = "Enables 0x361 'Alfa/Fiat/Lancia torque, RPM, TPS' message."
    can_bcast2_041 = "Enables 0x041 'Alfa/Fiat/Lancia dash initialisation' message."
    can_bcast2_he351 = "Broadcasts 'boost duty' to control the variable vane turbo.\nUses 29bit CAN message 0x0cffc600 and typically requires 250k CAN baud rate."
    can_bcast2_23d = "Enables 0x23d 'Nissan 350Z temp/RPM' message."
    can_bcast2_lotus0407 = "Enables 0x400 Lotus 'white' dash 2004-7. Requires 1Mbit CAN speed."
    can_bcast2_lotus0815 = "Enables 0x400 Lotus 'black' dash 2008-15. Requires 500kbit CAN speed."
    can_bcast_lotus_fuel = "Generic sensor input channel used for fuel level. Configure the sensor to give 0 for empty and 100 for full."
    can_bcast2_xxx = "Enables sending a user-defined CAN packet."

    can_enable_on = "Master enable/disable for all CAN polling and broadcasting. Setting to 'Off' still allows CAN-passthrough for tuning but turns off all other messages. This can be useful for performing a firmware upgrade on a remote expansion board."
    can_enable_alcan = "Master enable/disable for 29bit 'Megasquirt CAN'. Normally this should be enabled to allow 'passthrough' tuning or data exchange with other MS3 compatible CAN devices. If not needed, it may be disabled to prevent interference from other devices broadcasting standard 29bit messages or to allow communication with 3rd party devices using 29bit broadcasts."
    can_enable_baud = "Sets the CAN baud rate. 500k is the standard baud rate, changing this will prevent communications with Megasquirt-compatible devices. Alternatives for 3rd party devices are 250k and 1M."
	can_enable_outpc = "Allow writes to realtime data over CAN. This should only be enabled if you have a very specific reason for doing so. Unexpected or incorrect writes can interfere with engine operation." 
	can_enable_tuning = "Allow writes to tuning data over CAN. This should only be enabled if you will be tuning via a remote CAN gateway. When connecting directly to the ECU with serial or USB, leave this off to prevent any chance of unexpected CAN data interfering with engine operation." 
    vss1_can_id = "CANid of expansion board."
    vss1_can_table = "Table number on expansion board."
    vss1_can_offset = "Data offset on expansion board."
    vss1_can_size = "How the data is stored on the expansion board. See documentation."
    vss2_can_offset = "Data offset on expansion board."
    vss2_can_size = "How the data is stored on the expansion board. See documentation."
    gear_can_offset = "Data offset on expansion board."
    vss3_can_offset = "Data offset on expansion board. Uses same size as VSS1"
    vss4_can_offset = "Data offset on expansion board. Uses same size as VSS2"

  opt142_rtc = "Enables the built-in real time clock or selects a clock on an expansion board via CAN."
    rtc_trim = "Applies a trim to correct for slow/fast running clock."
    can_poll_id_rtc = "CANid of expansion board."
    poll_table_rtc = "Table number on expansion board."
    poll_offset_rtc = "Data offset on expansion board."

    can_poll2_ego2 = "Enables collecting EGO/AFR from CAN connected widebands on expansion board.\nDisable will still allow Megaspartan messages to be received.\nInnovate requires a JBperf IO-extender using 29bit Megasquirt-CAN.\nAEM 4ch UEGO uses 29bit messages at 500k from ID 0x0000001F and requires that Megasquirt-CAN be disabled.\nECOTRONS ALM uses 250k and requires that Megasquirt-CAN be disabled.\nGeneric allows messages to be received using the 'CAN Receiving' system. The input value must be converted to give Lambda * 10000.\nAEM X UEGO uses 29bit messages at 500k from ID 0x00000180 and requires that Megasquirt-CAN be disabled.\nCANEGT broadcast uses 11bit CAN with id 1682,3 and requires the CANEGT be configured to match.\n14point7 Spartan3 listens on id 1024,5 and requires the Spartan3 be configured to match.\nAMPEFI WB uses address 80 by default. Can be altered by dipswitch."
    can_poll2_egolag = "Enables or disables the 'lag factor' smoothing for EGO data collected from a CAN device. Typically set to Off."
    can_ego_id = "CANid of expansion board."
    can_ego_table = "Table number on expansion board."
    can_ego_offset = "Data offset on expansion board."
    can_poll2_gps = "Whether to enable GPS data reception via CAN.\n\nJBPerf GPS = Use Megasquirt-CAN to poll for data from a JBperf IO-extender GPS.\nRace Technology 11bit = listen for 11bit broadcasts from a Race Technology dash/GPS."
    can_gps_id = "CANid of expansion board."
    can_gps_table = "Table number on expansion board."
    can_gps_offset = "Data offset on expansion board."
    canrx1_rt_gps_base = "Base CAN id for broadcasts. Default is 769 (0x301). Dash must be configured to match."
    canrx1_rt_accel_base = "Base CAN id for broadcasts. Default is 768 (0x300). Dash must be configured to match."
    canrx1_opt_accel = "Whether to enable accelerometer reception via CAN.\nOff no CAN device, use analog inputs.\nRace Technology 11bit = listen for 11bit broadcasts from a Race Technology dash.\nKia IMU = listen for 11bit broadcasts from Kia IMU."
	can_accelx_offset = "Adjust this to correct for any sensor offset. Sensor must be set level in vehicle as angular 'mounting plane' corrections are not allowed for."
	can_accely_offset = "Adjust this to correct for any sensor offset. Sensor must be set level in vehicle as angular 'mounting plane' corrections are not allowed for."
	can_accelz_offset = "Adjust this to correct for any sensor offset. Sensor must be set level in vehicle as angular 'mounting plane' corrections are not allowed for."

    can_poll2_vss = "How VSS data is captured:\nPoll = use polling\nListen = Megasquirt-CAN receiving will be configured to listen for messages.\nThis setting is not applicable when using 'CAN Receiving'."

    cel_opt_on = "Enables sensor checking feature."
    cel_port = "Output for warning lamp.\nIt is STRONGLY SUGGESTED that a lamp be connected when the CEL feature is used."
    cel_opt_flash = "Selects whether CEL lights up solidly or flashes codes to aid diagnostics.\n\nNumber of flashes and fault:\n2=MAP 3=MAT 4=CLT 5=TPS 6=BATT 7=AFR0 8=SYNC 9=EGT 10=FLEX 11=MAF 12=KNOCK 13=CAM 14=OIL 15=FUELPRESS 16=EGTSHUT 17=AFRSHUT"
    cel_opt_when = "Do you want the light on when the engine is off?"
    cel_runtime = "Period after-start before sensors are checked."
    cel_opt2_map = "Enables checking of the MAP sensor."
    map_minadc = "Minimum raw ADC 0-1023 input allowed."
    map_maxadc = "Maximum raw ADC 0-1023 input allowed."
    map_var_lower = "Minimum amount of fluctuation allowed. (To detect flat-lined input.)"
    map_var_upper = "Maximum amount of fluctuation allowed. (To detect wildly varying input.)"
    cel_opt2_mat = "Enables checking of the MAT sensor."
    mat_minadc = "Minimum raw ADC 0-1023 input allowed."
    mat_maxadc = "Maximum raw ADC 0-1023 input allowed."
    mat_var_upper = "Maximum amount of fluctuation allowed. (To detect wildly varying input.)"
    cel_opt2_clt = "Enables checking of the CLT sensor."
    clt_minadc = "Minimum raw ADC 0-1023 input allowed."
    clt_maxadc = "Maximum raw ADC 0-1023 input allowed."
    clt_var_upper = "Maximum amount of fluctuation allowed. (To detect wildly varying input.)"
    cel_opt2_tps = "Enables checking of the TP sensor."
    tps_minadc = "Minimum raw ADC 0-1023 input allowed."
    tps_maxadc = "Maximum raw ADC 0-1023 input allowed."
    tps_var_upper = "Maximum amount of fluctuation allowed. (To detect wildly varying input.)"

    cel_opt2_batt = "Enables checking of the battery voltage input."
    batt_minv = "Minimum voltage allowed."
    batt_maxv = "Maximum voltage allowed."
    batt_var_upper = "Maximum amount of fluctuation allowed. (To detect wildly varying input.)"
    cel_opt2_afr0 = "Enables checking of the EGO/AFR input."
    afr_min = "Minimum AFR allowed."
    afr_max = "Maximum AFR allowed."
    afr_var_lower = "Minimum amount of fluctuation allowed. (To detect flat-lined input.)"
    afr_var_upper = "Maximum amount of fluctuation allowed. (To detect wildly varying input.)"
    cel_opt2_sync = "Enables checking for sync-losses."
    cel_synctol = "Set CEL above this many sync-losses."
    cel_opt2_egt = "Enables checking of the EGT input."
    egt_minvalid = "Minimum EGT allowed."
    egt_maxvalid = "Maximum EGT allowed."
    egt_var_lower = "Minimum amount of fluctuation allowed. (To detect flat-lined input.)"
    egt_var_upper = "Maximum amount of fluctuation allowed. (To detect wildly varying input.)"
    cel_opt3_flex = "Enables checking of the Flex-fuel sensor input."
    cel_opt_adc = "Sets gauge 'status5' to record 'fluctuations' number or raw ADC count for the chosen sensor input."
    cel_opt_stat = "Selects input for 'status5' value. Observe the dash gauge and examine datalogs to determine sensible min/max fluctuation limits and ADC counts for each sensor input in turn."
    cel_action1_map = "Whether an invalid MAP reading will trigger limp mode."
    cel_action1_map_an = "Whether an invalid MAP reading will enable the fallback MAP table."

    cel_action1_mat = "Whether an invalid MAT reading will trigger limp mode."
    cel_mat_default = "If MAT fails, assume MAT is this temperature."
    cel_action1_clt = "Whether an invalid CLT reading will trigger limp mode."
    cel_clt_cold = "If CLT fails, start engine using this assumed temperature."
    cel_clt_warm = "If CLT fails, assume this is the warmed up engine temperature."
    cel_warmtime = "If CLT fails, assume engine takes this long to warmup."
    cel_action1_tps = "Whether an invalid TPS reading will trigger limp mode."
    cel_action1_batt = "Whether an invalid battery voltage reading will trigger limp mode."
    cel_action1_ego = "Whether an invalid AFR/EGO reading will trigger limp mode."
    cel_action2_flex = "Whether an invalid Flex-fuel reading will trigger limp mode."
    cel_action2_egt = "Whether an invalid EGT reading will trigger limp mode."
    cel_action2_oil = "Whether an out of range oil pressure reading will trigger limp mode. (Set on limp mode screen.)"
    cel_revlim = "Rev limiter when in limp mode."
    cel_overboost = "Maximum boost when in limp mode. Typically 102kPa for no boost."
    cel_boost_duty = "Fixed boost valve duty in limp mode. Set for least boost, typically 0%."
    cel_boost_duty2 = "Fixed boost valve duty in limp mode. Set for least boost, typically 0%."
    cel_retard = "Retard timing by this amount when in limp mode."

    testint = "How often to pulse the coil/injector."
    testrpm = "Approximate equivalent RPM when operating a single output."
    testop_coil = "Whether to test the single coil output you have selected or operate in sequence up to the output you have selected. Note that 'sequence' does not simulate a real running engine as each output is fired individually and there is no dwell overlap."
    testsel_coil  = "Coil output to test."
    testdwell = "Dwell used during testing - no voltage correction is applied."
    testop_inj = "Whether to test the single injector output you have selected or operate in sequence up to the output you have selected. Note that 'sequence' does not simulate a real running engine as each output is fired individually and there is no overlap."
    testsel_inj = "Injector output to test."
    testpw = "Pulsewidth used during testing - no dead-time is added and no voltage correction is applied."
    testinjcnt = "Number of injection pulses in each test."

    pwm_testio = "Frequency of pulsed outputs."
    duty_testio = "Duty cycle of pulsed outputs."

    iachometest = "Number of steps to move valve in homing operation (should be set larger than total number of steps from open to closed.)"
    iacpostest = "Desired valve position."

  feature3_n2oin = "Normally this should be 'On' so that the input responds to a +12V signal."
    u08_debug38_1 = "Experimental feature to log trigger times to sensors9-16. This could be used to monitor cylinder contribution. This overwrites any sensors values."
    u08_debug38_2 = "During SDcard log download whether to stop at end of useful log data (normal) or download whole file (testing only)."
    fuelcalctime = "How often to perform fuel consumption calculations."

    RotarySplitModeFD = "FC mode = combined trailing coil for two trailing plugs.\nFD mode = individual coils for each trailing plug."
    RotarySplitModeNeg = "Split usually fires trailing coils after leading coils, this allows for the split to be negative and the trailing coils to fire before the leading."
    dwelltime_trl = "Dwell time applied to trailing coil(s)."
;curves help text
    oil_press_min = "For each RPM setting, set the min and max oil pressures allowed at that RPM.\nOutside of the limits the warning light will be illuminated.\nIt is suggested that the first row be 0 RPM. Set the Min and Max limits above 0 so that the oil warning light is tested on each start."
    hpte_afrs = "The curve specifies AFR decrease (richer) vs. time.\nIt is normal for the first row to be 0, 0.\nThe second row typically specifies when the enrichment should begin. e.g. 7, 0. This means that there is no change from 0-7 seconds as both are set to a 0 decrease in AFR.\nThe third row onwards specify the richening."
    fp_temp_adj = "Specifies a percentage adjustment in fuelling based on fuel temperature. 0% means no adjustment."
    fp_press_adj = "Specifies a percentage adjustment in fuelling based on fuel pressure. 0% means no adjustment.\nThe pressure used for the lookup is always the pressure across the injector i.e. rail pressure - intake pressure."
    dualfuel_temp_adj = "Specifies a percentage adjustment in fuelling based on fuel temperature. 0% means no adjustment."
    dualfuel_press_adj = "Specifies a percentage adjustment in fuelling based on fuel pressure. 0% means no adjustment.\nThe pressure used for the lookup is always the pressure across the injector i.e. rail pressure - intake pressure."
    fpd_duty = "The values in the table specify the duty cycle percent of the control output to the pump or controller based on the RPM/load axes."
    alt_dutyout = "This allows for non-linear control within alternators. It also allows you to restrict the output duty range."
    alternator_targvolts = "Specifies the target charge voltage related to the battery temperature.\nOnly works if you have a battery temperature sensor."
    alternator_dutyv = "Specifies the control duty to achieve the desired voltage."
    alternator_periodv = "Specifies the control period to achieve the desired voltage.\nFord alternators are described as using frequency, but expressing as the period in milliseconds (1000/frequency) gives a linear relationship."
    pwm_duties_a = "The values within the table specify the output duty or frequency based that is looked up based on the input 'load' and RPM."
    pwm_duties_b = "The values within the table specify the output duty or frequency based that is looked up based on the input 'load' and RPM."
    pwm_duties_c = "The values within the table specify the output duty or frequency based that is looked up based on the input 'load' and RPM."
    pwm_duties_d = "The values within the table specify the output duty or frequency based that is looked up based on the input 'load' and RPM."
    pwm_duties_e = "The values within the table specify the output duty or frequency based that is looked up based on the input 'load' and RPM."
    pwm_duties_f = "The values within the table specify the output duty or frequency based that is looked up based on the input 'load' and RPM."
    pwm_yaxis_a = "Specifies the output duty or frequency based on the input 'load' value."
    pwm_yaxis_b = "Specifies the output duty or frequency based on the input 'load' value."
    pwm_yaxis_c = "Specifies the output duty or frequency based on the input 'load' value."
    pwm_yaxis_d = "Specifies the output duty or frequency based on the input 'load' value."
    pwm_yaxis_e = "Specifies the output duty or frequency based on the input 'load' value."
    pwm_yaxis_f = "Specifies the output duty or frequency based on the input 'load' value."
    tcslipy = "Sets the desired slip% threshold at different knob settings 0-100%"
    tc_knob = "This enables an analog input to enable you to set the slip threshold. 0-5V input means 0-100%. Typically this would be a rotary potentiometer."
    blendy1 = "Sets a percentage blend from VE1 (0%) to VE2 (100%) based on the input X axis value."
    blendy2 = "Sets a percentage blend from Spk1 (0%) to Spk2 (100%) based on the input X axis value."
    blendy3 = "Sets a percentage blend from the combined VE1+2 (0%) to VE3+4 (100%) based on the input X axis value."
    blendy4 = "Sets a percentage blend from the combined Spk1+2 (0%) to Spk3+4 (100%) based on the input X axis value."
    blendy5 = "Sets a percentage blend from AFR1 (0%) to AFR2 (100%) based on the input X axis value."
    blendy6 = "Sets a percentage blend from Boost1 (0%) to Boost2 (100%) based on the input X axis value."
    blendy7 = "Sets a percentage blend from Cranking Pulse1 (0%) to Cranking Pulse2 (100%) based on the input X axis value."
    blendy8 = "Sets a percentage blend from Tables1 (0%) to Tables2 (100%) based on the Flex fuel percentage value.\ne.g. set 0% table for 10% flex and 100% table for 85% flex."
    blend_opt1 = "Sets the variable to use as the 'X' value on the blend curve. (Note that VSS is in MPH.)"
    blend_opt2 = "Sets the variable to use as the 'X' value on the blend curve. (Note that VSS is in MPH.)"
    blend_opt3 = "Sets the variable to use as the 'X' value on the blend curve. (Note that VSS is in MPH.)"
    blend_opt4 = "Sets the variable to use as the 'X' value on the blend curve. (Note that VSS is in MPH.)"
    blend_opt5 = "Sets the variable to use as the 'X' value on the blend curve. (Note that VSS is in MPH.)"
    blend_opt6 = "Sets the variable to use as the 'X' value on the blend curve. (Note that VSS is in MPH.)"
    blend_opt7 = "Sets the variable to use as the 'X' value on the blend curve. (Note that VSS is in MPH.)"
    tpswot_tps = "Sets the TPS% that is considered wide-open-throttle based on RPM.\ni.e. at low RPMS, partial throttle will flow the same air as full throttle. At maximum RPMs full throttle is required for full air flow.\nWhen the throttle is at or beyond the new 'full throttle' it is considered 100% throttle. This has the effect of making TPS based accel enrichment more sensitive at lower throttle opening at lower RPMs and also prevents TPS accel enrichment if the throttle is already 'fully open.'"
    launch_retard = "The curve sets the degrees of ignition subtracted from the normal timing (i.e. retarding it) against time after launch.\nThis can be used to launch at higher RPMs without blowing the tyres away and then feeding the timing back in.\nBe sure to end the curve with zero degrees of retard to use normal timing for the rest of the run."
    cl_idle_timing_advance_deltas = "Uses timing to assist closed-loop idle control.\nThe X axis of the curve is RPMs +/- the target. i.e. if the target was 800, then -75 in the curve means 800-75 = 725RPM\nThe Y axis of the curve is timing +/-. i.e. + means add timing, - means subtract timing.\nTypically, use positive (advanced) timing when RPMs are below target and negative (retarded) timing when RPMs are above target."
    idle_voltage_comp_delta = "Some 2 wire PWM idle valves will operate differently depending on the system voltage. This allows a compensation to be applied to allow for that difference.\nTypically at lower voltages the valve will need slightly more duty (positive number) and at higher voltages it will need less duty (negative number.)"
    maeBins = "The curve specifies a fuel pulsewidth percent adder based on rate of change of MAP (MAPdot)\nThis is part of the basic time based accel enrichment scheme. Larger changes in MAP require more fuel added. The number is a percentage of ReqFuel."
    taeBins = "The curve specifies a fuel pulsewidth percent adder based on rate of change of TPS (TPSdot)\nThis is part of the basic time based accel enrichment scheme. Larger changes in TPS require more fuel added. The number is a percentage of ReqFuel."
    accel_mapdot_amts = "The curve specifies a fuel pulsewidth percent adder based on rate of change of MAP (MAPdot)\nThis is part of the accel-pump based accel enrichment scheme. Larger changes in MAP require more fuel added.\nThe negative part of the curve is used for decel enleanment, or set to zero PW% for no enleanment.\nEnsure that there is a 0 0 point in the curve so that when MAP is not changing, no additional fuel is added. The number is a percentage of ReqFuel."
    accel_tpsdot_amts = "The curve specifies a fuel pulsewidth percent adder based on rate of change of TPS (TPSdot)\nThis is part of the accel-pump based accel enrichment scheme. Larger changes in TPS require more fuel added.\nThe negative part of the curve is used for decel enleanment, or set to zero PW% for no enleanment.\nEnsure that there is a 0 0 point in the curve so that when TPS is not changing, no additional fuel is added. The number is a percentage of ReqFuel."
    maeBins2 = "The curve specifies a fuel pulsewidth percent adder based on rate of change of MAP (MAPdot)\nThis is part of the basic time based accel enrichment scheme. Larger changes in MAP require more fuel added. The number is a percentage of ReqFuel.\n(Second fuel.)"
    taeBins2 = "The curve specifies a fuel pulsewidth percent adder based on rate of change of TPS (TPSdot)\nThis is part of the basic time based accel enrichment scheme. Larger changes in TPS require more fuel added. The number is a percentage of ReqFuel.\n(Second fuel.)"
    accel_mapdot_amts2 = "The curve specifies a fuel pulsewidth percent adder based on rate of change of MAP (MAPdot)\nThis is part of the accel-pump based accel enrichment scheme. Larger changes in MAP require more fuel added.\nThe negative part of the curve is used for decel enleanment, or set to zero PW% for no enleanment.\nEnsure that there is a 0 0 point in the curve so that when MAP is not changing, no additional fuel is added. The number is a percentage of ReqFuel.\n(Second fuel.)"
    accel_tpsdot_amts2 = "The curve specifies a fuel pulsewidth percent adder based on rate of change of TPS (TPSdot)\nThis is part of the accel-pump based accel enrichment scheme. Larger changes in TPS require more fuel added.\nThe negative part of the curve is used for decel enleanment, or set to zero PW% for no enleanment.\nEnsure that there is a 0 0 point in the curve so that when TPS is not changing, no additional fuel is added. The number is a percentage of ReqFuel.\n(Second fuel.)"
    knock_starts = "Set the crank angle (for each cylinder) when the knock system starts 'listening' for knock.\nKnock usually occurs in the time after TDC."
    knock_durations = "Set the number of crank degrees that the knock system 'listens' for knock."
    knock_thresholds = "Sets an allowable knock level before retard is triggered.\nThe numbers here are highly engine dependent."
    knock_upscale = "Allows the threshold to be scaled up on a cold engine. Frequently a cold engine is noiser and may cause false alarms without a raised threshold."
    tc_perfect_vss = "The perfect run traction control sets a curve of the 'best' speed (VSS) that you can run for each time-point after launch.\nIf your VSS is reporting a higher number than the curve, it is assumed to be wheelspin and the reactions come into force.\nThis traction control strategy is typically applied early in a run only.\nNote that VSS based traction control is outlawed in some race classes."
    tc_perfect_rpm = "The perfect run traction control sets a curve of the 'best' RPM that you can run for each time-point after launch.\nIf your RPM is higher than the curve, it is assumed to be wheelspin and the reactions come into force.\nThis traction control strategy only makes sense in first gear. Set the final row in the table to just earlier than the time when you expect to shift with an RPM higher than your maximum RPM."
    tc_retard = "Sets the number of degrees of timing retard to apply based on the amount of wheelspin multiplied by how long."
    tc_spkcut = "Sets the amount of spark cut to apply based on the amount of wheelspin multiplied by how long."
    tc_nitrous = "Sets the amount of nitrous cut to apply based on the amount of wheelspin multiplied by how long."
    tc_boost = "Sets the amount to reduce the boost target by based on the amount of wheelspin multiplied by how long."
    tc_boost_duty_delta = "Sets the amount to change the boost duty by based on the amount of wheelspin multiplied by how long."
    tc_addfuel = "Sets the amount of fuel to add based on the amount of wheelspin multiplied by how long."
    primePWTable = "The priming pulse is used to wet the intake manifold walls and provide some initial starting fuel.\nSetting the curve to all zeros will disable fuel pump priming also."
    primePWTable2 = "The priming pulse is used to wet the intake manifold walls and provide some initial starting fuel.\nSetting the curve to all zeros will disable fuel pump priming also."
    crankPctTable = "This percentage table controls the fuel injected when the engine is cranking over. Most engines need 200-400% when cold and near 100% when hot.\n(It is a percentage of ReqFuel, so that if you swap injectors, this curve can be left alone.)"
    crankPctTable2 = "This percentage table controls the fuel injected when the engine is cranking over. Most engines need 200-400% when cold and near 100% when hot.\n(It is a percentage of ReqFuel, so that if you swap injectors, this curve can be left alone.)"
    asePctTable = "Immediately after the engine has started it is normal to need additional fuel. This curve specifies how much as a percentage adder. (5-50%)"
    asePctTable2 = "Immediately after the engine has started it is normal to need additional fuel. This curve specifies how much as a percentage adder. (5-50%)"
    aseCntTable = "Specifies how long (in engine cycles or seconds) to apply afterstart enrichment."
    aseCntTable2 = "Specifies how long (in engine cycles or seconds) to apply afterstart enrichment."
    wueBins = "Specifies the percentage multiplier for fuel during warmup. At cold temperatures 200-300% may be required. At fully warm (final row in table) 100% MUST be specified.\n(LPG users can override this requirement by turning off the warmup warning on the gauge settings/limit page.)"
    wueBins2 = "Specifies the percentage multiplier for fuel during warmup. At cold temperatures 200-300% may be required. At fully warm (final row in table) 100% MUST be specified.\n(LPG users can override this requirement by turning off the warmup warning on the gauge settings/limit page.)"
    mafflow = "Specifies the flow curve in grammes/sec vs. frequency or voltage.\nStart out with the actual flow curve for your MAF sensor and then 'tweak' to tune it to your install."
    dwellrpm_dwell = "For Saab Trionic ignition, this allows the dwell time to be varied with RPM."
    boostvss_duty = "For open-loop boost control, this specifies a solenoid duty based on the wheel speed on VSS1 or VSS2."
    boostvss_target = "For closed-loop boost control, this specifies a target boost level based on the wheel speed on VSS1 or VSS2.\nThis can be used to limit boost in lower gears to reduce the chance of wheelspin or loss of control."
    n2o1_duty = "For progressive control, this specifies the solenoid duty vs. active time or RPM or VSS."
    n2o2_duty = "For progressive control, this specifies the solenoid duty vs. active time or RPM or VSS."
    n2o1_pw = "For progressive control, this specifies the additional fuel pulsewidth vs. active time or RPM or VSS."
    n2o2_pw = "For progressive control, this specifies the additional fuel pulsewidth vs. active time or RPM or VSS."
    n2o1_retard = "For progressive control, this specifies the ignition retard vs. active time or RPM or VSS."
    n2o2_retard = "For progressive control, this specifies the ignition retard vs. active time or RPM or VSS."
    n2o1_fuelpct = "This is the percentage of the Additional Fuel PW lookup between min and max RPMs. Added PW = percentage * PW lookup. Normally this percentage should be set to match the nitrous duty. It can be adjusted up/down to tweak the fuel."
    n2o2_fuelpct = "This is the percentage of the Additional Fuel PW lookup between min and max RPMs. Added PW = percentage * PW lookup. Normally this percentage should be set to match the nitrous duty. It can be adjusted up/down to tweak the fuel."
    matclt_pct = "The curve is the %CLT blended into the MAT reading vs. airflow.\nIn theory, at zero air-flow the air temperature in the intake manifold will reach the manifold (coolant) temperature. At infinite airflow, the air will be unaffected by the temperature of the manifold.\nThe curve is setup to give the 'best estimate' of intake air temperature as part of the speed-density fuel calculation.\nIt would be expected that some CLT should be blended in at low airflows, falling away rapidly to close to zero at higher airflows.\nWhen first enabling this curve it will be necessary to adjust the VE values at low RPMs as they will be compensating for the air density change."
    smallpw0 = "This allows for some correction to the non-linearity that fuel injectors show at low pulsewidths.\nTesting has shown that injectors are frequently linear by 2ms, but below than require more actual pulsewidth than linear to achieve the desired fuel flow.\ne.g. for '1.0ms' of fuel, 1.5ms PW may actually be required."
    smallpw1 = "This allows for some correction to the non-linearity that fuel injectors show at low pulsewidths.\nTesting has shown that injectors are frequently linear by 2ms, but below than require more actual pulsewidth than linear to achieve the desired fuel flow.\ne.g. for '1.0ms' of fuel, 1.5ms PW may actually be required."
    smallpw2 = "This allows for some correction to the non-linearity that fuel injectors show at low pulsewidths.\nTesting has shown that injectors are frequently linear by 2ms, but below than require more actual pulsewidth than linear to achieve the desired fuel flow.\ne.g. for '1.0ms' of fuel, 1.5ms PW may actually be required."
    smallpw3 = "This allows for some correction to the non-linearity that fuel injectors show at low pulsewidths.\nTesting has shown that injectors are frequently linear by 2ms, but below than require more actual pulsewidth than linear to achieve the desired fuel flow.\ne.g. for '1.0ms' of fuel, 1.5ms PW may actually be required."
;    opentimepct0 = "Specifies the percentage change in injector deadtime vs. system voltage.\n13.2V is typically 100%.\nAt lower voltages the deadtime % will be above 100%; at higher voltages it will be below 100%"
;    opentimepct1 = "Specifies the percentage change in injector deadtime vs. system voltage.\n13.2V is typically 100%.\nAt lower voltages the deadtime % will be above 100%; at higher voltages it will be below 100%"
;    opentimepct2 = "Specifies the percentage change in injector deadtime vs. system voltage.\n13.2V is typically 100%.\nAt lower voltages the deadtime % will be above 100%; at higher voltages it will be below 100%"
;    opentimepct3 = "Specifies the percentage change in injector deadtime vs. system voltage.\n13.2V is typically 100%.\nAt lower voltages the deadtime % will be above 100%; at higher voltages it will be below 100%"
	inj_deadtime_table1 = "The injector deadtime in microseconds vs. the battery voltage and DIFFERENTIAL fuel pressure.\n\nTo convert from milliseconds, multiple by 1000. i.e. 1.234ms = 1234us."
	inj_deadtime_curve1 = "The injector deadtime in microseconds vs. the battery voltage.\n\nTo convert from milliseconds, multiple by 1000. i.e. 1.234ms = 1234us."
    boost_timed_pct = "Allows boost to be feathered in after launching.\n100% means use normal boost settings."
    map_sample_timing = "When timed MAP sampling is enabled, this specifies the angle BTDC for each cylinder when MAP sampling should begin.\nExperimentation and use of the Diagnostics-MAP logger will be required to determine the best settings."
    dwellcorr = "Specifies the percentage adjustment to the nominal dwell based on battery voltage.\nInductive coils require greater dwell (charge time) at lower voltages."
    cold_adv_table = "This curve optionally allows ignition timing to be advance during warmup.\n Conversely, some engines may prefer retard during warmup to pre-heat the catalytic convertor."
    iacstepTable = "Specifies the stepper idle 'step' position vs. coolant temperature to be used during warmup.\nLarge positions are more open. Zero is fully closed.\nThe curve will start high at cold temperatures and descend towards zero at high temperatures."
    ipwmTable = "Specifies the PWM idle duty vs. coolant temperature to be used during warmup.\nLarge duties are more open. Typically zero is fully closed. (Some 2 wire Bosch valves have a closed position of about 35%)\nThe curve will start high at cold temperatures and descend towards zero at high temperatures."
    matRetard = "Allows ignition timing to be retarded based on intake temperature. This is primarily for forced induction installs where there is charge heating."
    baroCorrDelta = "Baro correction is very install dependant, if you climb mountains you must watch your AFRs and tune this curve accordingly. Using '%baro' as the primary fuel calculation is usually advised.\n\nThere are two ways that barometric correction may be used.\n\n1. The current way. On the MAP/Baro page the 'At total vacuum' and 'rate' numbers must be set to zero. This curve is then adjusted up or down to alter fuelling based on the barometer reading, where 100% means no correction.\n\n2. The old way. The two numbers are set to 147 and -47 and the curve is based around 0% meaning no correction."
    matCorrDelta2 =  "This curve is the whole air density correction exposed in full.\nIt is based on the 'ideal gas law' and typically varies between 125% cold to 75% hot."
    matCorrDelta = "Allows for minor corrections to fuelling based on manifold air temperature (MAT) when using MAF to control fuelling. The default curve is 0% meaning no correction."
    EAEAWN2 = "This curve modifies the EAE Adhere-to-walls curve. It allows the amount of correction specified by the EAE Adhere-to-walls curve to be increased or decreased based on RPM."
    EAEAWN = "This curve modifies the EAE Adhere-to-walls curve. It allows the amount of correction specified by the EAE Adhere-to-walls curve to be increased or decreased based on RPM."
    EAEAWW2 = "This curve modifies the EAE Adhere-to-walls curve. It allows the amount of correction specified by the EAE Adhere-to-walls curve to be increased or decreased based on coolant temperature."
    EAEAWW = "This curve modifies the EAE Adhere-to-walls curve. It allows the amount of correction specified by the EAE Adhere-to-walls curve to be increased or decreased based on coolant temperature."
    EAEBAWC2 = "This curve determines how much fuel is getting added to the port walls per injection event. It is a percentage (Y-axis) of each injection event based on load (X-axis)."
    EAEBAWC = "This curve determines how much fuel is getting added to the port walls per injection event. It is a percentage (Y-axis) of each injection event based on load (X-axis)."
    EAEBSOC2 = "This curve determines how much fuel is being sucked from the walls on each intake (valve open) event. It is a percentage (Y-axis) of the total amount of fuel that has adhered to the walls based on load (X-axis), so therefore the percentages are much smaller (about 10x smaller) than the Adhere-to-walls coefficients."
    EAEBSOC = "This curve determines how much fuel is being sucked from the walls on each intake (valve open) event. It is a percentage (Y-axis) of the total amount of fuel that has adhered to the walls based on load (X-axis), so therefore the percentages are much smaller (about 10x smaller) than the Adhere-to-walls coefficients."
    EAESON2 = "This curve modifies the EAE Sucked-from-walls curve. It allows the amount of correction specified by the EAE Sucked-from-walls curve to be increased or decreased based on RPM."
    EAESON = "This curve modifies the EAE Sucked-from-walls curve. It allows the amount of correction specified by the EAE Sucked-from-walls curve to be increased or decreased based on RPM."
    EAESOW2 = "This curve modifies the EAE Sucked-from-walls curve. It allows the amount of correction specified by the EAE Sucked-from-walls curve to be increased or decreased based on coolant temperature."
    EAESOW = "This curve modifies the EAE Sucked-from-walls curve. It allows the amount of correction specified by the EAE Sucked-from-walls curve to be increased or decreased based on coolant temperature."
    XAcc = "This is the percentage of the fuel (0-100%) that goes into the wall puddle while accelerating (fuel pulse width increasing), with the remainder of the squirt going directly into the cylinder to be burned."
    XDec = "This is the percentage of fuel (0-100%) going into the wall puddle while decelerating (fuel pulse width decreasing),"
    TauAcc = "This is the time factor vs. RPM used during acceleration."
    TauDec = "This is the time factor vs. RPM used during deceleration."
    XClt = "Coolant temperature (CLT) correction to the puddling factor X."
    TauClt = "Coolant temperature (CLT) correction to the time factor Tau."
    MapThreshXTD = "X-Tau accel tables are used when MAPdot is positive or less negative than this start transition threshold. In-between a blend is used."
    MapThreshXTD2 = "X-Tau Decel tables are used when MAPdot is more negative than this finish transition threshold. In-between a blend is used."
    NoiseFilterLen = "The duration of the noise filter depending on RPM. Its aim is to filter out brief spikes of noise on the tach input. The settings here depend on wheel mode and are engine specific. Setting the filter period too high will filter out real teeth.\nExamples\n36-1, 60-2: 500rpm = 200us, 7500rpm = 13\nBasic crank trigger: 500rpm = 1800us, 7500rpm = 120us"
    idleadvance_curve = "Sets the timing vs engine load when Idle-Advance is active. Typically the curve will ramp from low advance at low load to more advance at higher loads to stabilise idle."
    pwmidle_target_rpms = "The closed-loop idle RPM target depending on coolant temperature. It is normal to set a high idle on a cold engine, tapering down as the engine warms up."
    RevLimRpm1 = "When the coolant-based rev-limiter is enabled this allows you to specify different hard rev limits depending on the coolant temperature to prevent a cold engine from being over-revved."
    pwmidle_crank_dutyorsteps_duty = "The idle valve position during cranking. This should be set high enough so that the engine can start without touching the throttle when cold, but not so high that the engine revs up too far immediately after starting."
    pwmidle_crank_dutyorsteps_steps = "The idle valve position during cranking. This should be set high enough so that the engine can start without touching the throttle when cold, but not so high that the engine revs up too far immediately after starting."
    ITB_load_loadvals = "This curve is used to allocate the bins on the VE table to either Speed-Density or Alpha-N tuning. The area of the VE table below the load value from the curve will be used for Speed-Density tuning and the area above the curve will be used for Alpha-N tuning, this is set by personal preference. If unsure leave at 50% across the range.\nChanging this curve will require the VE table to be retuned.\nSee the setting up manual for more details on ITB mode."
    ITB_load_switchpoints = "This curve defines the TPS value where the MAP load reaches %Baro switchpoint (e.g. 90% baro). It will start low at low RPMs and increase at higher RPMs. This curve will be different for each engine and should be set up using values obtained from log files from your engine e.g. using scatterplots. Setting this curve is an important part of ITB mode.\nChanging this curve will require the VE table to be retuned.\nSee the setting up manual for more details on ITB mode."
    ITB_load_mappoint = "Above this MAP value, tuning switches from MAP based to TPS based. Default is 90% and works for most engines. This is the main setting that controls the MAP based to TPS based switch. Uses the MAP and Barometer sensor input values."
    ITB_load_idletpsthresh = "A minimum TPS value that must be met to allow the switch to TPS based tuning to occur. This is sometimes useful in idle tuning."
; tables
    ego_auth_table = "Specifies the EGO authority limit across the range of engine operation condition. Setting zero means there will be no change in fuel based on the lambda sensor i.e. open-loop mode.\nWhen using separate authority tables, this table is for the positive direction."
    ego_auth_table2 = "Specifies the negative EGO authority limit across the range of engine operation condition. Setting zero means there will be no change in fuel based on the lambda sensor i.e. open-loop mode. Note that positive numbers are always used in the table such that 5 means to allow up to 5% fuel to be removed."
    ltt_table1 = "This read-only table shows the long-term-terim values the ECU has calculated based on lambda sensor feedback."
    alphaMAPtable = "The best-guess MAP value from an alpha-N (TPS vs. RPM) lookup table. This is primarily used as a fallback in case of MAP sensor failure."
    pwmidle_cl_initialvalues_duties = "The best-guess idle valve duty for RPM/load. This allows you to 'kick-start' the closed-loop idle by setting the valve to the most likely position."
    pwmidle_cl_initialvalues_steps = "The best-guess idle valve position for RPM/load. This allows you to 'kick-start' the closed-loop idle by setting the valve to the most likely position."
    vvt_timing1 = "Desired VVT (relative) timing vs RPM/load"
    vvt_timing2 = "Desired VVT (relative) timing vs RPM/load"
    als_rifuelcut = "The fuel-cut percentage vs. RPM/load when in anti-lag idle mode.\nThis must ONLY be used with sequential fuel as it cuts off injectors in a round-robin manner."
    als_fuelcut = "The fuel-cut percentage vs. RPM/load when in anti-lag mode.\nThis must ONLY be used with sequential fuel as it cuts off injectors in a round-robin manner."
    als_sparkcut = "The spark-cut percentage vs. RPM/load when in anti-lag mode.\nThis drops sparks in a round-robin manner."
    als_timing = "The ignition advance vs. RPM/load when in anti-lag mode.\nTypically this will be -20 to -50 for ATDC timing."
    als_addfuel = "The percentage of fuel to be added vs. RPM/load when in anti-lag mode."
    waterinj_duty = "The duty cycle of the output vs RPM/load"
    maxafr1_diff = "The maximum AFR difference allowed on the leaner side. This compares the AFR target table and the wideband lambda sensor reading.\nTypically a larger allowance is allowed under low load and low RPMs. High load and into boost require tight control to guard against engine-damaging lean conditions."
    veTable1 = "The main fuel table (1). Larger VE values mean more fuel, smaller mean less fuel."
    veTable2 = "The secondary fuel table (2), can be used as a blend table with table 1. Larger VE values mean more fuel, smaller mean less fuel."
    veTable3 = "The alternate main fuel table (3). Can be used as a switched table from no.1. Larger VE values mean more fuel, smaller mean less fuel."
    veTable4 = "The alternate secondary fuel table (4). Can be used as a blended and switched table from no.1+2. Larger VE values mean more fuel, smaller mean less fuel."
    idleve_table1 = "Sets the VE values when 'idle-VE' is active."
    idleve_table2 = "Sets the VE values when 'idle-VE' is active."
    staged_percents = "Percentage values specify the amount of staging.\n0% = not staged, only primaries\n100% = fully staged."
    afrTable1 = "Sets the target AFR vs RPM/load.\nWhen 'incorporate AFR' is off, this is a reference table only.\nWhen 'incorporate AFR' is on, this table is included in the fuel calculation.\n\nSet this table before beginning tuning."
    afrTable2 = "Sets the target AFR vs RPM/load.\nWhen 'incorporate AFR' is off, this is a reference table only.\nWhen 'incorporate AFR' is on, this table is included in the fuel calculation.\n\nSet this table before beginning tuning."
    advanceTable1 = "The main ignition advance table (1). Numbers are actual timing BTDC.\nBe sure to have verified timing before starting tuning."
    advanceTable2 = "The secondary ignition advance table (2), can be used as a blend table with table 1."
    advanceTable3 = "The alternate main ignition advance table (3). Can be used as a switched table from no.1"
    advanceTable4 = "The alternate secondary ignition advance table (4). Can be used as a blended and switched table from no.1+2."
    RotarySplitTable = "Specifies the split (delay) in degrees between leading and trailing coils."
    boost_ctl_pwm_targets = "For open-loop boost, sets the output duty cycle vs. TPS/RPM"
    boost_ctl_load_targets = "For closed-loop boost, sets the target absolute kPa vs. TPS/RPM i.e. this number will always be over 100kPa"
    boost_ctl_pwm_targets2 = "For open-loop boost, sets the output duty cycle vs. TPS/RPM"
    boost_ctl_cl_pwm_targs1 = "The best-estimate boost valve duty for target load vs. RPM. This allows you to 'kick-start' the closed-loop boost by setting the valve to the this position before engaging closed-loop PID control.\n\nThe table is initially determined by using 'Setup Mode' and tuning as an open-loop table. Once the table is close enough, switch to 'Basic Mode' (or 'Advanced Mode') to enable the closed-loop control."
    boost_ctl_cl_pwm_targs2 = "The best-estimate boost valve duty for target load vs. RPM. This allows you to 'kick-start' the closed-loop boost by setting the valve to the this position before engaging closed-loop PID control.\n\nThe table is initially determined by using 'Setup Mode' and tuning as an open-loop table. Once the table is close enough, switch to 'Basic Mode' (or 'Advanced Mode') to enable the closed-loop control."
    boost_ctl_load_targets2 = "For closed-loop boost, sets the target absolute manifold kPa vs. TPS/RPM. For Open-loop Dome Control, this sets the target Dome pressure instead. "
    inj_trima = "Specifies a +/- percentage adjustment on the basic fuel pulsewidth to allow for difference per cylinder."
    inj_trimb = "Specifies a +/- percentage adjustment on the basic fuel pulsewidth to allow for difference per cylinder."
    inj_trimc = "Specifies a +/- percentage adjustment on the basic fuel pulsewidth to allow for difference per cylinder."
    inj_trimd = "Specifies a +/- percentage adjustment on the basic fuel pulsewidth to allow for difference per cylinder."
    inj_trime = "Specifies a +/- percentage adjustment on the basic fuel pulsewidth to allow for difference per cylinder."
    inj_trimf = "Specifies a +/- percentage adjustment on the basic fuel pulsewidth to allow for difference per cylinder."
    inj_trimg = "Specifies a +/- percentage adjustment on the basic fuel pulsewidth to allow for difference per cylinder."
    inj_trimh = "Specifies a +/- percentage adjustment on the basic fuel pulsewidth to allow for difference per cylinder."
    inj_trimi = "Specifies a +/- percentage adjustment on the basic fuel pulsewidth to allow for difference per cylinder."
    inj_trimj = "Specifies a +/- percentage adjustment on the basic fuel pulsewidth to allow for difference per cylinder."
    inj_trimk = "Specifies a +/- percentage adjustment on the basic fuel pulsewidth to allow for difference per cylinder."
    inj_triml = "Specifies a +/- percentage adjustment on the basic fuel pulsewidth to allow for difference per cylinder."
    inj_trimm = "Specifies a +/- percentage adjustment on the basic fuel pulsewidth to allow for difference per cylinder."
    inj_trimn = "Specifies a +/- percentage adjustment on the basic fuel pulsewidth to allow for difference per cylinder."
    inj_trimo = "Specifies a +/- percentage adjustment on the basic fuel pulsewidth to allow for difference per cylinder."
    inj_trimp = "Specifies a +/- percentage adjustment on the basic fuel pulsewidth to allow for difference per cylinder."
    inj_timing = "The injector timing in degrees BTDC vs load/RPM. Typical wisdom says that the injection event should finish just as the inlet valve is opening. This corresponds to around 360 BTDC as the timing is measured with respect to the spark event.\nActual best timing can be determined by dyno or road testing."
    inj_timing_sec = "The injector timing (for secondary staged injectors) in degrees BTDC vs load/RPM. Typical wisdom says that the injection event should finish just as the inlet valve is opening. This corresponds to around 360 BTDC as the timing is measured with respect to the spark event.\nActual best timing can be determined by dyno or road testing."
    spk_trima = "Specifies a +/- timing angle adjustment on the basic timing to allow for difference per cylinder."
    spk_trimb = "Specifies a +/- timing angle adjustment on the basic timing to allow for difference per cylinder."
    spk_trimc = "Specifies a +/- timing angle adjustment on the basic timing to allow for difference per cylinder."
    spk_trimd = "Specifies a +/- timing angle adjustment on the basic timing to allow for difference per cylinder."
    spk_trime = "Specifies a +/- timing angle adjustment on the basic timing to allow for difference per cylinder."
    spk_trimf = "Specifies a +/- timing angle adjustment on the basic timing to allow for difference per cylinder."
    spk_trimg = "Specifies a +/- timing angle adjustment on the basic timing to allow for difference per cylinder."
    spk_trimh = "Specifies a +/- timing angle adjustment on the basic timing to allow for difference per cylinder."
    spk_trimi = "Specifies a +/- timing angle adjustment on the basic timing to allow for difference per cylinder."
    spk_trimj = "Specifies a +/- timing angle adjustment on the basic timing to allow for difference per cylinder."
    spk_trimk = "Specifies a +/- timing angle adjustment on the basic timing to allow for difference per cylinder."
    spk_triml = "Specifies a +/- timing angle adjustment on the basic timing to allow for difference per cylinder."
    spk_trimm = "Specifies a +/- timing angle adjustment on the basic timing to allow for difference per cylinder."
    spk_trimn = "Specifies a +/- timing angle adjustment on the basic timing to allow for difference per cylinder."
    spk_trimo = "Specifies a +/- timing angle adjustment on the basic timing to allow for difference per cylinder."
    spk_trimp = "Specifies a +/- timing angle adjustment on the basic timing to allow for difference per cylinder."
    narrowband_tgts = "The target narrowband lamba sensor voltage vs. load/RPM"
    vsslaunch_rpm = "RPM specifies the hard limiter RPM for given wheel speed.\nRetard is the retard to ignition advance for given wheel speed.\nWhen wheel speed exceeds maximum speed on curve, the launch control is disabled until speed drops below the re-arm setting."
    fuelcut_fuelon_upper_rpmdot = "When revs are falling more quickly than this RPMdot value the initial RPM is used for fuel return.\nIn-between upper and lower RPMdot values, the return RPM is interpolated. This number must be larger than the 'lower' RPMdot setting.\nTypically 1000."
    fuelcut_fuelon_lower_rpmdot = "When revs are falling more slowly than this RPMdot value the lower RPM is used for fuel return. This will happen when coasting down.\nIf revs are falling more quickly then any return transitions will be cancelled and the return RPM will be raised.\n\nSet this so that clutch-in during fuel cut does not stall.\nTypically 500.\n\n(The RPMdot shows negative in datalogs when revs are falling, so a setting of 500 means less negative than -500)"
    egoAlgorithm_delay_table = "Specifies whether to use IGN events or delay table to determine how often EGO runs"
    ego_delay_table = "Table which specifies the delay between runs of the EGO algorithm in ms"
    ego_delay_rpms  = "RPM (x) axis of the EGO delay table."
    ego_delay_loads = "Load (y) axis of the EGO delay table."
    ego_sensor_delay = "Static value representing O2 sensor response time" 
    generic_pid_flags_a_on = "Generic Closed-Loop channel A on or off.\nA table is used to plot the desired value of the feedback value (PV) based on a lookup from the input variables.\nA closed-loop PID method adjusts the PWM output until the desired feedback value is achieved."
    generic_pid_flags_a_type = "Type B (change in error affects P term) or\nType C (change in PV affects P term) PID" 
    generic_pid_flags_a_direction = "Output polarity for PID output"
    generic_pid_flags_a_output_type = "Use a PWM output or the stepper output for PID output" 
    generic_pid_flags_a_lookup_type = "Use a table or a curve for closed-loop table lookup" 
    generic_pid_flags_b_on = "Generic Closed-Loop channel B on or off.\nA table is used to plot the desired value of the feedback value (PV) based on a lookup from the input variables.\nA closed-loop PID method adjusts the PWM output until the desired feedback value is achieved."
    generic_pid_flags_b_type = "Type B (change in error affects P term) or\nType C (change in PV affects P term) PID" 
    generic_pid_flags_b_direction = "Output polarity for output"
    generic_pid_flags_b_output_type = "Use a PWM output or the stepper output for PID output" 
    generic_pid_flags_b_lookup_type = "Use a table or a curve for closed-loop table lookup" 
    generic_pid_pwm_opts_freq_a    = "Frequency to use for PWM output" 
    generic_pid_pwm_opts_freq_b    = "Frequency to use for PWM output"
    generic_pid_pwm_outs_a        = "Output pin.\nThis is the output to control the actuator (or whatever) that change the process.\ne.g. opens or closes a valve."
    generic_pid_pwm_outs_b        = "Output pin.\nThis is the output to control the actuator (or whatever) that change the process.\ne.g. opens or closes a valve."
    generic_pid_upper_inputlim_a = "Maximum value for feedback input (PV)" 
    generic_pid_upper_inputlim_b = "Maximum value for feedback input (PV)" 
    generic_pid_lower_inputlim_a = "Minimum value for feedback input (PV)"
    generic_pid_lower_inputlim_b = "Minimum value for feedback input (PV)"
    generic_pid_output_upperlim_a = "Maximum output duty" 
    generic_pid_output_upperlim_b = "Maximum output duty" 
    generic_pid_output_lowerlim_a = "Minimum output duty" 
    generic_pid_output_lowerlim_b = "Minimum output duty" 
    generic_pid_rpms_a     = "RPM axis bins for lookup table" 
    generic_pid_rpms_b     = "RPM axis bins for lookup table" 
    generic_pid_loadvals_a = "Load axis bins for lookup table" 
    generic_pid_loadvals_b = "Load axis bins for lookup table" 
    generic_pid_targets_a = "Generic PID lookup table\n\nThis is the target value which the closed-loop algorithm aims to match to the feedback input by controlling the PWM output."
    generic_pid_targets_b = "Generic PID lookup table\n\nThis is the target value which the closed-loop algorithm aims to match to the feedback input by controlling the PWM output."
    generic_pid_control_interval_a = "Time in milliseconds between each run of PID control loop" 
    generic_pid_control_interval_b = "Time in milliseconds between each run of PID control loop"
    generic_pid_P_a = "Proportional gain" 
    generic_pid_P_b = "Proportional gain" 
    generic_pid_I_a = "Integral gain"
    generic_pid_I_b = "Integral gain" 
    generic_pid_D_a = "Derivative gain"
    generic_pid_D_b = "Derivative gain"
    generic_pid_load_offset_a = "Variable used as the Y load axis in the lookup table"
    generic_pid_PV_offset_a = "Variable used as feedback input (PV)"
    generic_pid_load_offset_b = "Variable used as the Y load axis in the lookup table"
    generic_pid_PV_offset_b = "Variable used as feedback input (PV)"

    outmsg1_offset01 = "Offset in the OutputChannels of the first variable in the outmsg 1. The outmsg is used to transfer a set of variables to a CAN device. The CAN device must support this and initiate the transfer. The list of variables must match on both devices."
    outmsg1_size01 = "Size in bytes of the first variable in the outmsg 1"
    outmsg2_offset01 = "Offset in the OutputChannels of the first variable in the outmsg 2. The outmsg is used to transfer a set of variables to a CAN device. The CAN device must support this and initiate the transfer. The list of variables must match on both devices."
    outmsg2_size01 = "Size in bytes of the first variable in the outmsg 2"
    outmsg3_offset01 = "Offset in the OutputChannels of the first variable in the outmsg 3. The outmsg is used to transfer a set of variables to a CAN device. The CAN device must support this and initiate the transfer. The list of variables must match on both devices."
    outmsg3_size01 = "Size in bytes of the first variable in the outmsg 3"
    outmsg4_offset01 = "Offset in the OutputChannels of the first variable in the outmsg 4. The outmsg is used to transfer a set of variables to a CAN device. The CAN device must support this and initiate the transfer. The list of variables must match on both devices."
    outmsg4_size01 = "Size in bytes of the first variable in the outmsg 4"

    dwell_table_values = "Specifies the base dwell time in milliseconds based on RPM/load.\nThis can be used to reduce dwell where possible to increase spark-plug life.\nAreas in the tune of very rich or very dilute mixture will need most spark energy.\n(Battery voltage correction is applied afterwards.)"
    spkadj_max = "Sets a limit on the maximum adjustment a remote device (e.g. trans controller) can apply to the ignition timing.\nThis is a positive number, meaning advance."
    spkadj_min = "Sets a limit on the minimum adjustment a remote device (e.g. trans controller) can apply to the ignition timing.\nThis is a negative number, meaning retard."

    cranktaper_pct = "Allows cranking fuel to be tapered down during extended cranking to reduce flooding.\n100% means normal cranking pulsewidth."
    flashlock = "Locks or unlocks the sensor calibration tables.\nLocked = Prevents accidental changes to the tables.\nUnlocked = Allows fresh calibrations to be written.\n\nEnsure you lock again after writing the calibration tables."
    scatterRuntimeEnabled = "Default = Enabled.\n\nEnabled = Enables a faster method of collecting realtime data from MS3. Recommended for all users.\nDisabled = use previous slower method for realtime data."
    can_outpc_msg = "The base message identifier in decimal of the sequential 11-bit CAN addresses used for realtime data (outpc) broadcasting. The ECU assigns the next identifier for each data group whether enabled or not.\ni.e. group 0 is at base identifier, group 17 is at base identifier+17\n\nThis means that by using the default base address you can use a predefined template for your dash etc.\nSee the manual for full message contents and offsets."
    can_outpc_gp00 = "Enables broadcasting of this group of data at the data rate specified.\n\nPick an appropriate rate for the data within the group, there is no benefit in transmitting slow changing data at a high rate."
    can_outpc_gp16 = "Enables broadcasting of this group of data at the data rate specified.\n\nPick an appropriate rate for the data within the group, there is no benefit in transmitting slow changing data at a high rate."
    can_outpc_gp32 = "Enables broadcasting of this group of data at the data rate specified.\n\nPick an appropriate rate for the data within the group, there is no benefit in transmitting slow changing data at a high rate."
    can_outpc_gp48 = "Enables broadcasting of this group of data at the data rate specified.\n\nPick an appropriate rate for the data within the group, there is no benefit in transmitting slow changing data at a high rate."
    can_outpc_gp00_master = "Global enable/disable of realtime data CAN broadcasting."
    can_rcv_opt_on = "Master enable for CAN receiving."
    can_rcv_opt_share = "Off: Once matched here, the packet is unavailable to other sub-modules.\nOn: Allows data packets to be shared with other sub-modules. e.g. the same packet can be received by the EGT system and this general CAN receiving."
#9    engine_state_accel_fast_thresh = "When RPMdot is above this threshold, your engine is considered to be accelerating quickly. This should be set to slightly below what is normal for WOT in a low gear.\nUsed by Closed-loop idle control, idle-VE and idle-advance."
#9    engine_state_accel_slow_thresh = "Between this value for RPMdot and the fast accel threshold, your engine is accelerating slowly. It should be set as low as possible to catch all actual acceleration, but not set so low that it catches RPM jitter.\nUsed by Closed-loop idle control, idle-VE and idle-advance."
#9    engine_state_decel_fast_thresh = "Below this value for RPMdot, your engine is decelerating fast. This should be set to a value that is slightly above the RPMdot when you rev high and then let the engine fall back to idle. Use an RPMdot value from the middle of the rev range.\nUsed by Closed-loop idle control, idle-VE and idle-advance, idle-VE, idle-advance and overrun fuel-cut."
#9    engine_state_decel_slow_thresh = "Between this value for RPMdot and the fast threshold, your engine is decelerating slowly. To set this, cruise in a high gear, then see what RPMdot value you get by lifting off the throttle fully and decelerating. Set this value slightly above that RPMdot value.\nUsed by Closed-loop idle control, idle-VE and idle-advance, idle-VE, idle-advance and overrun fuel-cut."
    engine_state_accel_slow_thresh = "When RPMdot is above this threshold, your engine is considered to be accelerating. It should be set as low as possible to catch all actual acceleration, but not set so low that it catches RPM jitter.\nUsed by Closed-loop idle control, idle-VE and idle-advance."
    engine_state_decel_slow_thresh = "When RPMdot is more negative than this value (larger), your engine is decelerating. To set this, cruise in a high gear, then see what RPMdot value you get by lifting off the throttle fully and decelerating. Set this value slightly above that RPMdot value.\nUsed by Closed-loop idle control, idle-VE and idle-advance, idle-VE, idle-advance and overrun fuel-cut."
    engine_state_tps_closed_thresh = "Below this threshold your throttle is considered to be closed.\nUsed by Closed-loop idle control, idle-VE and idle-advance, idle-VE, idle-advance and overrun fuel-cut."
    engine_state_overrun_map_thresh = "Below this threshold, as long as the engine is at least slowly decelerating, the engine is considered to be in overrun.\nUsed for overrun fuel-cut."
    engine_state_flags_use_vss = "When VSS is enabled for engine states, this setting should be set just above the vehicle speed where idle operation is desired."
    engine_state_vss_thresh = "Use VSS to help get more accurate engine state.\nUsed by Closed-loop idle control."
    engine_state_tps_wot_thresh = "TPS value above which the engine is considered to be at wide-open throttle.\nUsed for Closed-loop idle 'open valve on WOT' feature."
    can_rcv_id1 = "CAN identifier to listen for. (See also Offset)"
    can_rcv_var1 = "ECU variable to store resulting data to.\nThis can then be used by other subsystems.\n\nBe sure to enable the master enable above once all options are set."
    can_rcv_off1 = "Offset of data within each 8-byte CAN message.\nFor systems sending sequential messages, you need to calculate the actual identifier and offset.\ne.g. Take the offset and divide by 8. e.g. offset = 19. Divide by 8 gives 2 remainder 3. Add 2 to the identifier and the offset is 3."
    can_rcv_size1 = "Endianism, data size and sign.\nB = Big endian\n (Motorola, high byte first)\nL = Little endian\n (Intel, low byte first)\n# = # bytes\nU = Unsigned\nS = Signed"
    can_rcv_size_ext1 = "Standard (11bit) or Extended (29bit) headers on message."
    can_rcv_mult1 = "Result = ((raw_data * mult) / divide) + add"
    pwm_opt_load_a_offset = "This selects the 'load' axis on the table or curve."
    pwm_opt_load_b_offset = "This selects the 'load' axis on the table or curve."
    pwm_opt_load_c_offset = "This selects the 'load' axis on the table or curve."
    pwm_opt_load_d_offset = "This selects the 'load' axis on the table or curve."
    pwm_opt_load_e_offset = "This selects the 'load' axis on the table or curve."
    pwm_opt_load_f_offset = "This selects the 'load' axis on the table or curve."
    iobox_opta1 = "Enables or disables a IO-box for additional inputs and outputs"
    iobox_id1 = "Base CAN identifier used by IO-box."
    iobox_optb1vss = "Selects which speed inputs are used on the IO-box."
    iobox_opta1adv = "Selects between automatic and manual advanced configuration."
    iobox_opta1canin = "Base CANIN for this IObox. i.e. input 1 is CANIN1, input2 is CANIN2 etc."
    iobox_opta1canout = "Base CANOUT for this IObox. i.e. output 1 is CANOUT1, output2 is CANOUT2 etc."
    iobox_opta1canadc = "Base CANADC for this IObox. i.e. ADC1 is CANADC1, ADC2 is CANADC2 etc."
    iobox_optb1tachrate = "Rate to broadcast wheel speed data from IO-box."
    iobox_optb1inrate = "Rate to broadcast inputs data from IO-box."
    iobox_optb1outrate = "Rate to send outputs to IO-box."
    iobox_opta2 = "Enables or disables a IO-box for additional inputs and outputs."
    iobox_id2 = "Base CAN identifier used by IO-box."
    iobox_optb2vss = "Selects which speed inputs are used on the IO-box."
    iobox_opta2adv = "Selects between automatic and manual advanced configuration."
    iobox_opta2canin = "Base CANIN for this IObox. i.e. input 1 is CANIN1, input2 is CANIN2 etc."
    iobox_opta2canout = "Base CANOUT for this IObox. i.e. output 1 is CANOUT1, output2 is CANOUT2 etc."
    iobox_opta2canadc = "Base CANADC for this IObox. i.e. ADC1 is CANADC1, ADC2 is CANADC2 etc."
    iobox_optb2tachrate = "Rate to broadcast wheel speed data from IO-box."
    iobox_optb2inrate = "Rate to broadcast inputs data from IO-box."
    iobox_optb2outrate = "Rate to send outputs to IO-box."
    iobox_opta3 = "Enables or disables a IO-box for additional inputs and outputs"
    iobox_id3 = "Base CAN identifier used by IO-box."
    iobox_optb3vss = "Selects which speed inputs are used on the IO-box."
    iobox_opta3adv = "Selects between automatic and manual advanced configuration."
    iobox_opta3canin = "Base CANIN for this IObox. i.e. input 1 is CANIN1, input2 is CANIN2 etc."
    iobox_opta3canout = "Base CANOUT for this IObox. i.e. output 1 is CANOUT1, output2 is CANOUT2 etc."
    iobox_opta3canadc = "Base CANADC for this IObox. i.e. ADC1 is CANADC1, ADC2 is CANADC2 etc."
    iobox_optb3tachrate = "Rate to broadcast wheel speed data from IO-box."
    iobox_optb3inrate = "Rate to broadcast inputs data from IO-box."
    iobox_optb3outrate = "Rate to send outputs to IO-box."
    iobox_opta4 = "Enables or disables a IO-box for additional inputs and outputs."
    iobox_id4 = "Base CAN identifier used by IO-box."
    iobox_optb4vss = "Selects which speed inputs are used on the IO-box."
    iobox_opta4adv = "Selects between automatic and manual advanced configuration."
    iobox_opta4canin = "Base CANIN for this IObox. i.e. input 1 is CANIN1, input2 is CANIN2 etc."
    iobox_opta4canout = "Base CANOUT for this IObox. i.e. output 1 is CANOUT1, output2 is CANOUT2 etc."
    iobox_opta4canadc = "Base CANADC for this IObox. i.e. ADC1 is CANADC1, ADC2 is CANADC2 etc."
    iobox_optb4tachrate = "Rate to broadcast wheel speed data from IO-box."
    iobox_optb4inrate = "Rate to broadcast inputs data from IO-box."
    iobox_optb4outrate = "Rate to send outputs to IO-box."
    pitlim_opt_on = "Enables Pit Lane Limiter" 
    pitlim_opt_mode = "Fixed = one fixed limiter speed\nHolding = takes speed when button pressed as limiter and holds it."
    pitlim_opt_retard = "Whether to use spark retard."
    pitlim_opt_spkcut = "Whether to use spark cut. (Can cause backfires and exhaust damage.)"
    pitlim_opt_fuelcut = "Whether to use fuel cut."
    pitlim_opt_fuelprog = "Whether to use a progressive fuel cut (sequential only.)"
    pitlim_opt_vssrpm = "Whether VSS or RPM is used as the hold target."
    pitlim_enin = "Switch input."
    pitlim_speed = "Fixed speed limit."
    pitlim_retardmax = "Maximum allowed spark retard."
    pitlim_sensitivity = "Adjust tracking sensitivity to adjust limiter window. Initially the 0% fuel/spark cut is applied at the limit and full cut is applied at the limit+range. If the speed is above the limit, the lower limiting point is lowered slowly."
    pitlim_speed_range = "Control range of speed to apply limiters across. 5mph recommended as a starting point. Setting the range too small will cause oscillation."
    pitlim_rpm_range = "Control range of RPM to apply limiters across. Setting the range too small will cause oscillation."
    dashbcast_opta1 = "Enables or disables Dash Broadcasting.\nThis is a simplified set of data for display or logging sent over CAN."
    dashbcast_id1 = "Base CAN identifier used for Dash Broadcasting."
    dashbcast_opta1adv = "Selects between automatic and manual advanced configuration."
    dashbcast_opta4outrate = "Rate to send outputs."
    boost_dome_Kp1 = "PID Proportional Gain 1 for wastegate dome pressure control."
    boost_dome_Kp2 = "PID Proportional Gain 2 for wastegate dome pressure control."
    boost_dome_Ki1 = "PID Integral Gain 1 for wastegate dome pressure control."
    boost_dome_Ki2 = "PID Integral Gain 2 for wastegate dome pressure control."
    boost_dome_Kd1 = "PID Derivative Gain 1 for wastegate dome pressure control."
    boost_dome_Kd2 = "PID Derivative Gain 2 for wastegate dome pressure control."
    boost_dome_outputs_fill1 = "Output 1 for solenoid that controls filling of wastegate dome with air."
    boost_dome_outputs_fill2 = "Output 2 for solenoid that controls filling of wastegate dome with air."
;    boost_dome_settings1_on = "Turn off/on first channel of dome control."
    boost_dome_settings1_emptydome_offboost = "This setting controls whether channel 1 will empty the wastegate dome when off boost."
    boost_dome_settings1_advanced = "This settings controls whether channel 1's PID routine is tuned with just the slider or with the slider for sensitivity and the individual PID gains for fine-tuning."
    boost_dome_testopt = "For testing, the Dome target pressure can be manually set, this selects which dome channel to test."
    boost_dome_testtarg = "Sets the target dome pressure while testing."
;    boost_dome_settings2_on = "Turn off/on second channel of dome control."
;    boost_dome_settings2_emptydome_offboost = "This setting controls whether channel 2 will empty the wastegate dome when off boost."
;    boost_dome_settings2_advanced = "This settings controls whether channel 2's PID routine is tuned with just the slider or with the slider for sensitivity and the individual PID gains for fine-tuning."
    boost_dome_sensitivities1 = "Dome pressure control's channel 1 PID sensitivity. Adjust to the right to make PID loop more sensitive."
    boost_dome_sensitivities2 = "Dome pressure control's channel 2 PID sensitivity. Adjust to the right to make PID loop more sensitive."
    boost_dome_freqs1 = "Channel 1 boost solenoid output frequency."
    boost_dome_fill_out_mins1 = "Channel 1 dome pressure control output minimum duty. Set to just below the lowest duty that affects actual dome pressure."
    boost_dome_fill_out_mins2 = "Channel 2 dome pressure control output minimum duty. Set to just below the lowest duty that affects actual dome pressure."
    boost_dome_fill_out_maxs1 = "Channel 1 dome pressure control output maximum duty. Set to just above the highest duty that affects actual dome pressure."
    boost_dome_fill_out_maxs2 = "Channel 2 dome pressure control output maximum duty. Set to just above the highest duty that affects actual dome pressure."
    boost_dome_empty_out_mins1 = "Channel 1 dome pressure control output minimum duty. Set to just below the lowest duty that affects actual dome pressure."
    boost_dome_empty_out_mins2 = "Channel 2 dome pressure control output minimum duty. Set to just below the lowest duty that affects actual dome pressure."
    boost_dome_empty_out_maxs1 = "Channel 1 dome pressure control output maximum duty. Set to just above the highest duty that affects actual dome pressure."
    boost_dome_empty_out_maxs2 = "Channel 2 dome pressure control output maximum duty. Set to just above the highest duty that affects actual dome pressure."
    boost_dome_freqs2 = "Channel 2 boost solenoid output frequency."
    boost_dome_inputs1 = "Channel 1 MAP sensor input. Uses generic sensors feature. This must be calibrated to give absolute kPa i.e. around 100kPa for no line pressure."
    boost_dome_inputs2 = "Channel 2 MAP sensor input. Uses generic sensors feature. This must be calibrated to give absolute kPa i.e. around 100kPa for no line pressure."
    boost_dome_outputs_empty1 = "Output 1 for solenoid that controls emptying of wastegate dome pressure."
    boost_dome_outputs_empty2 = "Output 2 for solenoid that controls emptying of wastegate dome pressure."
    boost_dome_hyst1 = "Pressure dead-band between fill and empty in simple (non-PID) mode. If you experience overshoot during fill, try increasing the deadband."
    boost_dome_hyst1 = "Pressure dead-band between fill and empty in simple (non-PID) mode. If you experience overshoot during fill, try increasing the deadband."
    boost_dome_settings1_mode = "Selects between simple and PID control algorithms. The 'simple' control requires few settings but may require restrictors in your air lines to prevent overshoot. The PID control requires more settings and more tuning, but can give optimal control."
    boost_dome_settings1_biasen = "When in boost but not yet within control zone, the Dome Target is set to either:\n-Bias table\n-Max dome target\n\nUsing the maximum dome target pressure is likely to use more CO2, but should help boost reach target more quickly."
    boost_dome_settings1_range = "Selects the min/max dome target.\nRange = use the bias table +/- the range number. This constrains the boost target to fairly close to your bias table to help reduce integral windup in the PID.\nMin/max = use the min/max limits above."
    boost_dome_bias_range1 = "The min/max control range around your bias value.\nMin=bias-range. Max=bias+range.\n(Default = 30kPa)"
;    boost_dome_settings2_mode = "Selects between simple and PID control algorithms. The 'simple' control requires few settings but may require restrictors in your air lines to prevent overshoot. The PID control requires more settings and more tuning, but can give optimal control."
    boost_ctl_dome_min = "When operating boost control in closed-loop mode, this sets the minimum dome pressure to target." 
    boost_ctl_dome_max = "When operating boost control in closed-loop mode, this sets the maximum dome pressure to target." 
    boost_dome_targets1 = "This gives a bias (best guess) dome pressure required to meet the target manifold pressure (y-axis) at a given RPM (x-axis). The 'boost control' system adjusts this dome target. The 'dome control' system operates the output solenoids to achieve the dome target. This is in absolute kPa, so always more than 100kPa."
    llstg_in = "The push button input to arm the line-lock staging system.\nThis is primarily intended for manual cars to help from rolling the beams and must be used with Launch Control."
    llstg_out = "The relay output to control the line-lock."
    can_bcast_user_id = "11bit decimal CAN identifier of the user defined test message to send."
    can_bcast_user_d0 = "Decimal message byte 0."
    can_bcast_user_d1 = "Decimal message byte 1."
    can_bcast_user_d2 = "Decimal message byte 2."
    can_bcast_user_d3 = "Decimal message byte 3."
    can_bcast_user_d4 = "Decimal message byte 4."
    can_bcast_user_d5 = "Decimal message byte 5."
    can_bcast_user_d6 = "Decimal message byte 6."
    can_bcast_user_d7 = "Decimal message byte 7."
    vvt_onoff_loads = "Curve for On/off VVT. If RPM < the lowest RPM in the curve, VVT is off.\nIf RPM > the highest RPM in the curve, VVT is off.\nIf between the RPMs but load is below the curve, VVT is off.\nIf between the RPMs, and load is above the curve, VVT is on."
    etc_opt_on = "Enables Drive-by-Wire (DBW) electronic throttle control where the target throttle position is controlled by the ECU using the pedal/RPM table and modifiers. Idle control mode uses the output for idle control only.\n\nAn external safety engineered throttle controller is required. MS3 is not a safety product and must not be relied upon for safe operation."
    etc_opt_follow =  "Whether throttle 2,3,4 targets should be set to match throttle 1 target. Otherwise they are broadcast as zero."
    etc_canbase = "Base CAN identifier for broadcast and received messages. Default is 256."
    etc_app_min = "Minimum data value for accelerator pedal position input."
    etc_app_max = "Maximum data value for accelerator pedal position input."
    etc_tp_min = "Minimum data value for target throttle position output."
    etc_tp_max = "Maximum data value for target throttle position output."
    etc_tp_act_min = "Minimum data value for actual throttle position input."
    etc_tp_act_max = "Maximum data value for actual throttle position input."
    etc_testpos = "Target throttle position in test mode."
    etc_pedal_pos = "Pedal position."
    etc_rpms = "RPMs"
    etc_targ_pos = "Target throttle position looked up from table of pedal position and engine RPM."
    etc_idlescale = "Throttle target addition when idle duty is 100%. (Typically 5-10% here.)"
    vss_diff_vss1 = "Driven wheel speed i.e. rear wheels in rear-wheel drive."
    vss_diff_vss2 = "Un-driven wheel speed i.e. front wheels in front-wheel drive."
    vss_diff_table = "Timing retard degrees desired for this VSS1 vs. VSS2"

; tool tips end tooltips

[Menu]

   ;----------------------------------------------------------------------------
   ;  There are five pre-defined values that may be used to define your menus.
   ;  The first four allow access to the "standard" dialog boxes, the last one
   ;  merely draws a separator (horizontal line) in the menu.
   ;
   ;     std_constants
   ;     std_enrichments
   ;     std_realtime
   ;     std_warmup
   ;     std_accel
   ;
   ;     std_separator
   ;
   ;  Additionally, to support MS2/MS3 firmware, there are two standard
   ;  dialogs to generate its three embedded tables.  The first of these acts
   ;  like Roger Enns' EasyTherm, but only works for MS2.  The second one
   ;  generates the internal AFR table required for proper closed loop operation
   ;  in MS2.  Use these without page numbers, as they will just be ignored
   ;  in any case.
   ;
   ;     std_ms2gentherm
   ;     std_ms2geno2
   ;
   ;  If you use any of the std_constants, std_enrichments or std_warmup
   ;  editors, they may be optionally suffixed with a page number (only
   ;  useful for multi-page code variants), which causes them to edit the
   ;  specified page.  If you leave off the page specifier, they edit logical
   ;  page one as specified in the Constants section.
   ;
   ;  There are four special menu names, which when used append to the standard
   ;  menus of the same name instead of creating a new one.  The menu names
   ;  are "File", "Communications", "Tools" and "Help".
   ;
   ;----------------------------------------------------------------------------

   menuDialog = main
      menu = "Basic/Load Settings"
        subMenu = base,   "Engine and Sequential Settings"
        subMenu = generalsettings2,   "General Settings"
        subMenu = revlimiter2, "Rev Limiter"
        subMenu = shiftlight, "Shift Light"
        subMenu = engine_state_settings, "Engine State Settings"
        subMenu = std_separator
        subMenu = std_tpscal, "Calibrate TPS"
        subMenu = sensorCal,       "Calibrate MAP/Baro"
        subMenu = battcalib,       "Calibrate Battery Voltage"
        subMenu = flash_unlock, "Un/Lock Calibrations"
        subMenu = std_ms2gentherm, "Calibrate T&hermistor Sensors", 0, {flashlock}
        subMenu = std_ms2geno2,    "Calibrate Lambda Sensor", 0, {flashlock}
        subMenu = std_separator    ;----------------------------------------------
        subMenu = tacho,          "Tacho Output"
        subMenu = fan_control,      "Fan Control"
        subMenu = tcluparams, "Torque Convertor Lockup"
        subMenu = alternator, "Alternator Control"
        subMenu = std_separator
        subMenu = barometerCorr,   "Barometric Correction",0, {baroCorr}
        subMenu = map_sample_dialog,  "MAP Sample Settings"
        subMenu = mapPredictCombined, "MAP/Load Prediction Settings"
        subMenu = std_separator
        subMenu = ITBcombined, "ITB Load Settings", 0, { algorithm == 6 || algorithm2 == 6 || IgnAlgorithm == 6 || IgnAlgorithm2 == 6 || afrload == 6 || eaeload == 6 }
        subMenu = mafdialog,      "MAF Settings"
        subMenu = MAFtable,      "MAF Flow Curve", 0, {MAFOption_t < 2 }
        subMenu = manifoldTempCorr,"MAF/MAT Correction Table", 0, {feature7_mafmat && ((algorithm == 5) || (algorithm2 == 4) || (algorithm2 == 5))}
        subMenu = std_separator
        subMenu = manifoldTempCorr2,"MAT Air Density Table", 0, {((algorithm != 4) && (algorithm != 5) && (algorithm2 != 4) && (algorithm2 != 5))}
        subMenu = matclt_curve,   "MAT/CLT Correction", 0, {(algorithm != 4) && (algorithm != 5) && (algorithm2 != 4) && (algorithm2 != 5)}
        subMenu = std_separator
        subMenu = std_realtime,    "&Realtime Display"
        subMenu = iopinlist, "Feature List Showing I/O pins"
        subMenu = pinusage, "I/O pins List Usage and Status"
        subMenu = pinusagel2, "I/O pins List2 Usage and Status"
        subMenu = pinusagecanloop, "CAN/loop Usage and Status"
        subMenu = pinusagecan, "Expansion I/O pins Usage and Status"
        subMenu = limitsettings, "Gauge and Settings Limits"

      menu = "F&uel Settings"
        subMenu = injsettings,   "Injector Dead-Time"
        subMenu = smallpw, "Injector Small Pulsewidths"
        subMenu = inj_timing_tbl,  "Injector Timing Table", 0, { sequential != 0 }
        subMenu = inj_timing_sec_tbl, "Secondary Injector Timing Table", 0, { sequential != 0 && (dualfuel_sw_on || staged_first_param) }
        subMenu = stagedCombined,  "Staged Injection"
        subMenu = flexFuelSettings,"Fuel Sensor Settings (Flex)"
        subMenu = overrun, "Over-Run Fuel Cut"
        subMenu = std_separator
        subMenu = egoControl,      "AFR/&EGO Control"
        subMenu = afrTable1Tbl,    "A&FR Table 1",         0
        subMenu = afrTable2Tbl,    "AF&R Table 2",         0, { (!dualfuel_sw_on && tsw_pin_afr) || (dualfuel_sw_on && dualfuel_sw_afr) || ( N2Oopt_2 && N2Oopt_4) || tsw_pin_afr}
        subMenu = ego_auth_Tbl,    "EGO Authority Table", 0, {egoType && egoAlgorithm_auth }
        subMenu = ego_auth_Tbl2,    "EGO Authority Table Negative", 0, {egoType && egoAlgorithm_auth && egoAlgorithm_auth2 }
        subMenu = ego_delay_Tbl,   "EGO Delay Table", 0, {egoType && (egoAlgorithm < 3) && egoAlgorithm_delay_table}
        subMenu = narrowband_tgts_tbl, "Narrowband EGO targets", 0, { egoType == 1 }
        subMenu = maxafr, "AFR safety system"
        subMenu = std_separator
        subMenu = veTable1Tbl,     "Fuel VE Table &1", 0, { ((algorithm != 5) || ((algorithm == 5) && (feature7_maftrim))) }
        subMenu = veTable2Tbl,     "Fuel VE Table &2",          0, { (algorithm2 != 0) }
        subMenu = veTable3Tbl,     "Fuel VE Table 3", 0, { ((algorithm != 5) || ((algorithm == 5) && (feature7_maftrim))) && (f5_0_tsf || (dualfuel_sw_on && dualfuel_sw_fuel) || (dualfuel_sw_on && dualfuel_opt_mode)) }
        subMenu = veTable4Tbl,     "Fuel VE Table 4", 0, { (algorithm2 != 0) && (f5_0_tsf || (dualfuel_sw_on && dualfuel_sw_fuel) || (dualfuel_sw_on && dualfuel_opt_mode)) }
        subMenu = std_separator
        subMenu = inj_trimad, "Cyl 1-4 Trims", 7, { hardware_fuel && sequential_trim_on_off }
        subMenu = inj_trimeh, "Cyl 5-8 Trims", 7, { hardware_fuel && (nInjectors > 4) && sequential_trim_on_off }

        subMenu = inj_trimil, "Cyl 9-12 Trims", 7, { hardware_fuel && (nInjectors > 8) && sequential_trim_on_off }
        subMenu = std_separator
        subMenu = injseq, "Sequenced Batch Fire", 0, { sequential == 0 }
        subMenu = std_separator
        subMenu = fuelpump, "Fuel Pump and Pressure"
        subMenu = fp_temp_curve, "Temperature Adjustment", 0, {fueltemp1 && fueltemp1_corr}
        subMenu = fp_press_curve, "Pressure Adjustment", 0, {(fp_opt_mode != 2) && fp_press_in && (fp_opt_reg == 2)}
        subMenu = fp_safety, "Fuel Pressure Safety", 0, {fp_press_in}
        subMenu = std_separator
        subMenu = fuelcalcs, "Fuel Calculations Summary"
        
      menu = "&Ignition Settings"
        subMenu = combinedignition, "Ignition Options/Wheel Decoder"
         subMenu = std_trigwiz,     "Tri&gger Wizard", 0,{ (spk_mode0 != 31) && (spk_mode0 != 4) }
        subMenu = std_separator
        subMenu = dwellSettings,   "D&well Battery Correction", 0, { spk_mode0 != 31 }
        subMenu = dwellrpm_curve,  "Dwell vs RPM", 0, {spk_mode0 > 1 && dwellmode == 2 && spk_conf2_dwell}
        subMenu = dwell_tbl,  "Dwell Table", 0, {(spk_mode0 > 1) && (dwellmode == 0) && spk_conf2_dwelltbl}
        subMenu = std_separator
        subMenu = coldAdvance,     "&Cold Advance", 0, { spk_mode0 != 31 }
        subMenu = matBasedRetard,  "MAT-&Based Timing Retard", 0, { spk_mode0 != 31 }
        subMenu = noisefiltering2,  "Noise Filtering", 0
        subMenu = std_separator
        subMenu = knockSettings,   "&Knock Sensor Settings"
        subMenu = knockSettings4,  "Knock Sensor Parameters", 0, {knk_option && (knk_option_an == 3)}
        subMenu = knockSettings2,   "Knock Window Settings", 0, {knk_option}
        subMenu = knockupscale_curve, "Knock Coolant Scaling", 0, {knk_option}
        subMenu = std_separator
        subMenu = ignitionTbl1,     "&Ignition Table 1", 0, { (spk_mode0 != 31) }
        subMenu = ignitionTbl2,     "Ignition Table 2", 0, { (IgnAlgorithm2 !=0) && (spk_mode0 != 31)}
        subMenu = ignitionTbl3,     "Ignition Table 3", 0, { f5_0_tss || (dualfuel_sw_on && dualfuel_sw_spk) }
        subMenu = ignitionTbl4,     "Ignition Table 4", 0, { (IgnAlgorithm2 !=0) && (f5_0_tss || (dualfuel_sw_on && dualfuel_sw_spk)) }
        subMenu = std_separator
        subMenu = RotaryTrailingSettings, "Rotary Settings", 0, { (twoStroke == 3) && (spk_mode0 != 31) }
        subMenu = RotarySplitTbl,  "Rotary Split Table", 0, { (twoStroke == 3) && (spk_mode0 != 31) }
        subMenu = std_separator
        subMenu = spk_trimad, "Cyl 1-4 Trims", 8, { spk_mode3_trim }
      subMenu = spk_trimeh, "Cyl 5-8 Trims", 8, { spk_mode3_trim && (nCylinders > 4)}
        subMenu = spk_trimil, "Cyl 9-12 Trims", 8, { spk_mode3_trim && (nCylinders > 8)}
        subMenu = std_separator
        subMenu = sparkcalcs, "Spark Calculations Summary"

      menu = "&Startup/Idle"
        subMenu = crsettings,      "Cranking/Startup Settings",  0
        subMenu = primingPW,       "Pri&ming Pulse",       0
        subMenu = crankingPW,      "Cra&nking Pulse",      0
        subMenu = cranktaper_curvet, "Cranking Taper Curve", 0, {feature7_cranktaper}, {feature7_crtpunits == 0}
        subMenu = cranktaper_curvee, "Cranking Taper Curve", 0, {feature7_cranktaper}, {feature7_crtpunits == 1}
        subMenu = nestedasePct,          "AfterStart Enrichment (ASE)",      0
        subMenu = aseTaper,        "AfterStart Enrichment (ASE) Taper",           0
        subMenu = nestedwarmup_curve,      "&Warmup Enrichment (WUE)",       0
        subMenu = std_separator
        subMenu = primingPW2,       "Priming Pulse 2",       0, { (dualfuel_sw_on && dualfuel_sw2_prime) }
        subMenu = crankingPW2,      "Cranking Pulse 2",      0, { (dualfuel_sw_on && dualfuel_sw2_crank) || alternate_blend }
        subMenu = nestedasePct2,          "AfterStart Enrichment (ASE) 2",      0, { (dualfuel_sw_on && dualfuel_sw_ase) }
        subMenu = aseTaper2,        "AfterStart Enrichment (ASE) Taper 2",           0, { (dualfuel_sw_on && dualfuel_sw_ase) }
        subMenu = nestedwarmup_curve2,    "Warmup Enrichment (WUE) 2",   0, { (dualfuel_sw_on && dualfuel_sw_wue) }
        subMenu = std_separator
        subMenu = combinedidle,     "I&dle Control"
        subMenu = pwmidle_crank_dutyorsteps_curve, "Idle Cranking Duty/Steps", 0, {IdleCtl > 1}
        subMenu = idlebins, "Idle Warmup Duty/Steps", 0, {(IdleCtl > 1) && (IdleCtl_alg == 0)}
        subMenu = combinedCLidle, "Closed-Loop Idle Settings", 0, {IdleCtl && (IdleCtl_alg == 1)}
        subMenu = pwmidle_target_curve, "Closed-Loop Idle Target Curve", 0, { ((IdleCtl > 1) && (IdleCtl_alg == 1)) || idle_special_ops_timing_assist } 
        subMenu = pwmidle_cl_initialvalues, "Closed-Loop Idle Initial Values", 0, { pwmidle_cl_opts_initvaluetable && (IdleCtl > 1) && (IdleCtl_alg == 1) }
        subMenu = idle_voltage_comp_curve, "PWM Idle Voltage Compensation", 0, {IdleCtl == 2}
        subMenu = ac_idleup,        "Air Conditioning Idle-up", 0
        subMenu = std_separator
        subMenu = idleAdvance,  "Idle Advance Settings"
        subMenu = cl_idle_timing_curve, "Idle RPM Timing Correction Curve", 0, { idle_special_ops_timing_assist }
        subMenu = idleVe,       "Idle VE Settings"

      menu = "Accel Enrich"
         subMenu = accelsettings,   "Accel Enrich Settings"
         subMenu = AEtime_settings, "Time-Based Accel",0, { !(AE_options & 0x1) }
         subMenu = AEpump_settings, "Accel-Pump Accel Enrichment Settings",0, { AE_options & 0x1 }
         subMenu = AEtime_settings2, "Time-Based Accel 2",0, { !(AE_options & 0x1) && (dualfuel_sw_on && dualfuel_sw2_ae) }
         subMenu = AEpump_settings2, "Accel-Pump Accel Enrichment Settings 2",0, { AE_options & 0x1 && (dualfuel_sw_on && dualfuel_sw2_ae) }
         subMenu = tpswot_curve,   "TPS WOT Curve", 0, {feature7_aetpswot}
         subMenu = std_separator
         subMenu = EAEBAWCcurve,   "EAE Adhere-to-walls Coefficient", 0, { EAEOption == 1 }
         subMenu = EAEBSOCcurve,   "EAE Sucked-from-walls Coefficient", 0, { EAEOption == 1 }
         subMenu = EAEAWNcurve,   "EAE Adhere-to-walls RPM Correction", 0, { EAEOption == 1  }
     subMenu = EAEcombi1, "EAE Sucked/Adhered Coefficients", 0, { EAEOption == 1 }
         subMenu = EAESONcurve,   "EAE Sucked-from-walls RPM Correction", 0, { EAEOption == 1 }
         subMenu = EAEAWWcurve,   "EAE Adhere-to-walls CLT Correction", 0, { EAEOption == 1 }
         subMenu = EAESOWcurve,   "EAE Sucked-from-walls CLT Correction", 0, { EAEOption == 1 }
         subMenu = std_separator
         subMenu = EAEBAWCcurve2,   "EAE Adhere-to-walls Coefficient 2", 0, { (EAEOption == 1 ) && (staged_first_param ) }
         subMenu = EAEBSOCcurve2,   "EAE Sucked-from-walls Coefficient 2", 0, { (EAEOption == 1 ) && (staged_first_param ) }
         subMenu = EAEAWNcurve2,   "EAE Adhere-to-walls RPM Correction 2", 0, { (EAEOption == 1  ) && (staged_first_param ) }
         subMenu = EAESONcurve2,   "EAE Sucked-from-walls RPM Correction 2", 0, { (EAEOption == 1 ) && (staged_first_param ) }
         subMenu = EAEAWWcurve2,   "EAE Adhere-to-walls CLT Correction 2", 0, { (EAEOption == 1 ) && (staged_first_param ) }
         subMenu = EAESOWcurve2,   "EAE Sucked-from-walls CLT Correction 2", 0, { (EAEOption == 1 ) && (staged_first_param ) }
         subMenu = std_separator
         subMenu = XAccTable,     "Puddling Factors (Accel)",  0, { EAEOption == 3 || EAEOption == 4 }
         subMenu = XDecTable,       "Puddling Factors (Decel)",      0, { EAEOption == 3 || EAEOption == 4 }
         subMenu = TauAccTable,     "Time Factors (Accel)",          0, { EAEOption == 3 || EAEOption == 4 }
         subMenu = TauDecTable,     "Time Factors (Decel)",          0, { EAEOption == 3 || EAEOption == 4 }
         subMenu = XCltTable,       "&X (Puddling) Temp. Corrections",0, { EAEOption == 4 }    
         subMenu = TCltTable,       "&Tau (Time) Temp. Corrections",  0, { EAEOption == 4 } 

      menu = "Boost/VVT"
        subMenu = boost, "Boost Control Settings"
        subMenu = boostctlDutys, "Boost Control Duty Table", 0, { (boost_ctl_settings_on) && (!boost_ctl_settings_cl) && !boost_ctl_settings_dome && (boost_vss == 0)} 
        subMenu = boostctlTargs, "Boost Control Target Table", 0, { (boost_ctl_settings_on == 1) && (boost_vss == 0) && ((boost_ctl_settings_cl == 1) ||  boost_ctl_settings_dome) }
        subMenu = boostctlCLPWMtargs1, "Boost Control Bias Duty Table 1", 0, { (boost_ctl_settings_on == 1) && (boost_ctl_settings_cl == 1) && !boost_ctl_settings_dome}
        subMenu = boostctlCLPWMtargs2, "Boost Control Bias Duty Table 2", 0, { (boost_ctl_settings_on == 1) && (boost_ctl_settings_cl == 1) && !boost_ctl_settings_dome && boost_vss_biasgear && (gear_no >= 2)}
        subMenu = boostctlCLPWMtargs3, "Boost Control Bias Duty Table 3", 0, { (boost_ctl_settings_on == 1) && (boost_ctl_settings_cl == 1) && !boost_ctl_settings_dome && boost_vss_biasgear && (gear_no >= 3)}
        subMenu = boostctlCLPWMtargs4, "Boost Control Bias Duty Table 4", 0, { (boost_ctl_settings_on == 1) && (boost_ctl_settings_cl == 1) && !boost_ctl_settings_dome && boost_vss_biasgear && (gear_no >= 4)}
        subMenu = boostctlCLPWMtargs5, "Boost Control Bias Duty Table 5", 0, { (boost_ctl_settings_on == 1) && (boost_ctl_settings_cl == 1) && !boost_ctl_settings_dome && boost_vss_biasgear && (gear_no >= 5)}
        subMenu = boostctlCLPWMtargs6, "Boost Control Bias Duty Table 6", 0, { (boost_ctl_settings_on == 1) && (boost_ctl_settings_cl == 1) && !boost_ctl_settings_dome && boost_vss_biasgear && (gear_no >= 6)}
        subMenu = boost_timed_curve, "Boost Delay (Timed From Launch)",0, { boost_ctl_settings_on && launch_opt_on && boost_feats_timed && (boost_vss != 4)}
        subMenu = boostvss_curve, "Boost Control vs Speed/Time", 0, { boost_ctl_settings_on && ((boost_vss == 1) || (boost_vss == 2) || (boost_vss == 4))}
        subMenu = std_separator
        subMenu = boostctlSettings2, "Boost Control Settings 2", 0 , {boost_ctl_settings_on}
        subMenu = boostctlDutys2, "Boost Control Duty Table 2", 0, { boost_ctl_settings_on && (((!boost_ctl_settings_cl) && (boost_feats_tsw || dualfuel_sw2_boosw)) || (boost_ctl_settings_on2 && !boost_ctl_settings_cl2)) && !boost_ctl_settings_dome }
        subMenu = boostctlTargs2, "Boost Control Target Table 2", 0, { boost_ctl_settings_on && (((boost_ctl_settings_cl ||boost_ctl_settings_dome) && (boost_feats_tsw || dualfuel_sw2_boosw)) || (boost_ctl_settings_on2 && boost_ctl_settings_cl2)) }
        subMenu = boostctlCLPWMtargs2, "Boost Control Bias Duty Table 2", 0, { boost_ctl_settings_on && boost_ctl_settings_on2 && boost_ctl_settings_cl2 }
        subMenu = std_separator
        subMenu = boost_dome_settings1, "Wastegate Dome Pressure Control 1", { boost_ctl_settings_on && boost_ctl_settings_dome }
        subMenu = boost_dome_tbl1, "Dome Bias Table 1", { boost_ctl_settings_on && boost_ctl_settings_dome && boost_ctl_settings_cl }
        subMenu = std_separator
        subMenu = antilag,      "Turbo Anti-lag (ALS)"
        subMenu = antilagtables,  "Turbo Anti-lag Tables", 0, {als_in_pin}
        subMenu = als_rifuelcut_tbl, "Turbo Anti-lag Roving Idle", 0, {als_in_pin && als_opt_ri && hardware_fuel && sequential}
        subMenu = std_separator
        subMenu = vvtparams, "VVT Settings"
        subMenu = vvt_timing1_tbl, "VVT Intake Table", 0, {vvt_opt1_on && vvt_opt2_pid2}
        subMenu = vvt_timing2_tbl, "VVT Exhaust Table", 0, {vvt_opt1_on && vvt_opt2_pid2 && (vvt_opt5_vvt1 || vvt_opt5_vvt2 || vvt_opt1_on > 2)}
        subMenu = vvt_onoff_curve, "VVT On/Off curve", 0, {vvt_opt1_on && !vvt_opt2_pid2}

      menu = "Table choices"
        subMenu = tablesw,         "Table Switch/Dual Fuel"
        subMenu = dualfuel_temp_curve, "Temperature Adjustment",   0, { (dualfuel_sw_on && dualfuel_opt_temp) }
        subMenu = dualfuel_press_curve, "Pressure Adjustment",   0, { (dualfuel_sw_on && dualfuel_opt_press) }
        subMenu = injsettings2,   "Alt. Injector Dead-time 2",    0, { (dualfuel_sw_on && dualfuel_sw2_injp)  }
        subMenu = smallpw2, "Alt. Injector Small Pulsewidths 2",   0, { (dualfuel_sw_on && dualfuel_sw2_smpw) }
        subMenu = std_separator
        subMenu = blend1menu, "Blend Curve (1) VE1->2", 0, {algorithm2 && (loadCombine == 2)}
        subMenu = blend2menu, "Blend Curve (2) Spk1->2", 0, {IgnAlgorithm2 && (loadCombineign == 1)}
        subMenu = blend3menu, "Blend Curve (3) VE1+2->3+4", 0, {f5_0_tsf && (f5_0_tsf_opt == 0) && (tsw_pin_f == 14)}
        subMenu = blend4menu, "Blend Curve (4) Spk1+2->3+4", 0, {f5_0_tss && (f5_0_tss_opt == 0) && (tsw_pin_s == 14)}
        subMenu = blend5menu, "Blend Curve (5) AFR1->2", 0, {tsw_pin_afr == 14}
        subMenu = blend6menu, "Blend Curve (6) Boost1->2", 0, {(boost_feats_tsw == 14) && boost_ctl_settings_on}
        subMenu = blend7menu, "Blend Curve (7) Crank%1->2", 0, {alternate_blend}
        subMenu = blend8menu, "Blend Curve (8) Flex Blending", 0, { dualfuel_sw_on && (dualfuel_opt_mode == 2) }

      menu = "Advanced Engine"
        subMenu = speedsensors, "Speed and Gear Sensors"
        subMenu = ss, "Shaft Speed Sensors"
        subMenu = egt, "EGT/Thermocouple Settings"
        subMenu = sensors, "Generic Sensor Inputs"
        subMenu = accelerometer, "Accelerometer Parameters"
        subMenu = tcsettings, "Traction Control Settings"
        subMenu = tc_perfect_curve, "Traction Control - Perfect Run VSS", 0, {tc_opt_on && (tc_opt_method == 0)}
        subMenu = tc_perfectrpm_curve, "Traction Control - Perfect Run RPM", 0, {tc_opt_on && (tc_opt_method == 2)}
        subMenu = tcslip_menu, "Traction Control - External Slip% Input", 0, {tc_opt_on && (tc_opt_method == 1) && tc_opt_slipcurve}
        subMenu = tc_curves, "Traction Control Reactions", 0, {tc_opt_on}
        subMenu = tc_vss_diff_tbl, "Speed difference retard", 0, {tc_opt_on && tc_opt3_vssdiff}
        subMenu = std_separator
        subMenu = launch,          "Launch / 2-step / 3-step / T-brake"
        subMenu = launch_retard_time, "Timed Retard After Launch", 0, {launch_opt_on && launch_opt_retard}
        subMenu = vsslaunch, "Speed-based Launch Control"
        subMenu = launch_var_curve, "Launch limit vs. MAP"
        subMenu = ShiftSettings, "Sequential Shift Cut"
        subMenu = nitrous,    "&Nitrous System"
        subMenu = nitrous_curves_time,    "Nitrous - Time-Based Progressive",0, {N2Oopt_2 && N2Oopt2_prog && (N2Oopt2_prog_time == 1) }
        subMenu = nitrous_curves_rpm,    "Nitrous - RPM-Based Progressive", 0, {N2Oopt_2 && N2Oopt2_prog && (N2Oopt2_prog_time == 0)}
        subMenu = nitrous_curves_vss,    "Nitrous - VSS-Based Progressive", 0, {N2Oopt_2 && N2Oopt2_prog && (N2Oopt2_prog_time == 2)}
        subMenu = waterinj,        "Water Injection"
        subMenu = hpte, "High Power Time Enrichment"
        subMenu = oilpress, "Oil Pressure"
        subMenu = pitlimiter, "Pit Lane Limiter"
        subMenu = std_separator
        subMenu = ms3_port_edit_wrap1,   "Programmable On/Off Outputs 1"
        subMenu = ms3_port_edit_wrap2,   "Programmable On/Off Outputs 2"
        subMenu = gen_pwm_a, "Generic PWM output A"
        subMenu = gen_pwm_b, "Generic PWM output B"
        subMenu = gen_pwm_c, "Generic PWM output C"
        subMenu = gen_pwm_d, "Generic PWM output D"
        subMenu = gen_pwm_e, "Generic PWM output E", 0, {!(vvt_opt1_on)}
        subMenu = gen_pwm_f, "Generic PWM output F"
        subMenu = std_separator
        subMenu = generic_pid_a, "Generic Closed-Loop A"
        subMenu = generic_pid_b, "Generic Closed-Loop B"
      
;      subMenu = userdefined, "User defined menu" ; uncomment this line to enable

   menuDialog = main
      menu = "3D &Tuning Maps"
         subMenu = veTable1Map,     "Fuel VE Table &1",0, { ((algorithm != 5) || ((algorithm == 5) && (feature7_maftrim))) }
         subMenu = veTable2Map,     "Fuel VE Table &2",          0, { (algorithm2 != 0) && (algorithm2 != 5) }
         subMenu = veTable3Map,     "Fuel VE Table &3",          0, { (!dualfuel_sw_on && f5_0_tsf) || (dualfuel_sw_on && dualfuel_sw_fuel) || (dualfuel_sw_on && dualfuel_opt_mode) }
         subMenu = veTable4Map,     "Fuel VE Table &4",          0, { ((!dualfuel_sw_on && f5_0_tsf) || (dualfuel_sw_on && dualfuel_sw_fuel) || (dualfuel_sw_on && dualfuel_opt_mode)) && (algorithm2 != 0) }

         subMenu = afrTable1Map,    "A&FR Table 1",         0, { egoType > 1              }
         subMenu = afrTable2Map,    "AF&R Table 2",         0, { (egoType > 1) && ((!dualfuel_sw_on && tsw_pin_afr) || (dualfuel_sw_on && dualfuel_sw_afr)) }
         subMenu = std_separator    ;----------------------------------------------
         subMenu = ignitionMap1,     "&Ignition Table 1", 0, {(spk_mode0 != 31)}
         subMenu = ignitionMap2,     "Ignition Table 2", 0, { (IgnAlgorithm2 != 0) && (spk_mode0 != 31)}
         subMenu = ignitionMap3,     "Ignition Table 3", 0, { (!dualfuel_sw_on && f5_0_tss) || (dualfuel_sw_on && dualfuel_sw_fuel) }
         subMenu = ignitionMap4,     "Ignition Table 4", 0, { (IgnAlgorithm2 !=0) && ((!dualfuel_sw_on && f5_0_tss) || (dualfuel_sw_on && dualfuel_sw_spk)) }
         subMenu = RotarySplitMap,   "Rotary Split Table", 0, {(twoStroke == 3) && (spk_mode0 != 31)}
         subMenu = std_separator    ;----------------------------------------------
         subMenu = boostctlDtyMap,   "Boost Control Duty Table", 0, {boost_ctl_settings_on && boost_ctl_settings_cl == 0}
         subMenu = boostctlTargMap,  "Boost Control Target Table", 0, {boost_ctl_settings_on && boost_ctl_settings_cl}
         subMenu = boostctlDtyMap2,   "Boost Control Duty Table 2", 0, {boost_ctl_settings_on && boost_ctl_settings_cl == 0}
         subMenu = boostctlTargMap2,  "Boost Control Target Table 2", 0, {boost_ctl_settings_on && boost_ctl_settings_cl}
         subMenu = std_separator
         subMenu = inj_timing_map,  "Sequential Injector Timing Table", 0, { sequential != 0 }
         subMenu = inj_timing_sec_map, "Sequential Injector Secondary Timing Table", 0, { sequential != 0 && (dualfuel_sw_on || staged_first_param) }

       menu = "CAN-bus/ Testmodes"
         subMenu = canparams, "CAN Parameters"
         subMenu = canbroadcast, "CAN Broadcasting",0, {can_enable_on}
         subMenu = canbcast_userdef, "CAN Broadcast Testing", 0, {can_enable_on && can_bcast1_on && can_bcast2_xxx}
         subMenu = can_outpc_bcast,"CAN Realtime Data Broadcasting", 0, {can_enable_on}
         subMenu = can_outpc_bcast_2,"CAN Realtime Data Broadcasting 2", 0, {can_enable_on && can_outpc_gp00_master}
         subMenu = can_outpc_bcast_3,"CAN Realtime Data Broadcasting 3", 0, {can_enable_on && can_outpc_gp00_master}
         subMenu = can_outpc_bcast_4,"CAN Realtime Data Broadcasting 4", 0, {can_enable_on && can_outpc_gp00_master}
         subMenu = can_rcv, "CAN Receiving", 0, {can_enable_on}
         subMenu = canvss, "CAN VSS, Gear",0, {can_enable_on}
         subMenu = canego, "CAN EGO, GPS",0, {can_enable_on}
         subMenu = realtimeclock, "Real Time Clock"
         subMenu = iobox, "IO-Box Settings"
         subMenu = dashbcast, "Dash Broadcasting"
         subMenu = std_separator    ;----------------------------------------------
         subMenu = checkengine, "Check Engine Light"
         subMenu = limpmode, "Limp Mode", 0, {cel_opt_on}
         subMenu = alphaMAPTbl, "Fallback MAP Table", 0, {cel_opt_on && cel_opt2_map && cel_action1_map && cel_action1_map_an}
         subMenu = std_separator    ;----------------------------------------------
         subMenu = outputtest, "Output Test Mode - Inj/Spk"
         subMenu = outputtest_io_1, "Output Test Mode - I/O"
         subMenu = outputtest_io_2, "Output Test Mode - I/O 2"
         subMenu = outputtest_io_3, "Output Test Mode - I/O 3"
         subMenu = outputtest_io_4, "Output Test Mode - CAN I/O"
         subMenu = iactest, "Output Test Mode - Idle Valve", 0, {IdleCtl && (etc_opt_on == 0)}
         subMenu = injseqtest, "Injector Sequential Testing"
         subMenu = injspkonoff, "Inj/Spk Disabling Test Mode"
         subMenu = std_separator    ;----------------------------------------------
         subMenu = engine_control, "Engine Control"
         subMenu = special, "Special Options"
         subMenu = std_separator
        subMenu = lttrim, "Long Term Trim Settings"        
        subMenu = ltt_Table1Tbl,     "Long Term Trim Table &1", 0
         subMenu = std_separator
        subMenu = etc, "Throttle control (DBW)"
        subMenu = etctest, "Throttle Test Mode", 0, {etc_opt_on}
#if OUTMSG_EDITING
         subMenu = std_separator 
         subMenu = outmsg1,   "Outmsg 1"
         subMenu = outmsg2,   "Outmsg 2"
         subMenu = outmsg3,   "Outmsg 3"
         subMenu = outmsg4,   "Outmsg 4"
#endif

   menuDialog = main
      menu = "T&ools"
        subMenu = sensorCal,       "Calibrate MAP/Baro"
        subMenu = battcalib,       "Calibrate Battery Voltage"
        subMenu = std_separator    ;----------------------------------------------
        subMenu = flash_unlock, "Un/Lock Calibrations"
        subMenu = std_ms2gentherm, "Calibrate T&hermistor Sensors", 0, {flashlock}
        subMenu = std_ms2geno2,    "Calibrate Lambda Sensor", 0, {flashlock}

      menu = "Data Logging"
        subMenu = sdcard_datalog, "SD Card Datalogging"
        subMenu = std_ms3SdConsole, "Browse / Import SD Card",0, {log_style_on2 && (tsLocalCanId == tsCanId) }

      menu = "Communications"
        subMenu = setbaud, "ECU Baud Rate", 0

      menu = "Help"
        subMenu = helpGeneral,     "MS3 Info"
;-------------------------------------------------------------------------------

[VerbiageOverride]
; text over-rides for internal TS dialogs.
"Engine Stroke" = "Engine Stroke/Rotary"
"Number of Cylinders" = "No. Cylinders/Rotors"

[ControllerCommands]
; commandName    = command1, command2, commandn...
; command in standard ini format, a command name can be assigned to 1 to n commands that will be executed in order.
;         This does not include any resultant protocol envelope data, only the response data itself.

; WARNING!! These commands bypass TunerStudio's normal memory synchronization. If these commands
; alter mapped settings (Constant) memory in the controller, TunerStudio will have an out of sync condition 
; and may create error messages.
; It is expected that these commands would not typically alter any ram mapped to a Constant.

;The offsets here must match the actual offsets in 'datax1' and include the 0x200 offset.
cmdStopTestmode = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x00"
cmdEnterTestMode = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x01"
cmdtestspkon = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x02"
cmdtestinjon = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x03"

cmdfpon = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x05"
cmdfpoff = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x06"
cmdtestinjspkoff = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x07"
cmdtestiacoff = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x08"
cmdtestiachome = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x09"
cmdtestiacon = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x0a"

cmdskipinjoff= "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x0b"
cmdskipinjon = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x0c"
cmdskipspkon = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x0d"

cmdetcoff    = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x0e"
cmdetcon     = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x0f"

cmdtestinjnorm = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x10"
cmdtestinjbat  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x11"
cmdtestinjsem  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x12"
cmdtestinjseq  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x13"

cmdtestiaccycle = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x18"

cmdinjspk1  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x20"
cmdinjspk2  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x21"
cmdinjspk3  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x22"
cmdinjspk4  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x23"
cmdinjspk5  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x24"
cmdinjspk6  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x25"
cmdinjspk7  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x26"
cmdinjspk8  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x27"
cmdinjspk9  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x28"
cmdinjspk10  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x29"
cmdinjspk11  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x2a"
cmdinjspk12  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x2b"
cmdinjspk13  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x2c"
cmdinjspk14  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x2d"
cmdinjspk15  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x2e"
cmdinjspk16  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x2f"

cmdtest_pp3_off  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x80"
cmdtest_pp3_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x82"
cmdtest_pp3_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x83"

cmdtest_pp4_off  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x84"
cmdtest_pp4_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x86"
cmdtest_pp4_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x87"

cmdtest_pp5_off  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x88"
cmdtest_pp5_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x8a"
cmdtest_pp5_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x8b"

cmdtest_pp6_off  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x8c"
cmdtest_pp6_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x8e"
cmdtest_pp6_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x8f"

cmdtest_pp7_off  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x90"
cmdtest_pp7_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x92"
cmdtest_pp7_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x93"

cmdtest_pk0_off  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x94"
cmdtest_pk0_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x96"
cmdtest_pk0_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x97"

cmdtest_pp2_off  = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x98"
cmdtest_pp2_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x9a"
cmdtest_pp2_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x9b"

cmdtest_pe4_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x9c"
cmdtest_pe4_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x9e"
cmdtest_pe4_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\x9f"

cmdtest_pa0_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xa0"
cmdtest_pa0_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xa2"
cmdtest_pa0_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xa3"

cmdtest_pa1_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xa4"
cmdtest_pa1_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xa6"
cmdtest_pa1_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xa7"

cmdtest_pa2_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xa8"
cmdtest_pa2_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xaa"
cmdtest_pa2_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xab"

cmdtest_pa3_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xac"
cmdtest_pa3_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xae"
cmdtest_pa3_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xaf"

cmdtest_pa4_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xb0"
cmdtest_pa4_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xb2"
cmdtest_pa4_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xb3"

cmdtest_pa5_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xb4"
cmdtest_pa5_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xb6"
cmdtest_pa5_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xb7"

cmdtest_pa6_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xb8"
cmdtest_pa6_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xba"
cmdtest_pa6_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xbb"

cmdtest_pa7_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xbc"
cmdtest_pa7_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xbe"
cmdtest_pa7_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xbf"

cmdtest_pb0_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xc0"
cmdtest_pb0_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xc2"
cmdtest_pb0_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xc3"

cmdtest_pb1_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xc4"
cmdtest_pb1_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xc6"
cmdtest_pb1_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xc7"

cmdtest_pb2_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xc8"
cmdtest_pb2_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xca"
cmdtest_pb2_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xcb"

cmdtest_pb3_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xcc"
cmdtest_pb3_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xce"
cmdtest_pb3_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xcf"

cmdtest_pb4_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xd0"
cmdtest_pb4_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xd2"
cmdtest_pb4_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xd3"

cmdtest_pb5_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xd4"
cmdtest_pb5_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xd6"
cmdtest_pb5_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xd7"

cmdtest_pb6_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xd8"
cmdtest_pb6_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xda"
cmdtest_pb6_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xdb"

cmdtest_pb7_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xdc"
cmdtest_pb7_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xde"
cmdtest_pb7_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xdf"

cmdtest_pj0_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xe0"
cmdtest_pj0_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xe2"
cmdtest_pj0_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xe3"

cmdtest_pj1_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xe4"
cmdtest_pj1_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xe6"
cmdtest_pj1_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xe7"

cmdtest_pt1_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xe8"
cmdtest_pt1_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xea"
cmdtest_pt1_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xeb"

cmdtest_pt3_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xec"
cmdtest_pt3_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xee"
cmdtest_pt3_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xef"

cmdtest_pm2_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xf0"
cmdtest_pm2_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xf2"
cmdtest_pm2_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xf3"

cmdtest_pk1_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xf4"
cmdtest_pk1_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xf6"
cmdtest_pk1_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xf7"

cmdtest_pk3_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xf8"
cmdtest_pk3_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xfa"
cmdtest_pk3_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xfb"

cmdtest_pk7_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xfc"
cmdtest_pk7_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xfe"
cmdtest_pk7_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x00\xff"


cmdlttr1  = "w\$tsCanId\x07\x02\x9a\x00\x01\x41"
cmdlttr2  = "w\$tsCanId\x07\x02\x9a\x00\x01\x42"
cmdlttw   = "w\$tsCanId\x07\x02\x9a\x00\x01\x51"
cmdlttz   = "w\$tsCanId\x07\x02\x9a\x00\x01\x61"

; CAN outs
cmdtestcano0off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x80"
cmdtestcano0pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x82"
cmdtestcano0on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x83"

cmdtestcano1off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x84"
cmdtestcano1pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x86"
cmdtestcano1on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x87"

cmdtestcano2off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x88"
cmdtestcano2pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x8a"
cmdtestcano2on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x8b"

cmdtestcano3off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x8c"
cmdtestcano3pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x8e"
cmdtestcano3on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x8f"

cmdtestcano4off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x90"
cmdtestcano4pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x92"
cmdtestcano4on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x93"

cmdtestcano5off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x94"
cmdtestcano5pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x96"
cmdtestcano5on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x97"

cmdtestcano6off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x98"
cmdtestcano6pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x9a"
cmdtestcano6on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x9b"

cmdtestcano7off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x9c"
cmdtestcano7pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x9e"
cmdtestcano7on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\x9f"

cmdtestcano8off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xa0"
cmdtestcano8pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xa2"
cmdtestcano8on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xa3"

cmdtestcano9off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xa4"
cmdtestcano9pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xa6"
cmdtestcano9on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xa7"

cmdtestcano10off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xa8"
cmdtestcano10pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xaa"
cmdtestcano10on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xab"

cmdtestcano11off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xac"
cmdtestcano11pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xae"
cmdtestcano11on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xaf"

cmdtestcano12off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xb0"
cmdtestcano12pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xb2"
cmdtestcano12on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xb3"

cmdtestcano13off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xb4"
cmdtestcano13pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xb6"
cmdtestcano13on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xb7"

cmdtestcano14off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xb8"
cmdtestcano14pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xba"
cmdtestcano14on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xbb"

cmdtestcano15off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xbc"
cmdtestcano15pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xbe"
cmdtestcano15on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xbf"


 cmdtest_pm7_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xc0"
 cmdtest_pm7_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xc2"
 cmdtest_pm7_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xc3"
 
 cmdtest_pm6_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xc4"
 cmdtest_pm6_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xc6"
 cmdtest_pm6_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xc7"
 
 cmdtest_ps4_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xc8"
 cmdtest_ps4_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xca"
 cmdtest_ps4_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xcb"
 
 cmdtest_ps5_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xcc"
 cmdtest_ps5_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xce"
 cmdtest_ps5_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xcf"
 
 cmdtest_pt7_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xd0"
 cmdtest_pt7_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xd2"
 cmdtest_pt7_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xd3"
 
 cmdtest_pp0_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xd4"
 cmdtest_pp0_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xd6"
 cmdtest_pp0_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xd7"
 
 cmdtest_pp1_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xd8"
 cmdtest_pp1_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xda"
 cmdtest_pp1_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xdb"
 
 cmdtest_ps6_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xdc"
 cmdtest_ps6_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xde"
 cmdtest_ps6_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xdf"
 
 cmdtest_ps7_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xe0"
 cmdtest_ps7_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xe2"
 cmdtest_ps7_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xe3"
 

cmdtest_pt4_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xe4"
cmdtest_pt4_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xe6"
cmdtest_pt4_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xe7"

cmdtest_pt5_off = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xe8"
cmdtest_pt5_pulsed = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xea"
cmdtest_pt5_on = "w\$tsCanId\x07\x02\x87\x00\x05\x30\x39\x01\xeb"

;SDcard - cancel an active readback
cmdsdcard_cancel_readback = "w\$tsCanId\x11\x00\x00\x00\x01\x06"

;Engine shutdown and reset
cmdengineshutdown = "w\$tsCanId\x07\x02\xab\x00\x02\x85\x03"
cmdenginereset = "w\$tsCanId\x07\x02\xab\x00\x02\xc4\x31"
 
cmdnull = ""

[UserDefined]

    dialog = engine_control, "", yAxis
    commandButton = "Stop engine", cmdengineshutdown
    field = "This disables injectors and coils, to stop the engine."
    commandButton = "Reset ECU", cmdenginereset, {(rpm == 0) || (rpm >= 65000)}
    field = "This resets the ECU, similar to a 'Power Cycle'."

    dialog = etctest_l, "", yAxis
    field = "Throttle testing can be used with the engine running or stationary"
    field = "but will be limited to 5% max if engine is running."
    field = "Position% (0-100)", etc_testpos
    field = "Set the position before enabling testing"

    dialog = etctest_r, "", yAxis
    commandButton = "Enable test", cmdetcon, {(status8 & 0x40) == 0}
    commandButton = "Stop testing", cmdetcoff, {status8 & 0x40}, clickOnCloseIfEnabled

    dialog = etctest_top, "", xAxis
    panel = etctest_l
    panel = etctest_r

    dialog = etctest_bot, "", xAxis
    gauge = throttletargGauge
    gauge = throttleGauge
    gauge = appGauge

    dialog = etctest, "Throttle test", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#throttletest"
    panel = etctest_top
    panel = etctest_bot

    dialog = etc_set, ""
    field = "!See help/manual for critical safety notes."
    field = "Enable / mode", etc_opt_on
    field = "Base CAN identifier", etc_canbase, {etc_opt_on}
    field = "Throttle target:"
    field = "Minimum value", etc_tp_min, {etc_opt_on}
    field = "Maximum value", etc_tp_max, {etc_opt_on}
    field = "Throttle actual position:"
    field = "Minimum value", etc_tp_act_min, {etc_opt_on}
    field = "Maximum value", etc_tp_act_max, {etc_opt_on}
    field = "Pedal position:"
    field = "Minimum value", etc_app_min, {etc_opt_on}
    field = "Maximum value", etc_app_max, {etc_opt_on}
    field = "Idle control:"
    field = "Max idle addition", etc_idlescale, {etc_opt_on}
    field = "Additional throttles"
    field = "Throttle 2,3,4 follow throttle 1", etc_opt_follow

    dialog = etc, "Electronic Throttle Control", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#throttlecont"
    panel = etc_set, West
    panel = etc_Tbl, East, {etc_opt_on == 3}

    dialog = pitlimiter, "", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#pitlim"
    field = "Pit Limiter Enable", pitlim_opt_on
    field = "Input", pitlim_enin, pitlim_opt_on
    field = "Mode", pitlim_opt_mode, { pitlim_opt_on && pitlim_enin }
    field = "Use VSS or RPM target", pitlim_opt_vssrpm, { pitlim_opt_on && pitlim_enin && (pitlim_opt_mode == 1) }
    field = "Speed", pitlim_speed, { pitlim_opt_on && pitlim_enin && (pitlim_opt_mode == 0) }
    field = "Speed control range", pitlim_speed_range, { pitlim_opt_on && pitlim_enin && ((pitlim_opt_mode == 0) || (pitlim_opt_vssrpm == 0)) }
    field = "RPM control range", pitlim_rpm_range, { pitlim_opt_on && pitlim_enin && (pitlim_opt_mode == 1) && pitlim_opt_vssrpm }
    slider = "Tracking Sensitivity", pitlim_sensitivity, horizontal, { pitlim_opt_on && pitlim_enin}
    field = "SPARK RETARD"
    field = "Spark Retard Mode",  pitlim_opt_retard, { pitlim_opt_on && pitlim_enin}
    field = "Maximum Retard",        pitlim_retardmax, { pitlim_opt_on && pitlim_enin&& (pitlim_opt_retard == 1) }
    field = "SPARK CUT"
    field = "Enable Spark Cut Limiting", pitlim_opt_spkcut, { pitlim_opt_on && pitlim_enin}
    field = "FUEL CUT"
    field = "Enable Fuel Cut Limiting", pitlim_opt_fuelcut, { pitlim_opt_on && pitlim_enin}
    field = "Progressive Fuel Cut", pitlim_opt_fuelprog, { pitlim_opt_on && pitlim_enin && pitlim_opt_fuelcut }

    dialog = iobox1, "IO box 1", yAxis
    field = "IO-Box #1 Enable", iobox_opta1
    field = "VSS setting", iobox_optb1vss, {iobox_opta1}
    field = "Configuration", iobox_opta1adv, {iobox_opta1}
    field = "Base CAN identifier", iobox_id1, {iobox_opta1 && iobox_opta1adv }
    field = "Base CANIN", iobox_opta1canin, {iobox_opta1 && iobox_opta1adv }
    field = "Base CANOUT", iobox_opta1canout , {iobox_opta1 && iobox_opta1adv }
    field = "Base CANADC", iobox_opta1canadc, {iobox_opta1 && iobox_opta1adv }
    field = "Tach transmit rate", iobox_optb1tachrate, {iobox_opta1 && iobox_opta1adv }
    field = "Inputs transmit rate", iobox_optb1inrate, {iobox_opta1 && iobox_opta1adv }
    field = "Outputs transmit rate", iobox_optb1outrate, {iobox_opta1 && iobox_opta1adv }

    dialog = iobox2, "IO box 2", yAxis
    field = "IO-Box #2 Enable", iobox_opta2
    field = "VSS setting", iobox_optb2vss, {iobox_opta2}
    field = "Configuration", iobox_opta2adv, {iobox_opta2}
    field = "Base CAN identifier", iobox_id2, {iobox_opta2 && iobox_opta2adv }
    field = "Base CANIN", iobox_opta2canin, {iobox_opta2 && iobox_opta2adv }
    field = "Base CANOUT", iobox_opta2canout , {iobox_opta2 && iobox_opta2adv }
    field = "Base CANADC", iobox_opta2canadc, {iobox_opta2 && iobox_opta2adv }
    field = "Tach transmit rate", iobox_optb2tachrate, {iobox_opta2 && iobox_opta2adv }
    field = "Inputs transmit rate", iobox_optb2inrate, {iobox_opta2 && iobox_opta2adv }
    field = "Outputs transmit rate", iobox_optb2outrate, {iobox_opta2 && iobox_opta2adv }

    dialog = iobox3, "IO box 3", yAxis
    field = "IO-Box #3 Enable", iobox_opta3
    field = "VSS setting", iobox_optb3vss, {iobox_opta3}
    field = "Configuration", iobox_opta3adv, {iobox_opta3}
    field = "Base CAN identifier", iobox_id3, {iobox_opta3 && iobox_opta3adv }
    field = "Base CANIN", iobox_opta3canin, {iobox_opta3 && iobox_opta3adv }
    field = "Base CANOUT", iobox_opta3canout , {iobox_opta3 && iobox_opta3adv }
    field = "Base CANADC", iobox_opta3canadc, {iobox_opta3 && iobox_opta3adv }
    field = "Tach transmit rate", iobox_optb3tachrate, {iobox_opta3 && iobox_opta3adv }
    field = "Inputs transmit rate", iobox_optb3inrate, {iobox_opta3 && iobox_opta3adv }
    field = "Outputs transmit rate", iobox_optb3outrate, {iobox_opta3 && iobox_opta3adv }

    dialog = iobox4, "IO box 4", yAxis
    field = "IO-Box #4 Enable", iobox_opta4
    field = "VSS setting", iobox_optb4vss, {iobox_opta4}
    field = "Configuration", iobox_opta4adv, {iobox_opta4}
    field = "Base CAN identifier", iobox_id4, {iobox_opta4 && iobox_opta4adv }
    field = "Base CANIN", iobox_opta4canin, {iobox_opta4 && iobox_opta4adv }
    field = "Base CANOUT", iobox_opta4canout , {iobox_opta4 && iobox_opta4adv }
    field = "Base CANADC", iobox_opta4canadc, {iobox_opta4 && iobox_opta4adv }
    field = "Tach transmit rate", iobox_optb4tachrate, {iobox_opta4 && iobox_opta4adv }
    field = "Inputs transmit rate", iobox_optb4inrate, {iobox_opta4 && iobox_opta4adv }
    field = "Outputs transmit rate", iobox_optb4outrate, {iobox_opta4 && iobox_opta4adv }

    dialog = ioboxtop, "", xAxis
    panel = iobox1, West
    panel = iobox2, East

    dialog = ioboxbot, "", xAxis
    panel = iobox3, West
    panel = iobox4, East, {0}

    dialog = iobox, "", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#iobox"
    panel = ioboxtop, North
    panel = ioboxbot, South

    dialog = dashbcast, "Dash Broadcasting", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#dashbcast"
    field = "Enable", dashbcast_opta1
    field = "Configuration", dashbcast_opta1adv, {dashbcast_opta1}
    field = "Base CAN identifier", dashbcast_id1, {dashbcast_opta1 && dashbcast_opta1adv }
    field = "Outputs transmit rate", dashbcast_opta4outrate, {dashbcast_opta1 && dashbcast_opta1adv }

    dialog = can_rcv2, "", yAxis
        field = "   Local variable / channel"
        field = "", can_rcv_var1
        field = "", can_rcv_var2
        field = "", can_rcv_var3
        field = "", can_rcv_var4
        field = "", can_rcv_var5
        field = "", can_rcv_var6
        field = "", can_rcv_var7
        field = "", can_rcv_var8

    dialog = can_rcv2b, "", yAxis
        field = "   Local variable / channel"
        field = "", can_rcv_var9
        field = "", can_rcv_var10
        field = "", can_rcv_var11
        field = "", can_rcv_var12
        field = "", can_rcv_var13
        field = "", can_rcv_var14
        field = "", can_rcv_var15
        field = "", can_rcv_var16

    dialog = can_rcv3, "", yAxis
        field = "   Identifier (dec.)"
        field = "", can_rcv_id1
        field = "", can_rcv_id2
        field = "", can_rcv_id3
        field = "", can_rcv_id4
        field = "", can_rcv_id5
        field = "", can_rcv_id6
        field = "", can_rcv_id7
        field = "", can_rcv_id8

    dialog = can_rcv3b, "", yAxis
        field = "   Identifier (dec.)"
        field = "", can_rcv_id9
        field = "", can_rcv_id10
        field = "", can_rcv_id11
        field = "", can_rcv_id12
        field = "", can_rcv_id13
        field = "", can_rcv_id14
        field = "", can_rcv_id15
        field = "", can_rcv_id16

    dialog = can_rcv4, "", yAxis
        field = "   Offset"
        field = "", can_rcv_off1
        field = "", can_rcv_off2
        field = "", can_rcv_off3
        field = "", can_rcv_off4
        field = "", can_rcv_off5
        field = "", can_rcv_off6
        field = "", can_rcv_off7
        field = "", can_rcv_off8

    dialog = can_rcv4b, "", yAxis
        field = "   Offset"
        field = "", can_rcv_off9
        field = "", can_rcv_off10
        field = "", can_rcv_off11
        field = "", can_rcv_off12
        field = "", can_rcv_off13
        field = "", can_rcv_off14
        field = "", can_rcv_off15
        field = "", can_rcv_off16

    dialog = can_rcv5, "", yAxis
        field = "   Size"
        field = "", can_rcv_size1
        field = "", can_rcv_size2
        field = "", can_rcv_size3
        field = "", can_rcv_size4
        field = "", can_rcv_size5
        field = "", can_rcv_size6
        field = "", can_rcv_size7
        field = "", can_rcv_size8

    dialog = can_rcv5b, "", yAxis
        field = "   Size"
        field = "", can_rcv_size9
        field = "", can_rcv_size10
        field = "", can_rcv_size11
        field = "", can_rcv_size12
        field = "", can_rcv_size13
        field = "", can_rcv_size14
        field = "", can_rcv_size15
        field = "", can_rcv_size16

    dialog = can_rcv6, "", yAxis
        field = "   Multiply"
        field = "", can_rcv_mult1
        field = "", can_rcv_mult2
        field = "", can_rcv_mult3
        field = "", can_rcv_mult4
        field = "", can_rcv_mult5
        field = "", can_rcv_mult6
        field = "", can_rcv_mult7
        field = "", can_rcv_mult8

    dialog = can_rcv6b, "", yAxis
        field = "   Multiply"
        field = "", can_rcv_mult9
        field = "", can_rcv_mult10
        field = "", can_rcv_mult11
        field = "", can_rcv_mult12
        field = "", can_rcv_mult13
        field = "", can_rcv_mult14
        field = "", can_rcv_mult15
        field = "", can_rcv_mult16

    dialog = can_rcv7, "", yAxis
        field = "   Divide"
        field = "", can_rcv_div1
        field = "", can_rcv_div2
        field = "", can_rcv_div3
        field = "", can_rcv_div4
        field = "", can_rcv_div5
        field = "", can_rcv_div6
        field = "", can_rcv_div7
        field = "", can_rcv_div8

    dialog = can_rcv7b, "", yAxis
        field = "   Divide"
        field = "", can_rcv_div9
        field = "", can_rcv_div10
        field = "", can_rcv_div11
        field = "", can_rcv_div12
        field = "", can_rcv_div13
        field = "", can_rcv_div14
        field = "", can_rcv_div15
        field = "", can_rcv_div16

    dialog = can_rcv8, "", yAxis
        field = "   Add"
        field = "", can_rcv_add1
        field = "", can_rcv_add2
        field = "", can_rcv_add3
        field = "", can_rcv_add4
        field = "", can_rcv_add5
        field = "", can_rcv_add6
        field = "", can_rcv_add7
        field = "", can_rcv_add8

    dialog = can_rcv8b, "", yAxis
        field = "   Add"
        field = "", can_rcv_add9
        field = "", can_rcv_add10
        field = "", can_rcv_add11
        field = "", can_rcv_add12
        field = "", can_rcv_add13
        field = "", can_rcv_add14
        field = "", can_rcv_add15
        field = "", can_rcv_add16

    dialog = can_rcv9, "", yAxis
        field = "Std/Ext"
        field = "", can_rcv_size_ext1
        field = "", can_rcv_size_ext2
        field = "", can_rcv_size_ext3
        field = "", can_rcv_size_ext4
        field = "", can_rcv_size_ext5
        field = "", can_rcv_size_ext6
        field = "", can_rcv_size_ext7
        field = "", can_rcv_size_ext8

    dialog = can_rcv9b, "", yAxis
        field = "Std/Ext"
        field = "", can_rcv_size_ext9
        field = "", can_rcv_size_ext10
        field = "", can_rcv_size_ext11
        field = "", can_rcv_size_ext12
        field = "", can_rcv_size_ext13
        field = "", can_rcv_size_ext14
        field = "", can_rcv_size_ext15
        field = "", can_rcv_size_ext16

    dialog = can_rcv1, "", xAxis
        panel = can_rcv2
        panel = can_rcv9
        panel = can_rcv3
        panel = can_rcv4
        panel = can_rcv5
        panel = can_rcv6
        panel = can_rcv7
        panel = can_rcv8

    dialog = can_rcv1b, "", xAxis
        panel = can_rcv2b
        panel = can_rcv9b
        panel = can_rcv3b
        panel = can_rcv4b
        panel = can_rcv5b
        panel = can_rcv6b
        panel = can_rcv7b
        panel = can_rcv8b

    dialog = can_rcv0, "", xAxis
        field = "Enable receiving CAN data", can_rcv_opt_on
        field = "Enable sharing CAN data", can_rcv_opt_share
        field = ""

    dialog = can_rcv, "CAN receiving", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#canrcv"
        panel = can_rcv0, North
        panel = can_rcv1, Center;, {can_rcv_opt_on} ; ungreying does not work
        panel = can_rcv1b, South;, {can_rcv_opt_on}

    dialog = can_outpc_bcast_setting, "", yAxis
        field = "Enable realtime data broadcasting over CAN", can_outpc_gp00_master
        field = "Base message identifier (decimal)", can_outpc_msg

    dialog = can_outpc_bcast_1, "", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#canrtbcast"
        field = "00: Seconds,PW1,PW2,RPM", can_outpc_gp00, { can_outpc_gp00_master }
        field = "01: Advance,Squirt,Engine,AFRtgt1,2,WBen1,2", can_outpc_gp01, { can_outpc_gp00_master }
        field = "02: Baro,MAP,MAT,CLT", can_outpc_gp02, { can_outpc_gp00_master }
        field = "03: TPS,Batt,EGO1,2", can_outpc_gp03, { can_outpc_gp00_master }
        field = "04: Knock,egocor1,2,aircor", can_outpc_gp04, { can_outpc_gp00_master }
        field = "05: warmcor,tpsaccel,tpsfuelcut,barocor", can_outpc_gp05, { can_outpc_gp00_master }
        field = "06: totalcor,ve1,ve2,iacstep", can_outpc_gp06, { can_outpc_gp00_master }
        field = "07: cold_adv,TPSdot,MAPdot,RPMdot", can_outpc_gp07, { can_outpc_gp00_master }
        field = "08: MAFload,fuelload,fuelcor,MAF", can_outpc_gp08, { can_outpc_gp00_master }
        field = "09: egoV1,2,dwell,dwell_trl", can_outpc_gp09, { can_outpc_gp00_master }
        field = "10: status1,2,3,4,5,6,7", can_outpc_gp10, { can_outpc_gp00_master }
        field = "11: fuelload2,ignload1,2,airtemp", can_outpc_gp11, { can_outpc_gp00_master }
        field = "12: wallfuel1,2", can_outpc_gp12, { can_outpc_gp00_master }
        field = "13: sensors1,2,3,4", can_outpc_gp13, { can_outpc_gp00_master }
        field = "14: sensors5,6,7,8", can_outpc_gp14, { can_outpc_gp00_master }
        field = "15: sensors9,10,11,12", can_outpc_gp15, { can_outpc_gp00_master }

    dialog = can_outpc_bcast_2, "CAN Realtime Data Broadcasting 2", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#canrtbcast"
        field = "16: sensors13,14,15,16", can_outpc_gp16
        field = "17: boost_targ1,2,boostduty1,2,MAFv", can_outpc_gp17
        field = "18: PWseq1,2,3,4", can_outpc_gp18
        field = "19: PWseq5,6,7,8", can_outpc_gp19
        field = "20: PWseq9,10,11,12", can_outpc_gp20
        field = "21: PWseq13,14,15,16", can_outpc_gp21
        field = "22: EGT1,2,3,4", can_outpc_gp22
        field = "23: EGT5,6,7,8", can_outpc_gp23
        field = "24: EGT9,10,11,12", can_outpc_gp24
        field = "25: EGT13,14,15,16", can_outpc_gp25
        field = "26: nitrous:duty1,2,timer,addfuel,retard", can_outpc_gp26
        field = "27: CANpwinin1,2,3,4", can_outpc_gp27
        field = "28: CLidletarg,tpsadc,EAEload,AFRload", can_outpc_gp28
        field = "29: EAEfcor1,2,VSS1dot,VSS2dot", can_outpc_gp29
        field = "30: AccelX,Y,Z,streamlvl,waterduty", can_outpc_gp30
        field = "31: AFR0,1,2,3,4,5,6,7,8", can_outpc_gp31

    dialog = can_outpc_bcast_3, "CAN Realtime Data Broadcasting 3", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#canrtbcast"
        field = "32: AFR9,10,11,12,13,14,15,16", can_outpc_gp32
        field = "33: PWMduty1,2,3,4,5,6,gear,timingerr", can_outpc_gp33
        field = "34: EGOv1,2,3,4", can_outpc_gp34
        field = "35: EGOv5,6,7,8", can_outpc_gp35
        field = "36: EGOv9,10,11,12", can_outpc_gp36
        field = "37: EGOv13,14,15,16", can_outpc_gp37
        field = "38: EGOcor1,2,3,4", can_outpc_gp38
        field = "39: EGOcor5,6,7,8", can_outpc_gp39
        field = "40: EGOcor9,10,11,12", can_outpc_gp40
        field = "41: EGOcor13,14,15,16", can_outpc_gp41
        field = "42: VSS1,2,3,4", can_outpc_gp42
        field = "43: synccnt,reason,SD:file#,err,phase,stat,timing_err", can_outpc_gp43
        field = "44: VVTang1,2,3,4", can_outpc_gp44
        field = "45: VVTtarg1,2,3,4", can_outpc_gp45
        field = "46: VVTduty1,2,3,4,injtimingpri,sec", can_outpc_gp46
        field = "47: eth%,tpsacc,SS1,2", can_outpc_gp47

    dialog = can_outpc_bcast_4, "CAN Realtime Data Broadcasting 4", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#canrtbcast"
        field = "48: knock_cyl1,2,3,4,5,6,7,8", can_outpc_gp48
        field = "49: knock_cyl9,10,11,12,13,14,15,16", can_outpc_gp49
        field = "50: MAPacc,totalacc,launch:timer,retard", can_outpc_gp50
        field = "51: PORTa,b,eh,k,mj,p,t,cel_err", can_outpc_gp51
        field = "52: CANin,CANout,knockretard,fuelflow,cons", can_outpc_gp52
        field = "53: Fuel:press1,2,temp1,2", can_outpc_gp53
        field = "54: battcurr,CELstatus,FPduty,ALTduty,loadduty,ALTtarg", can_outpc_gp54
        field = "55: looptime,fueltempcor,fuelprescor,lttcor", can_outpc_gp55
        field = "56: Retards:TC,CEL,FCut,ext", can_outpc_gp56
        field = "57: Advance:Base,Idle,Flex.MATretard", can_outpc_gp57
        field = "58: TableAdv:1,2,3,4", can_outpc_gp58
        field = "59: Revlimretard,ALSadv,ext_advance,deadtime", can_outpc_gp59
        field = "60: Launchadv,3stepadv,VSSlaunchretard,celstat2", can_outpc_gp60
        field = "61: GPS", can_outpc_gp61
        field = "62: GPS", can_outpc_gp62
        field = "63: Gen CL duty1,2", can_outpc_gp63
    
    dialog = can_outpc_bcast, "CAN Realtime Data Broadcasting", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#canrtbcast"
        panel = can_outpc_bcast_setting, North
        panel = can_outpc_bcast_1, South

     dialog = outmsg1_off, "", yAxis
       field = "Variable        Offset"
       field = "01", outmsg1_offset01
       field = "02", outmsg1_offset02
       field = "03", outmsg1_offset03
       field = "04", outmsg1_offset04
       field = "05", outmsg1_offset05
       field = "06", outmsg1_offset06
       field = "07", outmsg1_offset07
       field = "08", outmsg1_offset08
       field = "09", outmsg1_offset09
       field = "10", outmsg1_offset10
       field = "11", outmsg1_offset11
       field = "12", outmsg1_offset12
       field = "13", outmsg1_offset13
       field = "14", outmsg1_offset14
       field = "15", outmsg1_offset15
       field = "16", outmsg1_offset16

     dialog = outmsg1_size, "", yAxis
       field = "                Size"
       field = "", outmsg1_size01
       field = "", outmsg1_size02
       field = "", outmsg1_size03
       field = "", outmsg1_size04
       field = "", outmsg1_size05
       field = "", outmsg1_size06
       field = "", outmsg1_size07
       field = "", outmsg1_size08
       field = "", outmsg1_size09
       field = "", outmsg1_size10
       field = "", outmsg1_size11
       field = "", outmsg1_size12
       field = "", outmsg1_size13
       field = "", outmsg1_size14
       field = "", outmsg1_size15
       field = "", outmsg1_size16

     dialog = outmsg1, "Outmsg 1", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#outmsg"
       panel = outmsg1_off
       panel = outmsg1_size

     dialog = outmsg2_off, "", yAxis
       field = "Variable        Offset"
       field = "01", outmsg2_offset01
       field = "02", outmsg2_offset02
       field = "03", outmsg2_offset03
       field = "04", outmsg2_offset04
       field = "05", outmsg2_offset05
       field = "06", outmsg2_offset06
       field = "07", outmsg2_offset07
       field = "08", outmsg2_offset08
       field = "09", outmsg2_offset09
       field = "10", outmsg2_offset10
       field = "11", outmsg2_offset11
       field = "12", outmsg2_offset12
       field = "13", outmsg2_offset13
       field = "14", outmsg2_offset14
       field = "15", outmsg2_offset15
       field = "16", outmsg2_offset16

     dialog = outmsg2_size, "", yAxis
       field = "                Size"
       field = "", outmsg2_size01
       field = "", outmsg2_size02
       field = "", outmsg2_size03
       field = "", outmsg2_size04
       field = "", outmsg2_size05
       field = "", outmsg2_size06
       field = "", outmsg2_size07
       field = "", outmsg2_size08
       field = "", outmsg2_size09
       field = "", outmsg2_size10
       field = "", outmsg2_size11
       field = "", outmsg2_size12
       field = "", outmsg2_size13
       field = "", outmsg2_size14
       field = "", outmsg2_size15
       field = "", outmsg2_size16

     dialog = outmsg2, "Outmsg 2", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#outmsg"
       panel = outmsg2_off
       panel = outmsg2_size

     dialog = outmsg3_off, "", yAxis
       field = "Variable        Offset"
       field = "01", outmsg3_offset01
       field = "02", outmsg3_offset02
       field = "03", outmsg3_offset03
       field = "04", outmsg3_offset04
       field = "05", outmsg3_offset05
       field = "06", outmsg3_offset06
       field = "07", outmsg3_offset07
       field = "08", outmsg3_offset08
       field = "09", outmsg3_offset09
       field = "10", outmsg3_offset10
       field = "11", outmsg3_offset11
       field = "12", outmsg3_offset12
       field = "13", outmsg3_offset13
       field = "14", outmsg3_offset14
       field = "15", outmsg3_offset15
       field = "16", outmsg3_offset16

     dialog = outmsg3_size, "", yAxis
       field = "                Size"
       field = "", outmsg3_size01
       field = "", outmsg3_size02
       field = "", outmsg3_size03
       field = "", outmsg3_size04
       field = "", outmsg3_size05
       field = "", outmsg3_size06
       field = "", outmsg3_size07
       field = "", outmsg3_size08
       field = "", outmsg3_size09
       field = "", outmsg3_size10
       field = "", outmsg3_size11
       field = "", outmsg3_size12
       field = "", outmsg3_size13
       field = "", outmsg3_size14
       field = "", outmsg3_size15
       field = "", outmsg3_size16

     dialog = outmsg3, "Outmsg 3", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#outmsg"
       panel = outmsg3_off
       panel = outmsg3_size

     dialog = outmsg4_off, "", yAxis
       field = "Variable        Offset"
       field = "01", outmsg4_offset01
       field = "02", outmsg4_offset02
       field = "03", outmsg4_offset03
       field = "04", outmsg4_offset04
       field = "05", outmsg4_offset05
       field = "06", outmsg4_offset06
       field = "07", outmsg4_offset07
       field = "08", outmsg4_offset08
       field = "09", outmsg4_offset09
       field = "10", outmsg4_offset10
       field = "11", outmsg4_offset11
       field = "12", outmsg4_offset12
       field = "13", outmsg4_offset13
       field = "14", outmsg4_offset14
       field = "15", outmsg4_offset15
       field = "16", outmsg4_offset16

     dialog = outmsg4_size, "", yAxis
       field = "                Size"
       field = "", outmsg4_size01
       field = "", outmsg4_size02
       field = "", outmsg4_size03
       field = "", outmsg4_size04
       field = "", outmsg4_size05
       field = "", outmsg4_size06
       field = "", outmsg4_size07
       field = "", outmsg4_size08
       field = "", outmsg4_size09
       field = "", outmsg4_size10
       field = "", outmsg4_size11
       field = "", outmsg4_size12
       field = "", outmsg4_size13
       field = "", outmsg4_size14
       field = "", outmsg4_size15
       field = "", outmsg4_size16

     dialog = outmsg4, "Outmsg 4", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#outmsg"
       panel = outmsg4_off
       panel = outmsg4_size

    dialog = fuelcalc_gauges1, "", xAxis
        gauge = veGauge1
        gauge = veGauge2
        gauge = reqfuelGauge
        gauge = deadtime1Gauge
        gauge = stoichGauge

    dialog = fuelcalc_gauges2, "", xAxis
        gauge = warmupgauge   
        gauge = barocorgauge    
        gauge = gammaairGauge
        gauge = fuelcorr
        gauge = afr1targetGauge

    dialog = fuelcalc_gauges3, "", xAxis
        gauge = accelEnrichGauge
        gauge = accEnrichMSGauge
        gauge = EAEGauge1
        gauge = EAEGauge2
        gauge = fuelloadGauge
        gauge = nitrous_addfuel

    dialog = fuelcalc_gauges3, "", xAxis
        gauge = fueltemp_cor
        gauge = fuelpress_cor
        gauge = ltt_cor
        gauge = als_addfuel

    dialog = fuelcalc_gauges4, "", xAxis
        gauge = mapGauge
        gauge = egoCorrGauge1
        gauge = pulseWidth1Gauge
        gauge = pulseWidth2Gauge
;        gauge = pulseWidth3Gauge
;        gauge = pulseWidth4Gauge

    dialog = fuelcalc_gauges5, "", xAxis
        gauge = dutyCycle1Gauge
        gauge = dutyCycle2Gauge
        gauge = gammaEnrichGauge

    dialog = fuelcalc_gauges6, ""
        field = "For more information on fuel calculations, see the Setting Up Manual."

    dialog = fuelcalcs, "Fuel Calculations Summary", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#fuelsum"
        panel = fuelcalc_gauges1
        panel = fuelcalc_gauges2
        panel = fuelcalc_gauges3
        panel = fuelcalc_gauges4
        panel = fuelcalc_gauges5
        panel = fuelcalc_gauges6

    dialog = sparkcalc_gauges1, "", xAxis
        gauge = adv1Gauge
        gauge = adv2Gauge
        gauge = adv3Gauge
        gauge = adv4Gauge
        gauge = base_advanceGauge

    dialog = sparkcalc_gauges2, "", xAxis
        gauge = idle_cor_advanceGauge      
        gauge = coldAdvGauge     
        gauge = mat_retardGauge
        gauge = flex_advanceGauge

    dialog = sparkcalc_gauges3, "", xAxis
        gauge = nitrous_retard
        gauge = revlim_retardGauge
        gauge = ext_advanceGauge
        gauge = knockGauge

    dialog = sparkcalc_gauges4, "", xAxis
        gauge = tc_retardGauge
        gauge = cel_retardGauge
        gauge = fc_retardGauge
        gauge = als_timingGauge

    dialog = sparkcalc_gauges5, "", xAxis
        gauge = launch_timingGauge
        gauge = step3_timingGauge
        gauge = launchvss_retardGauge
        gauge = advdegGauge

    dialog = sparkcalcs, "Spark Calculations Summary", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#sparksum"
        panel = sparkcalc_gauges1
        panel = sparkcalc_gauges2
        panel = sparkcalc_gauges3
        panel = sparkcalc_gauges4
        panel = sparkcalc_gauges5

    dialog = buts_injspk_label, "", yAxis
        field = "Enabled -->>"
        field = "Disabled ->>"

    dialog = buts_injspk1, "", yAxis
        commandButton = "1", cmdinjspk1, {(status8 & 0x03) && ((status5 & 1) == 0)}
        commandButton = "1", cmdinjspk1, {(status8 & 0x03) && (status5 & 1)}
    dialog = buts_injspk2, "", yAxis
        commandButton = "2", cmdinjspk2, {(status8 & 0x03) && ((status5 & 2) == 0)}
        commandButton = "2", cmdinjspk2, {(status8 & 0x03) && (status5 & 2)}
    dialog = buts_injspk3, "", yAxis
        commandButton = "3", cmdinjspk3, {(status8 & 0x03) && ((status5 & 4) == 0)}
        commandButton = "3", cmdinjspk3, {(status8 & 0x03) && (status5 & 4)}
    dialog = buts_injspk4, "", yAxis
        commandButton = "4", cmdinjspk4, {(status8 & 0x03) && ((status5 & 8) == 0)}
        commandButton = "4", cmdinjspk4, {(status8 & 0x03) && (status5 & 8)}
    dialog = buts_injspk5, "", yAxis
        commandButton = "5", cmdinjspk5, {(status8 & 0x03) && ((status5 & 16) == 0)}
        commandButton = "5", cmdinjspk5, {(status8 & 0x03) && (status5 & 16)}
    dialog = buts_injspk6, "", yAxis
        commandButton = "6", cmdinjspk6, {(status8 & 0x03) && ((status5 & 32) == 0)}
        commandButton = "6", cmdinjspk6, {(status8 & 0x03) && (status5 & 32)}
    dialog = buts_injspk7, "", yAxis
        commandButton = "7", cmdinjspk7, {(status8 & 0x03) && ((status5 & 64) == 0)}
        commandButton = "7", cmdinjspk7, {(status8 & 0x03) && (status5 & 64)}
    dialog = buts_injspk8, "", yAxis
        commandButton = "8", cmdinjspk8, {(status8 & 0x03) && ((status5 & 128) == 0)}
        commandButton = "8", cmdinjspk8, {(status8 & 0x03) && (status5 & 128)}

    dialog = buts_injspk9, "", yAxis
        commandButton = "9", cmdinjspk9, {(status8 & 0x03) && ((status5 & 0x100) == 0)}
        commandButton = "9", cmdinjspk9, {(status8 & 0x03) && (status5 & 0x100)}
    dialog = buts_injspk10, "", yAxis
        commandButton = "10", cmdinjspk10, {(status8 & 0x03) && ((status5 & 0x200) == 0)}
        commandButton = "10", cmdinjspk10, {(status8 & 0x03) && (status5 & 0x200)}
    dialog = buts_injspk11, "", yAxis
        commandButton = "11", cmdinjspk11, {(status8 & 0x03) && ((status5 & 0x400) == 0)}
        commandButton = "11", cmdinjspk11, {(status8 & 0x03) && (status5 & 0x400)}
    dialog = buts_injspk12, "", yAxis
        commandButton = "12", cmdinjspk12, {(status8 & 0x03) && ((status5 & 0x800) == 0)}
        commandButton = "12", cmdinjspk12, {(status8 & 0x03) && (status5 & 0x800)}
    dialog = buts_injspk13, "", yAxis
        commandButton = "13", cmdinjspk13, {(status8 & 0x03) && ((status5 & 0x1000) == 0)}
        commandButton = "13", cmdinjspk13, {(status8 & 0x03) && (status5 & 0x1000)}
    dialog = buts_injspk14, "", yAxis
        commandButton = "14", cmdinjspk14, {(status8 & 0x03) && ((status5 & 0x2000) == 0)}
        commandButton = "14", cmdinjspk14, {(status8 & 0x03) && (status5 & 0x2000)}
    dialog = buts_injspk15, "", yAxis
        commandButton = "15", cmdinjspk15, {(status8 & 0x03) && ((status5 & 0x4000) == 0)}
        commandButton = "15", cmdinjspk15, {(status8 & 0x03) && (status5 & 0x4000)}
    dialog = buts_injspk16, "", yAxis
        commandButton = "16", cmdinjspk16, {(status8 & 0x03) && ((status5 & 0x8000) == 0)}
        commandButton = "16", cmdinjspk16, {(status8 & 0x03) && (status5 & 0x8000)}

    dialog = injspkonoffmaster, "", xAxis
        commandButton = "Off", cmdskipinjoff, {status8 & 0x03}, clickOnCloseIfEnabled
        commandButton = "Injectors", cmdskipinjon, {(status8 & 0x03) == 0}
        commandButton = "Coils", cmdskipspkon, {(status8 & 0x03) == 0}

    dialog = injspkonoffchans, "Outputs Per cylinder", xAxis
        panel = buts_injspk_label
        panel = buts_injspk1
        panel = buts_injspk2
        panel = buts_injspk3
        panel = buts_injspk4
        panel = buts_injspk5
        panel = buts_injspk6
        panel = buts_injspk7
        panel = buts_injspk8

        panel = buts_injspk9

        panel = buts_injspk10

    dialog = injspkonoffchans2, "Outputs Per cylinder", xAxis
        panel = buts_injspk_label
        panel = buts_injspk9
        panel = buts_injspk10
        panel = buts_injspk11
        panel = buts_injspk12

    dialog = injspkonofftype, "", yAxis
        displayOnlyField = "Off", dummyfield, {(status8 & 0x03) == 0}
        displayOnlyField = "Injector disabling test.", dummyfield, {(status8 & 0x03) == 1}
        displayOnlyField = "Coil disabling test - beware of plug fouling.", dummyfield, {(status8 & 0x03) == 2}
        field = "Will not run as expected if running:"
        field = " - semi-sequential fuel"
        field = " - wasted spark and only a crank wheel"
        field = " - a simple distributor input."

    dialog = injspkonoff, "Inj/Spk Disabling Test Mode", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#injspkonoff"
        panel = injspkonoffmaster, North
        panel = injspkonofftype, Center
        panel = injspkonoffchans, South;, {status8 & 0x03} ; <--- this isn't ungreying

    dialog = fp_safety, ""
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#fuelsafety"
        field = "Fuel pressure monitoring must be enabled."
        field = "Enable Fuel Pressure Safety", fp_opt_safety, {fp_press_in}
        field = "(Target fuel pressure are set on fuel pressure page.)"
        displayOnlyField = "Static/Target rail differential pressure", rail_pressure_psig
        displayOnlyField = "Static/Target rail differential pressure", rail_pressure_kpag
        field = "Check Above Load", fp_drop_load, {fp_opt_safety && fp_press_in}
        field = "Check Above RPM", fp_drop_rpm,   {fp_opt_safety && fp_press_in}
        field = "Allowed Pressure Drop", fp_drop_psig, {fp_opt_safety && fp_press_in}
        field = "Allowed Pressure Drop", fp_drop_kpag, {fp_opt_safety && fp_press_in}
        field = "Time Allowed At Low Pressure", fp_drop_time, {fp_opt_safety && fp_press_in}
        field = "See AFR safety for shutdown options"

    dialog = oilpress_set, ""
        field = "Oil Pressure Generic Sensor Input", oilpress_in
        field = "Oil Pressure Warning", oilpress_out, {oilpress_in}
        displayOnlyField = "Oil pressure Triggers Limp Mode", cel_action2_oil, {cel_opt_on && oilpress_in}
        field = "Low pressure triggers engine shutdown", oilpress_in_safety, {oilpress_in}
        field = "Time Allowed At Low Pressure", oilpress_time, {oilpress_in_safety && oilpress_in}
        field = "Set the zero rpm pressures above zero"
        field = "to ensure lamp is tested on each start."
        field = ""
        field = ""
        field = ""
        field = ""

    dialog = oilpress, "Oil Pressure", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#oil"
        panel = oilpress_set
        panel = oil_curve, {oilpress_in}

    dialog = shiftlight, "Shift Light"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#shiftlight"
        field = "Shift Light Output", shiftlight_opt_pins
        field = "Bulb test", shiftlight_opt2_test, {shiftlight_opt_pins}
        field = "Per Gear Limits", shiftlight_opt_gear, {shiftlight_opt_pins}
        field = "Limit", shiftlight_limit1, {shiftlight_opt_pins && (shiftlight_opt_gear == 0)}
        field = "1st Gear Limit", shiftlight_limit1, {shiftlight_opt_pins && shiftlight_opt_gear}
        field = "2nd Gear Limit", shiftlight_limit2, {shiftlight_opt_pins && shiftlight_opt_gear && (gear_no > 1)}
        field = "3rd Gear Limit", shiftlight_limit3, {shiftlight_opt_pins && shiftlight_opt_gear && (gear_no > 2)}
        field = "4th Gear Limit", shiftlight_limit4, {shiftlight_opt_pins && shiftlight_opt_gear && (gear_no > 3)}
        field = "5th Gear Limit", shiftlight_limit5, {shiftlight_opt_pins && shiftlight_opt_gear && (gear_no > 4)}
        field = "6th Gear Limit", shiftlight_limit6, {shiftlight_opt_pins && shiftlight_opt_gear && (gear_no > 5)}

    dialog = hpte1, ""
        field = "This feature requires Incorporate AFR be enabled"
        field = "High Power Time Enrichment", hpte_opt_on, {loadStoich}
        field = "Above Load", hpte_load, {hpte_opt_on && loadStoich}
        field = "Above RPM", hpte_rpm, {hpte_opt_on && loadStoich}

    dialog = hpte, "High Power Time Enrichment"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#hpte"
        panel = hpte1
        panel = hpte_curve, {hpte_opt_on && loadStoich}

    dialog = MAFtable, "MAF Flow Curve", card
       panel = MAFtable1,  Center, { MAFOption_t == 0 }
       panel = MAFtable1f, Center, { MAFOption_t == 1 }

    dialog = alt_load, ""
        field = "Warn on Voltage Difference >", alternator_diff, {alternator_opt_mode && alternator_lampout}
        field = "Load Monitor Input", alternator_freq_monin, {alternator_opt_mode && (alternator_opt_mode < 4)}
        field = "Capture Polarity", alternator_freq_moninv, {alternator_opt_mode && (alternator_opt_mode < 4) && alternator_freq_monin}
        field = "Warn On Load >", alternator_maxload, {alternator_lampout && ((alternator_opt_mode && alternator_freq_monin) || (alternator_opt_mode == 4) || (alternator_opt_mode == 5))}
        field = ""
        field = ""

    dialog = alt_pids, ""
        field = "Closed-Loop PID settings"
        field = "Proportional Gain", alternator_Kp, {alternator_opt_mode == 4}
        field = "Integral Gain", alternator_Ki, {alternator_opt_mode == 4}
        field = "Derivative Gain", alternator_Kd, {alternator_opt_mode == 4}
        slider = "Sensitivity", alternator_sensitivity, horizontal, {alternator_opt_mode == 4}

    dialog = alt_pidorload, "", card
        panel = alt_load, Center, {alternator_opt_mode != 4} 
        panel = alt_pids, Center, {alternator_opt_mode == 4} 

    dialog = alt_settings_t, ""
        field = "Control Mode", alternator_opt_mode
        field = "Control Interval", alternator_ctl_ms, {alternator_opt_mode}
        field = "Control Output", alternator_controlout, {alternator_opt_mode}
        field = "Output Polarity", alternator_control_inv, {alternator_opt_mode}
        field = "Control Frequency", alternator_freq, {(alternator_opt_mode == 3) || (alternator_opt_mode == 4)}
        field = "Warning Lamp Output", alternator_lampout, {alternator_opt_mode}

    dialog = alt_settings_b, ""
        field = "Current Monitor Input", alternator_freq_currin, {alternator_opt_mode}
        field = "Capture Polarity", alternator_freq_currinv, {alternator_opt_mode && alternator_freq_currin}
        field = "Start Delay", alternator_startdelay, {alternator_opt_mode}
        field = "Ramp Up Time", alternator_ramptime, {alternator_opt_mode > 1}
        field = "Battery Temperature Input", alternator_tempin, {alternator_opt_mode}
        field = "Charge Mode Target Voltage", alternator_targv, {(alternator_tempin == 0) && alternator_opt_mode}
        field = "Charge Time", alternator_chargetime, {alternator_opt_mode > 1}
        field = "Run Mode Target Voltage", alternator_targvr, {alternator_opt_mode > 1}
        field = "WOT TPS%", alternator_wot, {alternator_opt_mode > 1}
        field = "WOT Target Voltage", alternator_wotv, {(alternator_opt_mode > 1) && (alternator_wot < 100)}
        field = "WOT Timeout", alternator_wottimeout, {(alternator_opt_mode > 1) && (alternator_wot < 100)}
        field = "Over-Run Target Voltage", alternator_overrv, {alternator_opt_mode > 1}

    dialog = alt_settings, ""
        panel = alt_settings_t
        panel = alt_pidorload
        panel = alt_settings_b

    dialog = alt_outcurve, "", card
        panel = alternator_outperiod, Center, {alternator_opt_mode == 2} 
        panel = alternator_outduty, Center, {alternator_opt_mode == 3}
        panel = alternator_linearise, Center, {alternator_opt_mode == 4}

    dialog = alt_curves, "", yAxis
        panel = alternator_tempcurve, North, {alternator_opt_mode && alternator_tempin}
        panel = alt_outcurve

    dialog = alternator, "Alternator Control", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#altctl"
        panel = alt_settings, West
        panel = alt_curves, Center

    dialog = eaecombi1top, "", xAxis
            panel = EAEBSOCcurve
            panel = EAEBAWCcurve

    dialog = eaecombi1bot, "", yAxis
        liveGraph = eaeGraph, "AE Graph", North
            graphLine = EAEFuelCorr1
            graphLine = afr1
            graphLine = TPSdot, "%", -2000, 2000, auto, auto
            graphLine = MAPdot, "%", -2000, 2000, auto, auto

    dialog = EAEcombi1, "EAE Sucked/Adhered Coefficients", border
        panel = eaecombi1top, Center
        panel = eaecombi1bot, South

    dialog = ms3_pe_t, ""
        field = "Do not try to enable an output port that is already in use for another function."

    dialog = ms3_port_edit_wrap1, "", yAxis
        panel = ms3_port_edit1, North
        panel = ms3_pe_t

    dialog = ms3_port_edit_wrap2, "", yAxis
        panel = ms3_port_edit2, North
        panel = ms3_pe_t

    dialog = fuelpump_set, ""
        field = "Fuel Pump Mode", fp_opt_mode
        field = "Control Interval", fp_ctl_ms
        field = "Fuel Pump Output", fp_out1, {fp_opt_mode}
        field = "Output Frequency", fp_freq, {fp_opt_mode}
        field = "Fuel Pump Output Polarity", fp_opt_inv, {fp_opt_mode}
        field = "Pressure Regulation/Correction", fp_opt_reg, {fp_opt_mode == 0}
        field = "'Fixed' automatically adjusts fuel PW."
        field = "Static/Target Rail Differential Pressure", rail_pressure_psig
        field = "Static/Target Rail Differential Pressure", rail_pressure_kpag
        field = "Priming Duty", fp_prime_duty, {fp_opt_mode}
        field = "Off Duty", fp_off_duty, {fp_opt_mode}
        field = "Minimum Duty", fp_min_duty, {fp_opt_mode}
        field = "Maximum Duty", fp_max_duty, {fp_opt_mode}
        field = "Pressure Sensor Input (kPa)", fp_press_in
        field = "Sensor Type", fp_press_type, {fp_press_in}
        field = "Temperature Sensor Input", fueltemp1
        field = "Temperature Correction", fueltemp1_corr, {fueltemp1}
        field = "Closed-Loop PID settings"
        field = "Proportional Gain",    fp_Kp, {fp_opt_mode == 2}
        field = "Integral Gain",        fp_Ki, {fp_opt_mode == 2}
        field = "Derivative Gain",      fp_Kd, {fp_opt_mode == 2}

    dialog = fuelpump, "Fuel Pump and Pressure Control", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#fuelpump"
        panel = fuelpump_set, West
        panel = fp_dutyTbl, Center, {fp_opt_mode == 1}


    dialog = eng_state_l, "Settings"
        field = "Use VSS?", engine_state_flags_use_vss
        field = "VSS Threshold", engine_state_vss_thresh, { engine_state_flags_use_vss }
;        field = "Fast acceleration threshold", engine_state_accel_fast_thresh
        field = "Slow acceleration threshold", engine_state_accel_slow_thresh
;        field = "Fast deceleration threshold", engine_state_decel_fast_thresh
        field = "Slow deceleration threshold", engine_state_decel_slow_thresh
        field = "Throttle closed TPS threshold", engine_state_tps_closed_thresh
        field = "Wide-open throttle threshold", engine_state_tps_wot_thresh
        field = "Overrun MAP threshold", engine_state_overrun_map_thresh

        dialog = eng_state_r1, "", yAxis
            gauge = throttleGauge, North
            gauge = RPMdot, South

    indicatorPanel = eng_state_ind, 4, { 1 } ; 2 cols, enabled
        indicator = { engine_state_cruise }, "Cruise", "Cruise", white, black, green, black
        indicator = { engine_state_accel_slow }, "Accel", "Accel", white, black, green, black
;        indicator = { engine_state_accel_fast }, "Fast accel", "Fast Accel", white, black, green, black
        indicator = { engine_state_decel_slow }, "Decel", "Decel", white, black, green, black
;        indicator = { engine_state_decel_fast }, "Fast decel", "Fast Decel", white, black, green, black
        indicator = { engine_state_wot }, "WOT", "WOT", white, black, green, black
        indicator = { engine_state_idle }, "Idle", "Idle", white, black, green, black
        indicator = { status2 & 128}, "CL Idle off", "CL idle on",    white, black, green, black
        indicator = { engine_state_overrun }, "Overrun", "Overrun", white, black, green, black
        indicator = { status9 & 4}, "Overrun fuel cut", "Overrun fuel cut",         white, black, red, black
        indicator = { status6 & 16}, "Idle VE", "Idle VE",           white, black, green, black
        indicator = { status6 & 32}, "Idle Adv", "Idle Adv",          white, black, green, black

        dialog = eng_state_t, "", xAxis
        panel = eng_state_l, West
        panel = eng_state_r1, Center

    dialog = engine_state_settings, "Engine State Settings", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#engstate"
        panel = eng_state_t, North
        panel = eng_state_ind, South

    dialog = boost_dome_general_settings1, "General Settings"
        field = "Empty Wastegate Off Boost?", boost_dome_settings1_emptydome_offboost
        field = "Control method", boost_dome_settings1_mode
        field = "Min dome target", boost_ctl_dome_min, {boost_ctl_settings_cl}
        field = "Max dome target", boost_ctl_dome_max, {boost_ctl_settings_cl}
        field = "Target before closed-loop", boost_dome_settings1_biasen, {boost_ctl_settings_cl}
        field = "Use min/max or bias range", boost_dome_settings1_range, {boost_ctl_settings_cl}
        field = "Min/max range", boost_dome_bias_range1, {boost_ctl_settings_cl && (boost_dome_settings1_range == 0)}

    dialog = boost_dome_test_settings1, "Test Settings"
        field = "Enable test mode", boost_dome_testopt
        field = "Dome target pressure", boost_dome_testtarg

    dialog = boost_dome_io_settings1, "I/O settings"
        field = "Dome fill output", boost_dome_outputs_fill1
        field = "Dome fill output min duty", boost_dome_fill_out_mins1, { boost_dome_settings1_mode }
        field = "Dome fill output max duty", boost_dome_fill_out_maxs1, { boost_dome_settings1_mode}
        field = "Dome empty output", boost_dome_outputs_empty1
        field = "Dome empty output min duty", boost_dome_empty_out_mins1, { boost_dome_settings1_mode}
        field = "Dome empty output max duty", boost_dome_empty_out_maxs1, { boost_dome_settings1_mode}
        field = "Dome fill and empty output frequency", boost_dome_freqs1, { boost_dome_settings1_mode}
        field = "Dome MAP sensor input", boost_dome_inputs1
        field = "Dome pressure dead zone", boost_dome_hyst1, {(!boost_dome_settings1_mode) }

    dialog = boost_dome_pid_settings1, "PID settings"
        slider = "Sensitivity", boost_dome_sensitivities1, horizontal, { boost_dome_settings1_mode}
        field = "Basic or Advanced mode?", boost_dome_settings1_advanced, { boost_dome_settings1_mode }
        field = "Proportional Gain", boost_dome_Kp1, { boost_dome_settings1_advanced && boost_dome_settings1_mode}
        field = "Integral Gain", boost_dome_Ki1, { boost_dome_settings1_advanced && boost_dome_settings1_mode}
        field = "Derivative Gain", boost_dome_Kd1, { boost_dome_settings1_advanced && boost_dome_settings1_mode}
    dialog = boost_dome_settings_left, ""
        panel = boost_dome_general_settings1
        panel = boost_dome_test_settings1
        panel = boost_dome_io_settings1
        panel = boost_dome_pid_settings1

    dialog = boost_dome_settings1, "Wastegate Dome Pressure Control Settings 1", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#dome"
        panel = boost_dome_settings_left, West

    dialog = boostvss_curve, "", card
        panel = boostvss_duty_curve, Center, { (boost_ctl_settings_on) && (!(boost_ctl_settings_cl || boost_ctl_settings_dome)) && ((boost_vss == 1) || (boost_vss == 2))}
        panel = boostvss_target_curve, Center, { (boost_ctl_settings_on) && (boost_ctl_settings_cl || boost_ctl_settings_dome) && ((boost_vss == 1) || (boost_vss == 2))}
        panel = boosttime_duty_curve, Center, { (boost_ctl_settings_on) && (!(boost_ctl_settings_cl || boost_ctl_settings_dome)) && ((boost_vss == 4))}
        panel = boosttime_target_curve, Center, { (boost_ctl_settings_on) && (boost_ctl_settings_cl || boost_ctl_settings_dome) && ((boost_vss == 4))}

    dialog = pwmidle_crank_dutyorsteps_curve, "", card
        panel = pwmidle_crank_dutyorsteps_dutycurve, Center, {(IdleCtl == 2) || (IdleCtl == 4)}
        panel = pwmidle_crank_dutyorsteps_stepscurve, Center, {IdleCtl == 3}

    dialog = pwmidle_cl_initialvalues, "", card
        panel = pwmidle_cl_initialvalues_dty, Center, { pwmidle_cl_opts_initvaluetable && ((IdleCtl == 2) || (IdleCtl == 4))}
        panel = pwmidle_cl_initialvalues_stps, Center, { pwmidle_cl_opts_initvaluetable && (IdleCtl == 3) }

    dialog = idlebins, "", card
        panel = iacBins, Center, { IdleCtl == 3 }
        panel = ipwBins, Center, { (IdleCtl == 2) || (IdleCtl == 4) }

    dialog = tcslip_set, "", yAxis
        field = "0-5V knob Input", tc_knob

    dialog = tcslip_menu, "Traction Control - External Slip% Input", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#tractionslip"
        panel = tc_slip_curve
        panel = tcslip_set

    dialog = blend1_set, "", yAxis
        field = "X Axis Parameter", blend_opt1
        field = "%VE2. 0% = Fully VE1. 100% = Fully VE2."
    dialog = blend1menu, "Blend Curve (1)", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#blend1"
        panel = blend1_curve
        panel = blend1_set

    dialog = blend2_set
        field = "X Axis Parameter", blend_opt2
        field = "%Spk2. 0% = Fully Spk1. 100% = Fully Spk2."
    dialog = blend2menu, "Blend Curve (2)", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#blend2"
        panel = blend2_curve
        panel = blend2_set

    dialog = blend3_set
        field = "X Axis Parameter", blend_opt3
        field = "%VE3/4. 0% = Fully VE1/2. 100% = Fully VE3/4."
    dialog = blend3menu, "Blend Curve (3)", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#blend3"
        panel = blend3_curve
        panel = blend3_set

    dialog = blend4_set
        field = "X Axis Parameter", blend_opt4
        field = "%Spk3/4. 0% = Fully Spk1/2. 100% = Fully Spk3/4."
        field = "Delay option", slew_opts_blend4
        field = "Delay factor", blend4LF, {slew_opts_blend4 > 0 }
    dialog = blend4menu, "Blend Curve (4)", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#blend4"
        panel = blend4_curve
        panel = blend4_set

    dialog = blend5_set
        field = "X Axis Parameter", blend_opt5
        field = "%AFR2. 0% = Fully AFR1. 100% = Fully AFR2."
    dialog = blend5menu, "Blend Curve (5)", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#blend5"
        panel = blend5_curve
        panel = blend5_set

    dialog = blend6_set
        field = "X Axis Parameter", blend_opt6
        field = "%Boost2. 0% = Fully Boost1. 100% = Fully Boost2."
    dialog = blend6menu, "Blend Curve (6)", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#blend6"
        panel = blend6_curve
        panel = blend6_set

    dialog = blend7_set
        field = "X Axis Parameter", blend_opt7
        field = "%Crank%2. 0% = Fully Cranking curve1. 100% = Fully Cranking curve2."
    dialog = blend7menu, "Blend Curve (7)", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#blend7"
        panel = blend7_curve
        panel = blend7_set

    dialog = blend8_set
        field = "Flex blend%. 0% = Fully Tables1. 100% = Fully Tables2."
    dialog = blend8menu, "Blend Curve (8)", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#blend7"
        panel = blend8_curve
        panel = blend8_set

    dialog = airden_words
        field = "This curve is the whole air density correction exposed in full."
        field = "It is based on the 'ideal gas law' and typically varies between 125% cold to 75% hot."

    dialog = manifoldTempCorr2, "MAT Air Density Table"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#matairden"
        panel = airden_words
        panel = airdenCorr

    dialog = checkengine_l, "Sensor Validation"
        field = "Sensor Checking", cel_opt_on
        field = "Light Output", cel_port, {cel_opt_on}
        field = "CEL Solid/Flash Codes", cel_opt_flash, {cel_opt_on}
        field = "Light When Not Running", cel_opt_when, {cel_opt_on && cel_port}
        field = "Ignore Fluctuations For First", cel_runtime, {cel_opt_on}
        field = "#MAP Sensor  Check", cel_opt2_map, {cel_opt_on}
        field = "Minimum ADC", map_minadc, {cel_opt_on}
        field = "Maximum ADC", map_maxadc, {cel_opt_on}
        field = "Minimum Fluctuation", map_var_lower, {cel_opt_on}
        field = "Maximum Fluctuation", map_var_upper, {cel_opt_on}
        field = "#MAT Sensor Check", cel_opt2_mat, {cel_opt_on}
        field = "Minimum ADC", mat_minadc, {cel_opt_on}
        field = "Maximum ADC", mat_maxadc, {cel_opt_on}
        field = "Maximum Fluctuation", mat_var_upper, {cel_opt_on}
        field = "#CLT Sensor  Check", cel_opt2_clt, {cel_opt_on}
        field = "Minimum ADC", clt_minadc, {cel_opt_on}
        field = "Maximum ADC", clt_maxadc, {cel_opt_on}
        field = "Maximum Fluctuation", clt_var_upper, {cel_opt_on}
        field = "#TPS Check", cel_opt2_tps, {cel_opt_on}
        field = "Minimum ADC", tps_minadc, {cel_opt_on}
        field = "Maximum ADC", tps_maxadc, {cel_opt_on}
        field = "Maximum Fluctuation", tps_var_upper, {cel_opt_on}

    dialog = checkengine_r, ""
        field = "#Battery Check", cel_opt2_batt, {cel_opt_on}
        field = "Minimum Voltage", batt_minv, {cel_opt_on}
        field = "Maximum Voltage", batt_maxv, {cel_opt_on}
        field = "Maximum Fluctuation", batt_var_upper, {cel_opt_on}
        field = "#EGO1 Sensor Check", cel_opt2_afr0, {cel_opt_on}
        field = "Minimum AFR", afr_min, {cel_opt_on}
        field = "Maximum AFR", afr_max, {cel_opt_on}
        field = "Minimum Fluctuation", afr_var_lower, {cel_opt_on}
        field = "Maximum Fluctuation", afr_var_upper, {cel_opt_on}
        field = "#Sync-Loss Check", cel_opt2_sync, {cel_opt_on}
        field = "No. Sync Losses Allowed", cel_synctol, {cel_opt_on}
        field = "#EGT Sensor Check", cel_opt2_egt, {cel_opt_on}
        field = "Minimum EGT", egt_minvalid, {cel_opt_on}
        field = "Maximum EGT", egt_maxvalid, {cel_opt_on}
        field = "Minimum Fluctuation", egt_var_lower, {cel_opt_on}
        field = "Maximum Fluctuation", egt_var_upper, {cel_opt_on}
        field = "#Flex Sensor Check", cel_opt3_flex, {cel_opt_on && flexFuel}
        field = "AFR safety, oil pressure set CEL."
        field = ""
        field = "status5 Input", cel_opt_stat, {cel_opt_on}
        field = "status5 Shows", cel_opt_adc, {cel_opt_on && cel_opt_stat}

    dialog = limpmode, "Limp Mode"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#limp"
        field = "MAP Triggers Limp Mode", cel_action1_map,  {cel_opt_on && cel_opt2_map}
        field = "Use Fallback MAP Table", cel_action1_map_an,  {cel_opt_on && cel_opt2_map && cel_action1_map}
        field = "MAT Triggers Limp Mode", cel_action1_mat,  {cel_opt_on && cel_opt2_mat}
        field = "Fallback MAT", cel_mat_default, {cel_opt_on && cel_opt2_mat && cel_action1_mat}
        field = "CLT Triggers Limp Mode", cel_action1_clt,  {cel_opt_on && cel_opt2_clt}
        field = "Fallback Cold CLT", cel_clt_cold, {cel_opt_on && cel_opt2_clt && cel_action1_clt}
        field = "Fallback Warmed Up CLT", cel_clt_warm, {cel_opt_on && cel_opt2_clt && cel_action1_clt}
        field = "Time To Warmup Engine", cel_warmtime, {cel_opt_on && cel_opt2_clt && cel_action1_clt}
        field = "TPS Triggers Limp Mode", cel_action1_tps,  {cel_opt_on && cel_opt2_tps}
        field = "TPS-accel is disabled in fault conditions"
        field = "Batt Triggers Limp Mode", cel_action1_batt,  {cel_opt_on && cel_opt2_batt}
        field = "EGO Triggers Limp Mode", cel_action1_ego,  {cel_opt_on && cel_opt2_afr0}
        field = "Flex Triggers Limp Mode", cel_action2_flex, {cel_opt_on && cel_opt3_flex}
        field = "EGT Triggers Limp Mode", cel_action2_egt, {cel_opt_on && cel_opt2_egt}
        field = "Oil pressure Triggers Limp Mode", cel_action2_oil, {cel_opt_on && oilpress_in}
        field = "The following apply in limp mode:"
        field = "Limp Rev Limit", cel_revlim
        field = "Limp Boost Limit", cel_overboost
        field = "Limp Boost Valve Duty", cel_boost_duty
        field = "Limp Boost Valve2 Duty", cel_boost_duty2
        field = "Limp Retard Timing By", cel_retard

    dialog = checkengine, "Check Engine Light", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#cel"
        panel = checkengine_l
        panel = checkengine_r

    dialog = limitsettings, "Gauge and Settings Limits"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#gaugeset"
        field = "These are the limits for gauges and tuning settings,"
        field = "so that curves and tables are more appropriately scaled."
        field = "Adjust to suit your engine."
        field = "They do not directly alter engine behaviour."
        field = "RPM - Max Display", rpmhigh
        field = "RPM - Warn level", rpmwarn
        field = "RPM - Danger level", rpmdang
        field = "Load/kPa - Max", loadhigh
        field = "Allow WUE Below 100%", wue_lpg
        field = "Preferred Speed Units", prefSpeedUnits
        field = "Preferred Length Units", prefLengthUnits
        field = "Preferred Fuel Pressure Units", prefFuelPressUnits
        field = "Air-Cooled Expanded CLT Range", clt_exp

; list of features and what pins they use
    dialog = iopinlist1, ".", yAxis
        displayOnlyField = "Main Fuel Outputs",               hardware_fuel
        displayOnlyField = "Injector Out I, Injector Out J", hardware_fuel, {hardware_fuel== 0}
        displayOnlyField = "Injector Out A, Injector Out B etc.", hardware_fuel, {hardware_fuel}
        displayOnlyField = "Spark Hardware In Use", hardware_spk
        displayOnlyField = "Spark Out A, Spark Out B etc.", hardware_spk, {hardware_spk}
        displayOnlyField = "Cam Input (If Used)", hardware_cam, {!((spk_config_trig2 == 1) && (spk_mode0 == 4))} ; greyed in toothed wheel, single wheel
        displayOnlyField = "Tertiary Tach Input", spk_mode3_tach3, {spk_mode0 == 47}





 displayOnlyField = "Programmable On/Off Output: Stepper Out 2",    psEnabled[3], {psEnabled[3]}
 displayOnlyField = "Programmable On/Off Output: Stepper Out 1",    psEnabled[4], {psEnabled[4]}
 displayOnlyField = "Programmable On/Off Output: PWM Out 2",    psEnabled[6], {psEnabled[6]}
 displayOnlyField = "Programmable On/Off Output: High Current Out 3",   psEnabled[7], {psEnabled[7]}
 displayOnlyField = "Programmable On/Off Output: High Current Out 1", psEnabled[8], {psEnabled[8]}
 displayOnlyField = "Programmable On/Off Output: High Current Out 2", psEnabled[9], {psEnabled[9]}
 displayOnlyField = "Programmable On/Off Output: PWM Out 3",     psEnabled[10], {psEnabled[10]}
 displayOnlyField = "Programmable On/Off Output: PWM / Idle Out 1",   psEnabled[11], {psEnabled[11]}
 displayOnlyField = "Programmable On/Off Output: Injector Out I", psEnabled[12], {psEnabled[12]}
 displayOnlyField = "Programmable On/Off Output: Injector Out J", psEnabled[13], {psEnabled[13]}
 displayOnlyField = "Programmable On/Off Output: Digital Frequency In 2",    psEnabled[14], {psEnabled[14]}
 displayOnlyField = "Programmable On/Off Output: Tach Out",   psEnabled[15], {psEnabled[15]}
 displayOnlyField = "Programmable On/Off Output: Injector Out A",   psEnabled[16], {psEnabled[16]}
 displayOnlyField = "Programmable On/Off Output: Injector Out B",   psEnabled[17], {psEnabled[17]}
 displayOnlyField = "Programmable On/Off Output: Injector Out C",   psEnabled[18], {psEnabled[18]}
 displayOnlyField = "Programmable On/Off Output: Injector Out D",   psEnabled[19], {psEnabled[19]}
 displayOnlyField = "Programmable On/Off Output: Injector Out E",   psEnabled[20], {psEnabled[20]}
 displayOnlyField = "Programmable On/Off Output: Injector Out F",   psEnabled[21], {psEnabled[21]}
 displayOnlyField = "Programmable On/Off Output: Injector Out G",   psEnabled[22], {psEnabled[22]}
 displayOnlyField = "Programmable On/Off Output: Injector Out H",   psEnabled[23], {psEnabled[23]}
 displayOnlyField = "Programmable On/Off Output: Spark Out A",   psEnabled[24], {psEnabled[24]}
 displayOnlyField = "Programmable On/Off Output: Spark Out B",   psEnabled[25], {psEnabled[25]}
 displayOnlyField = "Programmable On/Off Output: Spark Out C",   psEnabled[26], {psEnabled[26]}
 displayOnlyField = "Programmable On/Off Output: Spark Out D",   psEnabled[27], {psEnabled[27]}
 displayOnlyField = "Programmable On/Off Output: Spark Out E",   psEnabled[28], {psEnabled[28]}
 displayOnlyField = "Programmable On/Off Output: Spark Out F",   psEnabled[29], {psEnabled[29]}
 displayOnlyField = "Programmable On/Off Output: Spark Out G",   psEnabled[30], {psEnabled[30]}
 displayOnlyField = "Programmable On/Off Output: Spark Out H",   psEnabled[31], {psEnabled[31]}
 displayOnlyField = "Programmable On/Off Output: Digital In Out 1",   psEnabled[32], {psEnabled[32]}
 displayOnlyField = "Programmable On/Off Output: Digital In Out 2",   psEnabled[33], {psEnabled[33]}
 displayOnlyField = "Programmable On/Off Output: Digital In Out 3",   psEnabled[34], {psEnabled[34]}
 displayOnlyField = "Programmable On/Off Output: Digital In Out 4",   psEnabled[35], {psEnabled[35]}
 displayOnlyField = "Programmable On/Off Output: Digital In Out 5",   psEnabled[36], {psEnabled[36]}
 displayOnlyField = "Programmable On/Off Output: PWM Out 4",   psEnabled[37], {psEnabled[37]}
 displayOnlyField = "Programmable On/Off Output: PWM Out 5",   psEnabled[38], {psEnabled[38]}
 displayOnlyField = "Programmable On/Off Output: Digital Out 1 LED",   psEnabled[39], {psEnabled[39]}
 displayOnlyField = "Programmable On/Off Output: Digital Out 2",   psEnabled[40], {psEnabled[40]}


 displayOnlyField = "Programmable On/Off Output: CANout01", psEnabled_2[0], {psEnabled_2[0]}
 displayOnlyField = "Programmable On/Off Output: CANout02", psEnabled_2[1], {psEnabled_2[1]}
 displayOnlyField = "Programmable On/Off Output: CANout03", psEnabled_2[2], {psEnabled_2[2]}
 displayOnlyField = "Programmable On/Off Output: CANout04", psEnabled_2[3], {psEnabled_2[3]}
 displayOnlyField = "Programmable On/Off Output: CANout05", psEnabled_2[4], {psEnabled_2[4]}
 displayOnlyField = "Programmable On/Off Output: CANout06", psEnabled_2[5], {psEnabled_2[5]}
 displayOnlyField = "Programmable On/Off Output: CANout07", psEnabled_2[6], {psEnabled_2[6]}
 displayOnlyField = "Programmable On/Off Output: CANout08", psEnabled_2[7], {psEnabled_2[7]}
 displayOnlyField = "Programmable On/Off Output: CANout09", psEnabled_2[8], {psEnabled_2[8]}
 displayOnlyField = "Programmable On/Off Output: CANout10", psEnabled_2[9], {psEnabled_2[9]}
 displayOnlyField = "Programmable On/Off Output: CANout11", psEnabled_2[10], {psEnabled_2[10]}
 displayOnlyField = "Programmable On/Off Output: CANout12", psEnabled_2[11], {psEnabled_2[11]}
 displayOnlyField = "Programmable On/Off Output: CANout13", psEnabled_2[12], {psEnabled_2[12]}
 displayOnlyField = "Programmable On/Off Output: CANout14", psEnabled_2[13], {psEnabled_2[13]}
 displayOnlyField = "Programmable On/Off Output: CANout15", psEnabled_2[14], {psEnabled_2[14]}
 displayOnlyField = "Programmable On/Off Output: CANout16", psEnabled_2[15], {psEnabled_2[15]}
 displayOnlyField = "Programmable On/Off Output: Loop 1", psEnabled_2[16], {psEnabled_2[16]}
 displayOnlyField = "Programmable On/Off Output: Loop 2", psEnabled_2[17], {psEnabled_2[17]}
 displayOnlyField = "Programmable On/Off Output: Loop 3", psEnabled_2[18], {psEnabled_2[18]}
 displayOnlyField = "Programmable On/Off Output: Loop 4", psEnabled_2[19], {psEnabled_2[19]}
 displayOnlyField = "Programmable On/Off Output: Loop 5", psEnabled_2[20], {psEnabled_2[20]}
 displayOnlyField = "Programmable On/Off Output: Loop 6", psEnabled_2[21], {psEnabled_2[21]}
 displayOnlyField = "Programmable On/Off Output: Loop 7", psEnabled_2[22], {psEnabled_2[22]}
 displayOnlyField = "Programmable On/Off Output: Loop 8", psEnabled_2[23], {psEnabled_2[23]}

        displayOnlyField = "EGO 1 Port", egoport1
        displayOnlyField = "EGO 2 Port", egoport2, {egonum > 1}
        displayOnlyField = "EGO 3 Port", egoport3, {egonum > 2}
        displayOnlyField = "EGO 4 Port", egoport4, {egonum > 3}
        displayOnlyField = "EGO 5 Port", egoport5, {egonum > 4}
        displayOnlyField = "EGO 6 Port", egoport6, {egonum > 5}
        displayOnlyField = "EGO 7 Port", egoport7, {egonum > 6}
        displayOnlyField = "EGO 8 Port", egoport8, {egonum > 7}
        displayOnlyField = "EGO 9 Port",  egoport9,  {egonum > 8}
        displayOnlyField = "EGO 10 Port", egoport10, {egonum > 9}
        displayOnlyField = "EGO 11 Port", egoport11, {egonum > 10}
        displayOnlyField = "EGO 12 Port", egoport12, {egonum > 11}
        displayOnlyField = "Generic Sensor 01 Input", sensor01_source, {sensor01_source}
        displayOnlyField = "Generic Sensor 02 Input", sensor02_source, {sensor02_source}
        displayOnlyField = "Generic Sensor 03 Input", sensor03_source, {sensor03_source}
        displayOnlyField = "Generic Sensor 04 Input", sensor04_source, {sensor04_source}
        displayOnlyField = "Generic Sensor 05 Input", sensor05_source, {sensor05_source}
        displayOnlyField = "Generic Sensor 06 Input", sensor06_source, {sensor06_source}
        displayOnlyField = "Generic Sensor 07 Input", sensor07_source, {sensor07_source}
        displayOnlyField = "Generic Sensor 08 Input", sensor08_source, {sensor08_source}
        displayOnlyField = "Generic Sensor 09 Input", sensor09_source, {sensor09_source}
        displayOnlyField = "Generic Sensor 10 Input", sensor10_source, {sensor10_source}
        displayOnlyField = "Generic Sensor 11 Input", sensor11_source, {sensor11_source}
        displayOnlyField = "Generic Sensor 12 Input", sensor12_source, {sensor12_source}
        displayOnlyField = "Generic Sensor 13 Input", sensor13_source, {sensor13_source}
        displayOnlyField = "Generic Sensor 14 Input", sensor14_source, {sensor14_source}
        displayOnlyField = "Generic Sensor 15 Input", sensor15_source, {sensor15_source}
        displayOnlyField = "Generic Sensor 16 Input", sensor16_source, {sensor16_source}
        displayOnlyField = "EGT 1 Channel",  egt1port, { (egt_num > 0) }
        displayOnlyField = "EGT 2 Channel",  egt2port, { (egt_num > 1) }
        displayOnlyField = "EGT 3 Channel",  egt3port, { (egt_num > 2) }
        displayOnlyField = "EGT 4 Channel",  egt4port, { (egt_num > 3) }
        displayOnlyField = "EGT 5 Channel",  egt5port, { (egt_num > 4) }
        displayOnlyField = "EGT 6 Channel",  egt6port, { (egt_num > 5) }
        displayOnlyField = "EGT 7 Channel",  egt7port, { (egt_num > 6) }
        displayOnlyField = "EGT 8 Channel",  egt8port, { (egt_num > 7) }
        displayOnlyField = "EGT 9 Channel",  egt9port, { (egt_num > 8) }
        displayOnlyField = "EGT 10 Channel", egt10port, { (egt_num > 9) }
        displayOnlyField = "EGT 11 Channel", egt11port, { (egt_num > 10) }
        displayOnlyField = "EGT 12 Channel", egt12port, { (egt_num > 11) }
;        displayOnlyField = "EGT 13 Channel", egt13port, { (egt_num > 12) }
;        displayOnlyField = "EGT 14 Channel", egt14port, { (egt_num > 13) }
;        displayOnlyField = "EGT 15 Channel", egt15port, { (egt_num > 14) }
;        displayOnlyField = "EGT 16 Channel", egt16port, { (egt_num > 15) }
        displayOnlyField = "Knock Input Pin",      knkport, { knk_option && !knk_option_an }

    dialog = iopinlist2, ".", yAxis
        displayOnlyField = "PWM Idle Output", pwmidle_freq_pin, { (IdleCtl == 1) || (IdleCtl == 2) }
        displayOnlyField = "PWM Idle 3 Wire Mode", pwmidle_freq_pin3, { (IdleCtl == 2) && pwmidle_freq_pin3 }
        displayOnlyField = "Fan Control Output", fanctl_settings_pin, { fanctl_settings_on }
        displayOnlyField = "AC Output", ac_idleup_io_out, { ac_idleup_settings && ac_idleup_io_out }
        displayOnlyField = "AC Idle-up Input", ac_idleup_io_in, { ac_idleup_settings }
        displayOnlyField = "Realtime Baro Port",    rtbaroport, {baroCorr == 2}
        displayOnlyField = "MAP Voltage Input", mapport, {mapport_t == 0}
        displayOnlyField = "MAP Frequency Input", mapport_f, {mapport_t == 1}
        displayOnlyField = "MAP 2nd Port",    map2port, {(mapport_t == 0) && (mapport != 7) && map2port}
        displayOnlyField = "MAF Voltage Input", MAFOption, {(MAFOption_t == 0)}
        displayOnlyField = "MAF Frequency Input", MAFOption_f, {(MAFOption_t == 1)}
        displayOnlyField = "Flex Sensor Port",              flexport,    { flexFuel > 0 }
        displayOnlyField = "Flex Temperature Input",        fueltemp1, {fueltemp1}
        displayOnlyField = "Tacho Output",  tacho_opt3f, { tacho_opt80 }
        displayOnlyField = "VVT1 Output",       vvt_out1,       {vvt_opt1_on}
        displayOnlyField = "VVT2 Output",       vvt_out2,       {vvt_opt1_on > 1}
        displayOnlyField = "VVT3 Output",       vvt_out3,       {vvt_opt1_on > 2}
        displayOnlyField = "VVT4 Output",       vvt_out4,       {vvt_opt1_on > 2}
        displayOnlyField = "VVT1 Output (complementary)", vvt_softout1, {vvt_opt1_on && (vvt_opt4_decode == 2)}
        displayOnlyField = "VVT2 Output (complementary)", vvt_softout2, {(vvt_opt1_on > 1) && (vvt_opt4_decode == 2)}
        displayOnlyField = "VVT3 Output (complementary)", vvt_softout3, {(vvt_opt1_on > 2) && (vvt_opt4_decode == 2)}
        displayOnlyField = "VVT4 Output (complementary)", vvt_softout4, {(vvt_opt1_on > 2) && (vvt_opt4_decode == 2)}
        displayOnlyField = "VVT1 Input",       vvt_opt3_cam1,       {vvt_opt1_on}
        displayOnlyField = "VVT2 Input",       vvt_opt3_cam2,       {vvt_opt1_on > 1}
        displayOnlyField = "VVT3 Input",       vvt_opt3_cam3,       {vvt_opt1_on > 2}
        displayOnlyField = "VVT4 Input",       vvt_opt3_cam4,       {vvt_opt1_on > 2}
        displayOnlyField = "Fuel Table Switching Input", tsw_pin_f, { f5_0_tsf && (f5_0_tsf_opt == 0) && !(dualfuel_sw_on && dualfuel_sw_fuel)}
        displayOnlyField = "Spark Table Switching Input", tsw_pin_s, { f5_0_tss && (f5_0_tss_opt == 0) }
        displayOnlyField = "Req Fuel Switching", tsw_pin_rf, { !(dualfuel_sw_on && dualfuel_sw_rf)}
        displayOnlyField = "AFR Table Switching", tsw_pin_afr, { !(dualfuel_sw_on && dualfuel_sw_afr)}
        displayOnlyField = "Stoich Switching", tsw_pin_stoich, { !(dualfuel_sw_on && dualfuel_sw_stoich)}
        displayOnlyField = "Dual Fuel Input", dualfuel_pin, { dualfuel_sw_on && (dualfuel_opt_mode != 1) }
        displayOnlyField = "Overboost Switching", tsw_pin_ob, { (OverBoostOption > 0) && (!(dualfuel_sw_on && (dualfuel_opt_mode == 2) && (dualfuel_sw2_ob )))}
        displayOnlyField = "Boost Table Switching", boost_feats_tsw, {boost_ctl_settings_on}
;        displayOnlyField = "Boost Control Output (Mid)",     boost_ctl_pins_pwm, {boost_ctl_settings_on && (boost_ctl_pwm < 2)}
        displayOnlyField = "Boost Control Output (Slow)",                boost_ctl_pins, {boost_ctl_settings_on && (boost_ctl_pwm == 2)}
;        displayOnlyField = "Boost Control2 Output (Mid)",     boost_ctl_pins_pwm2, {boost_ctl_settings_on && boost_ctl_settings_on2 && (boost_ctl_pwm < 2)}
        displayOnlyField = "Boost Control2 Output (Slow)",         boost_ctl_pins2, {boost_ctl_settings_on && boost_ctl_settings_on2 && (boost_ctl_pwm == 2)}
        displayOnlyField = "Gen PWM A Output", pwm_opt2_a, {pwm_opt_on_a}
        displayOnlyField = "Gen PWM B Output", pwm_opt2_b, {pwm_opt_on_b}
        displayOnlyField = "Gen PWM C Output", pwm_opt2_c, {pwm_opt_on_c}
        displayOnlyField = "Gen PWM D Output", pwm_opt2_d, {pwm_opt_on_d}
        displayOnlyField = "Gen PWM E Output", pwm_opt2_e, {pwm_opt_on_e}
        displayOnlyField = "Gen PWM F Output", pwm_opt2_f, {pwm_opt_on_f}
        displayOnlyField = "Generic Closed-Loop A Output", generic_pid_pwm_outs_a, {generic_pid_flags_a_on}
        displayOnlyField = "Generic Closed-Loop B Output", generic_pid_pwm_outs_b, {generic_pid_flags_b_on}

        displayOnlyField = "WI Pump Output", water_pins_pump, {water_freq_on}
        displayOnlyField = "WI Valve Output", water_pins_valve, {water_freq_on && water_freq_type}
        displayOnlyField = "VSS1 Analogue sensor", vss1_an, {vss_opt0_1 == 2}
        displayOnlyField = "VSS1 Digi Input", vss_opt1, {vss_opt0_1 == 1}
        displayOnlyField = "VSS1 CAN PWM Port", vss1_pwmseq, {vss_opt1 ==15 && (vss_opt0_1 == 1)}
        displayOnlyField = "VSS2 Analogue Sensor", vss2_an, {vss_opt0_2 == 2}
        displayOnlyField = "VSS2 Digi Input", vss_opt2, {vss_opt0_2 == 1}
        displayOnlyField = "VSS2 CAN PWM Port", vss2_pwmseq, {vss_opt2 ==15 && (vss_opt0_1 == 1)}
        displayOnlyField = "Shaft Sensor 1", ss_opt1, {ss_opt1}
        displayOnlyField = "Shaft Sensor 2", ss_opt2, {ss_opt2}
        displayOnlyField = "VSS Output", vssout_opt, {vssout_opt}
        displayOnlyField = "Gear Pos. Input", gear_port_an, { (gear_method == 2) }
        displayOnlyField = "Bike Shifter Input", shift_cut_in, { shift_cut_on }
        displayOnlyField = "Bike Shifter Output", shift_cut_out, { shift_cut_on }
        displayOnlyField = "Accelerometer X Input", accXport, {accXport && (canrx1_opt_accel == 0)}
        displayOnlyField = "Accelerometer Y Input", accYport, {accYport && (canrx1_opt_accel == 0)}
        displayOnlyField = "Accelerometer Z Input", accZport, {accZport && (canrx1_opt_accel == 0)}
        displayOnlyField = "SDcard Datalog button", log_style2_but, {log_style_on2 == 2}
        displayOnlyField = "SDcard LED indicator", log_style_led, {log_style_on2}
        displayOnlyField = "SDcard Stream Input", log_style3_adc, {log_style_block == 1}
        displayOnlyField = "SDcard trigger output", sdpulse_out, {log_style_on2 >= 2}
        displayOnlyField = "Nitrous Stage 1 output - nitrous",           n2o1n_pins,     { N2Oopt_2 }
        displayOnlyField = "Nitrous Stage 1 output - fuel",              n2o1f_pins,     { N2Oopt_2 }
        displayOnlyField = "Nitrous Enable input on:",                   N2Oopt_pins,    { N2Oopt_2 }
        displayOnlyField = "Nitrous Stage 2 output - nitrous",           n2o2n_pins,     { N2Oopt_2 && N2Oopt_3 }
        displayOnlyField = "Nitrous Stage 2 output - fuel",              n2o2f_pins,     { N2Oopt_2 && N2Oopt_3 }
        displayOnlyField = "AFR safety Warning Output", maxafr_opt1_led, { maxafr_opt1_on || egt_conf_action }
        displayOnlyField = "Launch Input",  launch_opt_pins, { launch_opt_on >0 }
        displayOnlyField = "Variable launch Input",        launch_var_on, { launch_opt_on >0 }
        displayOnlyField = "3-step Input", launch_3step_in, {launch_opt_on >0 }
        displayOnlyField = "Anti-Lag Enable Input",        als_in_pin, {als_in_pin}
        displayOnlyField = "ALS On/off Output",                als_out_pin, {als_in_pin}
        displayOnlyField = "ALS PWM Output",   als_opt_pwmout, {als_in_pin}
        displayOnlyField = "ALS Output",              als_pwm_opt2, {als_in_pin && als_opt_pwmout}
        displayOnlyField = "Traction Control Enable Input", tc_enin, {tc_opt_on}
        displayOnlyField = "Traction Control Light output", tc_led_out, {tc_opt_on}
        displayOnlyField = "Torque Convertor Lockup", tclu_outpin, {tclu_outpin}
        displayOnlyField = "TCLU Enable Input", tclu_enablepin, {tclu_outpin}
        displayOnlyField = "TCLU Brake switch", tclu_brakepin, {tclu_outpin}
        displayOnlyField = "Staged Injection Relay Output 1", staged_out1, { staged_first_param }
        displayOnlyField = "Staged Injection Relay Output 2", staged_out2, { staged_first_param }
        displayOnlyField = "Alternator Control Output", alternator_controlout, {alternator_opt_mode}
        displayOnlyField = "Alternator Warning Lamp Output", alternator_lampout, {alternator_opt_mode}
        displayOnlyField = "Load Monitor Input", alternator_freq_monin, {alternator_opt_mode && (alternator_opt_mode < 4)}
        displayOnlyField = "Battery Current Monitor Input", alternator_freq_currin, {alternator_opt_mode}
        displayOnlyField = "Battery Temperature Input", alternator_tempin, {alternator_opt_mode}
        displayOnlyField = "Fuel Pump Output", fp_out1, {fp_opt_mode}
        displayOnlyField = "Primary Pressure Input", fp_press_in, {fp_press_in}
        displayOnlyField = "Primary Fuel Temperature Input", fueltemp1, {fueltemp1}
        displayOnlyField = "Secondary Fuel Pressure Input", dualfuel_press_sens, { dualfuel_sw_on && dualfuel_opt_press}
        displayOnlyField = "Secondary Fuel Temperature Input", dualfuel_temp_sens, { dualfuel_sw_on && dualfuel_opt_temp}
        displayOnlyField = "Check Engine Light Output", cel_port, {cel_opt_on}

    dialog = iopinlist, "Feature List Showing I/O pins", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#iopins"
        panel = iopinlist1, West
        panel = iopinlist2, East

; now list of pins and what features they are assigned to.
    dialog = pinusage1, ".", yAxis ; 18 rows
        displayOnlyField = "Injector A", { bitStringValue( portLabels , portusage_a[0]  ) }
        displayOnlyField = "Injector B", { bitStringValue( portLabels , portusage_a[1]  ) }
        displayOnlyField = "Injector C", { bitStringValue( portLabels , portusage_a[2]  ) }
        displayOnlyField = "Injector D", { bitStringValue( portLabels , portusage_a[3]  ) }
        displayOnlyField = "Injector E", { bitStringValue( portLabels , portusage_a[4]  ) }
        displayOnlyField = "Injector F", { bitStringValue( portLabels , portusage_a[5]  ) }
        displayOnlyField = "Injector G", { bitStringValue( portLabels , portusage_a[6]  ) }
        displayOnlyField = "Injector H", { bitStringValue( portLabels , portusage_a[7]  ) }
        displayOnlyField = "Injector I", { bitStringValue( portLabels , portusage_t[1]  ) }
        displayOnlyField = "Injector J", { bitStringValue( portLabels , portusage_t[3]  ) }
        displayOnlyField = "Spark A", { bitStringValue( portLabels , portusage_b[0]  ) }
        displayOnlyField = "Spark B", { bitStringValue( portLabels , portusage_b[1]  ) }
        displayOnlyField = "Spark C", { bitStringValue( portLabels , portusage_b[2]  ) }
        displayOnlyField = "Spark D", { bitStringValue( portLabels , portusage_b[3]  ) }
        displayOnlyField = "Spark E", { bitStringValue( portLabels , portusage_b[4]  ) }
        displayOnlyField = "Spark F", { bitStringValue( portLabels , portusage_b[5]  ) }
        displayOnlyField = "Spark G", { bitStringValue( portLabels , portusage_b[6]  ) }
        displayOnlyField = "Spark H", { bitStringValue( portLabels , portusage_b[7]  ) }

    indicatorPanel = pinusage1i, 1, { 1 } ; 18 rows
        indicator = { porta & 1 }, "Off", "On", white, black, green, black
        indicator = { porta & 2 }, "Off", "On", white, black, green, black
        indicator = { porta & 4 }, "Off", "On", white, black, green, black
        indicator = { porta & 8 }, "Off", "On", white, black, green, black
        indicator = { porta & 16 }, "Off", "On", white, black, green, black
        indicator = { porta & 32 }, "Off", "On", white, black, green, black
        indicator = { porta & 64 }, "Off", "On", white, black, green, black
        indicator = { porta & 128 }, "Off", "On", white, black, green, black

        indicator = { portt & 2 }, "Off", "On", white, black, green, black
        indicator = { portt & 8 }, "Off", "On", white, black, green, black

        indicator = { portb & 1 }, "On", "Off", green, black, white, black
        indicator = { portb & 2 }, "On", "Off", green, black, white, black
        indicator = { portb & 4 }, "On", "Off", green, black, white, black
        indicator = { portb & 8 }, "On", "Off", green, black, white, black
        indicator = { portb & 16 }, "On", "Off", green, black, white, black
        indicator = { portb & 32 }, "On", "Off", green, black, white, black
        indicator = { portb & 64 }, "On", "Off", green, black, white, black
        indicator = { portb & 128 }, "On", "Off", green, black, white, black

    dialog = pinusage2, ".", yAxis


        displayOnlyField = "Fuel Pump Relay", { bitStringValue( portLabels , portusage_e[4]  ) }
        displayOnlyField = "Tacho Out", { bitStringValue( portLabels , portusage_k[0]  ) }
        displayOnlyField = "IAC1", { bitStringValue( portLabels , portusage_j[0]  ) }
        displayOnlyField = "IAC2", { bitStringValue( portLabels , portusage_j[1]  ) }
        displayOnlyField = "High Current Out 1", { bitStringValue( portLabels , portusage_p[4]  ) }
        displayOnlyField = "High Current Out 2", { bitStringValue( portLabels , portusage_p[5]  ) }
        displayOnlyField = "High Current Out 3", { bitStringValue( portLabels , portusage_p[3]  ) }
        displayOnlyField = "PWM Idle Out 1", { bitStringValue( portLabels , portusage_p[7]  ) }
        displayOnlyField = "PWM Out 2", { bitStringValue( portLabels , portusage_p[2]  ) }
        displayOnlyField = "PWM Out 3", { bitStringValue( portLabels , portusage_p[6]  ) }



        displayOnlyField = "PWM Out 4", { bitStringValue( portLabels , portusage_p[0]  ) }
        displayOnlyField = "PWM Out 5", { bitStringValue( portLabels , portusage_p[1]  ) }

        displayOnlyField = "Digital Output 1 LED", { bitStringValue( portLabels , portusage_s[6]  ) }
        displayOnlyField = "Digital Output 2", { bitStringValue( portLabels , portusage_s[7]  ) }


    indicatorPanel = pinusage2i, 1, { 1 }
        indicator = { porteh & 16 }, "Off", "On", white, black, green, black
        indicator = { portk & 1 }, "Off", "On", white, black, green, black
        indicator = { portmj & 1 }, "A- B+", "A+ B-", white, black, green, black
        indicator = { portmj & 2 }, "A- B+", "A+ B-", white, black, green, black
        indicator = { portp & 16 }, "Off", "On", white, black, green, black
        indicator = { portp & 32 }, "Off", "On", white, black, green, black
        indicator = { portp & 8 }, "Off", "On", white, black, green, black
        indicator = { portp & 128 }, "Off", "On", white, black, green, black

        indicator = { portp & 4 }, "Off", "On", white, black, green, black
        indicator = { portp & 64 }, "Off", "On", white, black, green, black


        indicator = { portp & 1 }, "Off", "On", white, black, green, black
        indicator = { portp & 2 }, "Off", "On", white, black, green, black

        indicator = { ports & 64 }, "Off", "On", white, black, green, black
        indicator = { ports & 128 }, "Off", "On", white, black, green, black


    dialog = pinusage3, ".", yAxis ; 17 rows





        displayOnlyField = "Crank input", { bitStringValue( portLabels , portusage_t[0] ) }
        displayOnlyField = "Cam Input", { bitStringValue( portLabels , portusage_t[2]  ) }
        displayOnlyField = "Digital Switched in 1", { bitStringValue( portLabels , portusage_e[2]  ) }
        displayOnlyField = "Digital Switched In 2", { bitStringValue( portLabels , portusage_k[2]  ) }
        displayOnlyField = "Digital Switched in 3", { bitStringValue( portLabels , portusage_h[6]  ) }
        displayOnlyField = "Digital Switched 12V in", { bitStringValue( portLabels , portusage_h[7]  ) }
        displayOnlyField = "Digital Frequency In 1", { bitStringValue( portLabels , portusage_t[4]  ) }
        displayOnlyField = "Digital Frequency In 2", { bitStringValue( portLabels , portusage_t[5]  ) }
        displayOnlyField = "Digital Frequency In 3", { bitStringValue( portLabels , portusage_t[6]  ) }


        displayOnlyField = "Digital In Out 1", { bitStringValue( portLabels , portusage_m[7]  ) }
        displayOnlyField = "Digital In Out 2", { bitStringValue( portLabels , portusage_m[6]  ) }
        displayOnlyField = "Digital In Out 3", { bitStringValue( portLabels , portusage_s[4]  ) }
        displayOnlyField = "Digital In Out 4", { bitStringValue( portLabels , portusage_s[5]  ) }
        displayOnlyField = "Digital In Out 5", { bitStringValue( portLabels , portusage_t[7]  ) }
        displayOnlyField = "Digital Input 4", { bitStringValue( portLabels , portusage_e[0]  ) }
        displayOnlyField = "Digital Input 5", { bitStringValue( portLabels , portusage_e[1]  ) }

    indicatorPanel = pinusage3i, 1, { 1 } ; 17 rows





        indicator = { portt & 1 }, "0V", "5V", white, black, green, black
        indicator = { portt & 4 }, "0V", "5V", white, black, green, black
        indicator = { porteh & 4 }, "0V", "5V", white, black, green, black
        indicator = { portk & 4 }, "0V", "5V", white, black, green, black
        indicator = { porteh & 64 }, "0V", "5V", white, black, green, black
        indicator = { porteh & 128 }, "0V", "5V", white, black, green, black
        indicator = { portt & 16 }, "0V", "5V", white, black, green, black
        indicator = { portt & 32 }, "0V", "5V", white, black, green, black
        indicator = { portt & 64 }, "0V", "5V", white, black, green, black



        indicator = { portm & 128 }, "0V", "5V", white, black, green, black
        indicator = { portm & 64 }, "0V", "5V", white, black, green, black
        indicator = { ports & 16 }, "0V", "5V", white, black, green, black
        indicator = { ports & 32 }, "0V", "5V", white, black, green, black
        indicator = { portt & 128 }, "0V", "5V", white, black, green, black
        indicator = { porteh & 1 }, "0V", "5V", white, black, green, black
        indicator = { porteh & 2 }, "0V", "5V", white, black, green, black

    dialog = pinusage4, ".", yAxis
        displayOnlyField = "CANIN 1", { bitStringValue( portLabels , portusage_canin[0]  ) }
        displayOnlyField = "CANIN 2", { bitStringValue( portLabels , portusage_canin[1]  ) }
        displayOnlyField = "CANIN 3", { bitStringValue( portLabels , portusage_canin[2]  ) }
        displayOnlyField = "CANIN 4", { bitStringValue( portLabels , portusage_canin[3]  ) }
        displayOnlyField = "CANIN 5", { bitStringValue( portLabels , portusage_canin[4]  ) }
        displayOnlyField = "CANIN 6", { bitStringValue( portLabels , portusage_canin[5]  ) }
        displayOnlyField = "CANIN 7", { bitStringValue( portLabels , portusage_canin[6]  ) }
        displayOnlyField = "CANIN 8", { bitStringValue( portLabels , portusage_canin[7]  ) }
        displayOnlyField = "Loop 1",  { bitStringValue( portLabels , portusage_loop[0]  ) }
        displayOnlyField = "Loop 2",  { bitStringValue( portLabels , portusage_loop[1]  ) }
        displayOnlyField = "Loop 3",  { bitStringValue( portLabels , portusage_loop[2]  ) }
        displayOnlyField = "Loop 4",  { bitStringValue( portLabels , portusage_loop[3]  ) }
        displayOnlyField = "Loop 5",  { bitStringValue( portLabels , portusage_loop[4]  ) }
        displayOnlyField = "Loop 6",  { bitStringValue( portLabels , portusage_loop[5]  ) }
        displayOnlyField = "Loop 7",  { bitStringValue( portLabels , portusage_loop[6]  ) }
        displayOnlyField = "Loop 8",  { bitStringValue( portLabels , portusage_loop[7]  ) }

    indicatorPanel = pinusage4i, 1, { 1 } ; 16 rows
        indicator = { canin1_8 & 1 }, "0", "1", white, black, green, black
        indicator = { canin1_8 & 2 }, "0", "1", white, black, green, black
        indicator = { canin1_8 & 4 }, "0", "1", white, black, green, black
        indicator = { canin1_8 & 8 }, "0", "1", white, black, green, black
        indicator = { canin1_8 & 16 }, "0", "1", white, black, green, black
        indicator = { canin1_8 & 32 }, "0", "1", white, black, green, black
        indicator = { canin1_8 & 64 }, "0", "1", white, black, green, black
        indicator = { canin1_8 & 128 }, "0", "1", white, black, green, black
        indicator = { loop & 1 }, "0", "1", white, black, green, black
        indicator = { loop & 2 }, "0", "1", white, black, green, black
        indicator = { loop & 4 }, "0", "1", white, black, green, black
        indicator = { loop & 8 }, "0", "1", white, black, green, black
        indicator = { loop & 16 }, "0", "1", white, black, green, black
        indicator = { loop & 32 }, "0", "1", white, black, green, black
        indicator = { loop & 64 }, "0", "1", white, black, green, black
        indicator = { loop & 128 }, "0", "1", white, black, green, black

    dialog = pinusage5, ".", yAxis
        displayOnlyField = "CANOUT 1",  { bitStringValue( portLabels , portusage_canout[0]  ) }
        displayOnlyField = "CANOUT 2",  { bitStringValue( portLabels , portusage_canout[1]  ) }
        displayOnlyField = "CANOUT 3",  { bitStringValue( portLabels , portusage_canout[2]  ) }
        displayOnlyField = "CANOUT 4",  { bitStringValue( portLabels , portusage_canout[3]  ) }
        displayOnlyField = "CANOUT 5",  { bitStringValue( portLabels , portusage_canout[4]  ) }
        displayOnlyField = "CANOUT 6",  { bitStringValue( portLabels , portusage_canout[5]  ) }
        displayOnlyField = "CANOUT 7",  { bitStringValue( portLabels , portusage_canout[6]  ) }
        displayOnlyField = "CANOUT 8",  { bitStringValue( portLabels , portusage_canout[7]  ) }
        displayOnlyField = "CANOUT 9",  { bitStringValue( portLabels , portusage_canout[8]  ) }
        displayOnlyField = "CANOUT 10", { bitStringValue( portLabels , portusage_canout[9]  ) } 
        displayOnlyField = "CANOUT 11", { bitStringValue( portLabels , portusage_canout[10] ) }
        displayOnlyField = "CANOUT 12", { bitStringValue( portLabels , portusage_canout[11] ) }
        displayOnlyField = "CANOUT 13", { bitStringValue( portLabels , portusage_canout[12] ) }
        displayOnlyField = "CANOUT 14", { bitStringValue( portLabels , portusage_canout[13] ) }
        displayOnlyField = "CANOUT 15", { bitStringValue( portLabels , portusage_canout[14] ) }
        displayOnlyField = "CANOUT 16", { bitStringValue( portLabels , portusage_canout[15] ) }

    indicatorPanel = pinusage5i, 1, { 1 } ; 16 rows
        indicator = { canout1_8 & 1 }, "Off", "On", white, black, green, black
        indicator = { canout1_8 & 2 }, "Off", "On", white, black, green, black
        indicator = { canout1_8 & 4 }, "Off", "On", white, black, green, black
        indicator = { canout1_8 & 8 }, "Off", "On", white, black, green, black
        indicator = { canout1_8 & 16 }, "Off", "On", white, black, green, black
        indicator = { canout1_8 & 32 }, "Off", "On", white, black, green, black
        indicator = { canout1_8 & 64 }, "Off", "On", white, black, green, black
        indicator = { canout1_8 & 128 }, "Off", "On", white, black, green, black
        indicator = { canout9_16 & 1 }, "Off", "On", white, black, green, black
        indicator = { canout9_16 & 3 }, "Off", "On", white, black, green, black
        indicator = { canout9_16 & 4 }, "Off", "On", white, black, green, black
        indicator = { canout9_16 & 8 }, "Off", "On", white, black, green, black
        indicator = { canout9_16 & 16 }, "Off", "On", white, black, green, black
        indicator = { canout9_16 & 32 }, "Off", "On", white, black, green, black
        indicator = { canout9_16 & 64 }, "Off", "On", white, black, green, black
        indicator = { canout9_16 & 128 }, "Off", "On", white, black, green, black

    dialog = pinusage5s, ".", yAxis
        displayOnlyField = "CANIN1-8 Source", { bitStringValue( portLabels , portusage_canin_src  ) }
        displayOnlyField = "CANOUT1-8 Destination",  { bitStringValue( portLabels , portusage_canout1_src  ) }
        displayOnlyField = "CANOUT9-16 Destination", { bitStringValue( portLabels , portusage_canout2_src ) }

    dialog = pinusage6, ".", yAxis
        displayOnlyField = "Channel:       Feature:"
        displayOnlyField = "CANADC 1", { bitStringValue( portLabels , portusage_canadc[0] ) }
        displayOnlyField = "CANADC 2", { bitStringValue( portLabels , portusage_canadc[1] ) }
        displayOnlyField = "CANADC 3", { bitStringValue( portLabels , portusage_canadc[2] ) }
        displayOnlyField = "CANADC 4", { bitStringValue( portLabels , portusage_canadc[3] ) }
        displayOnlyField = "CANADC 5", { bitStringValue( portLabels , portusage_canadc[4] ) }
        displayOnlyField = "CANADC 6", { bitStringValue( portLabels , portusage_canadc[5] ) }
        displayOnlyField = "CANADC 7", { bitStringValue( portLabels , portusage_canadc[6] ) }
        displayOnlyField = "CANADC 8", { bitStringValue( portLabels , portusage_canadc[7] ) }
        displayOnlyField = "CANADC 9",  { bitStringValue( portLabels , portusage_canadc[8]  ) }
        displayOnlyField = "CANADC 10", { bitStringValue( portLabels , portusage_canadc[9]  ) }
        displayOnlyField = "CANADC 11", { bitStringValue( portLabels , portusage_canadc[10] ) }
        displayOnlyField = "CANADC 12", { bitStringValue( portLabels , portusage_canadc[11] ) }
        displayOnlyField = "CANADC 13", { bitStringValue( portLabels , portusage_canadc[12] ) }
        displayOnlyField = "CANADC 14", { bitStringValue( portLabels , portusage_canadc[13] ) }
        displayOnlyField = "CANADC 15", { bitStringValue( portLabels , portusage_canadc[14] ) }
        displayOnlyField = "CANADC 16", { bitStringValue( portLabels , portusage_canadc[15] ) }

    dialog = pinusage6s, ".", yAxis
        displayOnlyField = "      Source:"
        displayOnlyField = "1-4:", { bitStringValue( portLabels , portusage_canadc_src[0]  ) }
        displayOnlyField = "", { ^ }
        displayOnlyField = "", { ^ }
        displayOnlyField = "", { ^ }
        displayOnlyField = "5-8:", { bitStringValue( portLabels , portusage_canadc_src[1]  ) }
        displayOnlyField = "", { ^ }
        displayOnlyField = "", { ^ }
        displayOnlyField = "", { ^ }
        displayOnlyField = "9-12:", { bitStringValue( portLabels , portusage_canadc_src[2]  ) }
        displayOnlyField = "", { ^ }
        displayOnlyField = "", { ^ }
        displayOnlyField = "", { ^ }
        displayOnlyField = "13-15:", { bitStringValue( portLabels , portusage_canadc_src[3] ) }
        displayOnlyField = "", { ^ }
        displayOnlyField = "", { ^ }
        displayOnlyField = "", { ^ }

    dialog = pinusage7, ".", yAxis
        displayOnlyField = "Channel:       Feature:"
        displayOnlyField = "CANADC 17", { bitStringValue( portLabels , portusage_canadc[16] ) }
        displayOnlyField = "CANADC 18", { bitStringValue( portLabels , portusage_canadc[17] ) }
        displayOnlyField = "CANADC 19", { bitStringValue( portLabels , portusage_canadc[18] ) }
        displayOnlyField = "CANADC 20", { bitStringValue( portLabels , portusage_canadc[19] ) }
        displayOnlyField = "CANADC 21", { bitStringValue( portLabels , portusage_canadc[20] ) }
        displayOnlyField = "CANADC 22", { bitStringValue( portLabels , portusage_canadc[21] ) }
        displayOnlyField = "CANADC 23", { bitStringValue( portLabels , portusage_canadc[22] ) }
        displayOnlyField = "CANADC 24", { bitStringValue( portLabels , portusage_canadc[23] ) }
        displayOnlyField = "CANPWM 1", { bitStringValue( portLabels , portusage_canpwm[0]  ) }
        displayOnlyField = "CANPWM 2", { bitStringValue( portLabels , portusage_canpwm[1]  ) }
        displayOnlyField = "CANPWM 3", { bitStringValue( portLabels , portusage_canpwm[2]  ) }
        displayOnlyField = "CANPWM 4", { bitStringValue( portLabels , portusage_canpwm[3]  ) }
        displayOnlyField = "CANPWM 5", { bitStringValue( portLabels , portusage_canpwm[4]  ) }
        displayOnlyField = "CANPWM 6", { bitStringValue( portLabels , portusage_canpwm[5]  ) }
        displayOnlyField = "CANPWM 7", { bitStringValue( portLabels , portusage_canpwm[6]  ) }
        displayOnlyField = "CANPWM 8", { bitStringValue( portLabels , portusage_canpwm[7]  ) }

    dialog = pinusage7s, ".", yAxis
        displayOnlyField = "      Source:"
        displayOnlyField = "17-20:", { bitStringValue( portLabels , portusage_canadc_src[4]  ) }
        displayOnlyField = "", { ^ }
        displayOnlyField = "", { ^ }
        displayOnlyField = "", { ^ }
        displayOnlyField = "21-24:", { bitStringValue( portLabels , portusage_canadc_src[5]  ) }
        displayOnlyField = "", { ^ }
        displayOnlyField = "", { ^ }
        displayOnlyField = "", { ^ }
        displayOnlyField = "", { - }
        displayOnlyField = "", { - }
        displayOnlyField = "", { - }
        displayOnlyField = "", { - }
        displayOnlyField = "", { - }
        displayOnlyField = "", { - }
        displayOnlyField = "", { - }
        displayOnlyField = "", { - }

    dialog = pinusage10, ".", yAxis ; 13 rows




        displayOnlyField = "Analog In 1", { bitStringValue( portLabels , portusage_ad0h[4]  ) }
        displayOnlyField = "Analog In 2", { bitStringValue( portLabels , portusage_ad0h[5]  ) }
        displayOnlyField = "Analog In 3", { bitStringValue( portLabels , portusage_ad0h[3]  ) }
        displayOnlyField = "Analog In 4", { bitStringValue( portLabels , portusage_ad0h[6]  ) }
        displayOnlyField = "Analog In 5", { bitStringValue( portLabels , portusage_ad0h[1]  ) }
        displayOnlyField = "Analog In 6", { bitStringValue( portLabels , portusage_ad0h[0]  ) }
        displayOnlyField = "Analog In 7", { bitStringValue( portLabels , portusage_ad0l[7]  ) }
        displayOnlyField = "Analog In 8", { bitStringValue( portLabels , portusage_ad0h[7]  ) }
        displayOnlyField = "Internal Baro Sensor", { bitStringValue( portLabels , portusage_ad0h[2]  ) }

        displayOnlyField = "MAP In", { bitStringValue( portLabels , portusage_ad0l[0]  ) }
        displayOnlyField = "O2", { bitStringValue( portLabels , portusage_ad0l[5]  ) }

        displayOnlyField = "Hardware PWM A", { bitStringValue( portLabels , portusage_pwmscl[1]  ) }
        displayOnlyField = "Hardware PWM B", { bitStringValue( portLabels , portusage_pwmscl[3]  ) }

    indicatorPanel = pinusage10i, 1, { 1 } ; 13 rows
        indicator = { deadValue }, "-", "-", white, black, white, black
        indicator = { deadValue }, "-", "-", white, black, white, black
        indicator = { deadValue }, "-", "-", white, black, white, black
        indicator = { deadValue }, "-", "-", white, black, white, black
        indicator = { deadValue }, "-", "-", white, black, white, black
        indicator = { deadValue }, "-", "-", white, black, white, black
        indicator = { deadValue }, "-", "-", white, black, white, black

        indicator = { deadValue }, "-", "-", white, black, white, black
        indicator = { deadValue }, "-", "-", white, black, white, black
        indicator = { deadValue }, "-", "-", white, black, white, black
        indicator = { deadValue }, "-", "-", white, black, white, black

        indicator = { deadValue }, "-", "-", white, black, white, black
        indicator = { deadValue }, "-", "-", white, black, white, black

    dialog = pinusage, "I/O Pins List Usage and Status - only works when online", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#pinusage"
        panel = pinusage3, West
        panel = pinusage3i, West
        panel = pinusage2, Center
        panel = pinusage2i, Center

	dialog = pinucll, "", border
        panel = pinusage4, West
        panel = pinusage4i, East

	dialog = pinuclr, "", border
        panel = pinusage5, West
        panel = pinusage5i, Center

    dialog = pinuclt, "", xAxis
		panel = pinucll, West
		panel = pinuclr, East

	dialog = pinuclfa, "", yAxis
	    field = ""
	    field = ""
	    field = ""

    dialog = pinuclb, "", xAxis
		panel = pinusage5s, West
		panel = pinuclfa, East

    dialog = pinusagecanloop, "CAN/Loop Usage and Status - only works when online", yAxis
		panel = pinuclt, North
        panel = pinuclb, South

    dialog = pinucsl, "", border
        panel = pinusage6, West
        panel = pinusage6s, East

    dialog = pinucsr, "", border
        panel = pinusage7, West
        panel = pinusage7s, East

    dialog = pinusagecan, "Expansion I/O Pins Usage and Status - only works when online", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#pinusagecan"
        panel = pinucsl, West
        panel = pinucsr, East

    dialog = pinusagel2, "I/O Pins List2 Usage and Status - only works when online", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#pinusage"
        panel = pinusage1 ;, West
        panel = pinusage1i ;, West
        panel = pinusage10 ;, Center

    dialog = ase_note
        field = "The typical range for afterstart is 50% (cold) to 5% (warm)"

    dialog = nestedasePct, "Afterstart Enrichment (ASE) - Percent Adder"
        panel = asePct
        panel = ase_note

    dialog = nestedasePct2, "Afterstart Enrichment (ASE) - Percent Adder 2"
        panel = asePct2
        panel = ase_note

    dialog = wc_note
        field = "For 99% of engines, warmup must have 100% in the final row. Typical maximum is 255% (cold)."

    dialog = nestedwarmup_curve, "Warmup Enrichment (WUE) - Percent Multiplier"
        panel = warmup_curve
        panel = wc_note

    dialog = nestedwarmup_curve2, "Warmup Enrichment (WUE) - Percent Multiplier 2"
        panel = warmup_curve2
        panel = wc_note

    dialog = tcsettings, "Traction Control Settings"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#traction"
        field = "Traction Control", tc_opt_on
        field = "Method", tc_opt_method, {tc_opt_on}
        field = "Enable Input", tc_enin, {tc_opt_on}
        field = "Light output", tc_led_out, {tc_opt_on}
        field = "Minimum TPS", tc_mintps, {tc_opt_on}
        field = "Minimum MAP", tc_minmap, {tc_opt_on && (tc_opt_method == 1)}
        field = "Minimum VSS", tc_minvss, {tc_opt_on && (tc_opt_method != 2) && (tc_opt_method != 3) }
        field = "Driven", tc_opt_driven, {tc_opt_on}
        field = "Undriven", tc_opt_undriven, {tc_opt_on}
;        field = "Maximum VSS", tc_maxvss, {tc_opt_on }
        field = "Slip % Setting", tc_opt_slipcurve, {tc_opt_on && (tc_opt_method == 1)}
        field = "Slip Threshold", tc_slipthresh, {tc_opt_on && (tc_opt_method == 1) && !tc_opt_slipcurve}
        field = "Nitrous Control", tc_opt_n2o, {tc_opt_on }
        field = "Add Fuel To:", tc_opt_bank, {tc_opt_on }
        field = "When staging bank 1 = primary, bank 2 = secondary"
        field = "Speed difference retard table", tc_opt3_vssdiff {tc_opt_on}

    dialog = tc_top, "", xAxis
        panel = tc_retard_curve, West
        panel = tc_spkcut_curve, East, {spk_mode0 > 1}

    dialog = tc_mid, "", xAxis
        panel = tc_addfuel_curve, West
        panel = tc_nitrous_curve, East, {N2Oopt_2}

    dialog = tc_btm, "", xAxis
        panel = tc_boost_curve, West, {boost_ctl_settings_on && boost_ctl_settings_cl}
        panel = tc_boost_duty_delta_curve, East, {boost_ctl_settings_on && (boost_ctl_settings_cl != 1)}

    dialog = tc_curves, "Traction Control Reactions", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#tcreact"
        panel = tc_top, North
        panel = tc_mid, Center
        panel = tc_btm, South

    dialog = tcluparams, "Torque Convertor Lockup"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#tclu"
        field = "Output Pin", tclu_outpin
        field = "Enable Input", tclu_enablepin, {tclu_outpin}
        field = "Brake Switch", tclu_brakepin, {tclu_outpin}
        field = "Minimum TPS", tclu_tpsmin, {tclu_outpin}
        field = "Maximum TPS", tclu_tpsmax, {tclu_outpin}
        field = "Minimum MAP", tclu_mapmin, {tclu_outpin}
        field = "Maximum MAP", tclu_mapmax, {tclu_outpin}
        field = "Use VSS", tclu_opt_vss, {tclu_outpin}
        field = "Minimum Speed", tclu_vssmin, {tclu_outpin && tclu_opt_vss}
        field = "Use Gear Value", tclu_opt_gear, {tclu_outpin}
        field = "Minimum Gear", tclu_gearmin, {tclu_outpin && tclu_opt_gear}
        field = "Activation Delay", tclu_delay,  {tclu_outpin}

    dialog = vvtct, ""
        field = "."
        field = "Input"
        field = "Polarity"
        field = "No. Teeth"
        field = "Output"
        field = "Minimum"
        field = "Maximum"
        field = "Int./Exh."
        field = "Tooth 1"
        field = "Tooth 2"
        field = "More Duty Means"
        field = "Output (2)"

    dialog = vvtc1, ""
        field = "#CAM1"
        field = "", vvt_opt3_cam1,   {vvt_opt1_on && vvt_opt2_pid2}
        field = "", vvt_opt2_cam1pol,{vvt_opt1_on && ((spk_config_trig2l & 0x3) == 0x3) && (spk_mode0 == 4) && (spk_config_trig2 == 3) && (vvt_opt4_decode ==0 )}
        field = "", vvt_tth1,        {(vvt_opt1_on > 0) && (spk_mode0 == 4) && vvt_opt2_pid2}
        field = "", vvt_out1,        {vvt_opt1_on}
        field = "", vvt_min_ang1,    {vvt_opt1_on && vvt_opt2_pid2}
        field = "", vvt_max_ang1,    {vvt_opt1_on && vvt_opt2_pid2}
        field = "", vvt_opt5_vvt1,   {vvt_opt1_on && vvt_opt2_pid2}
        field = "", vvt_cam1tth1,    {vvt_opt1_on && (vvt_opt4_decode == 1)}
        field = "", vvt_cam1tth2,    {vvt_opt1_on && (vvt_opt4_decode == 1)}
        field = "", vvt_out1_dir,    {vvt_opt1_on && vvt_opt2_pid2}
        field = "", vvt_softout1,    {vvt_opt1_on && (vvt_opt4_decode == 2)}

    dialog = vvtc2, ""
        field = "#CAM2"
        field = "", vvt_opt3_cam2,   {(vvt_opt1_on > 1) && vvt_opt2_pid2}
        field = "", vvt_opt2_cam2pol,{(vvt_opt1_on > 1) && vvt_opt2_pid2}
        field = "", vvt_tth2,        {(vvt_opt1_on > 1) && vvt_opt2_pid2 && (spk_mode0 == 4)} 
        field = "", vvt_out2,        {(vvt_opt1_on > 1) && vvt_opt2_pid2}
        field = "", vvt_min_ang2,    {(vvt_opt1_on > 1) && vvt_opt2_pid2}
        field = "", vvt_max_ang2,    {(vvt_opt1_on > 1) && vvt_opt2_pid2}
        field = "", vvt_opt5_vvt2,   {(vvt_opt1_on > 1) && vvt_opt2_pid2}
        field = "", vvt_cam2tth1,    {0}
        field = "", vvt_cam2tth2,    {0}
        field = "", vvt_out2_dir,    {(vvt_opt1_on > 1) && vvt_opt2_pid2}
        field = "", vvt_softout2,    {(vvt_opt1_on > 1) && (vvt_opt4_decode == 2)}

    dialog = vvtc3, ""
        field = "#CAM3"
        field = "", vvt_opt3_cam3,   {(vvt_opt1_on > 2) && vvt_opt2_pid2}
        field = "", vvt_opt2_cam3pol,{(vvt_opt1_on > 2) && vvt_opt2_pid2}
        field = "", vvt_tth3,        {(vvt_opt1_on > 2) && vvt_opt2_pid2 && (spk_mode0 == 4)} 
        field = "", vvt_out3,        {(vvt_opt1_on > 2) && vvt_opt2_pid2}
        field = "", vvt_min_ang3,    {(vvt_opt1_on > 2) && vvt_opt2_pid2}
        field = "", vvt_max_ang3,    {(vvt_opt1_on > 2) && vvt_opt2_pid2}
        field = "", vvt_opt5_vvt3,   {(vvt_opt1_on > 2) && vvt_opt2_pid2}
        field = "", vvt_cam3tth1,    {(vvt_opt1_on > 2) && vvt_opt2_pid2 && (vvt_opt4_decode == 1)}
        field = "", vvt_cam3tth2,    {(vvt_opt1_on > 2) && vvt_opt2_pid2 && (vvt_opt4_decode == 1)}
        field = "", vvt_out3_dir,    {(vvt_opt1_on > 2) && vvt_opt2_pid2}
        field = "", vvt_softout3,    {(vvt_opt1_on > 2) && (vvt_opt4_decode == 2)}

    dialog = vvtc4, ""
        field = "#CAM4"
        field = "", vvt_opt3_cam4,   {(vvt_opt1_on > 2) && vvt_opt2_pid2}
        field = "", vvt_opt2_cam4pol,{(vvt_opt1_on > 2) && vvt_opt2_pid2}
        field = "", vvt_tth4,        {(vvt_opt1_on > 2) && vvt_opt2_pid2 && (spk_mode0 == 4)}
        field = "", vvt_out4,        {(vvt_opt1_on > 2) && vvt_opt2_pid2}
        field = "", vvt_min_ang4,    {(vvt_opt1_on > 2) && vvt_opt2_pid2}
        field = "", vvt_max_ang4,    {(vvt_opt1_on > 2) && vvt_opt2_pid2}
        field = "", vvt_opt5_vvt4,   {(vvt_opt1_on > 2) && vvt_opt2_pid2}
        field = "", vvt_cam4tth1,    {0}
        field = "", vvt_cam4tth2,    {0}
        field = "", vvt_out4_dir,    {(vvt_opt1_on > 2) && vvt_opt2_pid2}
        field = "", vvt_softout4,    {(vvt_opt1_on > 2) && (vvt_opt4_decode == 2)}

    dialog = vvtcams, "Cam Settings", xAxis
        panel = vvtct
        panel = vvtc1
        panel = vvtc2
        panel = vvtc3
        panel = vvtc4

    dialog = vvtinext, ""
        field = "."
        field = "Use Hold Duty"
        field = "Hold/Neutral Duty"
        field = "Proportional Gain"
        field = "Integral Gain"
        field = "Derivative Gain"
        field = "Table is Advance/Retard"

    dialog = vvtinexi, ""
        field = "#Intake"
        field = "", vvt_opt2_use_hold_intake, {vvt_opt1_on && vvt_opt2_pid2}
        field = "", vvt_hold_duty,  {vvt_opt1_on && vvt_opt2_pid2 && vvt_opt2_use_hold_intake}
        field = "", vvt_ctl_Kp,     {vvt_opt1_on && vvt_opt2_pid2}
        field = "", vvt_ctl_Ki,     {vvt_opt1_on && vvt_opt2_pid2}
        field = "", vvt_ctl_Kd,     {vvt_opt1_on && vvt_opt2_pid2}
        field = "Advance"

    dialog = vvtinexe, ""
        field = "#Exhaust"
        field = "", vvt_opt2_use_hold_exhaust, { vvt_opt2_pid2 && (vvt_opt5_vvt1 || vvt_opt5_vvt2 || vvt_opt1_on > 2) }
        field = "", vvt_hold_duty_exh,      { vvt_opt2_pid2 && (vvt_opt5_vvt1 || vvt_opt5_vvt2 || vvt_opt1_on > 2) && vvt_opt2_use_hold_exhaust }
        field = "", vvt_ctl_Kp_exh,         { vvt_opt2_pid2 && (vvt_opt5_vvt1 || vvt_opt5_vvt2 || vvt_opt1_on > 2) }
        field = "", vvt_ctl_Ki_exh,         { vvt_opt2_pid2 && (vvt_opt5_vvt1 || vvt_opt5_vvt2 || vvt_opt1_on > 2) } 
        field = "", vvt_ctl_Kd_exh,         { vvt_opt2_pid2 && (vvt_opt5_vvt1 || vvt_opt5_vvt2 || vvt_opt1_on > 2) }
        field = "", vvt_opt1_dir_exhaust,   { vvt_opt2_pid2 && (vvt_opt5_vvt1 || vvt_opt5_vvt2 || vvt_opt1_on > 2) }

    dialog = vvtinex, "PID Parameters", xAxis
        panel = vvtinext
        panel = vvtinexi
        panel = vvtinexe

    dialog = vvt_test, "Test", xAxis
        field = "Cam",                  vvt_opt1_tst,   {vvt_opt1_on}
        field = "Duty",                    vvt_test_duty,  {vvt_opt1_on && vvt_opt1_tst}

    dialog = vvtl, ""
        field = "No. VVTs",            vvt_opt1_on
        field = "After-start delay", vvt_startdelay, {vvt_opt1_on}
        field = "Cam Decoder",         vvt_opt4_decode,{vvt_opt1_on && (spk_mode0 == 4)}
        field = "Frequency",           vvt_opt6_freq, {vvt_opt1_on && vvt_out1}
        field = "On/off or Variable (PID)",       vvt_opt2_pid2,   {vvt_opt1_on}
        field = "Adjust Inj. Timing Based On",       vvt_opt5_add1,   {vvt_opt1_on}
        field = "Commanded vs. Actual",       vvt_opt5_add2,   {vvt_opt1_on && vvt_opt5_add1}
        field = "Inj. Timing Adjustment",       vvt_onoff_ang,  {vvt_opt1_on && !vvt_opt2_pid2 && vvt_opt5_add1}
        field = "Load Y Axis In Tables", vvt_opt7_yaxis, {vvt_opt1_on}
        field = "Minimum CLT", vvt_minclt, {vvt_opt1_on}
        field = "VVT Maximum Slew", vvt_slew, {vvt_opt1_on && vvt_opt2_pid2}
        panel = vvt_test

    dialog = vvtr, ""
        field = "Control Interval",             vvt_opt1_int,   {vvt_opt1_on && vvt_opt2_pid2}
        field = "Control Interval Time",        vvt_ctl_ms,     {vvt_opt1_on && vvt_opt2_pid2 && vvt_opt1_int}
        field = "Range Check Measured Angles",  vvt_opt5_err,   {vvt_opt1_on && vvt_opt2_pid2}
        field = "Tooth filter", vvt_opt1_filter, {vvt_opt1_on && vvt_opt2_pid2}
        field = "Minimum VVT Duty", vvt_minduty1, {vvt_opt1_on && vvt_opt2_pid2}
        field = "Maximum VVT Duty", vvt_maxduty1, {vvt_opt1_on && vvt_opt2_pid2}
        panel = vvtinex

    dialog = vvtparams2, "VVT Settings", xAxis
        panel = vvtl
        panel = vvtr

    dialog = vvtparams, "VVT Settings", yAxis
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#vvt"
        panel = vvtparams2
        panel = vvtcams

    dialog = spk_trimaTblTitle, "Cyl #1" 
        panel = spk_trimaTbl
    dialog = spk_trimbTblTitle, "Cyl #2"
        panel = spk_trimbTbl
    dialog = spk_trimcTblTitle, "Cyl #3"
        panel = spk_trimcTbl
    dialog = spk_trimdTblTitle, "Cyl #4"
        panel = spk_trimdTbl

    dialog = spk_trimadt, "", xAxis
        panel = spk_trimaTblTitle
        panel = spk_trimbTblTitle
    dialog = spk_trimadb, "", xAxis
        panel = spk_trimcTblTitle
        panel = spk_trimdTblTitle

    dialog = spk_trimad,"Spark Cyl 1-4 Trims"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#spktrim1-4"
        panel = spk_trimadt
        panel = spk_trimadb

    dialog = spk_trimeTblTitle, "Cyl #5" 
        panel = spk_trimeTbl
    dialog = spk_trimfTblTitle, "Cyl #6"
        panel = spk_trimfTbl
    dialog = spk_trimgTblTitle, "Cyl #7"
        panel = spk_trimgTbl
    dialog = spk_trimhTblTitle, "Cyl #8"
        panel = spk_trimhTbl

    dialog = spk_trimeht, "", xAxis
        panel = spk_trimeTblTitle
        panel = spk_trimfTblTitle
    dialog = spk_trimehb, "", xAxis
        panel = spk_trimgTblTitle
        panel = spk_trimhTblTitle

    dialog = spk_trimeh,"Spark Cyl 5-8 Trims"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#spktrim1-4"
        panel = spk_trimeht
        panel = spk_trimehb

    dialog = spk_trimiTblTitle, "Cyl #9" 
        panel = spk_trimiTbl
    dialog = spk_trimjTblTitle, "Cyl #10"
        panel = spk_trimjTbl
    dialog = spk_trimkTblTitle, "Cyl #11"
        panel = spk_trimkTbl
    dialog = spk_trimlTblTitle, "Cyl #12"
        panel = spk_trimlTbl

    dialog = spk_trimilt, "", xAxis
        panel = spk_trimiTblTitle
        panel = spk_trimjTblTitle

    dialog = spk_trimilb, "", xAxis
        panel = spk_trimkTblTitle
        panel = spk_trimlTblTitle

    dialog = spk_trimil,"Spark Cyl 9-12 Trims"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#spktrim1-4"
        panel = spk_trimilt
        panel = spk_trimilb




    dialog = inj_trimaTblTitle, "Cyl #1" 
        panel = inj_trimaTbl, Center
    dialog = inj_trimbTblTitle, "Cyl #2"
        panel = inj_trimbTbl
    dialog = inj_trimcTblTitle, "Cyl #3"
        panel = inj_trimcTbl
    dialog = inj_trimdTblTitle, "Cyl #4"
        panel = inj_trimdTbl

    dialog = inj_trimadt, "", xAxis
        panel = inj_trimaTblTitle
        panel = inj_trimbTblTitle
    dialog = inj_trimadb, "", xAxis
        panel = inj_trimcTblTitle
        panel = inj_trimdTblTitle

    dialog = inj_trimad,"Injector Cyl 1-4 Trims", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#injtrim1-4"
        panel = inj_trimadt
        panel = inj_trimadb

    dialog = inj_trimeTblTitle, "Cyl #5"
        panel = inj_trimeTbl, Center
    dialog = inj_trimfTblTitle, "Cyl #6"
        panel = inj_trimfTbl
    dialog = inj_trimgTblTitle, "Cyl #7"
        panel = inj_trimgTbl
    dialog = inj_trimhTblTitle, "Cyl #8"
        panel = inj_trimhTbl

    dialog = inj_trimeht, "", xAxis
        panel = inj_trimeTblTitle
        panel = inj_trimfTblTitle
    dialog = inj_trimehb, "", xAxis
        panel = inj_trimgTblTitle
        panel = inj_trimhTblTitle

    dialog = inj_trimeh,"Injector Cyl 5-8 Trims", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#injtrim1-4"
        panel = inj_trimeht
        panel = inj_trimehb

    dialog = inj_trimiTblTitle, "Cyl #9"
        panel = inj_trimiTbl
    dialog = inj_trimjTblTitle, "Cyl #10"
        panel = inj_trimjTbl
    dialog = inj_trimkTblTitle, "Cyl #11"
        panel = inj_trimkTbl
    dialog = inj_trimlTblTitle, "Cyl #12"
        panel = inj_trimlTbl

    dialog = inj_trimilt, "", xAxis
        panel = inj_trimiTblTitle
        panel = inj_trimjTblTitle
    dialog = inj_trimilb, "", xAxis
        panel = inj_trimkTblTitle
        panel = inj_trimlTblTitle

    dialog = inj_trimil,"Injector Cyl 9-12 Trims"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#injtrim1-4"
        panel = inj_trimilt
        panel = inj_trimilb




    dialog = antilag, "Turbo Anti-Lag (ALS)"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#als"
        field = "#Caution! Anti-lag is very hard on your turbo"
        field = "# and engine. Use at your risk."
        field = "Anti-lag Enable Input",        als_in_pin
;        field = "Minimum TPS",                  als_mintps, {als_in_pin}
        field = "Maximum TPS",                  als_maxtps, {als_in_pin}
        field = "Minimum RPM",                  als_minrpm, {als_in_pin}
        field = "Maximum RPM",                  als_maxrpm, {als_in_pin}
        field = "Maximum MAT",                  als_maxmat, {als_in_pin}
        field = "Maximum ALS time",             als_maxtime, {als_in_pin}
        field = "Time Between Activations",     als_pausetime,{als_in_pin}
        field = "Minimum CLT",                  als_minclt, {als_in_pin}
        field = "Maximum CLT",                  als_maxclt, {als_in_pin}
        field = "Enable Cyclic Fuel Cut",       als_opt_fc, {als_in_pin && hardware_fuel && sequential}
        field = "Fuel cut likely unsafe with Staging"
        field = "Enable Cyclic Spark Cut",      als_opt_sc, {als_in_pin}
        field = "-"
        field = "Enable Roving Idle Fuel Cut",  als_opt_ri, {als_in_pin}
        field = "-"
        field = "Use Idle Valve",               als_opt_idle, {als_in_pin}
        field = "Idle Valve Duty",              als_iac_duty,  { als_in_pin && als_opt_idle && ((IdleCtl == 2) || (IdleCtl == 4)) }
        field = "Idle Valve Steps",             als_iac_steps, { als_in_pin && als_opt_idle && (IdleCtl == 3)}
        field = "-"
        field = "On/off Output",                als_out_pin, {als_in_pin}
        field = "-"
        field = "PWM Output",                   als_opt_pwmout, {als_in_pin}
        field = "Output Port/Pin",              als_pwm_opt2, {als_in_pin && als_opt_pwmout}
        field = "Output Duty",                  als_pwm_duty, {als_in_pin && als_opt_pwmout}
        field = "Frequency",                    als_pwm_opt_freq, {als_in_pin && als_opt_pwmout}
        field = ""

    dialog = als_left1, "Added Fuel %age"
        panel = als_addfuel_tbl

    dialog = als_left2, "ALS Timing"
        panel = als_timing_tbl

    dialog = als_right1, "Spark Cut %"
        panel = als_sparkcut_tbl, North, {als_opt_sc}

    dialog = als_right2, "Fuel Cut %"
        panel = als_fuelcut_tbl, South, {als_opt_fc && hardware_fuel && sequential}}

    dialog = antilag_left, "", yAxis
        panel = als_left1
        panel = als_left2

    dialog = antilag_right, "", yAxis
        panel = als_right1
        panel = als_right2

    dialog = antilagtables, "Turbo Anti-lag Tables", xAxis
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#alstables"
        panel = antilag_left
        panel = antilag_right

    dialog = flash_unlock, "Un/Lock Calibrations"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#calunlock"
        field = "Sensor Calibrations", flashlock

        field = "Always re-lock after use"

    dialog = gen_pwm_left_a, ""
        field = "Enable Generic PWM A", pwm_opt_on_a
        field = "Output Port/Pin", pwm_opt2_a, {pwm_opt_on_a}
        field = "Frequency / On-Off", pwm_opt_freq_a, {pwm_opt_on_a}
        field = "On Above Duty", pwm_onabove_a, {pwm_opt_on_a && (pwm_opt_freq_a == 0)}
        field = "Off Below Duty", pwm_offbelow_a, {pwm_opt_on_a && (pwm_opt_freq_a == 0)}
        channelSelector= "Load Axis", pwm_opt_load_a_offset, pwm_opt_load_a_size, {pwm_opt_on_a}
        field = "Load is Y axis on table, X axis on curve"
        field = "Table or Curve", pwm_opt_curve_a, {pwm_opt_on_a}
        field = "CLT/MAT Units", sensor_temp, {0}
        field = ""
        field = ""
        field = ""
        field = ""
        field = ""
        field = ""

    dialog = gen_pwm_curve_grapha, "", card
        panel = pwm_duties_Tbl_a, Center, {pwm_opt_on_a && (pwm_opt_curve_a == 0)}
        panel = pwm_curve_a, Center, {pwm_opt_on_a && pwm_opt_curve_a}

    dialog = gen_pwm_a, "Generic PWM A", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#genpwm"
        panel = gen_pwm_left_a, West
        panel = gen_pwm_curve_grapha, Center

    dialog = gen_pwm_left_b, ""
        field = "Enable Generic PWM B", pwm_opt_on_b
        field = "Output Port/Pin", pwm_opt2_b, {pwm_opt_on_b}
        field = "Frequency / On-Off", pwm_opt_freq_b, {pwm_opt_on_b}
        field = "On Above Duty", pwm_onabove_b, {pwm_opt_on_b && (pwm_opt_freq_b == 0)}
        field = "Off Below Duty", pwm_offbelow_b, {pwm_opt_on_b && (pwm_opt_freq_b == 0)}
        channelSelector= "Load Axis", pwm_opt_load_b_offset, pwm_opt_load_b_size, {pwm_opt_on_b}
        field = "Load is Y axis on table, X axis on curve"
        field = "Table or Curve", pwm_opt_curve_b, {pwm_opt_on_b}
        field = "CLT/MAT Units", sensor_temp, {0}
        field = ""
        field = ""
        field = ""
        field = ""
        field = ""
        field = ""

    dialog = gen_pwm_curve_graphb, "", card
        panel = pwm_duties_Tbl_b, Center, {pwm_opt_on_b && (pwm_opt_curve_b == 0)}
        panel = pwm_curve_b, Center, {pwm_opt_on_b && pwm_opt_curve_b}

    dialog = gen_pwm_b, "Generic PWM B", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#genpwm"
        panel = gen_pwm_left_b, West
        panel = gen_pwm_curve_graphb, Center

    dialog = gen_pwm_left_c, ""
        field = "Enable Generic PWM C", pwm_opt_on_c
        field = "Output Port/Pin", pwm_opt2_c, {pwm_opt_on_c}
        field = "Frequency / On-Off", pwm_opt_freq_c, {pwm_opt_on_c}
        field = "On Above Duty", pwm_onabove_c, {pwm_opt_on_c && (pwm_opt_freq_c == 0)}
        field = "Off Below Duty", pwm_offbelow_c, {pwm_opt_on_c && (pwm_opt_freq_c == 0)}
        channelSelector= "Load Axis", pwm_opt_load_c_offset, pwm_opt_load_c_size, {pwm_opt_on_c}
        field = "Load is Y axis on table, X axis on curve"
        field = "Table or Curve", pwm_opt_curve_c, {pwm_opt_on_c}
        field = "CLT/MAT Units", sensor_temp, {0}
        field = ""
        field = ""
        field = ""
        field = ""
        field = ""
        field = ""

    dialog = gen_pwm_curve_graphc, "", card
        panel = pwm_duties_Tbl_c, Center, {pwm_opt_on_c && (pwm_opt_curve_c == 0)}
        panel = pwm_curve_c, Center, {pwm_opt_on_c && pwm_opt_curve_c}

    dialog = gen_pwm_c, "Generic PWM C", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#genpwm"
        panel = gen_pwm_left_c, West
        panel = gen_pwm_curve_graphc, Center

    dialog = gen_pwm_left_d, ""
        field = "Enable Generic PWM D", pwm_opt_on_d
        field = "Output Port/Pin", pwm_opt2_d, {pwm_opt_on_d}
        field = "Frequency / On-Off", pwm_opt_freq_d, {pwm_opt_on_d}
        field = "On Above Duty", pwm_onabove_d, {pwm_opt_on_d && (pwm_opt_freq_d == 0)}
        field = "Off Below Duty", pwm_offbelow_d, {pwm_opt_on_d && (pwm_opt_freq_d == 0)}
        channelSelector= "Load Axis", pwm_opt_load_d_offset, pwm_opt_load_d_size, {pwm_opt_on_d}
        field = "Load is Y axis on table, X axis on curve"
        field = "Table or Curve", pwm_opt_curve_d, {pwm_opt_on_d}
        field = "CLT/MAT Units", sensor_temp, {0}
        field = ""
        field = ""
        field = ""
        field = ""
        field = ""
        field = ""

    dialog = gen_pwm_curve_graphd, "", card
        panel = pwm_duties_Tbl_d, Center, {pwm_opt_on_d && (pwm_opt_curve_d == 0)}
        panel = pwm_curve_d, Center, {pwm_opt_on_d && pwm_opt_curve_d}

    dialog = gen_pwm_d, "Generic PWM D", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#genpwm"
        panel = gen_pwm_left_d, West
        panel = gen_pwm_curve_graphd, Center

    dialog = gen_pwm_left_e, ""
        field = "Enable Generic PWM E", pwm_opt_on_e
        field = "Output Port/Pin", pwm_opt2_e, {pwm_opt_on_e}
        field = "Frequency / On-Off", pwm_opt_freq_e, {pwm_opt_on_e}
        field = "On Above Duty", pwm_onabove_e, {pwm_opt_on_e && (pwm_opt_freq_e == 0)}
        field = "Off Below Duty", pwm_offbelow_e, {pwm_opt_on_e && (pwm_opt_freq_e == 0)}
        channelSelector= "Load Axis", pwm_opt_load_e_offset, pwm_opt_load_e_size, {pwm_opt_on_e}
        field = "Load is Y axis on table, X axis on curve"
        field = "Table or Curve", pwm_opt_curve_e, {pwm_opt_on_e}
        field = "CLT/MAT Units", sensor_temp, {0}
        field = ""
        field = ""
        field = ""
        field = ""
        field = ""
        field = ""

    dialog = gen_pwm_curve_graphe, "", card
        panel = pwm_duties_Tbl_e, Center, {pwm_opt_on_e && (pwm_opt_curve_e == 0)}
        panel = pwm_curve_e, Center, {pwm_opt_on_e && pwm_opt_curve_e}

    dialog = gen_pwm_e, "Generic PWM E", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#genpwm"
        panel = gen_pwm_left_e, West
        panel = gen_pwm_curve_graphe, Center

    dialog = gen_pwm_left_f, ""
        field = "Enable Generic PWM F", pwm_opt_on_f
        field = "Output Port/Pin", pwm_opt2_f, {pwm_opt_on_f}
        field = "Frequency / On-Off", pwm_opt_freq_f, {pwm_opt_on_f}
        field = "On Above Duty", pwm_onabove_f, {pwm_opt_on_f && (pwm_opt_freq_f == 0)}
        field = "Off Below Duty", pwm_offbelow_f, {pwm_opt_on_f && (pwm_opt_freq_f == 0)}
        channelSelector= "Load Axis", pwm_opt_load_f_offset, pwm_opt_load_f_size, {pwm_opt_on_f}
        field = "Load is Y axis on table, X axis on curve"
        field = "Table or Curve", pwm_opt_curve_f, {pwm_opt_on_f}
        field = "CLT/MAT Units", sensor_temp, {0}
        field = ""
        field = ""
        field = ""
        field = ""
        field = ""
        field = ""

    dialog = gen_pwm_curve_graphf, "", card
        panel = pwm_duties_Tbl_f, Center, {pwm_opt_on_f && (pwm_opt_curve_f == 0)}
        panel = pwm_curve_f, Center, {pwm_opt_on_f && pwm_opt_curve_f}

    dialog = gen_pwm_f, "Generic PWM F", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#genpwm"
        panel = gen_pwm_left_f, West
        panel = gen_pwm_curve_graphf, Center

    dialog = map_sample_dialog_south, "MAP Sample General Settings"
       field = "Use fast MAP/TPS sampling", MAP_fastsample
       field = "MAP Sample Method", mapsample_opt2, { !MAP_fastsample }
       field = "Map Sample Window",     map_sample_duration, { !mapsample_opt2 }
       field = "No. Sample Events", mapsample_opt1, { !mapsample_opt2 }
       field = ""
       field = "Phase Detect Threshold", map_phase_thresh, { (nCylinders < 3) && (hardware_cam == 2) && (spk_mode0 == 4) && (spk_config_trig2 == 3) }

    dialog = map_sample_dialog, "MAP Sample Settings", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#mapsamp"
        panel = mapsample_curve, Center, { !mapsample_opt2 }
        panel = map_sample_dialog_south, South

   dialog = ShiftSettings, "Sequential Shift Cut"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#seqshift"
    field = "Shifter Spark Cut System", shift_cut_on
    field = "Mode", shift_cut_auto, { shift_cut_on }
    field = "Cut fuel", shift_cut_fuel, { shift_cut_on }
    field = "Button Input", shift_cut_in, { shift_cut_on }
    field = "Solenoid Output", shift_cut_out, { shift_cut_on }
    field = "RPM >", shift_cut_rpm, { shift_cut_on }     
    field = "And TPS >", shift_cut_tps, { shift_cut_on }
    field = "Delay Before Spark Cut", shift_cut_delay, { shift_cut_on }
    field = "Spark Cut Time (Base)", shift_cut_time, { shift_cut_on }
    field = "Gear Based Delay", shift_cut_gear, { shift_cut_on }
    field = "Additional Delay 1-2", shift_cut_add12, { shift_cut_on && shift_cut_gear }
    field = "Additional Delay 2-3", shift_cut_add23, { shift_cut_on && shift_cut_gear }
    field = "Additional Delay 3-4", shift_cut_add34, { shift_cut_on && shift_cut_gear }
    field = "Additional Delay 4-5", shift_cut_add45, { shift_cut_on && shift_cut_gear }
    field = "Additional Delay 5-6", shift_cut_add56, { shift_cut_on && shift_cut_gear }
    field = "Solenoid Delay", shift_cut_soldelay,  { shift_cut_on && shift_cut_on}
    field = "Re-Shift Hold-Off Time", shift_cut_reshift
    field = "Automatic mode shift points"
    field = "Shift RPM 1-2", shift_cut_rpm12, { shift_cut_on && shift_cut_auto }
    field = "Shift RPM 2-3", shift_cut_rpm23, { shift_cut_on && shift_cut_auto }
    field = "Shift RPM 3-4", shift_cut_rpm34, { shift_cut_on && shift_cut_auto }
    field = "Shift RPM 4-5", shift_cut_rpm45, { shift_cut_on && shift_cut_auto }
    field = "Shift RPM 5-6", shift_cut_rpm56, { shift_cut_on && shift_cut_auto }

   dialog = fan_control, "Fan Control"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#fanctl"
        field = "Fan Control On", fanctl_settings_on
        field = "Mode", fanctl1_mode, { fanctl_settings_on }
        field = "Frequency", fanctl1_freq, { fanctl_settings_on && fanctl1_mode }
        field = "Invert output", fanctl1_inv, { fanctl_settings_on && fanctl1_mode }
        field = "Duty for off", fanctl1_duty_off, { fanctl_settings_on && fanctl1_mode }
        field = "Duty min speed", fanctl1_duty_min, { fanctl_settings_on && fanctl1_mode }
        field = "Duty full speed", fanctl1_duty_full, { fanctl_settings_on && fanctl1_mode }

        field = "Fan Control Idles up?", fanctl_settings_idleup, { fanctl_settings_on }
        field = "Output Pin", fanctl_settings_pin, { fanctl_settings_on }
        field = "Idle-up Delay", fanctl_idleup_delay, { fanctl_settings_on && fanctl_settings_idleup }
        field = "Idle-up Duty", fanctl_idleup_adder_duty, { fanctl_settings_on && fanctl_settings_idleup && ((IdleCtl == 2) || (IdleCtl == 4)) }
        field = "Idle-up Steps", fanctl_idleup_adder_steps, { fanctl_settings_on && fanctl_settings_idleup && (IdleCtl == 3) }
        field = "Idle-up Target Increase", fan_idleup_cl_targetadder, { fanctl_settings_on && (IdleCtl > 1) && (IdleCtl_alg == 1) }
        field = "Fan On Temperature", fanctl_ontemp, { fanctl_settings_on }
        field = "Fan Off Temperature", fanctl_offtemp, { fanctl_settings_on }
        field = "Full speed Temperature", fanctl1_temp_full, { fanctl_settings_on && fanctl1_mode }
        field = "Allow fan When Engine Off", fanctl_opt2_engineoff, { fanctl_settings_on }
        field = "Fan On With AC On?", fan_ctl_settings_acfan, { fanctl_settings_on && ac_idleup_settings }
        field = "Fan Shutoff"
        field = "TPS Shutoff Enable", fanctl_opt2_tps, { fanctl_settings_on }
        field = "TPS Shutoff", fan_idleup_tps_offpoint, { fanctl_settings_on && fanctl_opt2_tps }
        field = "TPS Hysteresis", fan_idleup_tps_hyst, { fanctl_settings_on && fanctl_opt2_tps }
        field = "VSS Shutoff Enable", fanctl_opt2_vss, { fanctl_settings_on }
        field = "VSS Shutoff", fan_idleup_vss_offpoint, { fanctl_settings_on && (vss_opt0_1) && fanctl_opt2_vss }
        field = "VSS Hyst", fan_idleup_vss_hyst, { fanctl_settings_on && (vss_opt0_1) && fanctl_opt2_vss }

    dialog = ac_idleup, "Air Conditioning Idle-Up"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#acidle"
        field = "A/C Idle-Up", ac_idleup_settings
        field = "Output", ac_idleup_io_out, { ac_idleup_settings }
        field = "Invert?", ac_idleup_set2_outinv, { ac_idleup_settings && ac_idleup_io_out }
        field = "Idle-Up Input", ac_idleup_io_in, { ac_idleup_settings }
        field = "Input Polarity", ac_idleup_settings_inv, { ac_idleup_settings }
        field = "Idle-Up Delay", ac_idleup_delay, { ac_idleup_settings }
        field = "Idle-Up Min RPM", ac_idleup_min_rpm, { ac_idleup_settings }
        field = "Compressor delay since last on", ac_delay_since_last_on, { ac_idleup_settings }
        field = "Idle-up Duty", ac_idleup_adder_duty, { ((IdleCtl == 2) || (IdleCtl == 4)) && ac_idleup_settings }
        field = "Idle-up Steps", ac_idleup_adder_steps, { (IdleCtl == 3) && ac_idleup_settings }
        field = "Idle-up Target RPM Adder", ac_idleup_cl_targetadder, { ac_idleup_settings && (IdleCtl > 1) && (IdleCtl_alg == 1) }
        field = "A/C compressor Shutoff"
        field = "TPS Shutoff Enable", ac_idleup_set2_tps, { ac_idleup_settings }
        field = "TPS Shutoff", ac_idleup_tps_offpoint, { ac_idleup_settings && ac_idleup_set2_tps}
        field = "TPS Hysteresis", ac_idleup_tps_hyst, { ac_idleup_settings && ac_idleup_set2_tps}
        field = "VSS Shutoff Enable", ac_idleup_set2_vss, { ac_idleup_settings }
        field = "VSS Shutoff", ac_idleup_vss_offpoint, { ac_idleup_settings && (vss_opt0_1) && ac_idleup_set2_vss }
        field = "VSS Hysteresis", ac_idleup_vss_hyst, { ac_idleup_settings && (vss_opt0_1) && ac_idleup_set2_vss }
        field = "RPM Shutoff Enable", ac_idleup_set2_rpm, { ac_idleup_settings }
        field = "Maximum RPM", ac_idleup_max_rpm, { ac_idleup_settings && ac_idleup_set2_rpm }

        dialog = sensor_source, "", yAxis
            field = "Sensor - Source"
            field = "01", sensor01_source
            field = "02", sensor02_source
            field = "03", sensor03_source
            field = "04", sensor04_source
            field = "05", sensor05_source
            field = "06", sensor06_source
            field = "07", sensor07_source
            field = "08", sensor08_source

        dialog = sensor_sourceb, "", yAxis
            field = "Sensor - Source"
            field = "09", sensor09_source
            field = "10", sensor10_source
            field = "11", sensor11_source
            field = "12", sensor12_source
            field = "13", sensor13_source
            field = "14", sensor14_source
            field = "15", sensor15_source
            field = "16", sensor16_source

        dialog = sensor_alias, "", yAxis
            field = "Field Name"
            field = "", sensor01Alias
            field = "", sensor02Alias
            field = "", sensor03Alias
            field = "", sensor04Alias
            field = "", sensor05Alias
            field = "", sensor06Alias
            field = "", sensor07Alias
            field = "", sensor08Alias

        dialog = sensor_aliasb, "", yAxis
            field = "Field Name"
            field = "", sensor09Alias
            field = "", sensor10Alias
            field = "", sensor11Alias
            field = "", sensor12Alias
            field = "", sensor13Alias
            field = "", sensor14Alias
            field = "", sensor15Alias
            field = "", sensor16Alias

        dialog = sensor_trans, "", yAxis
            field = "Transformation"
            field = "", sensor01_trans, {sensor01_source}
            field = "", sensor02_trans, {sensor02_source}
            field = "", sensor03_trans, {sensor03_source}
            field = "", sensor04_trans, {sensor04_source}

            field = "", sensor05_trans, {sensor05_source}
            field = "", sensor06_trans, {sensor06_source}
            field = "", sensor07_trans, {sensor07_source}
            field = "", sensor08_trans, {sensor08_source}

        dialog = sensor_transb, "", yAxis
            field = "Transformation"
            field = "", sensor09_trans, {sensor09_source}
            field = "", sensor10_trans, {sensor10_source}
            field = "", sensor11_trans, {sensor11_source}
            field = "", sensor12_trans, {sensor12_source}
            field = "", sensor13_trans, {sensor13_source}
            field = "", sensor14_trans, {sensor14_source}
            field = "", sensor15_trans, {sensor15_source}
            field = "", sensor16_trans, {sensor16_source}

        dialog = sensor_val0, "", yAxis
            field = "min value"
            field = "", sensor01_val0, {sensor01_source && ( (sensor01_trans == 1) || (sensor01_trans == 9) )}
            field = "", sensor02_val0, {sensor02_source && ( (sensor02_trans == 1) || (sensor02_trans == 9) )}
            field = "", sensor03_val0, {sensor03_source && ( (sensor03_trans == 1) || (sensor03_trans == 9) )}
            field = "", sensor04_val0, {sensor04_source && ( (sensor04_trans == 1) || (sensor04_trans == 9) )}
            field = "", sensor05_val0, {sensor05_source && ( (sensor05_trans == 1) || (sensor05_trans == 9) )}
            field = "", sensor06_val0, {sensor06_source && ( (sensor06_trans == 1) || (sensor06_trans == 9) )}
            field = "", sensor07_val0, {sensor07_source && ( (sensor07_trans == 1) || (sensor07_trans == 9) )}
            field = "", sensor08_val0, {sensor08_source && ( (sensor08_trans == 1) || (sensor08_trans == 9) )}

        dialog = sensor_val0b, "", yAxis
            field = "min value"
            field = "", sensor09_val0, {sensor09_source && ( (sensor09_trans == 1) || (sensor09_trans == 9) )}
            field = "", sensor10_val0, {sensor10_source && ( (sensor10_trans == 1) || (sensor10_trans == 9) )}
            field = "", sensor11_val0, {sensor11_source && ( (sensor11_trans == 1) || (sensor11_trans == 9) )}
            field = "", sensor12_val0, {sensor12_source && ( (sensor12_trans == 1) || (sensor12_trans == 9) )}
            field = "", sensor13_val0, {sensor13_source && ( (sensor13_trans == 1) || (sensor13_trans == 9) )}
            field = "", sensor14_val0, {sensor14_source && ( (sensor14_trans == 1) || (sensor14_trans == 9) )}
            field = "", sensor15_val0, {sensor15_source && ( (sensor15_trans == 1) || (sensor15_trans == 9) )}
            field = "", sensor16_val0, {sensor16_source && ( (sensor16_trans == 1) || (sensor16_trans == 9) )}

        dialog = sensor_max, "", yAxis
            field = "max value"
            field = "", sensor01_max, {sensor01_source && ( (sensor01_trans == 1) || (sensor01_trans == 9) )}
            field = "", sensor02_max, {sensor02_source && ( (sensor02_trans == 1) || (sensor02_trans == 9) )}
            field = "", sensor03_max, {sensor03_source && ( (sensor03_trans == 1) || (sensor03_trans == 9) )}
            field = "", sensor04_max, {sensor04_source && ( (sensor04_trans == 1) || (sensor04_trans == 9) )}
            field = "", sensor05_max, {sensor05_source && ( (sensor05_trans == 1) || (sensor05_trans == 9) )}
            field = "", sensor06_max, {sensor06_source && ( (sensor06_trans == 1) || (sensor06_trans == 9) )}
            field = "", sensor07_max, {sensor07_source && ( (sensor07_trans == 1) || (sensor07_trans == 9) )}
            field = "", sensor08_max, {sensor08_source && ( (sensor08_trans == 1) || (sensor08_trans == 9) )}

        dialog = sensor_maxb, "", yAxis
            field = "max value"
            field = "", sensor09_max, {sensor09_source && ( (sensor09_trans == 1) || (sensor09_trans == 9) )}
            field = "", sensor10_max, {sensor10_source && ( (sensor10_trans == 1) || (sensor10_trans == 9) )}
            field = "", sensor11_max, {sensor11_source && ( (sensor11_trans == 1) || (sensor11_trans == 9) )}
            field = "", sensor12_max, {sensor12_source && ( (sensor12_trans == 1) || (sensor12_trans == 9) )}
            field = "", sensor13_max, {sensor13_source && ( (sensor13_trans == 1) || (sensor13_trans == 9) )}
            field = "", sensor14_max, {sensor14_source && ( (sensor14_trans == 1) || (sensor14_trans == 9) )}
            field = "", sensor15_max, {sensor15_source && ( (sensor15_trans == 1) || (sensor15_trans == 9) )}
            field = "", sensor16_max, {sensor16_source && ( (sensor16_trans == 1) || (sensor16_trans == 9) )}

        dialog = sensor_lag, "", yAxis
            field = "Lag Factor"
            field = "", sensor01LF, {sensor01_source}
            field = "", sensor02LF, {sensor02_source}

            field = "", sensor03LF, {sensor03_source}
            field = "", sensor04LF, {sensor04_source}
            field = "", sensor05LF, {sensor05_source}
            field = "", sensor06LF, {sensor06_source}
            field = "", sensor07LF, {sensor07_source}
            field = "", sensor08LF, {sensor08_source}

        dialog = sensor_lagb, "", yAxis
            field = "Lag Factor"
            field = "", sensor09LF, {sensor09_source}
            field = "", sensor10LF, {sensor10_source}
            field = "", sensor11LF, {sensor11_source}
            field = "", sensor12LF, {sensor12_source}
            field = "", sensor13LF, {sensor13_source}
            field = "", sensor14LF, {sensor14_source}
            field = "", sensor15LF, {sensor15_source}
            field = "", sensor16LF, {sensor16_source}

        dialog = sensors_top, "Sensors 1-8", xAxis
           panel = sensor_source
           panel = sensor_alias
           panel = sensor_trans
           panel = sensor_val0
           panel = sensor_max
           panel = sensor_lag

        dialog = sensors_btm, "Sensors 9-16", xAxis
           panel = sensor_sourceb
           panel = sensor_aliasb
           panel = sensor_transb
           panel = sensor_val0b
           panel = sensor_maxb
           panel = sensor_lagb

        dialog = sensors_data, "", yAxis
           panel = sensors_top
           panel = sensors_btm

        dialog = sensors_temp, "", xAxis
           field = "Allow Input Sharing", opt142_gs_share
           field = "CLT/MAT Units", sensor_temp

        dialog = sensors, "Generic Sensor Inputs", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#gensens"
           panel = sensors_data, North
           panel = sensors_temp, South

        dialog = ITB_settingsw, "ITB settings"
           field = "Percent Baro Switchpoint", ITB_load_mappoint
           field = "Idle TPS Threshold", ITB_load_idletpsthresh

        dialog = ITB_settingsc, "Notes"
            field = "1. Validate that TPS, MAP and Baro read correctly. 2. Set the %baro switchpoint."
            field = "3. Configure the left curve from datalogs. 4. Set the right curve according to preference."

        dialog = ITB_settings, "", xAxis
           panel = ITB_settingsw, West
           panel = ITB_settingsc, Center

        dialog = ITBcombined, "ITB Load Settings", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#itbload"
           panel = ITB_settings, South 
           panel = ITB_load_switchpoint_curve, West 
           panel = ITB_load_loadvals_curve, East

        dialog = mafdialog, "MAF Settings", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#mafset"
            field = "Sensor Type", MAFOption_t
            field = "Voltage Input Port", MAFOption, {MAFOption_t == 0}
            field = "Frequency Input Port", MAFOption_f, {MAFOption_t == 1}
            field = "Low Frequency", maf_freq0, {MAFOption_t == 1}
            field = "High Frequency", maf_freq1, {MAFOption_t == 1}
            field = "MAT Correction Curve", feature7_mafmat, {MAFOption_t < 2}
            field = "Use VE1 As Trim Table", feature7_maftrim, {(algorithm == 5) && (MAFOption_t < 2) }
            field = "MAF Sensor Range", maf_range, {MAFOption_t < 2}
            field = "Set the range before loading a flow curve."

        dialog = battcalib, "Calibrate Battery Voltage"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#calbatt"
            field = "Supply Voltage At Zero ADC Count", batt0
            field = "Supply voltage At Max ADC Count", battmax
            field = ""
            field = "Typical values are 0.0V and 29.7V"

        dialog = waterinj_topl, ""
            field = "Enable Water/Meth Injection", water_freq_on
            field = "Pump Output", water_pins_pump, {water_freq_on}
            field = "Valve Style", water_freq_type, {water_freq_on}
            field = "Frequency", water_freq, {water_freq_on && (water_freq_type ==2)}
            field = "Valve Output", water_pins_valve, {water_freq_on && water_freq_type}
        dialog = waterinj_topr, ""
            field = "Enable When.."
            field = "TPS >", water_tps, {water_freq_on}
            field = "RPM >", water_rpm, {water_freq_on}
            field = "MAP >", water_map, {water_freq_on}
            field = "MAT >", water_mat, {water_freq_on}
            field = ""
            field = "Low Fluid Level Input", water_pins_in_shut, {water_freq_on}

        dialog = waterinj_top, "", border
            panel = waterinj_topl, West
            panel = waterinj_topr, East

        dialog = waterinj, "Water Injection", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#water"
            panel = waterinj_top, North
            panel = waterinjTbl, Center

       dialog = vss1, "Vehicle Speed Sensor 1"
          field = "VSS1 Input Type", vss_opt0_1
          field = "Analogue Input", vss1_an, {vss_opt0_1 == 2}
          field = "Full Scale Speed", vss1_an_max, {vss_opt0_1 == 2}
          field = "Digital Input", vss_opt1, {vss_opt0_1 == 1}
          field = "Wheel Diameter", wheeldia1, {vss_opt1 && (((vss_opt0_1 == 1) && (vss_opt1 != 14) && (vss1_pos < 2)) || (gear_method == 1) || (ss_opt1 == 14))}
          field = "VSS Position/Type", vss1_pos, {vss_opt0_1 == 1}
          field = "Pulses", vss1_can_scale_pulse, {vss_opt1 && (vss_opt0_1 == 1) && (vss_opt1 != 14) && (vss1_pos > 1)}
          field = "Speed Sensor #Teeth", reluctorteeth1, {vss_opt1 && (vss_opt0_1 == 1) && (vss_opt1 != 14) && (vss1_pos < 2)}
          field = "PWM Port", vss1_pwmseq, {(vss_opt1 ==15) && (vss_opt0_1 == 1)}
          field = "Scaler", vss1_can_scale, {(vss_opt1 ==14) && (vss_opt0_1 == 1)}
          field = "Smoothing lag factor", vss1LF, {vss_opt0_1}

       dialog = vss2, "Vehicle speed sensor 2"
          field = "VSS2 Input Type", vss_opt0_2
          field = "Analogue Input", vss2_an, {vss_opt0_2 == 2}
          field = "Full Scale Speed", vss2_an_max, {vss_opt0_2 == 2}
          field = "Digital Input", vss_opt2, {vss_opt0_2 == 1}
          field = "Wheel Diameter", wheeldia2, {vss_opt2 && (((vss_opt0_2 == 1) && (vss_opt2 != 14) && (vss2_pos < 2)) || (gear_method == 1))}
          field = "VSS Position/Type", vss2_pos, {vss_opt0_2 == 1}
          field = "Pulses", vss2_can_scale_pulse, {vss_opt2 && (vss_opt0_2 == 1) && (vss_opt2 != 14) && (vss2_pos > 1)}
          field = "Speed Sensor #Teeth", reluctorteeth2, {vss_opt2 && (vss_opt0_2 == 1) && (vss_opt2 != 14) && (vss2_pos < 2)}
          field = "PWM Port", vss2_pwmseq, {(vss_opt2 ==15) && (vss_opt0_2 == 1)}
          field = "Scaler", vss2_can_scale, {(vss_opt2 ==14) && (vss_opt0_2 == 1)}
          field = "Smoothing Lag Factor", vss2LF, {vss_opt0_2}

       dialog = vss3, "Vehicle Speed Sensor 3 (Matches VSS1)"
          field = "VSS3 Input Type", vss_opt0_3, {vss_opt0_1}
          field = "Analogue Input", vss3_an, {vss_opt0_3 && (vss_opt0_1 == 2)}
          field = "Digital Input", vss_opt3, {vss_opt0_3 && (vss_opt0_1 == 1)}
          field = "PWM Port", vss3_pwmseq, {(vss_opt3 ==15) && vss_opt0_3 && (vss_opt0_1 == 1)}

       dialog = vss4, "Vehicle speed sensor 4 (matches VSS2)"
          field = "VSS4 input type", vss_opt0_4, {vss_opt0_2}
          field = "Analogue Input", vss4_an, {vss_opt0_4 && (vss_opt0_2 == 2)}
          field = "Digital Input", vss_opt4, {vss_opt0_4 && (vss_opt0_2 == 1)}
          field = "PWM Port", vss4_pwmseq, {(vss_opt4 ==15) && vss_opt0_4 && (vss_opt0_4 == 1)}

       dialog = vssout, "VSS Output"
        field = "VSS Output", vssout_opt
        field = "VSSout Units", vssout_optunits, { vssout_opt }
        field = "Scale", vssout_scale, { vssout_opt }

       dialog = vssdotlag, "VSSdot Smoothing"
        field = "Sample Interval", vssdot_int
        field = "Lag factor", vssdotLF

       dialog = vsssamp, "VSS Sampling"
        field = "VSS Sample Interval", vss_samp_int

       dialog = gears, "Gear detection"
        field = "Final Drive Ratio", fdratio1

        field = "Method", gear_method
        field = "Number Of Gears", gear_no, {gear_method}
        field = "1st Ratio", gear1ratio, { (gear_method == 1) }
        field = "2nd Ratio", gear2ratio, { (gear_method == 1) && (gear_no > 1) } ; would be pretty pointless otherwise!
        field = "3rd Ratio", gear3ratio, { (gear_method == 1) && (gear_no > 2) }
        field = "4th Ratio", gear4ratio, { (gear_method == 1) && (gear_no > 3) }
        field = "5th Ratio", gear5ratio, { (gear_method == 1) && (gear_no > 4) }
        field = "6th Ratio", gear6ratio, { (gear_method == 1) && (gear_no > 5) }
        field = ""
        field = "Input Port", gear_port_an, { (gear_method == 2) }
        field = "Neutral Voltage",  gear0v, { (gear_method == 2) }
        field = "1st Gear Voltage", gear1v, { (gear_method == 2) }
        field = "2nd Gear Voltage", gear2v, { (gear_method == 2) && (gear_no > 1) }
        field = "3rd Gear Voltage", gear3v, { (gear_method == 2) && (gear_no > 2) }
        field = "4th Gear Voltage", gear4v, { (gear_method == 2) && (gear_no > 3) }
        field = "5th Gear Voltage", gear5v, { (gear_method == 2) && (gear_no > 4) }
        field = "6th Gear Voltage", gear6v, { (gear_method == 2) && (gear_no > 5) }

       dialog = vssunits, "Units"
        field = "Preferred Speed Units", prefSpeedUnits
        field = "Preferred Length Units", prefLengthUnits

       dialog = ssnorth, "", xAxis
            panel = vss1
            panel = vss2

       dialog = vss34, "", xAxis
            panel = vss3
            panel = vss4

       dialog = gearsunits, "", yAxis
            panel = gears
            panel = vssunits

       dialog = vssoutdotr, "", yAxis
            panel = vssdotlag
            panel = vsssamp

       dialog = vssoutdot, "", xAxis
            panel = vssout
            panel = vssoutdotr

       dialog = sssouth, "", yAxis
            panel = vss34
            panel = vssoutdot

       dialog = speedsensorsmain, "", yAxis
            panel = ssnorth
            panel = sssouth

       dialog = speedsensors, "Speed and Gear Sensors", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#speedgear"
            panel = speedsensorsmain
            panel = gearsunits

       dialog = ss, "Shaft Speed Sensors"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#shaftspeed"
          field = "Sensor 1", ss_opt1
          field = "Speed sensor #teeth", reluctorteeth3, {ss_opt1 && ss_opt1<14}
          field = "High Speed Input", ss_opt1_spd, {(ss_opt1 == 4) || (ss_opt1 == 10) || (ss_opt1 == 11) || (ss_opt1 == 12)}
          field = "Smoothing Lag Factor", ss1LF ;, {ss_opt2 && ss_opt2<15}
          field = ""
          field = "Sensor 2", ss_opt2
          field = "Speed Sensor #Teeth", reluctorteeth4, {ss_opt2 && ss_opt2<15}
          field = "High Speed Input", ss_opt2_spd, {(ss_opt2 == 4) || (ss_opt2 == 10) || (ss_opt2 == 11) || (ss_opt2 == 12)}
          field = "Smoothing Lag Factor", ss2LF ;, {ss_opt2 && ss_opt2<15}

       dialog = accelerometer, "Accelerometer Parameters"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#accelerometer"
		  field = "CANbus Accelerometer", canrx1_opt_accel
		  field = "CAN base address", canrx1_rt_accel_base, {canrx1_opt_accel == 1}
        field = "X zero offset", can_accelx_offset, {canrx1_opt_accel == 2}
        field = "Y zero offset", can_accely_offset, {canrx1_opt_accel == 2}
        field = "Z zero offset", can_accelz_offset, {canrx1_opt_accel == 2}

        field = "Analog X Input", accXport, {canrx1_opt_accel == 0}
        field = "Analog Y Input", accYport, {canrx1_opt_accel == 0}
        field = "Analog Z Input", accZport, {canrx1_opt_accel == 0}
        field = "X -1g Calib.", accXcal1, { accXport && (canrx1_opt_accel == 0) }
        field = "X +1g Calib.", accXcal2, { accXport && (canrx1_opt_accel == 0) }
        field = "Y -1g Calib.", accYcal1, { accYport && (canrx1_opt_accel == 0) }
        field = "Y +1g Calib.", accYcal2, { accYport && (canrx1_opt_accel == 0) }
        field = "Z -1g Calib.", accZcal1, { accZport && (canrx1_opt_accel == 0) }
        field = "Z +1g Calib.", accZcal2, { accZport && (canrx1_opt_accel == 0) }
        field = "Lag factor", accxyzLF

       dialog = sdcard_top, ""
          field = "SD Card Logging:", log_style_on2
          field = "Datalog Button", log_style2_but, {log_style_on2 == 2}
          field = "Trigger", log_style4_opt, {log_style_on2 == 3}
          field = "RPM >", log_trig_rpm, {(log_style_on2 == 3) && (log_style4_opt == 0)}
          field = "TPS >", log_trig_tps, {(log_style_on2 == 3) && (log_style4_opt == 1)}
          field = "MAP >", log_trig_map, {(log_style_on2 == 3) && (log_style4_opt == 2)}
          field = "LED Indicator", log_style_led, {log_style_on2}
          field = "Log Data Block Size", log_style_block, {log_style_on2}
          field = "Interleave GPS Data", log_style_gps, {log_style_on2}
          field = "Sampling", log_style2_samp, {(log_style_block != 1) && log_style_on2 }
          field = "Sample Interval", log_int, {(log_style_block != 1) && log_style_on2 }
          displayOnlyField = "Frames/Second", log_rate, {(log_style_block != 1) && log_style_on2 }
          field = "Log File Max Duration", log_length, {log_style_on2}
          field = "Action after log completed", log_style2_cont, {log_style_on2}
          field = "Stream Input", log_style3_adc, {log_style_block == 1}
          field = "SPI Comms Speed", log_style2_ledspd, {log_style_on2}
          field = "Trigger pulse output", sdpulse_out, {log_style_on2 >= 2}

       dialog = sdcard_btm, ""
; Needs to be 119 for 128 byte SD logs or 55 for 64 byte
          logFieldSelector = dataLogFieldSelector, "Log Field Selection", logFieldOffset, logFieldLength, { sdlog_maxnumbytes }

       dialog = sdcard_datalog, "SD Card Datalogging", xAxis
          panel = sdcard_top
          panel = dataLogFieldSelector

       dialog = N2OSystem_topl, ""
          field = "Nitrous Control",                    N2Oopt_2
          field = "Enable N2O When Above",              N2ORpm,         { N2Oopt_2 }
          field = "And Coolant Temp Above",             N2OClt,         { N2Oopt_2 }
          field = "And TPS >",                          N2OTps,         { N2Oopt_2 }
          field = "Max RPM",                            N2ORpmMax,      { N2Oopt_2 }
          field = "Enrich Which Bank",     N2Oopt_01,      { N2Oopt_2 }

       dialog = N2OSystem_topr, ""
          field = "On/Off vs Progressive Mode",         N2Oopt2_prog,   { N2Oopt_2 }
          field = "Time, RPM, VSS-Based", N2Oopt2_prog_time, { N2Oopt_2 && N2Oopt2_prog }
          field = "Action after a pedal", n2o_opt3_pedal, { N2Oopt_2 && N2Oopt2_prog && (N2Oopt2_prog_time == 1) }
          field = "Timeout for pedal", n2o_pedal_time, { N2Oopt_2 && N2Oopt2_prog && (N2Oopt2_prog_time == 1) && (n2o_opt3_pedal == 1) }
          field = "Solenoid Frequency", N2Oopt2_prog_freq, { N2Oopt_2 && N2Oopt2_prog }
          field = "Fuel Solenoid Frequency", N2Oopt2_prog_freqf, { N2Oopt_2 && N2Oopt2_prog && (n2o1f_pins > 0) }
          field = "AFR Safety Uses AFR2 Targets", N2Oopt_4, { N2Oopt_2 }
          field = "Fuel adder percent calc", N2Oopt2_fuel, { N2Oopt2_prog && (N2Oopt2_prog_time != 0) }
          field = "Timing return delay time", n2o_timing_delay,         { N2Oopt_2 }
          field = "Timing return ramp time", n2o_timing_taper,         { N2Oopt_2 }
          field = ""
          field = "READ THE MANUAL BEFORE USING NITROUS"

       dialog = N2OSystem1, "Nitrous System Stage 1"
          field = "Stage 1 Output - Nitrous",           n2o1n_pins,     { N2Oopt_2 }
          field = "Stage 1 Output - Fuel",              n2o1f_pins,     { N2Oopt_2 }
          field = "Enable Input On:",                   N2Oopt_pins,    { N2Oopt_2 }
          field = "Additional Fuel PW @ N2O Min RPM",   N2OPWLo,        { N2Oopt_2 && !(N2Oopt2_prog && (N2Oopt2_prog_time == 0)) }
          field = "Additional Fuel PW @ N2O Max RPM",   N2OPWHi,        { N2Oopt_2 && !(N2Oopt2_prog && (N2Oopt2_prog_time == 0)) }
          field = "Retard Ignition By",                 N2OAngle,       { N2Oopt_2 && !N2Oopt2_prog}
          field = "Nitrous Delay After Launch",         N2Odel_launch,  { N2Oopt_2 && launch_opt_on }
          field = "Nitrous Delay After Flat Shift",     N2Odel_flat,    { N2Oopt_2 && launch_opt_on }
          field = "Allow Nitrous During Launch",        N2Oopt_5,       { N2Oopt_2 && launch_opt_on }
          field = "Max MAP During Launch",              N2Olaunchmaxmap,{ N2Oopt_2 && launch_opt_on && N2Oopt_5}

       dialog = N2OSystem2, "Nitrous System Stage 2"
          field =   "Nitrous stage 2",                  N2Oopt_3,       { N2Oopt_2 }
          field = "Enable switch", n2o_opt3_enable2, { N2Oopt_2 }
          field = "Enable switch input", n2o_enable2_pin, { N2Oopt_2 && n2o_opt3_enable2}
          field = "Stage 2 Output - Nitrous",           n2o2n_pins,     { N2Oopt_2 && N2Oopt_3 }
          field = "Stage 2 Output - Fuel",              n2o2f_pins,     { N2Oopt_2 && N2Oopt_3 }
          field = "Enable Stage 2 Above",               N2O2Rpm,        { N2Oopt_2 && N2Oopt_3 && !N2Oopt2_prog }
          field = "Max RPM",                            N2O2RpmMax,     { N2Oopt_2 && N2Oopt_3 && !N2Oopt2_prog }
          field = "Delay After Stage1",                 N2O2delay,      { N2Oopt_2 && N2Oopt_3 && (!N2Oopt2_prog || (N2Oopt2_prog_time==0)) }
          field = "Retard Ignition By",                 N2O2Angle,      { N2Oopt_2 && N2Oopt_3 && !N2Oopt2_prog }
          field = "Additional Fuel PW @ N2O Min RPM",   N2O2PWLo,       { N2Oopt_2 && N2Oopt_3 && !(N2Oopt2_prog && (N2Oopt2_prog_time == 0)) }
          field = "Additional Fuel PW @ N2O Max RPM",   N2O2PWHi,       { N2Oopt_2 && N2Oopt_3 && !(N2Oopt2_prog && (N2Oopt2_prog_time == 0)) }

       dialog = N2OSystem_top, "", border
          panel = N2OSystem_topl, West
          panel = N2OSystem_topr, East

       dialog = N2OSystems, "", border
          panel = N2OSystem1, West
          panel = N2OSystem2, East

       dialog = nitrous, "Nitrous System", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#nitrous"
          panel = N2OSystem_top, North
          panel = N2OSystems, South

       dialog = n2o1_curves_time, ""
          panel = n2o1_duty_time, North
          panel = n2o1_fuelpct_time, Center, {N2Oopt2_fuel}
          panel = n2o1_retard_time, South

       dialog = n2o2_curves_time, ""
          panel = n2o2_duty_time, North, {N2Oopt_3}
          panel = n2o2_fuelpct_time, Center, {N2Oopt_3 && N2Oopt2_fuel}
          panel = n2o2_retard_time, South, {N2Oopt_3}

       dialog = nitrous_curves_time, "Nitrous - Time-Based Progressive", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#nitrous"
          panel = n2o1_curves_time
          panel = n2o2_curves_time

       dialog = n2o1_curves_rpm, ""
          panel = n2o1_duty_rpm
          panel = n2o1_pw_rpm
          panel = n2o1_retard_rpm

       dialog = n2o2_curves_rpm, ""
          panel = n2o2_duty_rpm, North, {N2Oopt_3}
          panel = n2o2_pw_rpm, Center, {N2Oopt_3}
          panel = n2o2_retard_rpm, South, {N2Oopt_3}

       dialog = nitrous_curves_rpm, "Nitrous - RPM-Based Progressive", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#nitrous"
          panel = n2o1_curves_rpm
          panel = n2o2_curves_rpm

       dialog = n2o1_curves_vss, ""
          panel = n2o1_duty_vss, North
          panel = n2o1_fuelpct_vss, Center, {N2Oopt2_fuel}
          panel = n2o1_retard_vss, South

       dialog = n2o2_curves_vss, ""
          panel = n2o2_duty_vss, North, {N2Oopt_3}
          panel = n2o2_fuelpct_vss, Center, {N2Oopt_3 && N2Oopt2_fuel}
          panel = n2o2_retard_vss, South, {N2Oopt_3}

       dialog = nitrous_curves_vss, "Nitrous - VSS-Based Progressive", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#nitrous"
          panel = n2o1_curves_vss
          panel = n2o2_curves_vss


       dialog = overboost, "Overboost Engine Protection"
       field = "Overboost Protection", OverBoostOption
       field = "Maximum MAP (Boost)",   OverBoostKpa, { OverBoostOption > 0 }
       field = "Hysteresis",      OverBoostHyst, { OverBoostOption > 0 }
       field = "Boost Tolerance", OverBoostOption_tol, { boost_ctl_settings_on && OverBoostOption && boost_ctl_settings_cl}
       field = "Tolerance", boosttol, {boost_ctl_settings_on && OverBoostOption && OverBoostOption_tol && boost_ctl_settings_cl}
       field = "Overboost Switching", tsw_pin_ob, { (OverBoostOption > 0) && (!(dualfuel_sw_on && (dualfuel_opt_mode == 2) && (dualfuel_sw2_ob )))}
       field = "Alt. Maximum MAP (Boost)",   OverBoostKpa2, { (tsw_pin_ob && (OverBoostOption > 0)) || dualfuel_sw2_ob }

       dialog = boostfeat, ""
         field = "Boost Table Switching", boost_feats_tsw, {boost_ctl_settings_on}
         field = "Boost Table Switching Gear", boost_gear_switch, { boost_feats_tsw == 15 }
         field = "Boost Timed Percent", boost_feats_timed, {boost_ctl_settings_on && launch_opt_on}
         field = "Specific Launch Duty/Target", boost_feats_launch, {boost_ctl_settings_on && launch_opt_on}
         field = "Launch Boost Duty", boost_launch_duty, {boost_ctl_settings_on && launch_opt_on && boost_feats_launch && (boost_ctl_settings_cl == 0) && !boost_ctl_settings_dome}
         field = "Launch Boost Target", boost_launch_target, {boost_ctl_settings_on && launch_opt_on && boost_feats_launch && (boost_ctl_settings_cl || boost_ctl_settings_dome)}
         field = "Boost vs Speed / Gear / Time", boost_vss, {boost_ctl_settings_on}
         field = "Above TPS", boost_vss_tps, {boost_ctl_settings_on && boost_vss}
         field = "Bias table per gear", boost_vss_biasgear, {boost_ctl_settings_on && boost_ctl_settings_cl}
         field = "Per Gear Targets:"

        dialog = boostgeartargsl, "", yAxis
         field = "1", boost_geartarg1, {(boost_vss == 3) && gear_method && (gear_no > 0) && (boost_ctl_settings_cl || boost_ctl_settings_dome) && boost_ctl_settings_on}
         field = "2", boost_geartarg2, {(boost_vss == 3) && gear_method && (gear_no > 1) && (boost_ctl_settings_cl || boost_ctl_settings_dome) && boost_ctl_settings_on}
         field = "3", boost_geartarg3, {(boost_vss == 3) && gear_method && (gear_no > 2) && (boost_ctl_settings_cl || boost_ctl_settings_dome) && boost_ctl_settings_on}

        dialog = boostgeartargsr, "", yAxis
         field = "4", boost_geartarg4, {(boost_vss == 3) && gear_method && (gear_no > 3) && (boost_ctl_settings_cl || boost_ctl_settings_dome) && boost_ctl_settings_on}
         field = "5", boost_geartarg5, {(boost_vss == 3) && gear_method && (gear_no > 4) && (boost_ctl_settings_cl || boost_ctl_settings_dome) && boost_ctl_settings_on}
         field = "6", boost_geartarg6, {(boost_vss == 3) && gear_method && (gear_no > 5) && (boost_ctl_settings_cl || boost_ctl_settings_dome) && boost_ctl_settings_on}

        dialog = boostgeartargs, "", border
            panel = boostgeartargsl, West
            panel = boostgeartargsr, East

        dialog = boostctlSettings, "Boost Control Settings"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#boost"
          field = "Boost Control Enabled",                boost_ctl_settings_on
          field = "System type", boost_ctl_settings_dome, {boost_ctl_settings_on}
          field = "Solenoid Freq. Range",       boost_ctl_pwm, {boost_ctl_settings_on && !boost_ctl_settings_dome}
;          field = "Solenoid Frequency (Mid)", boost_ctl_pwm_scale, { boost_ctl_settings_on && (boost_ctl_pwm == 1) && !boost_ctl_settings_dome}
;          field = "Boost Control Pin (Mid)",     boost_ctl_pins_pwm, {boost_ctl_settings_on && (boost_ctl_pwm < 2) && !boost_ctl_settings_dome}
          field = "Solenoid Frequency (Slow)",            boost_ctl_settings_freq, {boost_ctl_settings_on && (boost_ctl_pwm == 2) && !boost_ctl_settings_dome}
          field = "Boost Control Pin (Slow)",                boost_ctl_pins, {boost_ctl_settings_on && (boost_ctl_pwm == 2) && !boost_ctl_settings_dome}
          field = "Output Polarity",                  boost_ctl_settings_invert_new, {boost_ctl_settings_on && !boost_ctl_settings_dome}
          field = "Minimum Duty",                      boost_ctl_closeduty, {boost_ctl_settings_on && !boost_ctl_settings_dome}
          field = "Maximum Duty",                        boost_ctl_openduty, {boost_ctl_settings_on && !boost_ctl_settings_dome}
          field = "Boost Control Lower CLT Threshold",boost_ctl_clt_threshold, {boost_ctl_settings_on}
          field = "Boost Control Lower Limit Delta",  boost_ctl_lowerlimit, {boost_ctl_settings_on && boost_ctl_settings_cl}
          field = "Boost Control Upper Limit Delta", boost_ctl_upperlimit, {boost_ctl_settings_on && boost_ctl_settings_cl}
          field = "Boost Control Max Rate", boost_ctl_rate_disable, {boost_ctl_settings_on && boost_ctl_settings_cl}
          field = "Min/max range", boost_ctl_range1, {boost_ctl_settings_on && boost_ctl_settings_cl && (boost_ctl_settings_dome == 0)}

          field = "Algorithm",                    boost_ctl_settings_cl, {boost_ctl_settings_on && boost_ctl_settings_on}
          field = "Tuning Mode",    boost_ctl_flags, {boost_ctl_settings_on && boost_ctl_settings_cl}
          slider = "Closed-Loop Sensitivity",          boost_ctl_sensitivity, horizontal, {boost_ctl_settings_on && boost_ctl_settings_cl && ((boost_ctl_flags == 2) || (boost_ctl_flags == 3)) }
          field = "Proportional Gain",                boost_ctl_Kp, {boost_ctl_settings_on && boost_ctl_settings_cl && (boost_ctl_flags == 3) }
          field = "Integral Gain",                    boost_ctl_Ki, {boost_ctl_settings_on && boost_ctl_settings_cl && (boost_ctl_flags == 3) }
          field = "Derivative Gain",                boost_ctl_Kd, {boost_ctl_settings_on && boost_ctl_settings_cl && (boost_ctl_flags == 3) }
          field = "Use bias table only at part throttle", boost_ctl_settings_biasonly, {boost_ctl_settings_on && boost_ctl_settings_cl}

          dialog = boosteast, ""
           panel = overboost, North
           panel = boostfeat, Center
           panel = boostgeartargs, South

          dialog = boost, "Boost Control Settings", border
           panel = boostctlSettings, West
           panel = boosteast, East

        dialog = boostctlSettings2, "Boost Control Settings 2"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#boost2"
          field = "Boost Control Enabled",                    boost_ctl_settings_on2, {boost_ctl_settings_on}
          field = "Target duty and boost tables 2 are used."
          field = "Boost vs VSS or time or tableswitch not supported."
          field = "Frequencies same as channel 1"
          field = "Boost Control Pin (Mid)",     boost_ctl_pins_pwm2, {boost_ctl_settings_on && boost_ctl_settings_on2 && (boost_ctl_pwm < 2)}
          field = "Boost Control Pin (Slow)",         boost_ctl_pins2, {boost_ctl_settings_on && boost_ctl_settings_on2 && (boost_ctl_pwm == 2)}
          field = ""
          field = "Minimum Duty",                      boost_ctl_closeduty2, {boost_ctl_settings_on && boost_ctl_settings_on2 && boost_ctl_settings_cl2}
          field = "Maximum Duty",                        boost_ctl_openduty2, {boost_ctl_settings_on && boost_ctl_settings_on2 && boost_ctl_settings_cl2}
          field = "Boost Control Lower Limit",        boost_ctl_lowerlimit2, {boost_ctl_settings_on && boost_ctl_settings_cl2 }
          field = "Boost Control Upper Limit",        boost_ctl_upperlimit2, {boost_ctl_settings_on && boost_ctl_settings_cl2 }
          field = "Boost Control Max Rate",           boost_ctl_rate_disable2, {boost_ctl_settings_on && boost_ctl_settings_cl2 }
          field = ""
          field = "Algorithm",                                boost_ctl_settings_cl2, {boost_ctl_settings_on && boost_ctl_settings_on2}
          slider = "Closed-Loop Sensitivity",          boost_ctl_sensitivity2, horizontal, {boost_ctl_settings_on2 && boost_ctl_settings_cl2 && ((boost_ctl_flags2 == 2) || (boost_ctl_flags2 == 3)) }
          field = "Tuning Mode",    boost_ctl_flags2, {boost_ctl_settings_on2 && boost_ctl_settings_cl2}
          field = "Proportional Gain",                boost_ctl_Kp2, {boost_ctl_settings_on && boost_ctl_settings_on2 && boost_ctl_settings_cl2 && (boost_ctl_flags2 == 3) }
          field = "Integral Gain",                    boost_ctl_Ki2, {boost_ctl_settings_on && boost_ctl_settings_on2 && boost_ctl_settings_cl2 && (boost_ctl_flags2 == 3) }
          field = "Derivative Gain",                boost_ctl_Kd2, {boost_ctl_settings_on && boost_ctl_settings_on2 && boost_ctl_settings_cl2 && (boost_ctl_flags2 == 3) }
          field = "MAP Sensor To Target",             boost_ctl_sensor2, {boost_ctl_settings_on && boost_ctl_settings_on2 && boost_ctl_settings_cl2 && 0}
          field = "Must be defined in Generic Sensors"        

       dialog = maxafrset, ""
          field = "Enable AFR Safety", maxafr_opt1_on
           field = "Warning Output", maxafr_opt1_led, { maxafr_opt1_on || egt_conf_action || fp_opt_safety || (water_pins_in_shut && water_freq_on) }
           field = "Load Axis", maxafr_opt1_load, { maxafr_opt1_on }
           field = "Check above Load", maxafr_en_load, { maxafr_opt1_on }
           field = "Check above RPM", maxafr_en_rpm,   { maxafr_opt1_on }
           field = "Wait for", maxafr_en_time, { maxafr_opt1_on }
           field = "Kill spark For", maxafr_spkcut_time, { maxafr_opt1_on || egt_conf_action || fp_opt_safety || (water_pins_in_shut && water_freq_on) || oilpress_in_safety }

           field = "Then kill fuel until..." ;, "", { maxafr_opt1_on || egt_conf_action}
           field = "TPS Below", maxafr_ret_tps, { maxafr_opt1_on || egt_conf_action || fp_opt_safety || (water_pins_in_shut && water_freq_on) || oilpress_in_safety }
           field = "MAP Below", maxafr_ret_map, { maxafr_opt1_on || egt_conf_action || fp_opt_safety || (water_pins_in_shut && water_freq_on) || oilpress_in_safety }
           field = "RPM Below", maxafr_ret_rpm, { maxafr_opt1_on || egt_conf_action || fp_opt_safety || (water_pins_in_shut && water_freq_on) || oilpress_in_safety }

       dialog = maxafrTbls, "AFR Difference Table"
           panel = maxafr1Tbl

       dialog = maxafr, "AFR Safety System", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#afrsafety"
           panel = maxafrset, West
           panel = maxafrTbls, Center

         dialog = egtwestn, "Configuration"
           field = "No. EGT inputs", egt_num
           field = "Input configuration", egt_conf_input, {egt_num}
           field = "Base CAN id", canegt_base, {egt_num && (egt_conf_input == 1)}
           field = "Base CAN id (8+)", canegt_base2, {(egt_num > 8) && (egt_conf_input == 1)}
           field = "Input numbering", egt_conf_numbering, {(egt_num > 4) && (egt_conf_input == 1)}
           field = "Calibration - see documentation"
           field = "Temp At 0V", egtcal_temp0, {egt_num && (egt_conf_input != 1)}
           field = "Temp At 5V", egtcal_tempmax, {egt_num && (egt_conf_input != 1)}

         dialog = egtwests, "Actions"
           field = "EGT Actions", egt_conf_action
           field = "Warning LED same as AFR safety"
           field = "Warn Temperature", egt_warn, {egt_conf_action}
           field = "Added Fuel", egt_addfuel, {egt_conf_action}
           field = "Add To", egt_conf_bank, {egt_conf_action}
           field = "Per cylinder", egt_conf_percyl, {egt_conf_action && (sequential == 2) }
           field = "Shutdown Engine", egt_conf_shutdown, {egt_conf_action}
           field = "Time > Warn Temp", egt_time, {egt_conf_action && egt_conf_shutdown}
           field = "Max Temperature", egt_max, {egt_conf_action && egt_conf_shutdown}
           field = "See AFR safety for shutdown options"

         dialog = egtwest, "", yAxis
           panel = egtwestn, North
           panel = egtwests, South

         dialog = egteast, "Data capture"
           field = "EGT 1 Channel",  egt1port, { (egt_num > 0) }
           field = "EGT 2 Channel",  egt2port, { (egt_num > 1) }
           field = "EGT 3 Channel",  egt3port, { (egt_num > 2) }
           field = "EGT 4 Channel",  egt4port, { (egt_num > 3) }
           field = "EGT 5 Channel",  egt5port, { (egt_num > 4) }
           field = "EGT 6 Channel",  egt6port, { (egt_num > 5) }
           field = "EGT 7 Channel",  egt7port, { (egt_num > 6) }
           field = "EGT 8 Channel",  egt8port, { (egt_num > 7) }
           field = "EGT 9 Channel",  egt9port, { (egt_num > 8) }
           field = "EGT 10 Channel", egt10port, { (egt_num > 9) }
           field = "EGT 11 Channel", egt11port, { (egt_num > 10) }
           field = "EGT 12 Channel", egt12port, { (egt_num > 11) }
;           field = "EGT 13 Channel", egt13port, { (egt_num > 12) }
;           field = "EGT 14 Channel", egt14port, { (egt_num > 13) }
;           field = "EGT 15 Channel", egt15port, { (egt_num > 14) }
;           field = "EGT 16 Channel", egt16port, { (egt_num > 15) }

         dialog = egt, "EGT / Thermocouple Inputs", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#egt"
           panel = egtwest
           panel = egteast, { (egt_conf_input != 1) }

         dialog = injseq, "Sequenced Batch Fire"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#seqbatch"
           field = "These settings allow batch firing to be sequenced from a specific"
           field = "trigger number for repeatable phasing on each start."
           field = "Enable sequenced batch fire", feature3_3
           field = "Injector Sequence Start Trigger No.", trig_init, {feature3_3 }

          dialog = canwest,  ""
           field = "My CAN ID",  mycan_id
           field = "!Non-standard CAN ID - ECU will lose comms!", {0}, {1}, { mycan_id != 0 }
           field = "Master Enable", can_enable_on
           field = "29bit Megasquirt CAN Enable", can_enable_alcan
           field = "CAN baud rate (caution!)", can_enable_baud
;           field = "Allow writes to realtime data", can_enable_outpc, {can_enable_on && can_enable_alcan}
;           field = "Allow writes to tuning data", can_enable_tuning, {can_enable_on && can_enable_alcan}
           field = "Enable PWM Polling", enable_pollPWM, {can_enable_on && can_enable_alcan}
           field = "Remote CAN Id", can_poll_id, { enable_pollPWM && can_enable_on && can_enable_alcan}
           field = "Remote Table Number For PWM Data", poll_tablePWM, { enable_pollPWM && can_enable_on && can_enable_alcan}
           field = "Remote Table Offset For PWM Data", poll_offsetPWM, { enable_pollPWM && can_enable_on && can_enable_alcan}
           field = "Remote Clock", canpwm_clk, { enable_pollPWM && can_enable_on && can_enable_alcan}
           field = "Remote Prescale", canpwm_pre, { enable_pollPWM && can_enable_on && can_enable_alcan}
           field = "Remote Divider", canpwm_div, { enable_pollPWM && can_enable_on && can_enable_alcan}
           field = ""
           field = "Enable ADC Polling", enable_pollADC, {can_enable_on && can_enable_alcan}

          dialog = caneast,  ""
           field = "Digital ports"
           field = "Remote CAN Id", can_poll_id_ports, { enable_pollports_digin || enable_pollports_digout}
               field = "Table", poll_tableports, { enable_pollports_digin || enable_pollports_digout}
           field = "Enable Input Port", enable_pollports_digin
               field = "Offset", can_poll_digin_offset, { enable_pollports_digin}
           field = "Enable Output Port", enable_pollports_digout
               field = "Offset", can_poll_digout_offset, { enable_pollports_digout}
           field = ""
           field = "Enable PWM Outputs", enable_pwmout

           field = "Remote CAN Id", can_pwmout_id, { enable_pwmout }
               field = "Table", can_pwmout_tab, { enable_pwmout }
               field = "Offset", can_pwmout_offset, { enable_pwmout }
           field = "Force Duty To 0-255", enable_pwmout255

    ;CAN adcs
        dialog = canadc_opt, "", yAxis
            field = "CAN ADC group on/off"
            field = "CAN ADC  1- 4", canadc_opt1, { enable_pollADC }
            field = "CAN ADC  5- 8", canadc_opt2, { enable_pollADC }
            field = "CAN ADC  9-12", canadc_opt3, { enable_pollADC }
            field = "CAN ADC 13-16", canadc_opt4, { enable_pollADC }
            field = "CAN ADC 17-20", canadc_opt5, { enable_pollADC }
            field = "CAN ADC 21-24", canadc_opt6, { enable_pollADC }

        dialog = canadc_id, "", yAxis
            field = "CAN Id"
            field = "", canadc_id1, { canadc_opt1 && enable_pollADC }
            field = "", canadc_id2, { canadc_opt2 && enable_pollADC }
            field = "", canadc_id3, { canadc_opt3 && enable_pollADC }
            field = "", canadc_id4, { canadc_opt4 && enable_pollADC }
            field = "", canadc_id5, { canadc_opt5 && enable_pollADC }
            field = "", canadc_id6, { canadc_opt6 && enable_pollADC }

        dialog = canadc_tab, "", yAxis
            field = "Table"
            field = "", canadc_tab1, { canadc_opt1 && enable_pollADC }
            field = "", canadc_tab2, { canadc_opt2 && enable_pollADC }
            field = "", canadc_tab3, { canadc_opt3 && enable_pollADC }
            field = "", canadc_tab4, { canadc_opt4 && enable_pollADC }
            field = "", canadc_tab5, { canadc_opt5 && enable_pollADC }
            field = "", canadc_tab6, { canadc_opt6 && enable_pollADC }

        dialog = canadc_off, "", yAxis
            field = "Offset"
            field = "", canadc_off1, { canadc_opt1 && enable_pollADC }
            field = "", canadc_off2, { canadc_opt2 && enable_pollADC }
            field = "", canadc_off3, { canadc_opt3 && enable_pollADC }
            field = "", canadc_off4, { canadc_opt4 && enable_pollADC }
            field = "", canadc_off5, { canadc_opt5 && enable_pollADC }
            field = "", canadc_off6, { canadc_opt6 && enable_pollADC }

        dialog = canadcs, "CAN ADC selection", xAxis

            panel = canadc_opt
            panel = canadc_id
            panel = canadc_tab
            panel = canadc_off

          dialog = can_top, "", xAxis
            panel = canwest, West
            panel = caneast, East, {can_enable_on && can_enable_alcan}

          dialog = canparams, "CAN Parameters", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#canparams"
            panel = can_top, North
            panel = canadcs, South, {can_enable_on && can_enable_alcan}

    dialog = canbcast_userdef, "", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#canbcastuser"
        field = "Identifier", can_bcast_user_id
        field = "Data 0", can_bcast_user_d0
        field = "Data 1", can_bcast_user_d1
        field = "Data 2", can_bcast_user_d2
        field = "Data 3", can_bcast_user_d3
        field = "Data 4", can_bcast_user_d4
        field = "Data 5", can_bcast_user_d5
        field = "Data 6", can_bcast_user_d6
        field = "Data 7", can_bcast_user_d7

      dialog = canbroadcast,  "CAN Broadcasting"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#canbroadcast"
       field = "Enable Broadcasting", can_bcast1_on
       field = "Broadcast Interval", can_bcast_int, { can_bcast1_on }
       field = "0x280 RPM * 4", can_bcast1_280x4, { can_bcast1_on }
       field = "0x280 RPM * 1", can_bcast1_280x1, { can_bcast1_on }
       field = "0x289 Coolant", can_bcast1_289, { can_bcast1_on }
       field = "0x316 RPM", can_bcast1_316, { can_bcast1_on }
       field = "0x329 Coolant", can_bcast1_329, { can_bcast1_on }
       field = "0x561 Alfa/Fiat/Lancia dash", can_bcast1_561, { can_bcast1_on }
       field = "0x361 Alfa/Fiat/Lancia", can_bcast1_361, { can_bcast1_on }
       field = "0x041 Alfa/Fiat/Lancia", can_bcast2_041, { can_bcast1_on }
       field = "Holset HE351VE VGT turbo", can_bcast2_he351, { can_bcast1_on }
       field = "0x23d Nissan 350Z temp/RPM", can_bcast2_23d, { can_bcast1_on }
       field = "0x400 Lotus white 2004-2007 (1M)", can_bcast2_lotus0407, { can_bcast1_on }
       field = "0x400 Lotus black 2008-2015 (500k)", can_bcast2_lotus0815, { can_bcast1_on }
       field = "Generic Sensor input used for fuel", can_bcast_lotus_fuel, { can_bcast1_on && (can_bcast2_lotus0407 || can_bcast2_lotus0815) }
       field = "User defined testing", can_bcast2_xxx, { can_bcast1_on }

        dialog = canvss, "CAN VSS and gear selection"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#canvss"
          field = "This is for polling the actual vehicle speed"
          field = "mph/kph from a remote device."
          field = "For a pulse input use the CAN PWM instead"
          field = "Mode", can_poll2_vss
          field = "Remote CAN Id", vss1_can_id, {can_poll2_vss}
          field = "Remote CAN Table", vss1_can_table, {can_poll2_vss}
          field = ""
          field = "VSS1 Offset", vss1_can_offset, {(vss_opt0_1 == 1) && (vss_opt1 == 0x0e) && can_poll2_vss}
          field = "Data Size", vss1_can_size, {vss_opt1 == 0x0e}
          field = ""
          field = "VSS2 Offset", vss2_can_offset, {(vss_opt0_2 == 1) && (vss_opt2 == 0x0e) && can_poll2_vss}
          field = "Data Size", vss2_can_size, {vss_opt2 == 0x0e}
          field = ""
          field = "VSS3 Offset", vss3_can_offset, {(vss_opt0_1 == 1) && vss_opt0_3 && (vss_opt1 == 0x0e) && can_poll2_vss}
          field = "VSS4 Offset", vss4_can_offset, {(vss_opt0_2 == 1) && vss_opt0_4 && (vss_opt2 == 0x0e) && can_poll2_vss}
          field = ""
          field = "Gear# Offset", gear_can_offset, {((gear_method & 0x03) == 0x03)}

        dialog = canrtc, "Real Time Clock"
          field = "Enable Real Time Clock", opt142_rtc
          field = "Trim +/-", rtc_trim, {opt142_rtc}
          field = "Remote CAN Id", can_poll_id_rtc, {(opt142_rtc == 2) && can_enable_on && can_enable_alcan}
          field = "Table", poll_table_rtc, {(opt142_rtc == 2) && can_enable_on && can_enable_alcan}
          field = "Offset", poll_offset_rtc, {(opt142_rtc == 2) && can_enable_on && can_enable_alcan}

        dialog = canego1, "EGO Data Via CAN"
          field = "Fetch EGO Data", can_poll2_ego2
          field = "Base CAN id", canegt_base, {can_poll2_ego2 == 6}
          field = "Base CAN id (2nd box)", canegt_base2, {can_poll2_ego2 == 6}
          field = "Base CAN id", canego_base, {can_poll2_ego2 == 8}
          field = "Remote CAN Id", can_ego_id, {can_poll2_ego2 == 1}
          field = "Table", can_ego_table, {can_poll2_ego2 == 1}
          field = "Offset", can_ego_offset, {can_poll2_ego2 == 1}
          field = "Smoothing", can_poll2_egolag

        dialog = cangps, "GPS Data Via CAN"
          field = "Fetch GPS Data", can_poll2_gps
          field = "Remote CAN Id", can_gps_id, {can_poll2_gps == 1}
          field = "Table", can_gps_table, {can_poll2_gps == 1}
          field = "Offset", can_gps_offset, {can_poll2_gps == 1}
          field = "CAN base address", canrx1_rt_gps_base, {can_poll2_gps == 2}

          dialog = canego, "", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#canegogps"
            panel = canego1, North, {can_enable_on} 
            panel = cangps, South, {can_enable_on}

          dialog = realtimeclock, "", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#rtc"
            panel = canrtc
            panel = std_ms3Rtc
     
          dialog = tablesw1, "Table Switching"
          field = "Fuel Table Switching",         f5_0_tsf, { !(dualfuel_sw_on && dualfuel_sw_fuel) }
          field = "Switch Source",        f5_0_tsf_opt,  { f5_0_tsf && !(dualfuel_sw_on && dualfuel_sw_fuel)}
          field = "Input pin", tsw_pin_f, { f5_0_tsf && (f5_0_tsf_opt == 0) && !(dualfuel_sw_on && dualfuel_sw_fuel)}
          field = "RPM greater than",     tsf_rpm,  { f5_0_tsf && (f5_0_tsf_opt == 1) && !(dualfuel_sw_on && dualfuel_sw_fuel)}
          field = "MAP greater than",    tsf_kpa,  { f5_0_tsf && (f5_0_tsf_opt == 2) && !(dualfuel_sw_on && dualfuel_sw_fuel)}
          field = "TPS greater than",    tsf_tps,  { f5_0_tsf && (f5_0_tsf_opt == 3) && !(dualfuel_sw_on && dualfuel_sw_fuel)}
          field = ""
          field = "Spark Table Switching",         f5_0_tss, { !(dualfuel_sw_on && dualfuel_sw_spk) }
          field = "Switch Source",        f5_0_tss_opt,  { f5_0_tss && !(dualfuel_sw_on && dualfuel_sw_spk)}
          field = "Input Pin", tsw_pin_s, { f5_0_tss && (f5_0_tss_opt == 0) }
          field = "RPM Greater Than",     tss_rpm,  { f5_0_tss && (f5_0_tss_opt == 1) && !(dualfuel_sw_on && dualfuel_sw_spk)}
          field = "MAP Greater Than",    tss_kpa,  { f5_0_tss && (f5_0_tss_opt == 2) && !(dualfuel_sw_on && dualfuel_sw_spk)}
          field = "Slew control", slew_opts_tss, { f5_0_tss && !((f5_0_tss_opt == 0) && (tsw_pin_s == 14)) && !(dualfuel_sw_on && dualfuel_sw_spk)}
          field = "Max slew rate", slew_rate_global, { f5_0_tss && !((f5_0_tss_opt == 0) && (tsw_pin_s == 14)) && !(dualfuel_sw_on && dualfuel_sw_spk) && slew_opts_tss}

          field = "TPS Greater Than",    tss_tps,  { f5_0_tss && (f5_0_tss_opt == 3) && !(dualfuel_sw_on && dualfuel_sw_spk)}
          field = ""
          field = "Req Fuel Switching", tsw_pin_rf, { !(dualfuel_sw_on && dualfuel_sw_rf)}
          field = "Alternate ReqFuel (Lower Number)", ReqFuel_alt, { tsw_pin_rf || (dualfuel_sw_on && dualfuel_sw_rf)}
          field = ""
          field = "AFR Table Switching", tsw_pin_afr, { !(dualfuel_sw_on && dualfuel_sw_afr)}
          field = ""
          field = "Stoich Switching", tsw_pin_stoich, { !(dualfuel_sw_on && dualfuel_sw_stoich)}
          field = "Alternate Stoich", stoich_alt, { tsw_pin_stoich || (dualfuel_sw_on && dualfuel_sw_stoich)}
          field = ""
          field = "Boost control table switching is on the boost control menu"

        dialog = dualfuel, "Dual Fuel switching"
            field = "Dual Fuel Enable", dualfuel_sw_on
            field = "Mode", dualfuel_opt_mode, { dualfuel_sw_on }
            field = "Outputs Mode", dualfuel_opt_out, { dualfuel_sw_on && (dualfuel_opt_mode == 0) }
            field = "Secondary Outputs", staged_extended_opts_use_v3, { dualfuel_sw_on && (dualfuel_opt_mode < 2) && (dualfuel_opt_out || dualfuel_opt_mode) }
;was { ((dualfuel_opt_out || dualfuel_opt_mode) && hardware_fuel && ((nCylinders <= 4)) || ((nCylinders > 4) && (sequential == 1))) }
            field = "Secondary V3 Alternate", staged_extended_opts_simult, { (dualfuel_opt_mode < 2) && ((dualfuel_opt_out || dualfuel_opt_mode) && staged_extended_opts_use_v3) || ((nCylinders > 4) && (dualfuel_opt_out || dualfuel_opt_mode) && hardware_fuel && !(sequential & 0x1)) }
            field = "Input Pin", dualfuel_pin, { dualfuel_sw_on && (dualfuel_opt_mode == 0) }
            field = "Alt. Fuel Tables", dualfuel_sw_fuel, { dualfuel_sw_on && (dualfuel_opt_mode != 1) }
            field = "Alt. Spark Tables", dualfuel_sw_spk, { dualfuel_sw_on && (dualfuel_opt_mode != 1) }
            field = "Alt. AFR Tables", dualfuel_sw_afr, { dualfuel_sw_on && (dualfuel_opt_mode != 1) }
            field = "Alt. ReqFuel", dualfuel_sw_rf, { dualfuel_sw_on && (dualfuel_opt_mode == 0) }
            field = "Alt. Stoich", dualfuel_sw_stoich, { dualfuel_sw_on && (dualfuel_opt_mode == 0) }
            field = "Alt. Warmup", dualfuel_sw_wue, { dualfuel_sw_on && (dualfuel_opt_mode != 1) }
            field = "Alt. AfterStart", dualfuel_sw_ase, { dualfuel_sw_on && (dualfuel_opt_mode != 1) }
            field = "Alt. Priming", dualfuel_sw2_prime, { dualfuel_sw_on && (dualfuel_opt_mode == 0) }
            field = "Alt. Cranking Pulse", dualfuel_sw2_crank, { dualfuel_sw_on && (dualfuel_opt_mode != 1) }
            field = "Alt. Injector Params", dualfuel_sw2_injp, { dualfuel_sw_on && (dualfuel_opt_mode == 0) }
            field = "Alt. Small Pulsewidths", dualfuel_sw2_smpw, { dualfuel_sw_on && (dualfuel_opt_mode == 0) }
            field = "Alt. Overboost", dualfuel_sw2_ob, { dualfuel_sw_on && (dualfuel_opt_mode != 1) }
            field = "Alt. Boost Table", dualfuel_sw2_boosw, { dualfuel_sw_on && (dualfuel_opt_mode != 1) }
            field = "Alt. Accel Enrich", dualfuel_sw2_ae, { dualfuel_sw_on && (dualfuel_opt_mode != 1) }
            field = ""
            field = "Enable Temperature Adjustment", dualfuel_opt_temp, { dualfuel_sw_on && (dualfuel_opt_mode == 0) }
            field = "Temperature On", dualfuel_temp_sens, { dualfuel_sw_on && dualfuel_opt_temp && (dualfuel_opt_mode == 0)}
            field = "Enable Pressure Adjustment", dualfuel_opt_press, { dualfuel_sw_on && (dualfuel_opt_mode == 0) }
            field = "Pressure In kPa On", dualfuel_press_sens, { dualfuel_sw_on && dualfuel_opt_press && (dualfuel_opt_mode == 0)}
            field = "Sensor Type", dualfuel_press_type, { dualfuel_sw_on && dualfuel_opt_press && dualfuel_press_sens && (dualfuel_opt_mode == 0)}

        dialog = tablesw, "Table Switch/Dual Fuel", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#tablesw"
            panel = tablesw1, West
            panel = dualfuel, East

    dialog = outputTestbuttons1a, "", xAxis
        ;commandButton = "Label Text", command, { Enabled Condition }, optionalFlags
        ; The rem > 0 expression is just for testing.. It works when the MS is on the Stim with rpm.
        ; a status bit there would be the expected real expression
        commandButton = "Enable Test Mode", cmdEnterTestMode, { (!(status3 & 8)) && (rpm == 0)}

        ; if clickOnCloseIfEnabled is set, then the command assigned to this button will be run on the 
        ; dialog close, but only if the enable condition is true
        ; valid click flags are:
        ; clickOnCloseIfEnabled - the command will be sent on dialog close if active condition is true
        ; clickOnCloseIfDisabled - the command will be sent on dialog close if active condition is false
        ; clickOnClose - the command will be sent on dialog close always
        commandButton = "Disable Test Mode", cmdStopTestmode, { status3 & 8 }, clickOnCloseIfEnabled

    dialog = outputTestbuttons1b, ""
           field = "Ensure engine is stationary or stim RPM is 0 before testing injectors or coils"

    dialog = outputTestbuttons1, "Test Mode Controls", yAxis
        panel = outputTestbuttons1a
        panel = outputTestbuttons1b

    dialog = outputTestbuttons2, "Fuel pump", xAxis
        commandButton = "Fuel Pump On", cmdfpon, { status3 & 8 }
        commandButton = "Fuel Pump Off", cmdfpoff, { status3 & 8 }

          dialog = outputtest_spk_l, "", yAxis
           field = "Output Interval", testint
           displayOnlyField = "RPM (Coil-on-Plug)", testrpm
           field = "Coil Testing Mode", testop_coil
           field = "Coil Output To Test", testsel_coil
           field = "Dwell", testdwell

          dialog = outputtest_spk_r, "", yAxis
            commandButton = "Start", cmdtestspkon, { testop_coil && (status3 & 8) && testdwell }
            commandButton = "Stop", cmdtestinjspkoff, { status3 & 8 }

          dialog = outputtest_inj_l, "", yAxis
           field = "Output Interval", testint
           displayOnlyField = "RPM (Full Sequential)", testrpm
           field = "Injector Testing Mode", testop_inj
           field = "Injector Channel To Test", testsel_inj
           field = "Pulsewidth", testpw
           field = "Total Number Of Injections", testinjcnt

          dialog = outputtest_inj_r, "", yAxis
            commandButton = "Start", cmdtestinjon, { testop_inj && (status3 & 8) && testpw && testinjcnt }
            commandButton = "Stop", cmdtestinjspkoff, { status3 & 8 }

        dialog = outputtest_spk, "Coil Testing", xAxis
            panel = outputtest_spk_l
            panel = outputtest_spk_r

        dialog = outputtest_inj, "Injector Testing", xAxis
            panel = outputtest_inj_l
            panel = outputtest_inj_r

        dialog = outputtest_controls, "Output Test Modes", yAxis
            panel = outputTestbuttons1
            panel = outputTestbuttons2
                panel = outputtest_spk
                panel = outputtest_inj

        dialog = outputtest_r, "Reference Gauges", yAxis
            gauge = voltMeter, North
            gauge = injcountGauge, South

        dialog = outputtest, "", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#testinjspk"
            panel = outputtest_controls
            panel = outputtest_r

    dialog = outputtest9, "Fuel Pump", yAxis
        commandButton = "Off", cmdtest_pe4_off, { status3 & 8 }
        commandButton = "Pulsed", cmdtest_pe4_pulsed, { status3 & 8 }
        commandButton = "On", cmdtest_pe4_on, { status3 & 8 }

          dialog = outputtesta0, "Inj A", yAxis
            commandButton = "Off", cmdtest_pa0_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pa0_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pa0_on, { status3 & 8 }
          dialog = outputtesta1, "Inj B", yAxis
            commandButton = "Off", cmdtest_pa1_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pa1_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pa1_on, { status3 & 8 }
          dialog = outputtesta2, "Inj C", yAxis
            commandButton = "Off", cmdtest_pa2_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pa2_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pa2_on, { status3 & 8 }
          dialog = outputtesta3, "Inj D", yAxis
            commandButton = "Off", cmdtest_pa3_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pa3_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pa3_on, { status3 & 8 }
          dialog = outputtesta4, "Inj E", yAxis
            commandButton = "Off", cmdtest_pa4_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pa4_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pa4_on, { status3 & 8 }
          dialog = outputtesta5, "Inj F", yAxis
            commandButton = "Off", cmdtest_pa5_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pa5_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pa5_on, { status3 & 8 }
          dialog = outputtesta6, "Inj G", yAxis
            commandButton = "Off", cmdtest_pa6_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pa6_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pa6_on, { status3 & 8 }
          dialog = outputtesta7, "Inj H", yAxis
            commandButton = "Off", cmdtest_pa7_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pa7_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pa7_on, { status3 & 8 }

        dialog = outputtest_io1inj, "Inj Outputs", xAxis
            panel = outputtesta0
            panel = outputtesta1
            panel = outputtesta2
            panel = outputtesta3
            panel = outputtesta4
            panel = outputtesta5
            panel = outputtesta6
            panel = outputtesta7

          dialog = outputtestb0, "Spk A", yAxis
            commandButton = "Off", cmdtest_pb0_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pb0_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pb0_on, { status3 & 8 }
          dialog = outputtestb1, "Spk B", yAxis
            commandButton = "Off", cmdtest_pb1_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pb1_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pb1_on, { status3 & 8 }
          dialog = outputtestb2, "Spk C", yAxis
            commandButton = "Off", cmdtest_pb2_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pb2_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pb2_on, { status3 & 8 }
          dialog = outputtestb3, "Spk D", yAxis
            commandButton = "Off", cmdtest_pb3_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pb3_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pb3_on, { status3 & 8 }
          dialog = outputtestb4, "Spk E", yAxis
            commandButton = "Off", cmdtest_pb4_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pb4_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pb4_on, { status3 & 8 }
          dialog = outputtestb5, "Spk F", yAxis
            commandButton = "Off", cmdtest_pb5_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pb5_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pb5_on, { status3 & 8 }
          dialog = outputtestb6, "Spk G", yAxis
            commandButton = "Off", cmdtest_pb6_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pb6_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pb6_on, { status3 & 8 }
          dialog = outputtestb7, "Spk H", yAxis
            commandButton = "Off", cmdtest_pb7_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pb7_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pb7_on, { status3 & 8 }

        dialog = outputtest_io1spk, "Spk Outputs", xAxis
            panel = outputtestb0
            panel = outputtestb1
            panel = outputtestb2
            panel = outputtestb3

            panel = outputtestb4
            panel = outputtestb5
            panel = outputtestb6
            panel = outputtestb7

          dialog = outputtestcano0, "OUT1", yAxis
            commandButton = "Off", cmdtestcano0off, { (status3 & 8) && (canout1_8 & 1) }
;            commandButton = "Pulsed", cmdtestcano0pulsed, { status3 & 8 }
            commandButton = "On", cmdtestcano0on, { (status3 & 8) && ((canout1_8 & 1) == 0) }
          dialog = outputtestcano1, "OUT2", yAxis
            commandButton = "Off", cmdtestcano1off, { (status3 & 8) && (canout1_8 & 2) }
;            commandButton = "Pulsed", cmdtestcano1pulsed, { status3 & 8 }
            commandButton = "On", cmdtestcano1on, { (status3 & 8) && ((canout1_8 & 2) == 0) }
          dialog = outputtestcano2, "OUT3", yAxis
            commandButton = "Off", cmdtestcano2off, { (status3 & 8) && (canout1_8 & 4) }
;            commandButton = "Pulsed", cmdtestcano2pulsed, { status3 & 8 }
            commandButton = "On", cmdtestcano2on, { (status3 & 8) && ((canout1_8 & 4) == 0) }
          dialog = outputtestcano3, "OUT4", yAxis
            commandButton = "Off", cmdtestcano3off, { (status3 & 8) && (canout1_8 & 8) }
;            commandButton = "Pulsed", cmdtestcano3pulsed, { status3 & 8 }
            commandButton = "On", cmdtestcano3on, { (status3 & 8) && ((canout1_8 & 8) == 0) }
          dialog = outputtestcano4, "OUT5", yAxis
            commandButton = "Off", cmdtestcano4off, { (status3 & 8) && (canout1_8 & 16) }
;            commandButton = "Pulsed", cmdtestcano4pulsed, { status3 & 8 }
            commandButton = "On", cmdtestcano4on, { (status3 & 8) && ((canout1_8 & 16) == 0) }
          dialog = outputtestcano5, "OUT6", yAxis
            commandButton = "Off", cmdtestcano5off, { (status3 & 8) && (canout1_8 & 32) }
;            commandButton = "Pulsed", cmdtestcano5pulsed, { status3 & 8 }
            commandButton = "On", cmdtestcano5on, { (status3 & 8) && ((canout1_8 & 32) == 0) }
          dialog = outputtestcano6, "OUT7", yAxis
            commandButton = "Off", cmdtestcano6off, { (status3 & 8) && (canout1_8 & 64) }
;            commandButton = "Pulsed", cmdtestcano6pulsed, { status3 & 8 }
            commandButton = "On", cmdtestcano6on, { (status3 & 8) && ((canout1_8 & 64) == 0) }
          dialog = outputtestcano7, "OUT8", yAxis
            commandButton = "Off", cmdtestcano7off, { (status3 & 8) && (canout1_8 & 128) }
;            commandButton = "Pulsed", cmdtestcano7pulsed, { status3 & 8 }
            commandButton = "On", cmdtestcano7on, { (status3 & 8) && ((canout1_8 & 128) == 0) }

        dialog = outputtest_iocano, "CANOUT1-8", xAxis
            panel = outputtestcano0
            panel = outputtestcano1
            panel = outputtestcano2
            panel = outputtestcano3
            panel = outputtestcano4
            panel = outputtestcano5
            panel = outputtestcano6
            panel = outputtestcano7

          dialog = outputtestcano8, "OUT9", yAxis
            commandButton = "Off", cmdtestcano8off, { (status3 & 8) && (canout9_16 & 1) }
;            commandButton = "Pulsed", cmdtestcano8pulsed, { status3 & 8 }
            commandButton = "On", cmdtestcano8on, { (status3 & 8) && ((canout9_16 & 1) == 0) }
          dialog = outputtestcano9, "OUT10", yAxis
            commandButton = "Off", cmdtestcano9off, { (status3 & 8) && (canout9_16 & 2) }
;            commandButton = "Pulsed", cmdtestcano9pulsed, { status3 & 8 }
            commandButton = "On", cmdtestcano9on, { (status3 & 8) && ((canout9_16 & 2) == 0) }
          dialog = outputtestcano10, "OUT11", yAxis
            commandButton = "Off", cmdtestcano10off, { (status3 & 8) && (canout9_16 & 4) }
;            commandButton = "Pulsed", cmdtestcano10pulsed, { status3 & 8 }
            commandButton = "On", cmdtestcano10on, { (status3 & 8) && ((canout9_16 & 4) == 0) }
          dialog = outputtestcano11, "OUT12", yAxis
            commandButton = "Off", cmdtestcano11off, { (status3 & 8) && (canout9_16 & 8) }
;            commandButton = "Pulsed", cmdtestcano11pulsed, { status3 & 8 }
            commandButton = "On", cmdtestcano11on, { (status3 & 8) && ((canout9_16 & 8) == 0) }
          dialog = outputtestcano12, "OUT13", yAxis
            commandButton = "Off", cmdtestcano12off, { (status3 & 8) && (canout9_16 & 16) }
;            commandButton = "Pulsed", cmdtestcano12pulsed, { status3 & 8 }
            commandButton = "On", cmdtestcano12on, { (status3 & 8) && ((canout9_16 & 16) == 0) }
          dialog = outputtestcano13, "OUT14", yAxis
            commandButton = "Off", cmdtestcano13off, { (status3 & 8) && (canout9_16 & 32) }
;            commandButton = "Pulsed", cmdtestcano13pulsed, { status3 & 8 }
            commandButton = "On", cmdtestcano13on, { (status3 & 8) && ((canout9_16 & 32) == 0) }
          dialog = outputtestcano14, "OUT15", yAxis
            commandButton = "Off", cmdtestcano14off, { (status3 & 8) && (canout9_16 & 64) }
;            commandButton = "Pulsed", cmdtestcano14pulsed, { status3 & 8 }
            commandButton = "On", cmdtestcano14on, { (status3 & 8) && ((canout9_16 & 64) == 0) }
          dialog = outputtestcano15, "OUT16", yAxis
            commandButton = "Off", cmdtestcano15off, { (status3 & 8) && (canout9_16 & 128) }
;            commandButton = "Pulsed", cmdtestcano15pulsed, { status3 & 8 }
            commandButton = "On", cmdtestcano15on, { (status3 & 8) && ((canout9_16 & 128) == 0) }

        dialog = outputtest_iocano2, "CANOUT9-16", xAxis
            panel = outputtestcano8
            panel = outputtestcano9
            panel = outputtestcano10
            panel = outputtestcano11
            panel = outputtestcano12
            panel = outputtestcano13
            panel = outputtestcano14
            panel = outputtestcano15

          dialog = outputtestcani0, "IN1", yAxis
            commandButton = "High", cmdnull, { canin1_8 & 1 }
            commandButton = "Low", cmdnull, { (canin1_8 & 1) == 0 }
          dialog = outputtestcani1, "IN2", yAxis
            commandButton = "High", cmdnull, { canin1_8 & 2 }
            commandButton = "Low", cmdnull, { (canin1_8 & 2) == 0 }
          dialog = outputtestcani2, "IN3", yAxis
            commandButton = "High", cmdnull, { canin1_8 & 4 }
            commandButton = "Low", cmdnull, { (canin1_8 & 4) == 0 }
          dialog = outputtestcani3, "IN4", yAxis
            commandButton = "High", cmdnull, { canin1_8 & 8 }
            commandButton = "Low", cmdnull, { (canin1_8 & 8) == 0 }
          dialog = outputtestcani4, "IN5", yAxis
            commandButton = "High", cmdnull, { canin1_8 & 16 }
            commandButton = "Low", cmdnull, { (canin1_8 & 16) == 0 }
          dialog = outputtestcani5, "IN6", yAxis
            commandButton = "High", cmdnull, { canin1_8 & 32 }
            commandButton = "Low", cmdnull, { (canin1_8 & 32) == 0 }
          dialog = outputtestcani6, "IN7", yAxis
            commandButton = "High", cmdnull, { canin1_8 & 64 }
            commandButton = "Low", cmdnull, { (canin1_8 & 64) == 0 }
          dialog = outputtestcani7, "IN8", yAxis
            commandButton = "High", cmdnull, { canin1_8 & 128 }
            commandButton = "Low", cmdnull, { (canin1_8 & 128) == 0 }

        dialog = outputtest_iocani, "CANIN1-8 - read-only", xAxis
            panel = outputtestcani0
            panel = outputtestcani1
            panel = outputtestcani2
            panel = outputtestcani3
            panel = outputtestcani4
            panel = outputtestcani5
            panel = outputtestcani6
            panel = outputtestcani7


          dialog = outputtest16, "PWM Out 2", yAxis
            commandButton = "Off", cmdtest_pp2_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pp2_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pp2_on, { status3 & 8 }

          dialog = outputtest10, "High Curr 3", yAxis
            commandButton = "Off", cmdtest_pp3_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pp3_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pp3_on, { status3 & 8 }

          dialog = outputtest11, "High Curr 1", yAxis
            commandButton = "Off", cmdtest_pp4_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pp4_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pp4_on, { status3 & 8 }

          dialog = outputtest12, "High Curr 2", yAxis
            commandButton = "Off", cmdtest_pp5_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pp5_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pp5_on, { status3 & 8 }

          dialog = outputtest13, "PWM Out 3", yAxis
            commandButton = "Off", cmdtest_pp6_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pp6_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pp6_on, { status3 & 8 }

          dialog = outputtest14, "PWM/Idle 1", yAxis
            commandButton = "Off", cmdtest_pp7_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pp7_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pp7_on, { status3 & 8 }

          dialog = outputtest15, "Tach Out", yAxis
            commandButton = "Off", cmdtest_pk0_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pk0_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pk0_on, { status3 & 8 }

        dialog = outputtest_io_level, ""
            field = "Note! On MS3-Pro ECUs Spk outputs  ON=0V  OFF=5V"
            field = ""

        dialog = outputtest_io_warning, ""
            field = "Caution! Used incorrectly this can cause hardware damage. USE AT YOUR OWN RISK."
            field = "The pin/port will be forced into an output overriding any other configuration."
            field = "The Inj/Spk outputs must be used with additional caution to avoid flooding your engine or melting coils."
            field = "After testing, turn off/on the ECU to restore normal settings."
            field = ""
            field = "Use this test mode when the outputs are controlling relays, solenoids or lights."
            field = "To test injectors or coils, use 'Output Test Mode - Inj/Spk'"
            
        dialog = outputtest_io_warning2, ""
            field = "#NOT FOR INJECTORS OR COILS! Use 'Output Test Mode - Inj/Spk'"

        dialog = outputtest_io2_text, ""
            field = "Caution! Used incorrectly this can cause hardware damage. USE AT YOUR OWN RISK."
            field = "After testing, turn off/on the ECU to restore normal settings."
            field = ""

        dialog = outputtest_io_pwm, "Pulse Settings", xAxis
            field = "Pulse Frequency", pwm_testio
            field = "Pulse Duty Cycle", duty_testio

        dialog = outputtest_io1, "Outputs", xAxis
            panel = outputtest9
            panel = outputtest16
            panel = outputtest10
            panel = outputtest11
            panel = outputtest12
            panel = outputtest13
            panel = outputtest14
            panel = outputtest15

	dialog = outputtest_io_new1_off, ".", yAxis
            commandButton = "Off", cmdtest_pe4_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pk0_off, { status3 & 8 }

            commandButton = "Off", cmdtest_pj0_off, { status3 & 8 }

            commandButton = "Off", cmdtest_pj1_off, { status3 & 8 }


            commandButton = "Off", cmdtest_pp4_off, { status3 & 8 }

            commandButton = "Off", cmdtest_pp5_off, { status3 & 8 }

            commandButton = "Off", cmdtest_pp3_off, { status3 & 8 }

            commandButton = "Off", cmdtest_pp7_off, { status3 & 8 }

            commandButton = "Off", cmdtest_pp2_off, { status3 & 8 }

            commandButton = "Off", cmdtest_pp6_off, { status3 & 8 }

            commandButton = "Off", cmdtest_pp0_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pp1_off, { status3 & 8 }

            commandButton = "Off", cmdtest_ps6_off, { status3 & 8 }

            commandButton = "Off", cmdtest_ps7_off, { status3 & 8 }


	dialog = outputtest_io_new1_on, ".", yAxis
            commandButton = "On", cmdtest_pe4_on, { status3 & 8 }
            commandButton = "On", cmdtest_pk0_on, { status3 & 8 }

            commandButton = "On", cmdtest_pj0_on, { status3 & 8 }

            commandButton = "On", cmdtest_pj1_on, { status3 & 8 }


            commandButton = "On", cmdtest_pp4_on, { status3 & 8 }

            commandButton = "On", cmdtest_pp5_on, { status3 & 8 }

            commandButton = "On", cmdtest_pp3_on, { status3 & 8 }

            commandButton = "On", cmdtest_pp7_on, { status3 & 8 }

            commandButton = "On", cmdtest_pp2_on, { status3 & 8 }

            commandButton = "On", cmdtest_pp6_on, { status3 & 8 }

            commandButton = "On", cmdtest_pp0_on, { status3 & 8 }
            commandButton = "On", cmdtest_pp1_on, { status3 & 8 }

            commandButton = "On", cmdtest_ps6_on, { status3 & 8 }

            commandButton = "On", cmdtest_ps7_on, { status3 & 8 }


	dialog = outputtest_io_new1_pulsed, ".", yAxis
            commandButton = "Pulsed", cmdtest_pe4_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pk0_pulsed, { status3 & 8 }

            commandButton = "Pulsed", cmdtest_pj0_pulsed, { status3 & 8 }

            commandButton = "Pulsed", cmdtest_pj1_pulsed, { status3 & 8 }


            commandButton = "Pulsed", cmdtest_pp4_pulsed, { status3 & 8 }

            commandButton = "Pulsed", cmdtest_pp5_pulsed, { status3 & 8 }

            commandButton = "Pulsed", cmdtest_pp3_pulsed, { status3 & 8 }

            commandButton = "Pulsed", cmdtest_pp7_pulsed, { status3 & 8 }

            commandButton = "Pulsed", cmdtest_pp2_pulsed, { status3 & 8 }

            commandButton = "Pulsed", cmdtest_pp6_pulsed, { status3 & 8 }

            commandButton = "Pulsed", cmdtest_pp0_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pp1_pulsed, { status3 & 8 }

            commandButton = "Pulsed", cmdtest_ps6_pulsed, { status3 & 8 }

            commandButton = "Pulsed", cmdtest_ps7_pulsed, { status3 & 8 }


        dialog = outputtest_io1_new, "Outputs", xAxis
            panel = pinusage2
            panel = outputtest_io_new1_off
            panel = outputtest_io_new1_pulsed
            panel = outputtest_io_new1_on

          dialog = outputteste0, "IAC1", yAxis
            commandButton = "Off", cmdtest_pj0_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pj0_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pj0_on, { status3 & 8 }

          dialog = outputteste4, "IAC2", yAxis
            commandButton = "Off", cmdtest_pj1_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pj1_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pj1_on, { status3 & 8 }

          dialog = outputteste8, "InjI", yAxis
            commandButton = "Off", cmdtest_pt1_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pt1_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pt1_on, { status3 & 8 }

          dialog = outputtestec, "InjJ", yAxis
            commandButton = "Off", cmdtest_pt3_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pt3_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pt3_on, { status3 & 8 }





          dialog = outputtest1c0, "DigiInOut1", yAxis
            commandButton = "Off", cmdtest_pm7_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pm7_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pm7_on, { status3 & 8 }

          dialog = outputtest1c4, "DigiInOut2", yAxis
            commandButton = "Off", cmdtest_pm6_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pm6_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pm6_on, { status3 & 8 }

          dialog = outputtest1c8, "DigiInOut3", yAxis
            commandButton = "Off", cmdtest_ps4_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_ps4_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_ps4_on, { status3 & 8 }

          dialog = outputtest1cc, "DigiInOut4", yAxis
            commandButton = "Off", cmdtest_ps5_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_ps5_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_ps5_on, { status3 & 8 }

          dialog = outputtest1d0, "DigiInOut5", yAxis
            commandButton = "Off", cmdtest_pt7_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pt7_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pt7_on, { status3 & 8 }

          dialog = outputtest1d4, "PWM Out 4", yAxis
            commandButton = "Off", cmdtest_pp0_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pp0_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pp0_on, { status3 & 8 }

          dialog = outputtest1d8, "PWM Out 5", yAxis
            commandButton = "Off", cmdtest_pp1_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pp1_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pp1_on, { status3 & 8 }

          dialog = outputtest1dc, "Digi Out 1 LED", yAxis
            commandButton = "Off", cmdtest_ps6_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_ps6_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_ps6_on, { status3 & 8 }



          dialog = outputtest1e0, "Digi Out 2", yAxis
            commandButton = "Off", cmdtest_ps7_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_ps7_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_ps7_on, { status3 & 8 }


          dialog = outputtest1e4, "DigiFreqIn1", yAxis
            commandButton = "Off", cmdtest_pt4_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pt4_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pt4_on, { status3 & 8 }

          dialog = outputtest1e8, "DigiFreqIn2", yAxis
            commandButton = "Off", cmdtest_pt5_off, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pt5_pulsed, { status3 & 8 }
            commandButton = "On", cmdtest_pt5_on, { status3 & 8 }

        dialog = outputtest_io2, "Outputs", xAxis
            panel = outputteste0
            panel = outputteste4
            panel = outputteste8
            panel = outputtestec

	dialog = outputtest_io_new2_left, "Outputs", yAxis
        displayOnlyField = "Injector I", { bitStringValue( portLabels , portusage_t[1]  ) }
        displayOnlyField = "Injector J", { bitStringValue( portLabels , portusage_t[3]  ) }

        displayOnlyField = "Digital In Out 1", { bitStringValue( portLabels , portusage_m[7]  ) }
        displayOnlyField = "Digital In Out 2", { bitStringValue( portLabels , portusage_m[6]  ) }
        displayOnlyField = "Digital In Out 3", { bitStringValue( portLabels , portusage_s[4]  ) }
        displayOnlyField = "Digital In Out 4", { bitStringValue( portLabels , portusage_s[5]  ) }
        displayOnlyField = "Digital In Out 5", { bitStringValue( portLabels , portusage_t[7]  ) }

	dialog = outputtest_io_new2_off, ".", yAxis
            commandButton = "Off", cmdtest_pt1_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pt3_off, { status3 & 8 }


            commandButton = "Off", cmdtest_pm7_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pm6_off, { status3 & 8 }
            commandButton = "Off", cmdtest_ps4_off, { status3 & 8 }
            commandButton = "Off", cmdtest_ps5_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pt7_off, { status3 & 8 }

	dialog = outputtest_io_new2_pulsed, ".", yAxis
            commandButton = "Pulsed", cmdtest_pt1_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pt3_pulsed, { status3 & 8 }


            commandButton = "Pulsed", cmdtest_pm7_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pm6_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_ps4_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_ps5_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pt7_pulsed, { status3 & 8 }

	dialog = outputtest_io_new2_on, ".", yAxis
            commandButton = "On", cmdtest_pt1_on, { status3 & 8 }
            commandButton = "On", cmdtest_pt3_on, { status3 & 8 }


            commandButton = "On", cmdtest_pm7_on, { status3 & 8 }
            commandButton = "On", cmdtest_pm6_on, { status3 & 8 }
            commandButton = "On", cmdtest_ps4_on, { status3 & 8 }
            commandButton = "On", cmdtest_ps5_on, { status3 & 8 }
            commandButton = "On", cmdtest_pt7_on, { status3 & 8 }

        dialog = outputtest_io2_new, "Outputs", xAxis
            panel = outputtest_io_new2_left
            panel = outputtest_io_new2_off
            panel = outputtest_io_new2_pulsed
            panel = outputtest_io_new2_on

        dialog = outputtest_io3, "Outputs", xAxis
            panel = outputtest1e4
            panel = outputtest1e8
            panel = outputtest1c0
            panel = outputtest1c4
            panel = outputtest1c8
            panel = outputtest1cc
            panel = outputtest1d0

        dialog = outputtest_io4, "Outputs", xAxis
            panel = outputtest1d4
            panel = outputtest1d8
            panel = outputtest1dc
            panel = outputtest1e0


        dialog = outputtest_io_1, "", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#testio"
            panel = outputTestbuttons1
            panel = outputtest_io_pwm
            panel = outputtest_io1_new
            panel = outputtest_io_warning

        dialog = outputtest_io_2, "", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#testio"
            panel = outputTestbuttons1
            panel = outputtest_io_pwm
            panel = outputtest_io2_new
            panel = outputtest_io_warning


	dialog = outputtest_io_new3_left, "", yAxis
        displayOnlyField = "Injector A", { bitStringValue( portLabels , portusage_a[0]  ) }
        displayOnlyField = "Injector B", { bitStringValue( portLabels , portusage_a[1]  ) }
        displayOnlyField = "Injector C", { bitStringValue( portLabels , portusage_a[2]  ) }
        displayOnlyField = "Injector D", { bitStringValue( portLabels , portusage_a[3]  ) }
        displayOnlyField = "Injector E", { bitStringValue( portLabels , portusage_a[4]  ) }
        displayOnlyField = "Injector F", { bitStringValue( portLabels , portusage_a[5]  ) }
        displayOnlyField = "Injector G", { bitStringValue( portLabels , portusage_a[6]  ) }
        displayOnlyField = "Injector H", { bitStringValue( portLabels , portusage_a[7]  ) }
        displayOnlyField = "Injector I", { bitStringValue( portLabels , portusage_t[1]  ) }
        displayOnlyField = "Injector J", { bitStringValue( portLabels , portusage_t[3]  ) }
        displayOnlyField = "Spark A", { bitStringValue( portLabels , portusage_b[0]  ) }
        displayOnlyField = "Spark B", { bitStringValue( portLabels , portusage_b[1]  ) }
        displayOnlyField = "Spark C", { bitStringValue( portLabels , portusage_b[2]  ) }
        displayOnlyField = "Spark D", { bitStringValue( portLabels , portusage_b[3]  ) }
        displayOnlyField = "Spark E", { bitStringValue( portLabels , portusage_b[4]  ) }
        displayOnlyField = "Spark F", { bitStringValue( portLabels , portusage_b[5]  ) }
        displayOnlyField = "Spark G", { bitStringValue( portLabels , portusage_b[6]  ) }
        displayOnlyField = "Spark H", { bitStringValue( portLabels , portusage_b[7]  ) }

	dialog = outputtest_io_new3_off, ".", yAxis
            commandButton = "Off", cmdtest_pa0_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pa1_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pa2_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pa3_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pa4_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pa5_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pa6_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pa7_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pt1_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pt3_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pb0_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pb1_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pb2_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pb3_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pb4_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pb5_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pb6_off, { status3 & 8 }
            commandButton = "Off", cmdtest_pb7_off, { status3 & 8 }

	dialog = outputtest_io_new3_pulsed, ".", yAxis
            commandButton = "Pulsed", cmdtest_pa0_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pa1_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pa2_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pa3_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pa4_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pa5_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pa6_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pa7_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pt1_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pt3_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pb0_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pb1_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pb2_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pb3_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pb4_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pb5_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pb6_pulsed, { status3 & 8 }
            commandButton = "Pulsed", cmdtest_pb7_pulsed, { status3 & 8 }

	dialog = outputtest_io_new3_on, ".", yAxis
            commandButton = "On", cmdtest_pa0_on, { status3 & 8 }
            commandButton = "On", cmdtest_pa1_on, { status3 & 8 }
            commandButton = "On", cmdtest_pa2_on, { status3 & 8 }
            commandButton = "On", cmdtest_pa3_on, { status3 & 8 }
            commandButton = "On", cmdtest_pa4_on, { status3 & 8 }
            commandButton = "On", cmdtest_pa5_on, { status3 & 8 }
            commandButton = "On", cmdtest_pa6_on, { status3 & 8 }
            commandButton = "On", cmdtest_pa7_on, { status3 & 8 }
            commandButton = "On", cmdtest_pt1_on, { status3 & 8 }
            commandButton = "On", cmdtest_pt3_on, { status3 & 8 }
            commandButton = "On", cmdtest_pb0_on, { status3 & 8 }
            commandButton = "On", cmdtest_pb1_on, { status3 & 8 }
            commandButton = "On", cmdtest_pb2_on, { status3 & 8 }
            commandButton = "On", cmdtest_pb3_on, { status3 & 8 }
            commandButton = "On", cmdtest_pb4_on, { status3 & 8 }
            commandButton = "On", cmdtest_pb5_on, { status3 & 8 }
            commandButton = "On", cmdtest_pb6_on, { status3 & 8 }
            commandButton = "On", cmdtest_pb7_on, { status3 & 8 }

        dialog = outputtest_io3_new, "Outputs", xAxis
            panel = outputtest_io_new3_left
            panel = outputtest_io_new3_off
            panel = outputtest_io_new3_pulsed
            panel = outputtest_io_new3_on
            
        dialog = outputtest_io_3, "", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#testio"
            panel = outputTestbuttons1
            panel = outputtest_io_warning2
            panel = outputtest_io_pwm
;            panel = outputtest_io1inj
;            panel = outputtest_io1spk
			panel = outputtest_io3_new
            panel = outputtest_io_level
            panel = outputtest_io_warning

        dialog = outputtest_io_4, "", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#testio"
            panel = outputTestbuttons1
            panel = outputtest_iocano
            panel = outputtest_iocano2
            panel = outputtest_io2_text
            panel = outputtest_iocani


          dialog = iactest_l, "", yAxis
           field = "Idle valve testing can be used with the engine running or stationary"
           field = ""
           field = "Idle Valve Homing Steps", iachometest, { IdleCtl == 3 }
           field = "Idle Valve Step (0-255)", iacpostest, { IdleCtl == 3 }
           field = "PWM Idle Duty% (0-100)", iacpostest, { (IdleCtl == 2) || (IdleCtl == 4) } 
           field = "Set the steps before enabling testing"

          dialog = iactest_r, "", yAxis
            commandButton = "Enable Test - Home Position", cmdtestiachome, {( IdleCtl == 3 ) }
            commandButton = "Enable Test - Run Position", cmdtestiacon
            commandButton = "Enable Test - In/Out Cycle", cmdtestiaccycle, { IdleCtl == 3 }
            commandButton = "Stop Testing", cmdtestiacoff, {1}, clickOnCloseIfEnabled

          dialog = iactest_top, "", xAxis
            panel = iactest_l
            panel = iactest_r

          dialog = iactest_bot, "", xAxis
            gauge = IACgauge
            gauge = PWMIdlegauge

          dialog = iactest, "Output Test Mode - Idle Valve", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#testidle"
            panel = iactest_top
            panel = iactest_bot

        dialog = injseqtest, "Injector Sequential Testing"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#injseqtest"
            commandButton = "Stop Testing", cmdtestinjnorm
            commandButton = "Batch Fire", cmdtestinjbat
            commandButton = "Semi Sequential", cmdtestinjsem
            commandButton = "Full Sequential", cmdtestinjseq

          dialog = special, "Special Options"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#special"
           field = "Digital Switched 12V In Pulldown", feature3_n2oin

;           field = "U08 Debug 134, SPI baud", u08_debug134
;           field = "U16 Debug 640", u16_debug640
;           field = "SDcard Run/Test", u08_debug38_0
           field = "Log trigger times to sensors9-16", u08_debug38_1
           field = "SDcard log download", u08_debug38_2
           field = "SDcard detect", log_style2_alwaysin
            field = "Fuel flow/consumption calculation interval", fuelcalctime
           field = "Maximum SpkAdj Value", spkadj_max
           field = "Minimum SpkAdj Value", spkadj_min
;        field = "Testval1", testval1
;        field = "Testval2", testval2
            field = "Spare 1018", spare1018

          dialog = lttrim, "Long Term Trim Settings"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#lttrim"
           field = "Enable Experi. Long Term Trim", ltt_opt_on
           field = "Sample Interval", ltt_samp_time, {ltt_opt_on}
           field = "Correction Softness", ltt_agg, {ltt_opt_on}
           field = "Write Method", ltt_opt_mode, {ltt_opt_on}
           field = "Burn Button", ltt_but_in, {ltt_opt_on && (ltt_opt_mode == 1)}
           field = "Burn Interval", ltt_int, {ltt_opt_on && (ltt_opt_mode == 0)}
           field = "LED Output", ltt_led_out,{ltt_opt_on} 
           field = "Total Change Before Burning", ltt_thresh, {ltt_opt_on}
           field = "Display Current %Change In Sensor15", ltt_opt_feedback, {ltt_opt_on}
        commandButton = "Read Table 1 To RAM", cmdlttr1
        commandButton = "Read Table 2 To RAM", cmdlttr2
        commandButton = "Burn Table To Flash", cmdlttw
        commandButton = "Zero Tables", cmdlttz

          dialog = RotaryTrailingSettings, "Rotary Settings"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#rotary"
          field = "See also Rotary Split Table"
          field = "Output Mode", RotarySplitModeFD, { (twoStroke == 3) && (nCylinders == 2) && (spk_mode3 == 2) }
          field = "Allow Negative Split?", RotarySplitModeNeg, { twoStroke == 3 }
          field = "Trailing Dwell Time", dwelltime_trl, { (twoStroke == 3) && (spk_mode0 >1) && (dwellmode==0) }

          dialog = noisefiltering, "", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#noise"
          field = "#GLOBAL TIMER NOISE FILTER DELAY"
          field = "Noise Filter Period", dlyct
          field = "#Crosstalk Filter"
          field = "Nippon Denso Crosstalk filter", NoiseFilterOpts3, { spk_config_trig2 == 2 }
          field = "#PRIMARY TACH (crank)"
          field = "Noise Filter Enabled", NoiseFilterOpts
          field = "Use noise filter curve to tune"
          field = "Tach Period Rejection", NoiseFilterOpts1
          field = "Tach Interrupt Masking", NoiseFilterOpts2, {NoiseFilterOpts == 0 && NoiseFilterOpts3 == 0}
          field = "Time",                     ICISR_tmask, {NoiseFilterOpts1 || NoiseFilterOpts2}
          field = "Percentage",               ICISR_pmask, {NoiseFilterOpts1 || NoiseFilterOpts2}
          field = "#SECONDARY TACH (cam)"
          field = "Noise Filter Enabled",    secondtrigopts;
          field = "Noise Filter Time Period",      TC5_required_width, { secondtrigopts & 0x1 }
          field = "Tach Period Rejection", secondtrigopts1
          field = "Tach Interrupt Masking", secondtrigopts2, { secondtrigopts == 0 && NoiseFilterOpts3 == 0}
          field = "Time",                     IC2ISR_tmask, {secondtrigopts1 || secondtrigopts2}
          field = "Percentage",               IC2ISR_pmask, {secondtrigopts1 || secondtrigopts2}

          dialog = noisefilterpad
            field = ""
            field = ""
            field = ""
            field = ""

          dialog = Eastnoisefilter, "", yAxis
            panel = NoiseFiltercurve
           panel = noisefilterpad, South

          dialog = noisefiltering2, "Noise Filtering", xAxis
            panel = noisefiltering, West
            panel = Eastnoisefilter, East

          dialog = launchwest, ""
          field = "Launch Control Option:",        launch_opt_on
          field = "Launch/transbrake debounce time", launch_debounce, { launch_opt_on || timedout1_in }
          field = "Ignore RPM for launch activation", launch_opt2_ignorerpm, { launch_opt_on }
          field = "LAUNCH"
          field = "Input On:",  launch_opt_pins, { launch_opt_on }
          field = "Hard limit from MAP curve", launchlimopt_map, { launch_opt_on }
          field = "Launch Hard Limit", launch_hrd_lim, {launch_opt_on && (launchlimopt_map == 0)}
          field = "Soft Limit Zone", launch_sft_zone, {launch_opt_on}
          field = "Soft Limit Retard To", launch_sft_deg, {launch_opt_on }
          field = "Launch Fuel Add/Remove", launch_opt_bank, { launch_opt_on }
          field = "Fuel Addition", launch_addfuel, {launch_opt_bank && launch_opt_on}
          field = "Enable Launch When TPS Above", launch_tps, { launch_opt_on >0}
          field = "Limiter Method", launchlimopt, { launch_opt_on >0}
          field = "Disable Launch When VSS1 Above", launch_maxvss,   { (launch_opt_on ) && (vss_opt0_1) }
          field = "Limiter Settings",launchlimopt_adv , { launch_opt_on }
          field = "Spark Limiter Type",launchlimopt_cut , { launch_opt_on && launchlimopt_adv}
          field = "Spark Cut Zone",launchcutzone , { launch_opt_on && launchlimopt_adv}
          field = "Cut Zone Timing",launchcuttiming , { launch_opt_on && launchlimopt_adv}
          field = "FLAT SHIFT"
          field = "Disable Flat-Shift When VSS1 Below", flats_minvss,   { (launch_opt_on > 1) && (vss_opt0_1) }
          field = "Flat Shift Arming RPM",          flats_arm,   { launch_opt_on >1 }
          field = "Flat Shift Hard Rev Limit",      flats_hrd,   { launch_opt_on >1 }
          field = "Soft Limit Retard To :",                  flats_deg,   { launch_opt_on >1 }
          field = "Cut Fuel Above", launch_fcut_rpm, { (launchlimopt & 1) && (launch_opt_on >0) }
          field = "TIMED RETARD"
          field = "Timed Retard After Launch",      launch_opt_retard,   { launch_opt_on }

          dialog = launchnortheast, "Variable Launch"
          field = "Variable Launch Input",        launch_var_on, { launch_opt_on >0 }
          field = " -Minimum Setting", launch_var_low, {launch_var_on && launch_opt_on >0 }
          field = " -Maximum Setting", launch_var_up, {launch_var_on && launch_opt_on >0 }

          dialog = launchsoutheast, "3-Step / Burnout Limiter"
          field = "3-step Input", launch_3step_in, {launch_opt_on >0 }
          field = " -Soft Limit Retard To", launch_sft_deg3, {launch_3step_in && launch_opt_on >0}
          field = " -Hard Limit", launch_hrd_lim3, {launch_3step_in && launch_opt_on >0}

          dialog = llstg, "Line-Lock Staging"
          field = "Button Input", llstg_in, {launch_opt_on >0 }
          field = "Relay Output", llstg_out, {launch_opt_on && llstg_in }

          dialog = launchtbtstop, "Transbrake, Throttle Stop"
          field = "Transbrake Button Input", timedout1_in
          field = "Transbrake Output", timedout1_out, {timedout1_in}
          field = "Delay", timedout1_offdelay, {timedout1_in && timedout1_out}
          field = "Turbo Staging Button", tcs_in, {timedout1_in}
          field = "Release Time", tcs_offtime, {tcs_in && timedout1_in}
          field = "On Time", tcs_ontime, {tcs_in && timedout1_in}
          field = "Main # Moves", tcs_moves, {tcs_in && timedout1_in}
          field = "Step/Creep", tbrake_opt1_creep, {tcs_in && timedout1_in}
          field = "Throttle Stop Output", tstop_out, { launch_opt_on }
          field = "On Delay After Launch", tstop_delay, {tstop_out && launch_opt_on}
          field = "Keep On For", tstop_hold, {tstop_out && launch_opt_on}

          dialog = launcheast, "", yAxis
          panel = launchnortheast
          panel = launchtbtstop
          panel = launchsoutheast
          panel = llstg

          dialog = launch, "Launch Control/ 2-Step / 3-Step / T-brake", xAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#launch"
          panel = launchwest
          panel = launcheast

          dialog = vsslaunch1, ""
          field = "Wheel-Speed Based Launch", launch_opt_vss
          field = "ACTIVATION"
          field = "Enable Launch When TPS Above", launch_tps, { launch_opt_vss}
          field = "Timeout (0 = None)", launchvsstime, { launch_opt_vss}
          field = "Re-arm Below Speed", launchvss_minvss, { launch_opt_vss}
          field = "Enable Gear Checking", launch_opt_vssgear, { launch_opt_vss && gear_method }
          field = "Maximum Gear", launchvss_maxgear, { launch_opt_vss && launch_opt_vssgear && gear_method}
          field = "LIMITER"
          field = "Limiter Method", launchlimopt, { launch_opt_vss}
          field = "Hard limit is taken from the curve"
          field = "Soft Limit Zone", launch_sft_zone, { launch_opt_vss }
          field = "Retard To", launch_sft_deg, {launch_opt_vss }
          field = "Launch Fuel Add/Remove", launch_opt_bank, { launch_opt_vss }
          field = "Fuel Addition", launch_addfuel, {launch_opt_bank && launch_opt_vss}
          field = "Limiter settings are shared with the launch control page."

          dialog = vsslaunch, "Speed-Based Launch Control", xAxis
          panel = vsslaunch1
          panel = vsslaunch_curve

          dialog = tacho, "Tacho Output"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#tachoout"
          field = "Tacho Output Enabled",         tacho_opt80
          field = "Output On:",  tacho_opt3f, { tacho_opt80 }
          field = "Fixed or variable", tacho_optvar, { tacho_opt80 }
          field = "Speed", tacho_opt40, { tacho_opt80 && (tacho_optvar == 0) }
          field = "Scaling", tacho_scale, { tacho_opt80 && (tacho_optvar == 1) }

          dialog = overrun, "Over-Run Fuel Cut"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#overrun"
          field = "Over-Run Fuel Cut",         OvrRunC
          field = "Cut fuel when Overrun Engine State active and:"
          field = "CLT Greater Than:", fc_clt,  { OvrRunC }
          field = "After Delay",              fc_delay, { OvrRunC }
          field = "Engine States must be configured."
          field = ""
          field = "Progressive Fuel Cut", OvrRunC_progcut, { OvrRunC }
          field = "Ignition Timing Transition (Cut)", OvrRunC_progign, {OvrRunC}
          field = "Ignition Timing During Over-Run", fc_timing, { OvrRunC && (OvrRunC_progign || OvrRunC_retign)}
          field = "Cut Transition Time",    fc_transition_time, { OvrRunC && (OvrRunC_progcut || OvrRunC_progign)}
          field = "Progressive Fuel Return", OvrRunC_progret, { OvrRunC }
          field = "Ignition Timing Transition Return", OvrRunC_retign, { OvrRunC }
          field = "Return Transition Time",    fc_trans_time_ret, { OvrRunC && (OvrRunC_progret || OvrRunC_retign) }
          field = "Highest RPM To Re-Engage Fuel:", fc_rpm_upper, { OvrRunC }
          field = "Lowest RPM To Re-Engage Fuel:", fc_rpm_lower, { OvrRunC }
          field = "RPMdot For Upper RPM Re-Engagement", fuelcut_fuelon_upper_rpmdot, { OvrRunC }
          field = "RPMdot For Lower RPM Re-Engagement", fuelcut_fuelon_lower_rpmdot, { OvrRunC }
          field = "Duration Of Fuel Adder",  fc_ae_time, { OvrRunC }
          field = "Size Of Fuel Adder", fc_ae_pct, { OvrRunC && fc_ae_time }
          field = "Delay EGO After Fuel Return:", fc_ego_delay, { OvrRunC }

          dialog = mapPredictOn, "MAP/Load Prediction Settings", yAxis
          field = "MAP/Load Prediction On/Off", map_predict_on, { (algorithm == 1) || (algorithm == 2) || (algorithm == 6) }
          field = "MAP/Load Prediction activation (TPSdot)", map_predict_tpsdot, {map_predict_on}

          dialog = mapPredictTables, "MAP/Load Prediction Tables", yAxis 
          panel = mapPredTable, Center, { map_predict_on && ((algorithm == 1) || (algorithm == 2) || (algorithm == 6)) }
          panel = mapPredTable2, Center, { map_predict_on && ((algorithm2 == 1) || (algorithm2 == 2) || (algorithm2 == 6)) }

          dialog = mapPredictCombined, "MAP/Load Prediction", xAxis
          panel = mapPredictOn, West
          panel = mapPredictTables, East


          dialog = staging, "Staged Injection"
          field = "Staged Injection First Parameter", staged_first_param
          field = "Primary Injector Size",     staged_pri_size, { staged_first_param }
          field = "Secondary Injector Size",   staged_sec_size, { staged_first_param }
          field = "Transition Fully To Secondaries", staged_extended_opts_pw1off, { staged_first_param }
          field = "Secondary Outputs",  staged_extended_opts_use_v3, { staged_first_param && (staged_out1 == 0) }
          field = "Secondary V3 Alternate", staged_extended_opts_simult, { ((staged_extended_opts_use_v3 && staged_first_param) || ((nCylinders > 4) && (staged_first_param) && (hardware_fuel) && !(sequential & 0x1))) && (staged_out1 == 0) }
          field = ""
          field = "Gradual Transition", staged_transition_on, { staged_first_param && ((staged_first_param & 0x7) != 5) }
          field = "Transition Events", staged_transition_events, { (staged_first_param && staged_transition_on) && ((staged_first_param & 0x7) != 5) }
          field = "Primary Reduction Delay", staged_primary_delay, { (staged_first_param && staged_transition_on) && ((staged_first_param & 0x7) != 5) && (staged_out1 == 0) }
          field = "Secondary Enrichment", staged_secondary_enrichment, { (staged_first_param && staged_transition_on) && ((staged_first_param & 0x7) != 5) && (staged_out1 == 0) }
          field = ""
          field = "Primary Staging Threshold", staged_param_1, { staged_first_param && ((staged_first_param & 0x7) != 5) }
          field = "Primary Staging Hysteresis", staged_hyst_1, { staged_first_param && ((staged_first_param & 0x7) != 5) }
          field = ""
          field = "Second Parameter", staged_second_param, { staged_first_param && ((staged_first_param & 0x7) != 5) }
          field = "Secondary Staging Threshold", staged_param_2, { staged_second_param && staged_first_param && ((staged_first_param & 0x7) != 5) }
          field = "Secondary Staging Hysteresis", staged_hyst_2, { staged_second_param && staged_first_param && ((staged_first_param & 0x7) != 5) }
          field = "Secondary Staging Logic", staged_second_logic, { staged_second_param && staged_first_param && ((staged_first_param & 0x7) != 5) }
          field = ""
          field = "Relay Output", staged_out1, { staged_first_param }
          field = "Relay Output Polarity", staged_out1_inv, { staged_first_param && staged_out1}
          field = "Pre-Relay Output", staged_out2, { staged_first_param }
          field = "Pre-Relay Output Polarity", staged_out2_inv, { staged_first_param && staged_out2}
          field = "Pre-Relay Timer", staged_out2_time, { staged_first_param && staged_out2}

       dialog = stagedCombined, "Staged Injection", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#stagedinj"
          panel = staging, West
          panel = stagedTable, Center, { (staged_first_param & 0x7) == 5 }

       dialog = crsettings, "Cranking / Startup Settings"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#crankstart"
          field = "Cranking RPM",          crankingRPM
          field = ""
          field = "Flood Clear TPS", floodClear
          field = "Above this throttle no fuel is injected"
          field = "Batch Fire During Crank", feature7_batchcrank, {sequential}
          field = "Cranking Taper Curve", feature7_cranktaper
          field = "Cranking Taper Curve Units", feature7_crtpunits, {feature7_cranktaper}
          field = "Cranking Fuel Pulse Rate", altcrank
          field = "Blended Cranking Curves", alternate_blend
          field = ""
          field = "Priming Pulse Delay", primedelay
          field = "Ignore MAT Correction During ASE", feature3_matase
          field = "ASE Count Units", feature3_aseunit

       dialog = generalSettings, "Baro Sensor Settings"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#barocor"
             field = "Barometric Correction", baroCorr
             field = "Realtime Baro Port",    rtbaroport, {baroCorr == 2}
             field = "Upper Limit", baro_upper, {baroCorr}
             field = "Lower Limit", baro_lower, {baroCorr}
             field = "Default Baro", baro_default, {baroCorr < 2}
             field = "Old baro calc", loadopts_oldbaro
       dialog = gsmap, "MAP Sensor Settings"
            field = "MAP Sensor Type", mapport_t
            field = "Voltage Input Port", mapport, {mapport_t == 0}
            field = "Frequency Input Port", mapport_f, {mapport_t == 1}
            field = "Low Frequency", map_freq0, {mapport_t == 1}
            field = "High Frequency", map_freq1, {mapport_t == 1}
            field = "2nd MAP Port",    map2port, { (mapport_t == 0) }
            field = "(See also Tools->Calibrate MAP/Baro)"

       dialog = gsgen, "General Sensor Settings"
             field = "MegaView Temp. Units", tempUnits
             field = "MAP Averaging Lag Factor",    mapLF
             field = "MAF Averaging Lag Factor",    mafLF
             field = "RPM Averaging Lag Factor",    rpmLF
             field = "TPS Averaging Lag Factor",    tpsLF
             field = "Lambda Averaging Lag Factor", egoLF
             field = "CLT/MAT/Battery/Baro Lag Factor",  adcLF
			 field = "Disable additional battery smoothing", feature3_battv
          field = "Auto-zero TPS", feature3_tps

          dialog = secondaryLoad, "Load Parameters"
          field = "Primary Fuel Load",      algorithm
          field = "Secondary Fuel Load",      algorithm2
          field = "Secondary Fuel",               loadCombine, {algorithm2 != 0 }
          field = "Multiply MAP (VE1/3)",    loadMult
          field = "99% of Speed-Density installs should use Multiply"
          field = "Multiply MAP (VE2/4)",    loadMult2, {algorithm2 && (loadCombine == 2)}
          field = "Incorporate AFRTarget", loadStoich
          field = "Stoichiometric AFR", stoich ;, { loadStoich } needed for lambda calc even if not incl AFR
          field = "Primary Ignition Load",    IgnAlgorithm
          field = "Secondary Ignition Load",  IgnAlgorithm2
          field = "Secondary Ignition",       loadCombineign, {IgnAlgorithm2}
          field = "AFR table Load", afrload
          field = "EAE curve Load", eaeload

        dialog = overrun_note
            field = "Overrun is on the fuel menu"

        dialog = eastgeneral, ""
          panel = secondaryLoad, North
          panel = overrun_note, South

       dialog = generalsettings3, "", border
          panel = generalSettings, North
          panel = gsmap, Center
          panel = gsgen, South

       dialog = generalsettings2, "General Settings", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#genset"
          panel = generalsettings3, West
          panel = eastgeneral, East

       dialog = revlimiter, ""
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#revlim"
        field = "HARD REV LIMIT"
        field = "Hard Rev Limit",        RevLimNormal2
        field = "Soft Limit Zone / Hysteresis",        RevLimNormal2_hyst
        field = "COOLANT TEMP LIMITER"
        field = "Rev Limiter CLT Based", RevLimCLTbased 
        field = "Rev Limit TPS Bypass",  TpsBypassCLTRevlim, { RevLimCLTbased & 1 }
        field = "Outside of curve temperatures, normal limit is used."
        field = "SPARK RETARD"
        field = "Spark Retard Mode",  RevLimOption_retard
        field = "Maximum Retard",        RevLimMaxRtd, { RevLimOption_retard == 1 }
        field = "Retard To",        RevLimRtdAng, { RevLimOption_retard == 2}
        field = "SPARK CUT"
        field = "Enable Spark Cut Limiting", RevLimOption_spkcut
        field = "FUEL CUT"
        field = "Enable Fuel Cut Limiting", RevLimOption_fuelcut
        field = "Progressive Fuel Cut", RevLimOption_fuelprog, {RevLimOption_fuelcut}
        field = ""
        field = ""
        field = ""
        field = ""

       dialog = revlimiter2, "Rev Limiter", border
         panel = revlimiter, West
         panel = revlimiterBins, Center, { RevLimCLTbased & 1 }

       dialog = flexn, ""
        field = "#Spark/Fuel"
        field = "Sensor Frequency"
        field = "Ethanol Mix"
        field = "Fuel Multiplier%"
        field = "Timing Addition"
        field = "#Temp Sense"
        field = "Sensor PW"
        field = "Fuel Temp"

       dialog = flexl, ""
        field = "Low"
        field = "", fuelFreq0,   { flexFuel }
        field = "", flex_pct0,   { flexFuel }
        field = "", fuelCorr0,   { flexFuel }
        field = "", fuelSpkDel0, { flexFuel }
        field = "Low"
        field = "", ff_tpw0, { flexFuel && (fueltemp1 == 1)}
        field = "", ff_temp0, { flexFuel && (fueltemp1 == 1)}
        
       dialog = flexh, ""
        field = "High"
        field = "", fuelFreq1,   { flexFuel }
        field = "", flex_pct1,   { flexFuel }
        field = "", fuelCorr1,   { flexFuel }
        field = "", fuelSpkDel1, { flexFuel }
        field = "High"
        field = "", ff_tpw1, { flexFuel && (fueltemp1 == 1)}
        field = "", ff_temp1, { flexFuel && (fueltemp1 == 1)}

        dialog = ff_table1, "Flex Fuel Calibration", xAxis
        panel = flexn
        panel = flexl
        panel = flexh

        dialog = ff_fallback, "", yAxis
          field = "Baseline Ethanol%", flex_baseline,   { flexFuel }
          field = "#Fallback For Sensor Failure"
          field = "Fallback Ethanol %", flexpct_default, { flexFuel > 0 }
          field = "Fallback Fuel Multiplier%", fuelCorr_default,    { flexFuel > 0 }
          field = "Fallback Timing Addition", fuelSpkDel_default, { flexFuel > 0 }
          field = "#Flex Blending (enabled on Dual Fuel menu)"
          field = "Dual Fuel Mode", dualfuel_opt_mode, { 0 }

       dialog = flexFuelTop, ""
          field = "Flex Fuel Sensor",         flexFuel
          field = "Sensor Port",              flexport,    { flexFuel > 0 }
          field = "Temperature Input",        fueltemp1

       dialog = flexFuelSettings, "Fuel Sensor Settings", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#flex"
        panel = flexFuelTop
        panel = ff_table1
        panel = ff_fallback

       dialog = sequentialOptions, "Sequential Fuel Injection"
            field = "Main Fuel Outputs",               hardware_fuel
            field = "Sequential On",               sequential
            field = "Angle Specifies:",            sequential_angle_spec, { sequential != 0 }
            field = "Injector Trim",             sequential_trim_on_off

       dialog = firingorder1, "Firing Order"
          field = "A.", firea  
          field = "B.", fireb, { nCylinders > 1}
          field = "C.", firec, { nCylinders > 2}
          field = "D.", fired, { nCylinders > 3}
          field = "E.", firee, { nCylinders > 4}
          field = "F.", firef, { nCylinders > 5}
          field = "G.", fireg, { nCylinders > 6}
          field = "H.", fireh, { nCylinders > 7}

       dialog = firingorder2, "Firing Order"
          field = "I.", firei, { nCylinders > 8}  
          field = "J.", firej, { nCylinders > 9}
          field = "K.", firek, { nCylinders > 10}
          field = "L.", firel, { nCylinders > 11}
          field = ""
          field = ""
          field = ""
          field = ""
        field = ""

    dialog = firingorder, "", xAxis
        panel = firingorder1, West
        panel = firingorder2, East

      dialog = seqfo, "", yAxis
         panel = sequentialOptions
         panel = firingorder

      dialog = base3, "", yAxis
        field = "Engine Size", enginesize
        field = "Injector Size Each", staged_pri_size

      dialog = base2, "", yAxis
        panel = std_injection
        panel = base3
        
      dialog = base, "Engine and Sequential Settings", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#engseq"
         panel = base2, West
         panel = seqfo, Center

;main injector parameters
       dialog = ot_curve, "", yAxis
		  field = "Deadtime lookup", opentime_opt1_table
          field = "Inj Parameters", opentime_opt1_master

          field = "Inj A", opentime_opt1
          field = "Inj B", opentime_opt2, {opentime_opt1_master}
          field = "Inj C", opentime_opt3, {opentime_opt1_master}
          field = "Inj D", opentime_opt4, {opentime_opt1_master}
          field = "Inj E", opentime_opt5, {opentime_opt1_master}
          field = "Inj F", opentime_opt6, {opentime_opt1_master}
          field = "Inj G", opentime_opt7, {opentime_opt1_master}
          field = "Inj H", opentime_opt8, {opentime_opt1_master}
          field = "Inj I", opentime_opta, {opentime_opt1_master}
          field = "Inj J", opentime_optb, {opentime_opt1_master}
          field = "Inj K", opentime_opt11, {opentime_opt1_master}
          field = "Inj L", opentime_opt12, {opentime_opt1_master}

       dialog = injchar_ms3x, "Injectors", xAxis
          panel = ot_curve

; 9-16


;deadtime curves
      dialog = injcurveswest, "", yAxis
         panel = inj_deadtime_cv1, North
         panel = inj_deadtime_cv3, South

      dialog = injcurveseast, "", yAxis
         panel = inj_deadtime_cv2, North
         panel = inj_deadtime_cv4, South

      dialog = injcurves, "", xAxis
         panel = injcurveswest
         panel = injcurveseast
;deadtime tables
      dialog = injtableswest, "", yAxis
         panel = inj_deadtime_tbl1, North
         panel = inj_deadtime_tbl3, South

      dialog = injtableseast, "", yAxis
         panel = inj_deadtime_tbl2, North
         panel = inj_deadtime_tbl4, South

      dialog = injtables, "", xAxis
         panel = injtableswest
         panel = injtableseast



       dialog = injCharswest, "", yAxis
          panel = injchar_ms3x, North

	dialog = inj_curves_tables, "", card
         panel = injcurves, Center, { opentime_opt1_table == 0}
         panel = injtables, Center, { opentime_opt1_table == 1}

      dialog = injsettings, "", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#injdt"
         panel = injCharswest, West
		 panel = inj_curves_tables, Center

; table-switched alternate parameters



          field = "Inj I", inj2Opena,  {opentime2_opt1_master}
          field = "Inj J", inj2Openb, {opentime2_opt1_master}
          field = "Inj K", inj2Open11, {opentime2_opt1_master}
          field = "Inj L", inj2Open12, {opentime2_opt1_master}

       dialog = ot_curve2, "", yAxis
          field = "Inj Parameters", opentime2_opt1_master
          field = "Inj A", opentime2_opt1
          field = "Inj B", opentime2_opt2, {opentime2_opt1_master}
          field = "Inj C", opentime2_opt3, {opentime2_opt1_master}
          field = "Inj D", opentime2_opt4, {opentime2_opt1_master}
          field = "Inj E", opentime2_opt5, {opentime2_opt1_master}
          field = "Inj F", opentime2_opt6, {opentime2_opt1_master}
          field = "Inj G", opentime2_opt7, {opentime2_opt1_master}
          field = "Inj H", opentime2_opt8, {opentime2_opt1_master}
          field = "Inj I", opentime2_opta, {opentime2_opt1_master}
          field = "Inj J", opentime2_optb, {opentime2_opt1_master}
          field = "Inj K", opentime2_opt11, {opentime2_opt1_master}
          field = "Inj L", opentime2_opt12, {opentime2_opt1_master}

       dialog = injchar_ms3x_2, "Injectors", xAxis
          panel = ot_curve2



       dialog = injCharswest2, "", yAxis
          panel = injchar_ms3x_2, North

      dialog = injsettings2, ""
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#injdt2"
         panel = injCharswest2

       dialog = smallpwwest2, ""
          field = "Enable Non-Linear Small Pulsewidths", smallpw2_opt1_master
          field = "(This is for the alternate injectors from dual-fuel)"

          field = "Injector A", smallpw2_opt1, { smallpw2_opt1_master }
          field = "Injector B", smallpw2_opt2, { smallpw2_opt1_master }
          field = "Injector C", smallpw2_opt3, { smallpw2_opt1_master }
          field = "Injector D", smallpw2_opt4, { smallpw2_opt1_master }
          field = "Injector E", smallpw2_opt5, { smallpw2_opt1_master }
          field = "Injector F", smallpw2_opt6, { smallpw2_opt1_master }
          field = "Injector G", smallpw2_opt7, { smallpw2_opt1_master }
          field = "Injector H", smallpw2_opt8, { smallpw2_opt1_master }




          field = "Injector I", smallpw2_opta,  { smallpw2_opt1_master && ((hardware_fuel) && (nInjectors > 8)) }
          field = "Injector J", smallpw2_optb,  { smallpw2_opt1_master && ((hardware_fuel) && (nInjectors > 9)) }
          field = "Injector K", smallpw2_opt11, { smallpw2_opt1_master && ((hardware_fuel) && (nInjectors > 10)) }
          field = "Injector L", smallpw2_opt12, { smallpw2_opt1_master && ((hardware_fuel) && (nInjectors > 11)) }

      dialog = smallpw2, "Injector Small Pulsewidths 2", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#injsmallpw2"
         panel = smallpwwest2, West

       dialog = smallpwwest, ""
          field = "Enable Non-Linear Small Pulsewidths", smallpw_opt1_master
          field = "!CAUTION!"
          field = "Unless you have specific injector data these"
          field = "'curves' must be a straight line from 0-2"
          field = "Ensure the start and end points are equal"
          field = "(e.g. 0.000, 0.000 and 2.000, 2.000)"
          field = "Select the pulsewidth curve for each injector"


          field = "Injector A", smallpw_opt1, { smallpw_opt1_master && ((hardware_fuel) ) }
          field = "Injector B", smallpw_opt2, { smallpw_opt1_master && ((hardware_fuel) && (nInjectors > 1)) }
          field = "Injector C", smallpw_opt3, { smallpw_opt1_master && ((hardware_fuel) && (nInjectors > 2)) }
          field = "Injector D", smallpw_opt4, { smallpw_opt1_master && ((hardware_fuel) && (nInjectors > 3)) }
          field = "Injector E", smallpw_opt5, { smallpw_opt1_master && ((hardware_fuel) && (nInjectors > 4)) }
          field = "Injector F", smallpw_opt6, { smallpw_opt1_master && ((hardware_fuel) && (nInjectors > 5)) }
          field = "Injector G", smallpw_opt7, { smallpw_opt1_master && ((hardware_fuel) && (nInjectors > 6)) }
          field = "Injector H", smallpw_opt8, { smallpw_opt1_master && ((hardware_fuel) && (nInjectors > 7)) }

          field = "Injector I", smallpw_opta,  { smallpw_opt1_master && ((hardware_fuel) && (nInjectors > 8)) }
          field = "Injector J", smallpw_optb,  { smallpw_opt1_master && ((hardware_fuel) && (nInjectors > 9)) }
          field = "Injector K", smallpw_opt11, { smallpw_opt1_master && ((hardware_fuel) && (nInjectors > 10)) }
          field = "Injector L", smallpw_opt12, { smallpw_opt1_master && ((hardware_fuel) && (nInjectors > 11)) }

      dialog = smallcurveswest, "", yAxis
         panel = smallcurve0
         panel = smallcurve2

      dialog = smallcurveseast, "", yAxis
         panel = smallcurve1
         panel = smallcurve3

      dialog = smallcurves, "", xAxis
         panel = smallcurveswest
         panel = smallcurveseast

      dialog = smallpw, "Injector Small Pulsewidths", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#injsmallpw"
         panel = smallpwwest, West
         panel = smallcurves, Center



    ;   dialog = egoControl, "EGO Control"
       dialog = egoControlright, ""
          field = "Algorithm",              egoAlgorithm,       { egoType }
          field = "Use EGO Delay Table",    egoAlgorithm_delay_table, {egoType && (egoAlgorithm < 3)}
          field = "Ignition Events Per Step",  egoCount,        { egoType && (egoAlgorithm < 3) && !egoAlgorithm_delay_table}
          field = "EGO Sensor Response Time",  ego_sensor_delay, { egoType && (egoAlgorithm < 3) && egoAlgorithm_delay_table}
          field = "Controller Step Size",      egoDelta,        { egoType && (egoAlgorithm == 0) }
          field = "Use Authority Table", egoAlgorithm_auth,     { egoType }
          field = "Combined or use authority tables", egoAlgorithm_auth2, { egoType && egoAlgorithm_auth}
          field = "Controller Auth +/-",    egoLimit,           { egoType && !egoAlgorithm_auth && (egoAlgorithm < 3) }
          field = "Only Correct Above:",    ego_lower_bound,    { egoType && (egoAlgorithm < 3) }
          field = "And Correct Below:",     ego_upper_bound,    { egoType && (egoAlgorithm < 3) }
          field = "Active Above Coolant", egoTemp,              { egoType && (egoAlgorithm < 3) }
          field = "Active Above RPM",          egoRPM,          { egoType && !egoAlgorithm_auth && (egoAlgorithm < 3) }
          field = "Active Below TPS",          TPSOXLimit,      { egoType && (egoAlgorithm < 3) }
          field = "Active Below Load",          MAPOXLimit,     { egoType && !egoAlgorithm_auth && (egoAlgorithm < 3) }
          field = "Active Above Load",          MAPOXMin,       { egoType && !egoAlgorithm_auth && (egoAlgorithm < 3) }
          field = "EGO Delay After Start",     ego_startdelay,  { egoType && (egoAlgorithm < 3) }
          field = "EGO Delay After Fuel/Spark cut",     ego_limdelay,  { egoType && (egoAlgorithm < 3) }
          field = "PID Proportional Gain",  egoKP,              { egoType && (egoAlgorithm == 2) }
          field = "PID Integral",           egoKI,              { egoType && (egoAlgorithm == 2) }
          field = "PID Derivative",         egoKD,              { egoType && (egoAlgorithm == 2) }

        dialog = egoports, "",yAxis
          field = "EGO 1 Port", egoport1
          field = "EGO 2 Port", egoport2, {egonum > 1}
          field = "EGO 3 Port", egoport3, {egonum > 2}
          field = "EGO 4 Port", egoport4, {egonum > 3}
          field = "EGO 5 Port", egoport5, {egonum > 4}
          field = "EGO 6 Port", egoport6, {egonum > 5}
          field = "EGO 7 Port", egoport7, {egonum > 6}
          field = "EGO 8 Port", egoport8, {egonum > 7}
          field = "EGO 9 Port",  egoport9,  {egonum > 8}
          field = "EGO 10 Port", egoport10, {egonum > 9}
          field = "EGO 11 Port", egoport11, {egonum > 10}
          field = "EGO 12 Port", egoport12, {egonum > 11}
     
; not implemented
;       dialog = egoports_tgt, "", yAxis
;          field = "AFR target"
;          field = "", egomap1t
;          field = "", egomap2t, {egonum > 1}
;          field = "", egomap3t, {egonum > 2}
;          field = "", egomap4t, {egonum > 3}
;          field = "", egomap5t, {egonum > 4}
;          field = "", egomap6t, {egonum > 5}
;          field = "", egomap7t, {egonum > 6}
;          field = "", egomap8t, {egonum > 7}

        dialog = egoports2, "EGO ports", xAxis
           panel = egoports
    ;       panel = egoports_tgt

       dialog = egoControlleft, "", yAxis
          field = "EGO Sensor Type",           egoType
          field = "Number Of Sensors",         egonum, { egoType }
          field = "#Remember to Calibrate and set Project Properties"
            panel = egoports2

       dialog = egoControlmain, "", xAxis
            panel = egoControlright, West
            panel = egoControlleft, East

        dialog = egomap_inj, "", yAxis
          field = "Injector"
          field = "Inj A"
          field = "Inj B"
          field = "Inj C"
          field = "Inj D"
          field = "Inj E"
          field = "Inj F"
          field = "Inj G"
          field = "Inj H"
          field = "Inj I"
          field = "Inj J"
          field = "Inj K"
          field = "Inj L"

        dialog = egomap_ego, "", yAxis
          field = "- Uses Sensor"
          field = "", egomap1
          field = "", egomap2
          field = "", egomap3
          field = "", egomap4
          field = "", egomap5
          field = "", egomap6
          field = "", egomap7
          field = "", egomap8

          field = "", egomap9
          field = "", egomap10
          field = "", egomap11
          field = "", egomap12

        dialog = egomap_fo, "",yAxis
          field = "Cylinder"
        field = "$stringValue( firea )", 
        field = "$stringValue( fireb )", {0}, {1}, { nCylinders > 1}
        field = "", {0}, {1}, { !(nCylinders > 1)}
        field = "$stringValue( firec )", {0}, {1}, { nCylinders > 2}
        field = "", {0}, {1}, { !(nCylinders > 2)}
        field = "$stringValue( fired )", {0}, {1}, { nCylinders > 3}
        field = "", {0}, {1}, { !(nCylinders > 3)}
        field = "$stringValue( firee )", {0}, {1}, { nCylinders > 4}
        field = "", {0}, {1}, { !(nCylinders > 4)}
        field = "$stringValue( firef )", {0}, {1}, { nCylinders > 5}
        field = "", {0}, {1}, { !(nCylinders > 5)}
        field = "$stringValue( fireg )", {0}, {1}, { nCylinders > 6}
        field = "", {0}, {1}, { !(nCylinders > 6)}
        field = "$stringValue( fireh )", {0}, {1}, { nCylinders > 7}
        field = "", {0}, {1}, { !(nCylinders > 7)}
          field = "$stringValue( firei )", {0}, {1},  { nCylinders > 8}
        field = "", {0}, {1}, { !(nCylinders > 8)}
          field = "$stringValue( firej )", {0}, {1}, { nCylinders > 9}
        field = "", {0}, {1}, { !(nCylinders > 9)}
          field = "$stringValue( firek )", {0}, {1}, { nCylinders > 10}
        field = "", {0}, {1}, { !(nCylinders > 10)}
          field = "$stringValue( firel )", {0}, {1}, { nCylinders > 11}
        field = "", {0}, {1}, { !(nCylinders > 11)}

        dialog = egomapping, "AFR / EGO Sensor Mapping", xAxis
           panel = egomap_inj
           panel = egomap_ego
           panel = egomap_fo

       dialog = egoControl, "AFR / EGO Control", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#egocont"
            panel = egoControlmain, West
            panel = egomapping, East






       dialog = ignitionOptions, ""
          field = "Spark Mode (Dizzy, EDIS, Wheel)",                   spk_mode0  ; !
          field = "Trigger Angle/Offset",                triggerOffset, { (spk_mode0 != 31) && (spk_mode0 != 4)}
          field = "Angle Between Main And Return", trigret_ang, { spk_mode0 ==12}
          field = "Oddfire First Angle",           OddFireang, { (engineType == 1) && (spk_mode0 < 31) && (spk_conf2_oddodd != 3) }
          field = "HEI/GMDIS, TFI, C3I Options",     spk_conf2_gmtfi, {(spk_mode0 == 2) || (spk_mode0 == 4)}
          field = "Oddfire Phasing", spk_conf2_oddodd, { (engineType == 1) && (spk_mode0==4)}
          field = "Skip Pulses",                   no_skip_pulses
          field = "Ignition Input Capture",       ICIgnCapture  ; !
          field = "Spark Output",                 spkout_hi_lo2, {spk_mode0 != 31} ; 
          field = "Number Of Coils", spk_mode3
          field = "Spark Hardware In Use", hardware_spk
          field = "Cam Input (See tooltip)", hardware_cam, {!((spk_config_trig2 == 1) && (spk_mode0 == 4))} ; greyed in toothed wheel, single wheel
          field = "Tertiary Tach Input", spk_mode3_tach3, {spk_mode0 == 47}
          field = "Flip Polarity On Hi-Res Tach / Cam", spk_mode3_hirespol, { (spk_mode0 != 4) }

      dialog = moreIgnitionOptions, ""
          field = "Fixed Advance",                     timing_flags
          field = "Use Prediction",                use_prediction
          field = "Timing for Fixed Advance",      fixed_timing, { timing_flags == 1 };
          field = "Cranking Dwell",                    crank_dwell
          field = "Cranking Advance",          crank_timing, {!(spk_mode0 == 2 && triggerOffset < 20) }
          field = ""
          field = "Toyota Multiplex",     spk_conf2_dli, {spk_mode0 > 2}
          field = "Dwell type",                    dwellmode
          field = "Use Dwell vs Rpm Curve", spk_conf2_dwell, {dwellmode ==2}
          field = "Use Dwell Table", spk_conf2_dwelltbl, {dwellmode ==0}
          field = "Nominal Dwell",        max_coil_dur, {(spk_mode0 >1) && (dwellmode==0) && (spk_conf2_dwelltbl==0)}
          field = "Spark Duration",        max_spk_dur, {(spk_mode0 >1) && (dwellmode==0) }
          field = "Dwell Time",                    dwelltime, {(spk_mode0 >1) && (dwellmode==2) && (spk_conf2_dwell==0)}
          field = "Dwell Duty",                    dwellduty, {(spk_mode0 >1) && (dwellmode==1) }
          field = "NOTE: Spark hardware latency should ONLY be used if"
          field = "you notice spark retard with increasing rpms."
          field = "Spark Hardware Latency",               hw_latency
          field = "Middle LED indicator",          feature4_0igntrig, { (spk_mode0 == 3) }
          field = "Spark Trim", spk_mode3_trim
          field = "Kick-start crank delay", spk_mode3_kick,  { ((spk_mode0 == 2) && (triggerOffset < 20)) || (spk_mode0 == 3) }
          field = "Delay", kickdelay,  { spk_mode3_kick && (((spk_mode0 == 2) && (triggerOffset < 20)) || (spk_mode0 == 3)) }
           
      dialog = triggerWheel, ""
          field = "Trigger Wheel Arrangement",     spk_config_trig2, { spk_mode0 == 4 }
          field = "Trigger Wheel Teeth",          triggerTeeth, { (spk_mode0 == 4) || (spk_mode0 == 47) }
          field = "Missing Teeth",                No_Miss_Teeth, {(spk_config_trig2 != 2) && (spk_mode0 == 4)}
          field = "Tooth #1 Angle",     Miss_ang, { (spk_mode0 == 4) || (spk_mode0 == 47) }
          field = "Main Wheel Speed",                   spk_config_camcrank, { (spk_mode0 == 4) || ((spk_mode0 == 14) && (nCylinders == 2))}
          field = "Second Trigger Active On",      spk_config_trig2l, {(spk_config_trig2 & 0x2) && spk_mode0 == 4}
          field = "Level For Phase 1", spk_config_campol, {(spk_mode0 == 25) || ((spk_config_trig2l & 0x3) == 0x3) && (spk_mode0 == 4) && (spk_config_trig2 == 3)}
          field = "Check At Tooth#", poll_level_tooth, {((spk_config_trig2l & 0x3) == 0x3) && (spk_mode0 == 4) && (spk_config_trig2 == 3)}
          field = "And Every Rotation Of..", spk_config_resetcam, {((spk_config_trig2 & 0x3) == 0x2) && spk_mode0 == 4}
          field = "Start wasted COP", spk_mode3_wasted, { (spk_mode0 == 4) && (spk_config_trig2 == 3) }
          field = "High RPM fuel/spark delay after sync-loss", feature4_0resyncdel, { (spk_mode0 == 4) }
          field = "RPM threshold", resyncdel_rpm, { (spk_mode0 == 4) && feature4_0resyncdel }

     dialog = padignition
            field = ""

     dialog = westIgnitionOptions, "", yAxis
            panel = ignitionOptions
            panel = triggerWheel

     dialog = oddfireangles1, ""
            field = "Custom Oddfire Angles In Sequence From #1"

     dialog = oddfireangles3, "", xAxis
            field = "1st", oddfireangs1, {(spk_conf2_oddodd == 3) && (engineType == 1) && (spk_mode0==4)}
            field = "2nd", oddfireangs2, {(spk_conf2_oddodd == 3) && (engineType == 1) && (spk_mode0==4)}

     dialog = oddfireangles5, "", xAxis
            field = "3rd", oddfireangs3, {(spk_conf2_oddodd == 3) && (engineType == 1) && (spk_mode0==4)}
            field = "4th", oddfireangs4, {(spk_conf2_oddodd == 3) && (engineType == 1) && (spk_mode0==4)}

     dialog = eastIgnitionOptions, "", yAxis
            panel = moreIgnitionOptions
            panel = oddfireangles1
            panel = oddfireangles3
            panel = oddfireangles5

     dialog = IgnitionOptions_join, "", xAxis
            panel = westIgnitionOptions
            panel = eastIgnitionOptions

       dialog = combinedignition, "Ignition Options / Wheel Decoder", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#ignopts"
           ; panel = westIgnitionOptions, West
            panel = IgnitionOptions_join, Center

       dialog = northwestidle, "", yAxis
          field = "Idle Valve Type",               IdleCtl
          field = "Algorithm",                     IdleCtl_alg, {IdleCtl > 1}

       dialog = northeastidle, "", yAxis
          field = "Fast Idle Temperature",         fastIdleT,    { IdleCtl == 1 }
          field = "Hysteresis",                    IdleHyst,     { IdleCtl == 1 }

       dialog = westidle, "Stepper Idle"
          field = "Time Step Size",                IACtstep,     { IdleCtl == 3 }
          field = "Initial Time Step Size",        IAC_tinitial_step,   { IdleCtl == 3 }
          field = "Minimum # Steps To Move",       IACminstep,  { IdleCtl == 3 }
          field = "Homing Steps",                  IACStart,     { IdleCtl == 3 }
          field = "Homing Direction",              IdleCtl_home,  { IdleCtl == 3 }
          field = "Wide Open Steps",               iacfullopen,   { IdleCtl_home && (IdleCtl == 3) }
          field = "Crank-to-Run Taper Time",       IACcrankxt,   { (IdleCtl == 3) && (IdleCtl_alg == 0) }
          field = "Power Between Steps",           IACcurlim,    { IdleCtl == 3 }

       dialog = eastidle, "PWM Idle"
          field = "Crank-to-Run Taper Time", pwmidlecranktaper, { (IdleCtl == 2) || (IdleCtl == 4) }
          field = ""
          field = "Valve mode",      pwmidleset_inv, { IdleCtl == 2 }
          field = "Run Valve Before Start", pwmidle_freq_koeo, { IdleCtl == 2 }
          field = "Output Port", pwmidle_freq_pin, { (IdleCtl == 1) || (IdleCtl == 2) }
          field = "3 Wire Mode", pwmidle_freq_pin3, { IdleCtl == 2 }

          field = "Frequency", pwmidle_freq_scale, { IdleCtl == 2 }
          field = "This frequency may be shared with boost control"

       dialog = northidle, "", border
            panel = northwestidle, West
            panel = northeastidle, East

       dialog = southidle, "", border
            panel = westidle, West
            panel = eastidle, East

       dialog = combinedidle, "Idle Control", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#idle"
            panel = northidle, North
            panel = southidle, South

       dialog = pwmidle_closedloop_pwm, "Closed-Loop Idle Valve Settings"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#clidle"
          field = "Idle Valve Minimum Duty",          pwmidle_closed_duty, { ((IdleCtl == 2) || (IdleCtl == 4)) && (IdleCtl_alg == 1) }
          field = "Idle Valve Maximum Duty",                  pwmidle_open_duty, { ((IdleCtl == 2) || (IdleCtl == 4)) && (IdleCtl_alg == 1) }
          field = "Dashpot Adder",  pwmidle_dp_adder, { ((IdleCtl == 2) || (IdleCtl == 4)) && (IdleCtl_alg == 1) }
          field = "Use Last Value or Table", pwmidle_cl_opts_initvaluetable
          field = "Use CLT Or MAT In Table Lookup", pwmidle_cl_opts_initval_clt, { pwmidle_cl_opts_initvaluetable }
          field = "Close Delay (0 Means Do Not Close)", pwmidle_close_delay
          field = "Open valve on WOT", pwmidle_flags_wot, { ((IdleCtl == 2) || (IdleCtl == 4)) && (IdleCtl_alg == 1) }
          field = "Shift Settings"
          field = "Leave Valve Closed Above:", pwmidle_shift_lower_rpm, { pwmidle_close_delay > 0 }
          field = "For This Number Of Seconds:", pwmidle_shift_open_time, { pwmidle_close_delay > 0 }

       dialog = pwmidle_closedloop_stepper, "Closed-Loop Idle Valve Settings"
          field = "Idle Valve Minimum Steps",         pwmidle_closed_steps, { (IdleCtl == 3) }
          field = "Idle Valve Maximum Steps",               pwmidle_open_steps, { (IdleCtl == 3)  } 
          field = "Dashpot Adder",  pwmidle_dp_adder_steps
          field = "Use Last Value Or Table", pwmidle_cl_opts_initvaluetable
          field = "Use CLT Or MAT In Table Lookup", pwmidle_cl_opts_initval_clt, { pwmidle_cl_opts_initvaluetable }
          field = "Close Delay (0 Means Do Not Close)", pwmidle_close_delay
          field = "Open valve on WOT", pwmidle_flags_wot, { (IdleCtl == 3) }
          field = "Shift Settings"
          field = "Leave Valve Closed Above:", pwmidle_shift_lower_rpm, { pwmidle_close_delay > 0 }
          field = "For This Number Of Seconds:", pwmidle_shift_open_time, { pwmidle_close_delay > 0 }

       dialog = pwmidle_closedloop, "", card
        panel = pwmidle_closedloop_pwm, Center, { (IdleCtl == 2) || (IdleCtl == 4) }
        panel = pwmidle_closedloop_stepper, Center, { IdleCtl == 3 }


       dialog = pwmidle_PID_gains, "Closed-Loop Idle PID Gains"
          slider = "Closed-Loop Sensitivity", pwmidle_max_rpm_new, horizontal
          field = "Tuning Mode", pwmidle_cl_opts_display_pid
          field = "Proportional Gain",    pwmidle_Kp_new, { pwmidle_cl_opts_display_pid }
          field = "Integral Gain",        pwmidle_Ki_new, { pwmidle_cl_opts_display_pid }
          field = "Derivative Gain",      pwmidle_Kd_new, { pwmidle_cl_opts_display_pid } 

       dialog = pwmidle_PID_behavior, "Closed-Loop Idle PID Delays And Behavior"
          field = "PID Delay",            pwmidle_pid_wait_timer
          field = "Crank To Run Taper",   pwmidlecranktaper 
          field = "PID Ramp To Target Time", pwmidle_targ_ramptime
          field = "PID Control Interval", pwmidle_ms

       dialog = pwmidle_empty, ""
            field = "See also Engine State Settings."
            field = ""
            field = ""
            field = ""
            field = ""
            field = ""

          dialog = pwmidle_west_panel, "", yAxis
            panel = pwmidle_closedloop
            panel = pwmidle_PID_gains

         dialog = pwmidle_mid_panel, "", yAxis
            panel = pwmidle_PID_behavior
            panel = pwmidle_empty

          dialog = combinedCLidle, "Closed-Loop Idle Settings", xAxis
            panel = pwmidle_west_panel
            panel = pwmidle_mid_panel

; first accel page
      dialog = accelsettings, "Accel Enrich Settings"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#aeset"
          field = "Use Time-Based or Accel-Pump Accel", AE_options
          field = "Wall-Wetting AE (EAE, X-tau)", EAEOption
          field = "TPSdot Uses %WOT", feature7_aetpswot
          field = "X-Tau MAPdot Thresholds for transition to X, Tau Decel Tables"
          field = "Start Transition",  MapThreshXTD, {EAEOption > 2}
          field = "Finish Transition",  MapThreshXTD2, {EAEOption > 2}

;time based AE
       dialog = time_ae_south_west, ""
           field = "Accel MAPdot threshold", mapThresh
           field = "End Pulsewidth", aeEndPW
           field = "Time Or Ignition Events", feature7_aeevents
           field = "Accel Duration", tpsasync_events, { feature7_aeevents }
           field = "Accel Taper", tpsasync2_events, { feature7_aeevents }
           field = "Accel Time", taeTime, { !feature7_aeevents }
           field = "Accel Taper Time", aeTaperTime, { !feature7_aeevents }

       dialog = time_ae_south_east, ""
           field = "Accel TPSdot Threshold", tpsThresh
           field = "Decel Fuel Amount", tdePct
           field = "Cold Accel Adder", taeColdA
           field = "Cold Accel Multiplier", taeColdM
          field = "Accel Enrich Down-Scaling With RPM"
          field = "Full Accel Below:",      ae_lorpm, { !feature7_aeevents }
          field = "Zero Accel Above:",      ae_hirpm, { !feature7_aeevents }

       dialog = time_ae_south_south, "", xAxis
        panel = time_ae_south_west
        panel = time_ae_south_east
        
       dialog = time_ae_south, "", yAxis
        liveGraph = timeaeGraph, "AE Graph", South
            graphLine = afr1
            graphLine = TPSdot, "%", -2000, 2000, auto, auto
            graphLine = MAPdot, "%", -2000, 2000, auto, auto
        panel = time_ae_south_south

       dialog = time_ae_mid, ""
        slider = "Accel Enrichment MAPdot<->TPSdot Blend.", tpsProportion, horizontal

       dialog = time_ae_north, "", xAxis
           panel = time_accel_mapdot_curve, West, {tpsProportion < 100}
           panel = time_accel_tpsdot_curve, East, {tpsProportion > 0}

       dialog = AEtime_settings, "Time-Based Accel Enrichment", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#aetime"
           panel = time_ae_north
           panel = time_ae_mid
           panel = time_ae_south

;accel-pump

       dialog = pump_ae_south_west, ""
           field = "Accel MAPdot Threshold", accel_mapdot_threshold, { accel_blend_percent < 100 }
           field = "Accel TPSdot Threshold", accel_tpsdot_threshold, { accel_blend_percent > 0 }
           field = "Cold Accel Multiplier", accel_CLT_multiplier

       dialog = pump_ae_south_east, ""
          field = "Accel Enrich Down-Scaling With RPM"
          field = "Full Accel Below:",      ae_lorpm, { !feature7_aeevents }
          field = "Zero Accel Above:",      ae_hirpm, { !feature7_aeevents }

       dialog = pump_ae_south_south, "", xAxis
        panel = pump_ae_south_west
        panel = pump_ae_south_east
        
       dialog = pump_ae_south, "", yAxis
        liveGraph = pump_ae_Graph, "AE Graph", South
            graphLine = afr1
            graphLine = TPSdot, "%", -2000, 2000, auto, auto
            graphLine = MAPdot, "%", -2000, 2000, auto, auto
        panel = pump_ae_south_south

       dialog = pump_ae_north, "", xAxis
           panel = pump_accel_mapdot_curve, West, {accel_blend_percent < 100}
           panel = pump_accel_tpsdot_curve, East, {accel_blend_percent > 0}

       dialog = pump_ae_mid, ""
        slider = "Accel Enrichment MAPdot<->TPSdot Blend.", accel_blend_percent, horizontal

       dialog = AEpump_settings, "Accel-Pump Accel Enrichment", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#accelpump"
           panel = pump_ae_north
           panel = pump_ae_mid
           panel = pump_ae_south

;time based AE (2)
       dialog = time_ae_south_west2, ""
           field = "Accel MAPdot threshold", mapThresh2
           field = "End Pulsewidth", aeEndPW2
           field = "Time Or Ignition Events", feature7_aeevents
           field = "Accel Duration", taeTime_events2, { feature7_aeevents }
           field = "Accel Taper", aeTaperTime_events2, { feature7_aeevents }
           field = "Accel Time", taeTime2, { !feature7_aeevents }
           field = "Accel Taper Time", aeTaperTime2, { !feature7_aeevents }

       dialog = time_ae_south_east2, ""
           field = "Accel TPSdot Threshold", tpsThresh2
           field = "Decel Fuel Amount", tdePct2
           field = "Cold Accel Adder", taeColdA2
           field = "Cold Accel Multiplier", taeColdM2
          field = "Accel Enrich Down-Scaling With RPM"
          field = "Full Accel Below:",      ae_lorpm2, { !feature7_aeevents }
          field = "Zero Accel Above:",      ae_hirpm2, { !feature7_aeevents }

       dialog = time_ae_south_south2, "", xAxis
        panel = time_ae_south_west2
        panel = time_ae_south_east2
        
       dialog = time_ae_south2, "", yAxis
        liveGraph = timeaeGraph2, "AE Graph", South
            graphLine = afr1
            graphLine = TPSdot, "%", -2000, 2000, auto, auto
            graphLine = MAPdot, "%", -2000, 2000, auto, auto
        panel = time_ae_south_south2

       dialog = time_ae_mid2, ""
        slider = "Accel Enrichment MAPdot<->TPSdot Blend.", tpsProportion2, horizontal

       dialog = time_ae_north2, "", xAxis
           panel = time_accel_mapdot_curve2, West, {tpsProportion2 < 100}
           panel = time_accel_tpsdot_curve2, East, {tpsProportion2 > 0}

       dialog = AEtime_settings2, "Time-Based Accel Enrichment", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#aetime"
           panel = time_ae_north2
           panel = time_ae_mid2
           panel = time_ae_south2

;accel-pump (2)

       dialog = pump_ae_south_west2, ""
           field = "Accel MAPdot Threshold", accel_mapdot_threshold2, { accel_blend_percent < 100 }
           field = "Accel TPSdot Threshold", accel_tpsdot_threshold2, { accel_blend_percent > 0 }
           field = "Cold Accel Multiplier", accel_CLT_multiplier2

       dialog = pump_ae_south_east2, ""
          field = "Accel Enrich Down-Scaling With RPM"
          field = "Full Accel Below:",      ae_lorpm2, { !feature7_aeevents }
          field = "Zero Accel Above:",      ae_hirpm2, { !feature7_aeevents }

       dialog = pump_ae_south_south2, "", xAxis
        panel = pump_ae_south_west2
        panel = pump_ae_south_east2
        
       dialog = pump_ae_south2, "", yAxis
        liveGraph = pump_ae_Graph2, "AE Graph", South
            graphLine = afr1
            graphLine = TPSdot, "%", -2000, 2000, auto, auto
            graphLine = MAPdot, "%", -2000, 2000, auto, auto
        panel = pump_ae_south_south2

       dialog = pump_ae_north2, "", xAxis
           panel = pump_accel_mapdot_curve2, West, {accel_blend_percent2 < 100}
           panel = pump_accel_tpsdot_curve2, East, {accel_blend_percent2 > 0}

       dialog = pump_ae_mid2, ""
        slider = "Accel Enrichment MAPdot<->TPSdot Blend.", accel_blend_percent2, horizontal

       dialog = AEpump_settings2, "Accel-Pump Accel Enrichment 2", yAxis
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#accelpump"
           panel = pump_ae_north2
           panel = pump_ae_mid2
           panel = pump_ae_south2

       dialog = sensorCal, "Calibrate MAP/Baro"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#calmapbaro"
          field = "#MAP Sensor"
#if INI_VERSION_2
          settingSelector = "Common MAP Sensors"
             settingOption = "MPX4115",  map0=10.6, mapmax=121.7
             settingOption = "MPX4250",  map0=10,   mapmax=260
             settingOption = "GM 1-BAR", map0=10,   mapmax=105
             settingOption = "GM 2-BAR", map0=8.8,  mapmax=208
             settingOption = "GM 3-BAR / MPXH6300", map0=1.1,  mapmax=315.5
             settingOption = "MPXH6400", map0=3.5,  mapmax=416.5
             settingOption = "AEM 3.5 BAR", map0=-42.3,  mapmax=386.3
             settingOption = "AEM 5.0 BAR", map0=-64.6,  mapmax=581.7
#endif
          field =    "Value At 0.0 Volts",   map0
          field =    "Value At 5.0 Volts",   mapmax

          field = "#Barometer Sensor (usually identical to MAP)"
#if INI_VERSION_2
          settingSelector = "Common Baro Sensors"
             settingOption = "MPX4115",   baro0=10.6, baromax=121.7
             settingOption = "MPX4250",  baro0=10,   baromax=260
             settingOption = "GM 1-BAR", baro0=10,   baromax=105
             settingOption = "GM 2-BAR", baro0=8.8,  baromax=208
             settingOption = "GM 3-BAR / MPXH6300",baro0=1.1,  baromax=315.5
             settingOption = "MPXH6400", baro0=3.5,  baromax=416.5
             settingOption = "AEM 3.5 BAR", map0=-42.3,  mapmax=386.3
             settingOption = "AEM 5.0 BAR", map0=-64.6,  mapmax=581.7
#endif
          field =    "Value At 0.0 Volts",   baro0
          field =    "Value At 5.0 Volts",   baromax

          field = "#Barometric Correction"
          field =    "At Total Vacuum",     bcor0
          field =    "Rate",                 bcormult

       dialog = knockSettings3, "Knock Sensor Settings"
          field = "Knock Control",        knk_option
          field = "Input Type",           knk_option_an, { knk_option }
          field = "Knock Input Pin",      knkport, { knk_option && !knk_option_an }
          field = "Knock Indicated By:",  knkDirection,   { knk_option && !knk_option_an }
          field = "Pullup/Down On Input",  knkpull,   { knk_option && !knk_option_an }
          field = "Input Pin",      knkport_an, { knk_option && (knk_option_an == 1) }
          field = "Window Sample Type",  knk_option_wind, { knk_option && (knk_option_an == 1) }
          field = "Window Output",       knk_pin_out, { knk_option && (knk_option_an < 2) }
        field = "Monitor Per Cylinder", knock_conf_percyl, { knk_option > 0 }
        field = "Control Per Cylinder", knock_conf_percylact, { knk_option > 0 }
        field = "DEBUG data", knock_conf_debug, { knk_option > 0 }
          field = "#Detection"
          field = "Knock Count",          knk_ndet,       { knk_option > 0 }
          field = "Knock Ignored Above MAP",   knk_maxmap,     { knk_option > 0 }
          field = "RPM Window Low",   knk_lorpm,      { knk_option > 0 }
          field = "RPM Window High",   knk_hirpm,      { knk_option > 0 }
          field = "Ignore During Launch/Flatshift", knock_conf_launch, { knk_option > 0 }
          field = "#Retarding"
          field = "Maximum Retard",       knk_maxrtd,     { knk_option > 0 }
          field = "Retard Check Time",    knk_trtd,       { knk_option > 0 }
          field = "Retard Coarse Step Size",   knk_step1,      { knk_option > 0 }
          field = "Retard Fine Step Size",     knk_step2,      { knk_option > 0 }
          field = "#Recovery"
          field = "Advance Check Time",   knk_tadv,       { knk_option > 0 }
          field = "Advance Step Size",    knk_step_adv,   { knk_option > 0 }
          field = "Recovery Advance",     knk_dtble_adv,  { knk_option == 1 }

        dialog = ks4a, "", yAxis
            field = "Cyl#"
            field = "1"
            field = "2"
            field = "3"
            field = "4"
            field = "5"
            field = "6"
            field = "7"
            field = "8"
            field = "9"
            field = "10"
            field = "11"
            field = "12"
        dialog = ks4b, "", yAxis

            field = "Gain"
            field = "", knock_gain01
            field = "", knock_gain02, {knock_conf_percyl && (nCylinders >1)}
            field = "", knock_gain03, {knock_conf_percyl && (nCylinders >2)}
            field = "", knock_gain04, {knock_conf_percyl && (nCylinders >3)}
            field = "", knock_gain05, {knock_conf_percyl && (nCylinders >4)}
            field = "", knock_gain06, {knock_conf_percyl && (nCylinders >5)}
            field = "", knock_gain07, {knock_conf_percyl && (nCylinders >6)}
            field = "", knock_gain08, {knock_conf_percyl && (nCylinders >7)}
            field = "", knock_gain09, {knock_conf_percyl && (nCylinders >8)}
            field = "", knock_gain10, {knock_conf_percyl && (nCylinders >9)}
            field = "", knock_gain11, {knock_conf_percyl && (nCylinders >10)}
            field = "", knock_gain12, {knock_conf_percyl && (nCylinders >11)}

        dialog = ks4c, "", yAxis
            field = "Sensor"
            field = "", knock_sens01
            field = "", knock_sens02, {knock_conf_percyl && (nCylinders >1)}
            field = "", knock_sens03, {knock_conf_percyl && (nCylinders >2)}
            field = "", knock_sens04, {knock_conf_percyl && (nCylinders >3)}
            field = "", knock_sens05, {knock_conf_percyl && (nCylinders >4)}
            field = "", knock_sens06, {knock_conf_percyl && (nCylinders >5)}
            field = "", knock_sens07, {knock_conf_percyl && (nCylinders >6)}
            field = "", knock_sens08, {knock_conf_percyl && (nCylinders >7)}
            field = "", knock_sens09, {knock_conf_percyl && (nCylinders >8)}
            field = "", knock_sens10, {knock_conf_percyl && (nCylinders >9)}
            field = "", knock_sens11, {knock_conf_percyl && (nCylinders >10)}
            field = "", knock_sens12, {knock_conf_percyl && (nCylinders >11)}
        dialog = ks4bot, "", xAxis
        panel = ks4a
        panel = ks4b
        panel = ks4c

       dialog = ks4top, ""
        field = "Bandpass Frequency (kHz)", knock_bpass
        field = "Integrator Time constant (us)", knock_int
        field = "Number of Sensors", knock_conf_num
        field = "Monitor Per Cylinder", knock_conf_percyl
        field = "Knock gain:"

       dialog = knockSettings4, "Knock Sensor Parameters", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#knockparam"
            panel = ks4top, North
            panel = ks4bot, South

       dialog = knockSettings, "Knock Sensor Settings", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#knock"
            panel = knockSettings3, West
            panel = knockthresh_curve, Center

       dialog = knockSettings2, "Knock Window Settings", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#knockwindow"
            panel = knockstart_curve, North
            panel = knockduration_curve, South

        dialog = idleAdvancemenu, "Idle Advance Settings"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#idleadv"
          field = "Idle Advance On", idleadvance_on
          field = "Idle RPM Timing Correction", idle_special_ops_timing_assist
          field = "Go to idle advance/Idle RPM timing correction when:"
          field = "PID Idle Activates", idleveadv_to_pid_idleadv, { idleadvance_on || idle_special_ops_timing_assist }
          field = "Engine idle state and:"
          field = "And CLT Is Above:", idleadvance_clt, { (idleadvance_on || idle_special_ops_timing_assist) && !idleveadv_to_pid_idleadv }
          field = "And After Delay:", idleadvance_delay, { (idleadvance_on || idle_special_ops_timing_assist) && !idleveadv_to_pid_idleadv }
          field = "Engine States must be configured."

    dialog = idleAdvance, "Idle Advance Settings", border
          panel = idleAdvancemenu, West
          panel = idleAdvance_curve, Center

        dialog = idleVemenu,  "Idle VE settings"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#idleve"
           field = "Idle VE On", idleve_on
           field = "Go to idle VE when:"
           field = "PID Idle Activates", idleveadv_to_pid_idleve, { idleve_on }
           field = "Engine idle state and:"
           field = "And CLT Is Above:", idleve_clt, { idleve_on && !idleveadv_to_pid_idleve }
           field = "And After Delay:", idleve_delay, { idleve_on && !idleveadv_to_pid_idleve }
           field = "Engine States must be configured."

         dialog = idleVeTables_n, "Idle VE Table"
           panel = idleve1Tbl, North, { idleve_on }

         dialog = idleVeTables_s, "Idle VE Table - Dual Fuel"
           panel = idleve2Tbl, South, { idleve_on && dualfuel_sw_on }

         dialog = idleVeTables, "", yAxis
           panel = idleVeTables_n
           panel = idleVeTables_s

         dialog = idleVe, "Idle VE", border 
           panel = idleVemenu, West 
           panel = idleVeTables, Center 

    dialog = setbaud, "ECU Baud Rate"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#baud"
          field = "#The ECU baud rate should normally be 115200"
          field = "ECU Baud Rate", baud
          field = "9600, 19200, 38400, 57600, 115200 only"
          field = "!Non-standard baud - ECU will lose comms!", {0}, {1}, { baud != 115200 }
          field = "SDcard Readback Baud Rate", baudhigh
          field = "115200, 230400 or 460800 only"
          field = "!Invalid baud", {0}, {1}, { (baudhigh != 115200) && (baudhigh != 230400) && (baudhigh != 460800) }
          field = ""
          field = "Set these, then Burn. ECU will lose comms."
          field = "Then set Baud rate in Communications->Settings the same."
          field = ""
          field = "Use High Speed Runtime", scatterRuntimeEnabled

    dialog = userdefined, "User Defined Menu"
          field = "Feature Enabled", user_conf0
          field = "Mode", user_conf1, { user_conf0 }  ; <---- this bit here greys the control out if the bit isn't set
          field = "Value 1", user_value1, { user_conf0 }
          field = "Value 2", user_value2, { user_conf0 }

    dialog = generic_pid_left_a, ""
        field = "Enable", generic_pid_flags_a_on 
        field = "Closed-loop (PID) type", generic_pid_flags_a_type, { generic_pid_flags_a_on }
        channelSelector= "Load Axis", generic_pid_load_offset_a, generic_pid_load_size_a, { generic_pid_flags_a_on } 
        channelSelector= "Feedback Input Variable (PV)", generic_pid_PV_offset_a, generic_pid_PV_size_a, { generic_pid_flags_a_on }
        field = "Max Feedback Input", generic_pid_upper_inputlim_a, { generic_pid_flags_a_on }
        field = "Min Feedback Input", generic_pid_lower_inputlim_a, { generic_pid_flags_a_on }
        field = "Control Output Port/Pin", generic_pid_pwm_outs_a, { generic_pid_flags_a_on } 
        field = "Frequency" , generic_pid_pwm_opts_freq_a, { generic_pid_flags_a_on } 
        field = "Max Control Output", generic_pid_output_upperlim_a, { generic_pid_flags_a_on }
        field = "Min Control Output", generic_pid_output_lowerlim_a, { generic_pid_flags_a_on }
        field = "Output Polarity", generic_pid_flags_a_direction, { generic_pid_flags_a_on }
;        field = "Generic PID direction", generic_pid_flags_a_direction, { generic_pid_flags_a_on }
;        field = "Generic PID use stepper", generic_pid_flags_a_output_type, { generic_pid_flags_a_on }
;        field = "Generic PID use table or curve", generic_pid_flags_a_lookup_type, { generic_pid_flags_a_on }
        field = "Control Interval", generic_pid_control_interval_a, { generic_pid_flags_a_on }
        field = "P Term", generic_pid_P_a, { generic_pid_flags_a_on }
        field = "I Term", generic_pid_I_a, { generic_pid_flags_a_on }
        field = "D Term", generic_pid_D_a, { generic_pid_flags_a_on }
        field = "CLT/MAT Units", sensor_temp, {0}

    dialog = generic_pid_curve_grapha, "", card
        panel = generic_pid_Tbl_a, Center, { generic_pid_flags_a_on }

    dialog = generic_pid_a, "Generic Closed-Loop A", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#gencl"
        panel = generic_pid_left_a, West
        panel = generic_pid_curve_grapha, Center

    dialog = generic_pid_left_b, ""
        field = "Enable", generic_pid_flags_b_on 
        field = "Closed-Loop (PID) Type", generic_pid_flags_b_type, { generic_pid_flags_b_on }
        channelSelector= "Load Axis", generic_pid_load_offset_b, generic_pid_load_size_b, { generic_pid_flags_b_on } 
        channelSelector= "Feedback Input Variable (PV)", generic_pid_PV_offset_b, generic_pid_PV_size_b, { generic_pid_flags_b_on }
        field = "Max Feedback Input", generic_pid_upper_inputlim_b, { generic_pid_flags_b_on }
        field = "Min Feedback Input", generic_pid_lower_inputlim_b, { generic_pid_flags_b_on }
        field = "Control Output Port/Pin", generic_pid_pwm_outs_b, { generic_pid_flags_b_on } 
        field = "Frequency" , generic_pid_pwm_opts_freq_b, { generic_pid_flags_b_on } 
        field = "Max Control Output", generic_pid_output_upperlim_b, { generic_pid_flags_b_on }
        field = "Min Control Output", generic_pid_output_lowerlim_b, { generic_pid_flags_b_on }
        field = "Output Polarity", generic_pid_flags_b_direction, { generic_pid_flags_b_on }
;        field = "Generic PID direction", generic_pid_flags_b_direction, { generic_pid_flags_b_on }
;        field = "Generic PID use stepper", generic_pid_flags_b_output_type, { generic_pid_flags_b_on }
;        field = "Generic PID use table or curve", generic_pid_flags_b_lookup_type, { generic_pid_flags_b_on }
        field = "Control Interval", generic_pid_control_interval_b, { generic_pid_flags_b_on }
        field = "P Term", generic_pid_P_b, { generic_pid_flags_b_on }
        field = "I Term", generic_pid_I_b, { generic_pid_flags_b_on }
        field = "D Term", generic_pid_D_b, { generic_pid_flags_b_on }
        field = "CLT/MAT Units", sensor_temp, {0}

    dialog = generic_pid_curve_graphb, "", card
        panel = generic_pid_Tbl_b, Center, { generic_pid_flags_b_on }

    dialog = generic_pid_b, "Generic Closed-Loop B", border
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#gencl"
        panel = generic_pid_left_b, West
        panel = generic_pid_curve_graphb, Center

    ;-------------------------------------------------------------------------------
    ; General help text

       help = helpGeneral, "MS33 General Help"
        webHelp = "http://www.msextra.com/"
        text = "For current documentation, click the Web Help button,"
        text = "or visit http://www.msextra.com/."
        text = "<br>"
        text = "<br>MS3 firmware is copyright and is only licensed for use on approved hardware."
        text = "<br>See the LICENSE text supplied with your firmware."
        text = "<br>"
        text = "<br>To see legal MS3 ECUs, visit http://www.msextra.com/doc/general/whatmegasquirt.html"

    ;-------------------------------------------------------------------------------
#if INI_VERSION_2
    [PortEditor]
        ; spare ports
        ; map the arrays and supply the labels. 
        ; all arrays are expected to be the same length in the first dimension
        ; thus a [ 7] array will be 7 ports in length and expect 7 labels
        ; The second dimension will drive the number of conditions per array.
        ; thus a [7x2] array will have 2 conditions joined by the conditionRelationship.
        ; a [7x3] will have up to 3 conditions.
        portEditor = ms3_port_edit1, "Programmable On/Off Outputs "
        ;psEnabled
            ; 1st the array constant, then the labels in the index order. 
            enabledPorts = psEnabled, "INVALID", "INVALID", "INVALID", "Stepper Out 2", "Stepper Out 1", "INVALID", "PWM Out 2", "High Current Out 3", "High Current Out 1", "High Current Out 2", "PWM Out 3", "PWM / Idle Out 1", "Injector Out I", "Injector Out J", "Digital Frequency In 2", "Tach Out", "Injector Out A", "Injector Out B", "Injector Out C", "Injector Out D", "Injector Out E", "Injector Out F", "Injector Out G", "Injector Out H", "Spark Out A", "Spark Out B", "Spark Out C", "Spark Out D", "Spark Out E", "Spark Out F", "Spark Out G", "Spark Out H", "Digital In Out 1",  "Digital In Out 2", "Digital In Out 3", "Digital In Out 4", "Digital In Out 5", "PWM Out 4", "PWM Out 5", "Digital Output 1 LED", "Digital Output 2", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID","INVALID", "INVALID", "INVALID"
            outputOffset = psOutOffset 
            outputSize   = psOutSize 
            operators    = psCondition, "<", "=", ">", "&" ; the actual ASCII value of the operator will be sent to the controller
            threshold    = psThreshold
            hysteresis   = psHysteresis
            powerOnValue = psInitValue
            triggerValue = psPortValue
            conditionRelationship = psConnector, " ", "|", "&"
            activateOption = extendedDataInSize
            activateOption = filter32BitChannels

        portEditor = ms3_port_edit2, "Programmable On/Off Outputs 2"
            ; 1st the array constant, then the labels in the index order. 
            enabledPorts = psEnabled_2, "CANOUT01",  "CANOUT02", "CANOUT03", "CANOUT04", "CANOUT05", "CANOUT06", "CANOUT07", "CANOUT08", "CANOUT09", "CANOUT10", "CANOUT11", "CANOUT12", "CANOUT13", "CANOUT14", "CANOUT15", "CANOUT16", "Loop 1", "Loop 2", "Loop 3", "Loop 4", "Loop 5", "Loop 6", "Loop 7", "Loop 8"
            outputOffset = psOutOffset_2
            outputSize   = psOutSize_2 
            operators    = psCondition_2, "<", "=", ">", "&" ; the actual ASCII value of the operator will be sent to the controller
            threshold    = psThreshold_2
            hysteresis   = psHysteresis_2
            powerOnValue = psInitValue_2
            triggerValue = psPortValue_2
            conditionRelationship = psConnector_2, " ", "|", "&"
            activateOption = extendedDataInSize
            activateOption = filter32BitChannels

#endif
    ;-------------------------------------------------------------------------------

    [CurveEditor]
	curve = launch_var_curve, "Launch Limit vs. MAP"
      columnLabel = "MAP", "RPM limit"
      xAxis       =  0, 700, 7
      yAxis       = 0, 9000, 7
      xBins       = launch_var_maps
      yBins       = launch_var_rpms
 
   curve = vsslaunch_curve, "RPM Limit vs. Speed"
      columnLabel = "Speed", "RPM limit", "Retard"
      xAxis       =  0, { prefSpeedUnits == 0 ? 50 : 80 }, 9
      yAxis       = 0, {rpmhigh}, 9
;      xAxis       =  0, { prefSpeedUnits == 0 ? 50 : 80 }, 9
;      yAxis       = 0, 30, 9
      xBins       = vsslaunch_vss
      yBins       = vsslaunch_rpm
      yBins       = vsslaunch_retard

        curve = cranktaper_curvee, "Cranking Taper Curve (Events)"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#crankingtaper"
            columnLabel = "Events", "%fuel"
            xAxis       = 0, 1000, 5
            yAxis       = 0, 500, 5
            xBins       = cranktaper_timeevents
            yBins       = cranktaper_pct

        curve = cranktaper_curvet, "Cranking Taper Curve (Time)"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#crankingtaper"
            columnLabel = "Time", "%fuel"
            xAxis       = 0, 25.5, 5
            yAxis       = 0, 500, 5
            xBins       = cranktaper_time
            yBins       = cranktaper_pct

        curve = oil_curve, "Min/Max Oil Pressure vs. RPM"
            columnLabel = "RPM", "Min", "Max"
            xAxis       = 0, {rpmhigh}, 6
            yAxis       = 0, 300, 6
            xBins       = oil_rpm, rpm
            yBins       = oil_press_min, oil_pressure
            yBins       = oil_press_max
          lineLabel   = "Min. pressure"
          lineLabel   = "Max. pressure"

        curve = hpte_curve, "Enrichment vs. Time"
            columnLabel = "Time", "AFR decrease"
            xAxis       = 0, 25.5, 6
            yAxis       = 0, 3, 6
            xBins       = hpte_times
            yBins       = hpte_afrs

       curve = fp_temp_curve, "Temperature Adjustment (Primary Fuel)"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#fueltemp1"
          columnLabel = "Temperature", "adj %"
          xAxis       = -40, 220, 9
          yAxis       =  -200, 200, 6
          xBins       = fp_temps, fuel_temp1
          yBins       = fp_temp_adj

       curve = fp_press_curve, "Pressure Adjustment (Primary Fuel)"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#fuelpress1"
          columnLabel = "Differential Pressure", "adj %"
          xAxis       = 200, 600, 9
          yAxis       =  -200, 200, 6
          xBins       = fp_presss, fuel_press1
          yBins       = fp_press_adj

       curve = alternator_linearise, "Duty linearisation"
          columnLabel = "Calc", "Output"
          xAxis       = 0, 100, 7
          yAxis       = 0, 100, 7
          xBins       = alt_dutyin
          yBins       = alt_dutyout

       curve = alternator_tempcurve, "Target Charge Voltage"
          columnLabel = "Temperature", "Voltage"
          xAxis       = 0, 100, 6
          yAxis       = 12, 16, 6
          xBins       = alternator_temp
          yBins       = alternator_targvolts

       curve = alternator_outduty, "Alternator Control Duty"
          columnLabel = "Voltage", "Duty %"
          xAxis       = 12, 16, 6
          yAxis       = 0, 100, 6
          xBins       = alternator_dvolts, alt_targv
          yBins       = alternator_dutyv

       curve = alternator_outperiod, "Alternator Control Period"
          columnLabel = "Voltage", "Period ms"
          xAxis       = 12, 16, 6
          yAxis       = 0, 16, 6
          xBins       = alternator_pvolts, alt_targv
          yBins       = alternator_periodv

       curve = pwm_curve_a, "PWM curve A"
          columnLabel = "Load", ""
          xAxis       = 0, 100, 6
          yAxis       = 0, 100, 7
          xBins       = pwm_xaxis_a, pwma_load
          yBins       = pwm_yaxis_a
          size         = 300, 240

       curve = pwm_curve_b, "PWM curve B"
          columnLabel = "Load", ""
          xAxis       = 0, 100, 6
          yAxis       = 0, 100, 7
          xBins       = pwm_xaxis_b, pwmb_load
          yBins       = pwm_yaxis_b
          size         = 300, 240

       curve = pwm_curve_c, "PWM curve C"
          columnLabel = "Load", ""
          xAxis       = 0, 100, 6
          yAxis       = 0, 100, 7
          xBins       = pwm_xaxis_c, pwmc_load
          yBins       = pwm_yaxis_c
          size         = 300, 240

       curve = pwm_curve_d, "PWM curve D"
          columnLabel = "Load", ""
          xAxis       = 0, 100, 6
          yAxis       = 0, 100, 7
          xBins       = pwm_xaxis_d, pwmd_load
          yBins       = pwm_yaxis_d
          size         = 300, 240

       curve = pwm_curve_e, "PWM curve E"
          columnLabel = "Load", ""
          xAxis       = 0, 100, 6
          yAxis       = 0, 100, 7
          xBins       = pwm_xaxis_e, pwme_load
          yBins       = pwm_yaxis_e
          size         = 300, 240

       curve = pwm_curve_f, "PWM curve F"
          columnLabel = "Load", ""
          xAxis       = 0, 100, 6
          yAxis       = 0, 100, 7
          xBins       = pwm_xaxis_f, pwmf_load
          yBins       = pwm_yaxis_f
          size         = 300, 240

       curve = tc_slip_curve, "Slip Threshold vs Knob Input"
          columnLabel = "Knob Input", "%"
          xAxis       = 0, 100, 6
          yAxis       = 0, 100, 7
          xBins       = tcslipx
          yBins       = tcslipy

       curve = blend1_curve, "VE1 -> VE2"
          columnLabel = "X", "%"
          xAxis       = 0, 100, 6
          yAxis       = 0, 100, 7
          xBins       = blendx1
          yBins       = blendy1

       curve = blend2_curve, "Spk1 -> Spk2"
          columnLabel = "X", "%"
          xAxis       = 0, 100, 6
          yAxis       = 0, 100, 7
          xBins       = blendx2
          yBins       = blendy2

       curve = blend3_curve, "VE1+2 -> VE3+4"
          columnLabel = "X", "%"
          xAxis       = 0, 100, 6
          yAxis       = 0, 100, 7
          xBins       = blendx3
          yBins       = blendy3

       curve = blend4_curve, "Spk1+2 -> Spk3+4"
          columnLabel = "X", "%"
          xAxis       = 0, 100, 6
          yAxis       = 0, 100, 7
          xBins       = blendx4
          yBins       = blendy4

       curve = blend5_curve, "AFR1 -> AFR2"
          columnLabel = "X", "%"
          xAxis       = 0, 100, 6
          yAxis       = 0, 100, 7
          xBins       = blendx5
          yBins       = blendy5

       curve = blend6_curve, "Boost1 -> Boost2"
          columnLabel = "X", "%"
          xAxis       = 0, 100, 6
          yAxis       = 0, 100, 7
          xBins       = blendx6
          yBins       = blendy6

       curve = blend7_curve, "Crank % 1 -> Crank % 2"
          columnLabel = "X", "%"
          xAxis       = 0, 100, 6
          yAxis       = 0, 100, 7
          xBins       = blendx7
          yBins       = blendy7

       curve = blend8_curve, "Flex Blending"
          columnLabel = "Flex%", "Blend%"
          xAxis       = 0, 100, 6
          yAxis       = 0, 100, 7
          xBins       = blendx8
          yBins       = blendy8

       curve = tpswot_curve, "TPS for WOT"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#tpswot"
          columnLabel = "RPM", "TPS"
          xAxis       = 0, {rpmhigh}, 6
          yAxis       = 0, 100, 7
          xBins       = tpswot_rpm, rpm
          yBins       = tpswot_tps

       curve = launch_retard_time, "Timed Retard After Launch"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#timedretard"
          columnLabel = "s", "Retard"
          xAxis       = 0, 15, 6
          yAxis       = 0, 30, 7
          xBins       = launch_time, launch_timer
          yBins       = launch_retard

        curve = cl_idle_timing_curve, "Idle RPM Timing Correction Curve"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#idleadvrpm"
            columnLabel = "RPM delta", "Timing Delta"
            xAxis = -400, 400, 8
            yAxis = -20, 20, 8
            xBins = cl_idle_timing_target_deltas
            yBins = cl_idle_timing_advance_deltas

        curve = idle_voltage_comp_curve, "PWM Idle Voltage Compensation"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#idlevolt"
            columnLabel = "Voltage", "Duty"
            xAxis = 9, 17, 6
            yAxis = -10, 10, 6
            xBins = idle_voltage_comp_voltage
            yBins = idle_voltage_comp_delta

;time-based
        curve = time_accel_mapdot_curve, "MAP based AE"
            columnLabel = "MAPdot", "Added"
            xAxis = 0, 1200, 6
            yAxis = 0, 48, 4
            xBins = maeRates, MAPdot
            yBins = maeBins

;time-based
        curve = time_accel_tpsdot_curve, "TPS based AE"
            columnLabel = "TPSdot", "Added"
            xAxis = 0, 1200, 6
            yAxis = 0, 48, 4
            xBins = taeRates, TPSdot
            yBins = taeBins

;time-based2
        curve = time_accel_mapdot_curve2, "MAP based AE"
            columnLabel = "MAPdot", "Added"
            xAxis = 0, 1200, 6
            yAxis = 0, 48, 4
            xBins = maeRates2, MAPdot
            yBins = maeBins2

;time-based2
        curve = time_accel_tpsdot_curve2, "TPS based AE"
            columnLabel = "TPSdot", "Added"
            xAxis = 0, 1200, 6
            yAxis = 0, 48, 4
            xBins = taeRates2, TPSdot
            yBins = taeBins2

;accel-pump
        curve = pump_accel_mapdot_curve, "Accel MAPdot Curve"
            columnLabel = "MAPdot", "Added"
            xAxis = -2000, 2000, 5
            yAxis = -200, 200, 5
            xBins = accel_mapdots, MAPdot
            yBins = accel_mapdot_amts

;accel-pump
        curve = pump_accel_tpsdot_curve, "Accel TPSdot Curve"
            columnLabel = "TPSdot", "Added"
            xAxis = -1000, 1000, 5
            yAxis = -200, 200, 5
            xBins = accel_tpsdots, TPSdot
            yBins = accel_tpsdot_amts

;accel-pump2
        curve = pump_accel_mapdot_curve2, "Accel MAPdot Curve"
            columnLabel = "MAPdot", "Added"
            xAxis = -2000, 2000, 5
            yAxis = -200, 200, 5
            xBins = accel_mapdots2, MAPdot
            yBins = accel_mapdot_amts2

;accel-pump2
        curve = pump_accel_tpsdot_curve2, "Accel TPSdot Curve"
            columnLabel = "TPSdot", "Added"
            xAxis = -1000, 1000, 5
            yAxis = -200, 200, 5
            xBins = accel_tpsdots2, TPSdot
            yBins = accel_tpsdot_amts2

       curve = knockstart_curve, "Knock Window Start"
          columnLabel = "RPM", "deg"
          xAxis       = 0, {rpmhigh}, 6
          yAxis       = -40, 10, 6
          xBins       = knock_rpms, rpm
          yBins       = knock_starts

       curve = knockduration_curve, "Knock Window Duration"
          columnLabel = "RPM", "deg"
          xAxis       = 0, {rpmhigh}, 6
          yAxis       = 0, 40, 6
          xBins       = knock_rpms, rpm
          yBins       = knock_durations

       curve = knockthresh_curve, "Knock Input Threshold"
          columnLabel = "RPM", "%"
          xAxis       = 0, {rpmhigh}, 6
          yAxis       = 0, 100, 6
          xBins       = knock_rpms, rpm
          yBins       = knock_thresholds
          gauge       = knockinGauge

       curve = knockupscale_curve, "Knock Coolant Scaling"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#knockcoolant"
          columnLabel = "clt", "%"
          xAxis       = {cltlowlim}, {clthighlim}, 6
          yAxis       = 100, 500, 6
          xBins       = knock_clts, coolant
          yBins       = knock_upscale
          gauge       = cltGauge

   curve = tc_perfect_curve, "Traction Control - Perfect Run VSS"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#tractionperfectvss"
      columnLabel = "Time", "VSS"
      xAxis       = 0, 20, 9
      yAxis       =  0, { prefSpeedUnits == 0 ? 200 : 300 }, 6
      xBins       = tc_perfect_time
      yBins       = tc_perfect_vss

   curve = tc_perfectrpm_curve, "Traction Control - Perfect Run RPM"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#tractionperfectrpm"
      columnLabel = "Time", "RPM"
      xAxis       = 0, 20, 9
      yAxis       =  0, {rpmhigh}, 6
      xBins       = tc_perfect_time
      yBins       = tc_perfect_rpm

   curve = tc_retard_curve, "Spark Retard"
      columnLabel = "Slip x time", "Retard"
      xAxis       = 0, 100, 5
      yAxis       =  0, 30, 5
      xBins       = tc_react_x, tc_slipxtime
      yBins       = tc_retard

   curve = tc_spkcut_curve, "Spark Cut"
      columnLabel = "Slip x time", "Spark"
      xAxis       = 0, 100, 5
      yAxis       =  0, 100, 5
      xBins       = tc_react_x, tc_slipxtime
      yBins       = tc_spkcut

   curve = tc_nitrous_curve, "Nitrous%"
      columnLabel = "Slip x time", "Nitrous"
      xAxis       = 0, 100, 5
      yAxis       =  0, 100, 5
      xBins       = tc_react_x, tc_slipxtime
      yBins       = tc_nitrous

   curve = tc_boost_curve, "Boost Cut"
      columnLabel = "Slip x Time", "Boost"
      xAxis       = 0, 100, 5
      yAxis       =  0, 100, 5
      xBins       = tc_react_x, tc_slipxtime
      yBins       = tc_boost

   curve = tc_boost_duty_delta_curve, "Boost Duty +/-"
      columnLabel = "Slip x Time", "Boost Duty +/-"
      xAxis       = 0, 100, 5
      yAxis       =  -100, 100, 5
      xBins       = tc_react_x, tc_slipxtime
      yBins       = tc_boost_duty_delta

   curve = tc_addfuel_curve, "Add Fuel"
      columnLabel = "Slip x time", "Added Fuel"
      xAxis       = 0, 100, 5
      yAxis       =  0, 100, 5
      xBins       = tc_react_x, tc_slipxtime
      yBins       = tc_addfuel

       curve = dualfuel_temp_curve, "Temperature Adjustment (Secondary Fuel)"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#fueltemp2"
          columnLabel = "Temperature", "Adj %"
          xAxis       = -40, 220, 9
          yAxis       =  -200, 200, 6
          xBins       = dualfuel_temp, fuel_temp2
          yBins       = dualfuel_temp_adj

       curve = dualfuel_press_curve, "Pressure Adjustment (Secondary Fuel)"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#fuelpress2"
          columnLabel = "Differential Pressure", "Adj %"
          xAxis       = 200, 600, 9
          yAxis       =  -200, 200, 6
          xBins       = dualfuel_press, fuel_press2
          yBins       = dualfuel_press_adj

       curve = primingPW2, "Priming Pulse 2"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#primep2"
          columnLabel = "Coolant", "Prime PW"
          xAxis       = -40, {clthighlim}, 9
          yAxis       =   0,  20, 5
          xBins       = temp_table_p21, coolant, readonly
          yBins       = primePWTable2
          gauge       = cltGauge

       curve = crankingPW2, "Cranking Pulse % 2"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#crankp2"
          columnLabel = "Coolant", "Cranking PW%"
          xAxis       = -40, {clthighlim}, 9
          yAxis       =   0,  500, 6
          xBins       = temp_table_p21, coolant
          yBins       = crankPctTable2
          gauge       = cltGauge

       curve = asePct2, "Afterstart Enrichment (ASE) Percentage 2"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#asep2"
          columnLabel = "Coolant", "Afterstart"
          xAxis       = -40, {clthighlim}, 9
          yAxis       =   0, 100, 6
          xBins       = temp_table_p21, coolant, readonly
          yBins       = asePctTable2
          gauge       = cltGauge

       curve = aseTaper2, "Afterstart Enrichment (ASE) Taper 2"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#aset2"
          columnLabel = "Coolant", "Taper"
          xAxis       = -40, {clthighlim}, 9
          yAxis       =   0, 500, 6
          xBins       = temp_table_p21, coolant, readonly
          yBins       = aseCntTable2
          gauge       = cltGauge

       curve = warmup_curve2, "Warmup Enrichment (WUE) Curve 2"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#wue2"
          columnLabel = "Coolant", "WUE %"
          xAxis       = -40, {clthighlim}, 9
          yAxis       =   0,  500, 6
          xBins       = temp_table_p21, coolant, readonly
          yBins       = wueBins2
          gauge       = cltGauge

       curve = MAFtable1f, "MAF Flow Curve"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#mafflow"
          columnLabel = "MAF Freq", "Flow"
          xAxis       =  {maf_freq0}, {maf_freq1}, 11
          yAxis       = {-81 * (maf_range + 1)}, {573 * (maf_range + 1)}, 11
          xBins       = maff, maf_freq
          yBins       = mafflow
          gauge       = maf_voltsGauge

       curve = MAFtable1, "MAF Flow Curve"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#mafflow"
          columnLabel = "MAF Volts", "Flow"
          xAxis       =  0, 5, 11
          yAxis       = {-81 * (maf_range + 1)}, {573 * (maf_range + 1)}, 11
          xBins       = mafv, maf_volts
          yBins       = mafflow
          gauge       = maf_voltsGauge

       curve = dwellrpm_curve, "Dwell vs RPM"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#dwellvsrpm"
          columnLabel = "RPM", "Dwell"
          xAxis       = 0, {rpmhigh}, 6
          yAxis       = 0, 6, 6
          xBins       = dwellrpm_rpm, rpm
          yBins       = dwellrpm_dwell

       curve = boosttime_duty_curve, "Boost Duty vs Time"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#boostspeed"
          columnLabel = "Time", "Duty"
          xAxis       = 0, 10, 6
          yAxis       = 0, 100, 6
          xBins       = boostvss_time, launch_timer
          yBins       = boostvss_duty

       curve = boosttime_target_curve, "Boost Target vs Time"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#boostspeed"
          columnLabel = "Time", "kPa"
          xAxis       = 0, 10, 6
          yAxis       = 100, 400, 6
          xBins       = boostvss_time, launch_timer
          yBins       = boostvss_target

       curve = boostvss_duty_curve, "Boost Duty vs Speed"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#boostspeed"
          columnLabel = "Speed", "Duty"
          xAxis       = 0, { prefSpeedUnits == 0 ? 200 : 300 }, 6
          yAxis       = 0, 100, 6
          xBins       = boostvss_speed, vss1
          yBins       = boostvss_duty

       curve = boostvss_target_curve, "Boost Target vs Speed"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#boostspeed"
          columnLabel = "Speed", "kPa"
          xAxis       = 0, { prefSpeedUnits == 0 ? 200 : 300 }, 6
          yAxis       = 0, 400, 6
          xBins       = boostvss_speed, vss1
          yBins       = boostvss_target

    ; nitrous 1 vs time
       curve = n2o1_duty_time, "Nitrous1 - Duty vs Time"
          columnLabel = "s", "Duty"
          xAxis       = 0, 15, 6
          yAxis       = 0, 100, 6
          xBins       = n2o1_time, nitrous_timer
          yBins       = n2o1_duty

       curve = n2o1_fuelpct_time, "Nitrous1 - %age Fuel vs Time"
          columnLabel = "s", "%"
          xAxis       = 0, 15, 6
          yAxis       = 0, 150, 5
          xBins       = n2o1_time, nitrous_timer
          yBins       = n2o1_fuelpct

       curve = n2o1_retard_time, "Nitrous1 - Retard vs Time"
          columnLabel = "s", "Retard"
          xAxis       = 0, 15, 6
          yAxis       = 0, 30, 7
          xBins       = n2o1_time, nitrous_timer
          yBins       = n2o1_retard

    ; nitrous 2 vs time
       curve = n2o2_duty_time, "Nitrous2 - Duty vs Time"
          columnLabel = "s", "Duty"
          xAxis       = 0, 15, 6
          yAxis       = 0, 100, 6
          xBins       = n2o2_time, nitrous_timer
          yBins       = n2o2_duty

       curve = n2o2_fuelpct_time, "Nitrous2 - %age Fuel vs Time"
          columnLabel = "s", "%"
          xAxis       = 0, 15, 6
          yAxis       = 0, 150, 6
          xBins       = n2o2_time, nitrous_timer
          yBins       = n2o2_fuelpct

       curve = n2o2_retard_time, "Nitrous2 - Retard vs Time"
          columnLabel = "s", "Retard"
          xAxis       = 0, 15, 6
          yAxis       = 0, 30, 7
          xBins       = n2o2_time, nitrous_timer
          yBins       = n2o2_retard

    ; nitrous 1 vs rpm
       curve = n2o1_duty_rpm, "Nitrous1 - Duty vs RPM"
          columnLabel = "RPM", "Duty"
          xAxis       = 0, {rpmhigh}, 6
          yAxis       = 0, 100, 6
          xBins       = n2o1_rpm, rpm
          yBins       = n2o1_duty

       curve = n2o1_pw_rpm, "Nitrous1 - Added fuel vs RPM"
          columnLabel = "RPM", "pw"
          xAxis       = 0, {rpmhigh}, 6
          yAxis       = -5, 20, 6
          xBins       = n2o1_rpm, rpm
          yBins       = n2o1_pw

       curve = n2o1_retard_rpm, "Nitrous1 - Retard vs RPM"
          columnLabel = "RPM", "Retard"
          xAxis       = 0, {rpmhigh}, 6
          yAxis       = 0, 30, 7
          xBins       = n2o1_rpm, rpm
          yBins       = n2o1_retard

    ; nitrous 2 vs rpm
       curve = n2o2_duty_rpm, "Nitrous2 - Duty vs RPM"
          columnLabel = "RPM", "Duty"
          xAxis       = 0, {rpmhigh}, 6
          yAxis       = 0, 100, 6
          xBins       = n2o2_rpm, rpm
          yBins       = n2o2_duty

       curve = n2o2_pw_rpm, "Nitrous2 - Added Fuel vs RPM"
          columnLabel = "RPM", "pw"
          xAxis       = 0, {rpmhigh}, 6
          yAxis       = -5, 20, 6
          xBins       = n2o2_rpm, rpm
          yBins       = n2o2_pw

       curve = n2o2_retard_rpm, "Nitrous2 - Retard vs RPM"
          columnLabel = "RPM", "Retard"
          xAxis       = 0, {rpmhigh}, 6
          yAxis       = 0, 30, 7
          xBins       = n2o2_rpm, rpm
          yBins       = n2o2_retard

    ; nitrous 1 vs VSS
       curve = n2o1_duty_vss, "Nitrous1 - Duty vs VSS"
          columnLabel = "VSS", "Duty"
          xAxis       = 0, 200, 6
          yAxis       = 0, 100, 6
          xBins       = n2o1_vss, vss1
          yBins       = n2o1_duty

       curve = n2o1_fuelpct_vss, "Nitrous1 - %age Fuel vs VSS"
          columnLabel = "VSS", "%"
          xAxis       = 0, 200, 6
          yAxis       = 0, 150, 5
          xBins       = n2o1_vss, vss1
          yBins       = n2o1_fuelpct

       curve = n2o1_retard_vss, "Nitrous1 - Retard vs VSS"
          columnLabel = "VSS", "Retard"
          xAxis       = 0, 200, 6
          yAxis       = 0, 30, 7
          xBins       = n2o1_vss, vss1
          yBins       = n2o1_retard

    ; nitrous 2 vs vss
       curve = n2o2_duty_vss, "Nitrous2 - Duty vs VSS"
          columnLabel = "VSS", "Duty"
          xAxis       = 0, 200, 6
          yAxis       = 0, 100, 6
          xBins       = n2o2_vss, vss1
          yBins       = n2o2_duty

       curve = n2o2_fuelpct_vss, "Nitrous2 - %age Fuel vs VSS"
          columnLabel = "VSS", "%"
          xAxis       = 0, 200, 6
          yAxis       = 0, 100, 5
          xBins       = n2o2_vss, vss1
          yBins       = n2o2_fuelpct

       curve = n2o2_retard_vss, "Nitrous2 - Retard vs VSS"
          columnLabel = "VSS", "Retard"
          xAxis       = 0, 200, 6
          yAxis       = 0, 30, 7
          xBins       = n2o2_vss, vss1
          yBins       = n2o2_retard

    ;mat/clt
       curve = matclt_curve, "MAT/CLT correction"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#matcltcor"
          columnLabel = "flow", "%CLT"
          xAxis       = 0, {rpmhigh * 400}, 5
          yAxis       = 0, 100, 5
          xBins       = matclt_flow, calcflow
          yBins       = matclt_pct

    ;small pulsewidths
       curve = smallcurve0, "Small Pulsewidth Curve 1"
          columnLabel = "Original", "New"
          xAxis       = 0, 2, 5
          yAxis       = 0, 2, 5
          xBins       = smallpwpw
          yBins       = smallpw0

       curve = smallcurve1, "Small Pulsewidth Curve 2"
          columnLabel = "Original", "New"
          xAxis       = 0, 2, 5
          yAxis       = 0, 2, 5
          xBins       = smallpwpw
          yBins       = smallpw1

       curve = smallcurve2, "Small Pulsewidth Curve 3"
          columnLabel = "Original", "New"
          xAxis       = 0, 2, 5
          yAxis       = 0, 2, 5
          xBins       = smallpwpw
          yBins       = smallpw2

       curve = smallcurve3, "Small Pulsewidth Curve 4"
          columnLabel = "Original", "New"
          xAxis       = 0, 2, 5
          yAxis       = 0, 2, 5
          xBins       = smallpwpw
          yBins       = smallpw3

       curve = inj_deadtime_cv1, "Injector Dead Time Curve 1"
          columnLabel = "Voltage", "Deadtime"
          xAxis       = 7.2, 19.2, 7
          yAxis       = 0, 2500, 6
          xBins       = inj_deadtime_volts1, batteryVoltage
          yBins       = inj_deadtime_curve1

       curve = inj_deadtime_cv2, "Injector Dead Time Curve 2"
          columnLabel = "Voltage", "Deadtime"
          xAxis       = 7.2, 19.2, 7
          yAxis       = 0, 2500, 6
          xBins       = inj_deadtime_volts2, batteryVoltage
          yBins       = inj_deadtime_curve2

       curve = inj_deadtime_cv3, "Injector Dead Time Curve 3"
          columnLabel = "Voltage", "Deadtime"
          xAxis       = 7.2, 19.2, 7
          yAxis       = 0, 2500, 6
          xBins       = inj_deadtime_volts3, batteryVoltage
          yBins       = inj_deadtime_curve3

       curve = inj_deadtime_cv4, "Injector Dead Time Curve 4"
          columnLabel = "Voltage", "Deadtime"
          xAxis       = 7.2, 19.2, 7
          yAxis       = 0, 2500, 6
          xBins       = inj_deadtime_volts4, batteryVoltage
          yBins       = inj_deadtime_curve4

       curve = boost_timed_curve, "Boost %age After Launch"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#boostdelay"
          columnLabel = "Time", ""
          xAxis       = 0, 15, 6
          yAxis       = 0, 100, 6
          xBins       = boost_timed_time
          yBins       = boost_timed_pct

       curve = mapsample_curve, "MAP Sample Timing"
          columnLabel = "RPM", "deg"
          xAxis       = 0, {rpmhigh}, 8
          yAxis       = 0, 180, 8
          xBins       = map_sample_rpms
          yBins       = map_sample_timing
          gauge       = tachometer

       curve = dwellSettings, "Dwell Battery Correction"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#dwellbat"
          columnLabel = "Voltage", "%age"
          xAxis       = 6, 16, 6
          yAxis       = 0, 500, 6
          xBins       = dwellvolts, batteryVoltage
          yBins       = dwellcorr

       curve = coldAdvance, "Cold Advance"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#coldadv"
          columnLabel = "Coolant", "Offset"
          xAxis       = -40, {clthighlim}, 9
          yAxis       = -10,  10, 5
          xBins       = tempTable, coolant, readonly
          yBins       = cold_adv_table
          gauge       = cltGauge

       curve = iacBins, "Stepper Idle Warmup Position"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#idlewu"
          columnLabel = "Coolant", "IAC Steps"
          xAxis       = -40, {clthighlim}, 9
          yAxis       =   0, 300, 7
          xBins       = tempTable, coolant, readonly
          yBins       = iacstepTable
          gauge       = cltGauge

       curve = ipwBins, "PWM Idle Warmup Duty Cycle"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#idlewu"
          columnLabel = "Coolant", "Idle PWM duty"
          xAxis       = -40, {clthighlim}, 9
          yAxis       =   0, 100, 6
          xBins       = tempTable, coolant, readonly
          yBins       = ipwmTable
          gauge       = cltGauge

       curve = primingPW, "Priming Pulse"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#primep"
          columnLabel = "Coolant", "Prime PW"
          xAxis       = -40, {clthighlim}, 9
          yAxis       =   0,  20, 5
          xBins       = temp_table_p5, coolant, readonly
          yBins       = primePWTable
          gauge       = cltGauge

       curve = crankingPW, "Cranking Pulse %"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#crankp"
          columnLabel = "Coolant", "Cranking PW%"
          xAxis       = -40, {clthighlim}, 9
          yAxis       =   0,  500, 6
          xBins       = temp_table_p5, coolant
          yBins       = crankPctTable
          gauge       = cltGauge

       curve = asePct, "Afterstart Enrichment (ASE) Percentage"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#asep"
          columnLabel = "Coolant", "Afterstart"
          xAxis       = -40, {clthighlim}, 9
          yAxis       =   0, 100, 6
          xBins       = temp_table_p5, coolant, readonly
          yBins       = asePctTable
          gauge       = cltGauge

       curve = aseTaper, "Afterstart Enrichment (ASE) Taper"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#aset"
          columnLabel = "Coolant", "Taper"
          xAxis       = -40, {clthighlim}, 9
          yAxis       =   0, 500, 6
          xBins       = temp_table_p5, coolant, readonly
          yBins       = aseCntTable
          gauge       = cltGauge

       curve = matBasedRetard, "MAT-Based Timing Retard"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#matretard"
          columnLabel = "MAT", "Retard"
          xAxis       = -40, {mathigh}, 9
          yAxis       =   0,  15, 7
          xBins       = matTemps, airtemp
          yBins       = matRetard
          gauge       = matGauge

       curve = barometerCorr, "Barometric Correction"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#barocor"
          columnLabel = "Barometer", "Correction"
          xAxis       =  60, 120, 7
          yAxis       = 80,  200, 6
          xBins       = baroCorrVals, barometer
          yBins       = baroCorrDelta
          gauge       = barometerGauge

       curve = airdenCorr, "MAT Air density"
          columnLabel = "Air temp", "Correction"
          xAxis       =  -40, 200, 9
          yAxis       =  70,  130, 7
          xBins       = matCorrTemps2, airtemp
          yBins       = matCorrDelta2
          gauge       = airtempGauge

       curve = manifoldTempCorr, "MAF/MAT Correction"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#mafmatcor"
          columnLabel = "MAT", "Correction"
          xAxis       =  -40, 200, 9
          yAxis       =  -30,  30, 7
          xBins       = matCorrTemps, mat
          yBins       = matCorrDelta
          gauge       = matGauge

; this is just as an example.. not yet finished
       curve = EAEmanycurves, "Combined EAE Curve Graph - example to test TunerStudio features"
          columnLabel = "RPM", "Correction"
          xAxis       = 0, {rpmhigh}, 12
          yAxis       = 0, 200, 12
          xBins       = EAESOCRPMbins, rpm
          yBins       = EAESON
          xBins       = EAEAWCRPMbins, rpm
          yBins       = EAEAWN
          xBins       = EAEAWCRPMbins2, rpm
          yBins       = EAEAWN2
          xBins  = EAESOCRPMbins2, rpm ; commented out to show last yAxis tied to previous xAxis
          yBins       = EAESON2
          gauge       = EAEGauge1 ; As always gauge is optional
          
          lineLabel   = "Sucked-from-walls const"
          lineLabel   = "Adhere-to-walls coef"
          lineLabel   = "Adhere-to-walls coef 2"
          lineLabel   = "Sucked-from-walls Correction"

       curve = EAEBAWCcurve, "EAE Adhere-to-walls Coefficient"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#eaeawc"
          columnLabel = "%", "Correction"
          xAxis   = 0, 255, 12
          yAxis       = 0, 100, 12
          xBins   = EAEAWCKPAbins, eaeload1
          yBins   = EAEBAWC
          gauge   = EAEGauge1

       curve = EAEBSOCcurve, "EAE Sucked-from-walls Coefficient"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#eaeswc"
          columnLabel = "%", "Correction"
          xAxis   = 0, 255, 12
          yAxis   = 0, 25.5, 12
          xBins   = EAESOCKPAbins, eaeload1
          yBins   = EAEBSOC
          gauge   = EAEGauge1

       curve = EAEAWNcurve, "EAE Adhere-to-walls RPM Correction"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#eaeawrc"
          columnLabel = "RPM", "Correction"
          xAxis   = 0, {rpmhigh}, 12
          yAxis   = 0, 200, 12
          xBins           = EAEAWCRPMbins, rpm
          yBins   = EAEAWN
          gauge   = EAEGauge1

       curve = EAESONcurve, "EAE Sucked-from-walls RPM Correction"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#eaeswrc"
          columnLabel = "RPM", "Correction"
          xAxis       = 0, {rpmhigh}, 12
          yAxis       = 0, 200, 12
          xBins   = EAESOCRPMbins, rpm
          yBins       = EAESON
          gauge   = EAEGauge1

       curve = EAESOWcurve, "EAE Sucked-from-walls CLT Correction"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#eaeswcc"
          columnLabel = "CLT", "Correction"
          xAxis       = 0, {clthighlim}, 12
          yAxis       = 0, 200, 12
          xBins   = EAESOWCLTbins, coolant
          yBins       = EAESOW
          gauge   = EAEGauge1

       curve = EAEAWWcurve, "EAE Adhere-to-walls CLT Correction"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#eaeawcc"
          columnLabel = "CLT", "Correction"
          xAxis       = 0, {clthighlim}, 12
          yAxis       = 0, 200, 12
          xBins   = EAEAWWCLTbins, coolant
          yBins       = EAEAWW
          gauge   = EAEGauge1

       curve = EAEBAWCcurve2, "EAE Adhere-to-walls Coefficient 2"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#eaeawc2"
          columnLabel = "%", "Correction"
          xAxis   = 0, 255, 12
          yAxis       = 0, 100, 12
          xBins   = EAEAWCKPAbins2, fuelload
          yBins   = EAEBAWC2
          gauge   = EAEGauge1

       curve = EAEBSOCcurve2, "EAE Sucked-from-walls Coefficient 2"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#eaeswc"
          columnLabel = "%", "Correction"
          xAxis   = 0, 255, 12
          yAxis   = 0, 25.5, 12
          xBins   = EAESOCKPAbins2, fuelload
          yBins   = EAEBSOC2
          gauge   = EAEGauge1

       curve = EAEAWNcurve2, "EAE Adhere-to-walls RPM Correction 2"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#eaeawrc2"
          columnLabel = "RPM", "Correction"
          xAxis   = 0, {rpmhigh}, 12
          yAxis   = 0, 200, 12
          xBins           = EAEAWCRPMbins2, rpm
          yBins   = EAEAWN2
          gauge   = EAEGauge1

       curve = EAESONcurve2, "EAE Sucked-from-walls RPM Correction 2"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#eaeswrc2"
          columnLabel = "RPM", "Correction"
          xAxis       = 0, {rpmhigh}, 12
          yAxis       = 0, 200, 12
          xBins   = EAESOCRPMbins2, rpm
          yBins       = EAESON2
          gauge   = EAEGauge1

       curve = EAESOWcurve2, "EAE Sucked-from-walls CLT Correction 2"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#eaeswcc2"
          columnLabel = "CLT", "Correction"
          xAxis       = 0, {clthighlim}, 12
          yAxis       = 0, 200, 12
          xBins   = EAESOWCLTbins2, coolant
          yBins       = EAESOW2
          gauge   = EAEGauge1

       curve = EAEAWWcurve2, "EAE Adhere-to-walls CLT Correction 2"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#eaeawcc2"
          columnLabel = "CLT", "Correction"
          xAxis       = 0, {clthighlim}, 12
          yAxis       = 0, 200, 12
          xBins   = EAEAWWCLTbins2, coolant
          yBins       = EAEAWW2
          gauge   = EAEGauge1

       curve = XAccTable, "X Accel Fuel Correction"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#xtpuddlea"
          columnLabel = "RPM", "Correction"
          xAxis       =    0,  {rpmhigh}, 4
          yAxis       =    0,   120, 4
          xBins       = XTrpms, rpm
          yBins       = XAcc
          gauge       = EAEGauge1 
            
       curve = XDecTable, "X Decel Fuel Correction"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#xtpuddled"
          columnLabel = "RPM", "Correction"
          xAxis       =    0,  {rpmhigh}, 9
          yAxis       =    0,   120, 9
          xBins       = XTrpms, rpm
          yBins       = XDec
          gauge       = EAEGauge1          

       curve = TauAccTable, "Tau Accel Fuel Correction"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#xttimea"
          columnLabel = "RPM", "time"
          xAxis       =    0,  {rpmhigh}, 9
          yAxis       =    0,  1000, 9
          xBins       = XTrpms, rpm
          yBins       = TauAcc
          gauge       = EAEGauge1
     
       curve = TauDecTable, "Tau Decel Correction"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#xttimed"
          columnLabel = "RPM", "time"
          xAxis       =    0,  {rpmhigh}, 9
          yAxis       =    0,  1000, 9
          xBins       = XTrpms, rpm
          yBins       = TauDec
          gauge       = EAEGauge1 
          
       curve = XCltTable, "X (Puddling) Temp. Correction Factors"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#xtxtemp"
          columnLabel = "Temperature", "Correction"
          xAxis       = -40, {clthighlim}, 9
          yAxis       =    0,   600, 9
          xBins       = XClt_temps
          yBins       = XClt
          gauge       = cltGauge 

       curve = TCltTable, "Tau (Time) Temp. Correction Factors"
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#xtttemp"
          columnLabel = "Temperature", "time"
          xAxis       = -40, {clthighlim}, 9
          yAxis       =    0,   600, 9
          xBins       = TauClt_temps
          yBins       = TauClt
          gauge       = cltGauge

       curve = NoiseFiltercurve, "Noise Filter Curve"
          columnLabel = "RPMS", "usec"
          xAxis   = 0, {rpmhigh}, 4
          yAxis   = 0, 2000, 4
          xBins   = NoiseFilterRpm
          yBins   = NoiseFilterLen

       curve = warmup_curve, "Warmup Enrichment (WUE) Curve"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#wue"
          columnLabel = "Coolant", "WUE %"
          xAxis       = -40, {clthighlim}, 9
          yAxis       =   0,  500, 6
          xBins       = tempTable, coolant
          yBins       = wueBins
          gauge       = cltGauge

       curve = idleAdvance_curve, "Idle Advance Timing"
          columnLabel = "Load %", "deg"
          xAxis = 0, 100, 4
          yAxis = -10, 90, 4
          xBins = idleadvance_loads, fuelload
          yBins = idleadvance_curve

       curve = pwmidle_target_curve, "Closed-Loop Idle Target RPMs"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#clidletarg"
          columnLabel = "CLT", "RPM"
          xAxis       = 0, {clthighlim}, 8
          yAxis   = 0, 2000, 8
          xBins   = pwmidle_clt_temps, coolant
          yBins       = pwmidle_target_rpms

       curve = revlimiterBins, "Coolant Based Rev Limit" 
          columnLabel = "Coolant", "Rev limit" 
          xAxis       = -40, {clthighlim}, 8
          yAxis           =   0, 15000, 8 
          xBins       = RevLimLookup, coolant 
          yBins       = RevLimRpm1 
          gauge       = cltGauge

       curve = pwmidle_crank_dutyorsteps_dutycurve, "Coolant-Based Crank Duty"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#idlecrank"
          columnLabel = "Coolant", "Duty %"
          xAxis       = -40, {clthighlim}, 4
          yAxis       = 0, 100, 4
          xBins       = pwmidle_crank_clt_temps, coolant
          yBins       = pwmidle_crank_dutyorsteps_duty
          gauge       = cltGauge

       curve = pwmidle_crank_dutyorsteps_stepscurve, "Coolant-Based Crank Steps"
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#idlecrank"
          columnLabel = "Coolant", "Steps"
          xAxis       = -40, {clthighlim}, 4
          yAxis       = 0, 512, 4
          xBins       = pwmidle_crank_clt_temps, coolant
          yBins       = pwmidle_crank_dutyorsteps_steps
          gauge       = cltGauge

        curve = ITB_load_loadvals_curve, "ITB Load at TPS Switchpoint"
          columnLabel = "RPM", "Load"
          xAxis       = 0, {rpmhigh}, 12
          yAxis       = 0, 100, 12
          xBins       = ITB_load_rpms, rpm
          yBins       = ITB_load_loadvals

        curve = ITB_load_switchpoint_curve, "TPS% at %Baro Switchpoint"
          columnLabel = "RPM", "TPS %"
          xAxis       = 0, {rpmhigh}, 12
          yAxis       = 0, 100, 12
          xBins       = ITB_load_rpms, rpm
          yBins       = ITB_load_switchpoints

        curve = vvt_onoff_curve, "On/Off VVT curve"
          columnLabel = "RPM", "Load %"
          xAxis       = 0, {rpmhigh}, 8
          yAxis       = 0, {loadhigh}, 8
          xBins       = vvt_onoff_rpms, rpm
          yBins       = vvt_onoff_loads, fuelload

[TableEditor]
       ;       table_id,    map3d_id,    "title",      page

	table = inj_deadtime_tbl1, inj_deadtime_map1, "Injector deadtime 1"
        gridHeight = 1.0
        xBins = inj_deadtime_volts1, batteryVoltage
        yBins = inj_deadtime_pressure1, fuel_press1_user
        zBins = inj_deadtime_table1
        upDownLabel = "More", "Less"
        gridOrient = 250, 0, 340

	table = inj_deadtime_tbl2, inj_deadtime_map2, "Injector deadtime 2"
        gridHeight = 1.0
        xBins = inj_deadtime_volts2, batteryVoltage
        yBins = inj_deadtime_pressure2, fuel_press1_user
        zBins = inj_deadtime_table2
        upDownLabel = "More", "Less"
        gridOrient = 250, 0, 340

	table = inj_deadtime_tbl3, inj_deadtime_map3, "Injector deadtime 3"
        gridHeight = 1.0
        xBins = inj_deadtime_volts3, batteryVoltage
        yBins = inj_deadtime_pressure3, fuel_press1_user
        zBins = inj_deadtime_table3
        upDownLabel = "More", "Less"
        gridOrient = 250, 0, 340

	table = inj_deadtime_tbl4, inj_deadtime_map4, "Injector deadtime 4"
        gridHeight = 1.0
        xBins = inj_deadtime_volts4, batteryVoltage
        yBins = inj_deadtime_pressure4, fuel_press1_user
        zBins = inj_deadtime_table4
        upDownLabel = "More", "Less"
        gridOrient = 250, 0, 340

    table = tc_vss_diff_tbl, tc_vss_diff_map, "Wheel speed difference retard", 0
        gridHeight = 1.0
        xBins = vss_diff_vss1, vss1
        yBins = vss_diff_vss2, vss2
        zBins = vss_diff_table
        upDownLabel = "More Retard", "Less Retard"
        gridOrient = 250, 0, 340

    table = etc_Tbl, etc_Map, "Throttle control", 0
        gridHeight = 1.0
        xBins = etc_rpms, rpm
        yBins = etc_pedal_pos, pedal
        zBins = etc_targ_pos
        upDownLabel = "More", "Less"
        gridOrient = 250, 0, 340

   table = boost_dome_tbl1, boost_dome_tbl1Map, "Wastegate Dome Pressure Bias Table 1", 19
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#domebias"
      xBins      = boost_dome_target_rpms1, rpm
      yBins      = boost_dome_target_kpas1, boost_targ_1
      zBins      = boost_dome_targets1
      upDownLabel = "UP", "DOWN"
      gridOrient  = 250, 0, 340

   table = dwell_tbl, dwell_tblMap, "Dwell Table", 1
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#dwelltable"
      xBins       = dwell_table_rpms, rpm
      yBins       = dwell_table_loads, ignload
      zBins       = dwell_table_values
      upDownLabel = "UP", "DOWN"
      gridOrient  = 250,   0, 340

       table = ego_delay_Tbl, ego_delay_Map, "EGO Delay Table",  1
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#egodelay"
          xBins       = ego_delay_rpms, rpm
          yBins       = ego_delay_loads, afrload1
          zBins       = ego_delay_table
          upDownLabel = "SHORTER", "LONGER"
          gridOrient = 250, 0, 340

       table = ego_auth_Tbl2, ego_auth_Map, "EGO Authority Table (negative)", 1
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#egoauth"
          xBins       = ego_auth_rpms, rpm
          yBins       = ego_auth_loads, afrload1
          zBins       = ego_auth_table2
          upDownLabel = "LEANER", "RICHER"
          gridOrient  = 250,   0, 340

       table = ego_auth_Tbl, ego_auth_Map, "EGO Authority Table", 1
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#egoauth"
          xBins       = ego_auth_rpms, rpm
          yBins       = ego_auth_loads, afrload1
          zBins       = ego_auth_table
          upDownLabel = "LEANER", "RICHER"
          gridOrient  = 250,   0, 340

   table = ltt_Table1Tbl, ltt_Table1Map, "Long Term Trim Table 1", 15
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#ltttable"
          xBins       = ltt_rpms, rpm
          yBins       = ltt_loads, fuelload
          zBins       = ltt_table1
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340

   table = fp_dutyTbl, fp_dutyMap, "Fuel Pump Duty Table", 1
          ;             constant,   variable
          xBins       = fpd_rpm rpm
          yBins       = fpd_load, fuelload
          zBins       = fpd_duty
          upDownLabel = "MORE", "LESS"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

   table = alphaMAPTbl, alphaMAPMap, "Fallback MAP Table", 1
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#fallbackmap"
      xBins       = amap_rpm, rpm
      yBins       = amap_tps, tps
      zBins       = alphaMAPtable
      upDownLabel = "UP", "DOWN"
      gridOrient  = 250,   0, 340

       table = pwmidle_cl_initialvalues_dty, pwmidle_cl_initialvalues_dtymap, "Closed-Loop Idle Initial Values", 19
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#clidleinit"
         xBins = pwmidle_cl_initialvalue_rpms, cl_idle_targ_rpm
         yBins = pwmidle_cl_initialvalue_matorclt, pwmidle_cl_initialvalue_matorclt_follower
         zBins = pwmidle_cl_initialvalues_duties
         upDownLabel = "INCREASE","DECREASE"
         gridOrient = 250, 0, 340

       table = pwmidle_cl_initialvalues_stps, pwmidle_cl_initialvalues_stpmap, "Closed-Loop Idle Initial Values", 19
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#clidleinit"
         xBins = pwmidle_cl_initialvalue_rpms, cl_idle_targ_rpm
         yBins = pwmidle_cl_initialvalue_matorclt, pwmidle_cl_initialvalue_matorclt_follower
         zBins = pwmidle_cl_initialvalues_steps
         upDownLabel = "INCREASE","DECREASE"
         gridOrient = 250, 0, 340

;vvt timing
       table = vvt_timing1_tbl, vvt_timing1_map, "VVT Intake (Relative Timing)", 7
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#vvtint"
          xBins       = vvt_timing_rpm, rpm
          yBins       = vvt_timing_load, vvt_load
          zBins       = vvt_timing1
          upDownLabel = "ADVANCE", "RETARD"
          gridOrient  = 250,  0, 340

       table = vvt_timing2_tbl, vvt_timing2_map, "VVT Exhaust (Relative Timing)", 7
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#vvtexh"
          xBins       = vvt_timing_rpm, rpm
          yBins       = vvt_timing_load, vvt_load
          zBins       = vvt_timing2
          upDownLabel = "ADVANCE", "RETARD"
          gridOrient  = 250,  0, 340

       table = als_rifuelcut_tbl, als_rifuelcut_map, "Turbo Anti-lag Roving Idle", 14
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#alsidle"
          xBins       = als_rirpms, rpm
          yBins       = als_ritpss, tps
          zBins       = als_rifuelcut
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = als_fuelcut_tbl, als_fuelcut_map, "ALS Fuel Cut%", 14
          xBins       = als_rpms, rpm
          yBins       = als_tpss, tps
          zBins       = als_fuelcut
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = als_sparkcut_tbl, als_sparkcut_map, "ALS Spark Cut%", 14
          xBins       = als_rpms, rpm
          yBins       = als_tpss, tps
          zBins       = als_sparkcut
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = als_timing_tbl, als_timing_map, "ALS Timing", 14
          xBins       = als_rpms, rpm
          yBins       = als_tpss, tps
          zBins       = als_timing
          upDownLabel = "ADVANCE", "RETARD"
          gridOrient = 250, 0, 340

       table = als_addfuel_tbl, als_addfuel_map, "ALS Added Fuel %age", 14
          xBins       = als_rpms, rpm
          yBins       = als_tpss, tps
          zBins       = als_addfuel
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = pwm_duties_Tbl_a, pwm_duties_map_a, "Generic PWM Output A", 11
          xBins       = pwm_rpms_a, rpm
          yBins       = pwm_loadvals_a, pwma_load
          zBins       = pwm_duties_a
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = pwm_duties_Tbl_b, pwm_duties_map_b, "Generic PWM Output B", 2
          xBins       = pwm_rpms_b, rpm
          yBins       = pwm_loadvals_b, pwmb_load
          zBins       = pwm_duties_b
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = pwm_duties_Tbl_c, pwm_duties_map_c, "Generic PWM Output C", 2
          xBins       = pwm_rpms_c, rpm
          yBins       = pwm_loadvals_c, pwmc_load
          zBins       = pwm_duties_c
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = pwm_duties_Tbl_d, pwm_duties_map_d, "Generic PWM Output D", 2
          xBins       = pwm_rpms_d, rpm
          yBins       = pwm_loadvals_d, pwmd_load
          zBins       = pwm_duties_d
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = pwm_duties_Tbl_vvt, pwm_duties_map_vvt, "Generic PWM Output E / VVT", 2
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#vvtonoff"
          xBins       = pwm_rpms_e, rpm
          yBins       = pwm_loadvals_e, vvt_load
          zBins       = pwm_duties_e
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = pwm_duties_Tbl_e, pwm_duties_map_e, "Generic PWM Output E", 2
          xBins       = pwm_rpms_e, rpm
          yBins       = pwm_loadvals_e, pwme_load
          zBins       = pwm_duties_e
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = pwm_duties_Tbl_f, pwm_duties_map_f, "Generic PWM Output F", 2
          xBins       = pwm_rpms_f, rpm
          yBins       = pwm_loadvals_f, pwmf_load
          zBins       = pwm_duties_f
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = generic_pid_Tbl_a, generic_pid_map_a, "Generic Closed-Loop A", 17
          xBins       = generic_pid_rpms_a, rpm
          yBins       = generic_pid_loadvals_a, generic_pid_load_a
          zBins       = generic_pid_targets_a
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

        table = generic_pid_Tbl_b, generic_pid_map_b, "Generic Closed-Loop B", 17
          xBins       = generic_pid_rpms_b, rpm
          yBins       = generic_pid_loadvals_b, generic_pid_load_b
          zBins       = generic_pid_targets_b
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = waterinjTbl, waterinjMap, "Water Injection Duty Table", 1
          xBins       = waterinj_rpm, rpm
          yBins       = waterinj_map, map
          zBins       = waterinj_duty
          upDownLabel = "MORE", "LESS"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

#if LAMBDA
       table = maxafr1Tbl, maxafr1Map, "Max AFR 1 in Lambda", 1
#else
       table = maxafr1Tbl, maxafr1Map, "Max AFR Difference", 1
#endif
          xBins       = maxafr1_rpm, rpm
          yBins       = maxafr1_load, maxafrload
          zBins       = maxafr1_diff
          upDownLabel = "LEANER", "RICHER"
          gridOrient  = 250,   0, 340
    
   table = veTable1Tbl, veTable1Map, "Fuel VE Table 1", 4
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#ve1"
          ;             constant,   variable
          xBins       = frpm_table1, rpm
          yBins       = fmap_table1, fuelload
          zBins       = veTable1
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = veTable2Tbl, veTable2Map, "Fuel VE Table 2", 4
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#ve2"
          xBins       = frpm_table2, rpm
          yBins       = fmap_table2, fuelload2
          zBins       = veTable2
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340

       table = veTable3Tbl, veTable3Map, "Fuel VE Table 3", 4
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#ve3"
          ;             constant,   variable
          xBins       = frpm_table3, rpm
          yBins       = fmap_table3, fuelload
          zBins       = veTable3
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = veTable4Tbl, veTable4Map, "Fuel VE Table 4", 4
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#ve4"
          ;             constant,   variable
          xBins       = frpm_table4, rpm
          yBins       = fmap_table4, fuelload2
          zBins       = veTable4
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = idleve1Tbl, idleve1Map, "Idle VE table", 10
          xBins       = idleve_rpms1, rpm
          yBins       = idleve_loads1, fuelload
          zBins       = idleve_table1
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0,  340

       table = idleve2Tbl, idleve2Map, "Idle VE Table - Dual Fuel", 10 
          xBins       = idleve_rpms2, rpm
          yBins       = idleve_loads2, fuelload
          zBins       = idleve_table2
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250, 0, 340

       table = stagedTable, stagedMap, "Staged Injection Table", 6
          xBins       = staged_rpms, rpm
          yBins       = staged_loads, fuelload
          zBins       = staged_percents
          upDownLabel = "MORE", "LESS"
          gridOrient = 250, 0, 340

        table = mapPredTable, mapPredMap, "MAP/Load Prediction Table", 0
          xBins         = map_predict_rpm, rpm
          yBins         = map_predict_tps, tps
          zBins         = map_predict_lookup_table
          upDownLabel = "HIGHER", "LOWER"
          gridOrient  = 250, 0, 340

          
        table = mapPredTable2, mapPredMap2, "MAP/Load Prediction Table 2", 0
          xBins         = map_predict_rpm2, rpm
          yBins         = map_predict_tps2, tps
          zBins         = map_predict_lookup_table2
          upDownLabel = "HIGHER", "LOWER"
          gridOrient  = 250, 0, 340

#if LAMBDA
       table = afrTable1Tbl, afrTable1Map, "Lambda Table 1", 1
#else
       table = afrTable1Tbl, afrTable1Map, "AFR Table 1", 1
#endif
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#afr1"
          xBins       = arpm_table1, rpm
          yBins       = amap_table1, afrload1
          zBins       = afrTable1
          upDownLabel = "LEANER", "RICHER"
          gridOrient  = 250,   0, 340

#if LAMBDA
       table = afrTable2Tbl, afrTable2Map, "Lambda Table 2", 1
#else
       table = afrTable2Tbl, afrTable2Map, "AFR Table 2", 1
#endif
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#afr2"
          xBins       = arpm_table2, rpm
          yBins       = amap_table2, fuelload
          zBins       = afrTable2
          upDownLabel = "LEANER", "RICHER"
          gridOrient  = 250,   0, 340

       table = ignitionTbl1, ignitionMap1, "Ignition Table 1 (Spark Advance)", 3
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#ign1"
          xBins       = srpm_table1, rpm
          yBins       = smap_table1, ignload
          zBins       = advanceTable1
          upDownLabel = "ADVANCING", "RETARDING"
          gridOrient  = 250,   0, 340

       table = ignitionTbl2, ignitionMap2, "Ignition Table 2 (Spark Advance)", 3
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#ign2"
          xBins       = srpm_table2, rpm
          yBins       = smap_table2, ignload2
          zBins       = advanceTable2
          upDownLabel = "ADVANCING", "RETARDING"
          gridOrient  = 250,   0, 340

       table = ignitionTbl3, ignitionMap3, "Ignition Table 3 (Spark Advance)", 4
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#ign3"
          xBins       = srpm_table3, rpm
          yBins       = smap_table3, ignload
          zBins       = advanceTable3
          upDownLabel = "ADVANCING", "RETARDING"
          gridOrient  = 250,   0, 340

       table = ignitionTbl4, ignitionMap4, "Ignition Table 4 (Spark Advance)", 4
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#ign4"
          xBins       = srpm_table4, rpm
          yBins       = smap_table4, ignload2
          zBins       = advanceTable4
          upDownLabel = "ADVANCING", "RETARDING"
          gridOrient  = 250,   0, 340

       table = RotarySplitTbl, RotarySplitMap, "Rotary Split Table", 3
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#rotarysplit"
          xBins   = RotarySplitRPM, rpm
          yBins       = RotarySplitLoad, ignload
          zBins   = RotarySplitTable
          upDownLabel = "ADVANCING", "RETARDING"
          gridOrient = 250, 0, 340

       table = boostctlDutys, boostctlDtyMap, "Boost Control Duty 1", 2
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#boostduty"
          xBins       = boost_ctl_pwmtarg_rpm_bins, rpm
          yBins   = boost_ctl_pwmtarg_tps_bins, throttle
          zBins       = boost_ctl_pwm_targets
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = boostctlTargs, boostctlTargMap, "Boost Control Targets 1", 2
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#boosttarg"
          xBins       = boost_ctl_loadtarg_rpm_bins, rpm
          yBins       = boost_ctl_loadtarg_tps_bins, throttle
          zBins       = boost_ctl_load_targets
          upDownLabel = "HIGHER", "LOWER"
          gridOrient  = 250, 0, 340

       table = boostctlDutys2, boostctlDtyMap2, "Boost Control Duty 2", 2
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#boostduty2"
          xBins       = boost_ctl_pwmtarg_rpm_bins2, rpm
          yBins   = boost_ctl_pwmtarg_tps_bins2, throttle
          zBins       = boost_ctl_pwm_targets2
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = boostctlCLPWMtargs1, boostctlCLPWMtargsMap1, "Boost Control Bias Duty 1", 15
          xBins      = boost_ctl_cl_pwm_rpms, rpm
          yBins      = boost_ctl_cl_pwm_targboosts, boost_targ_1
          zBins      = boost_ctl_cl_pwm_targs1
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = boostctlCLPWMtargs2, boostctlCLPWMtargsMap2, "Boost Control Bias Duty 2", 15
          xBins      = boost_ctl_cl_pwm_rpms, rpm
          yBins      = boost_ctl_cl_pwm_targboosts, boost_targ_1
          zBins      = boost_ctl_cl_pwm_targs2
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = boostctlCLPWMtargs3, boostctlCLPWMtargsMap3, "Boost Control Bias Duty 3", 15
          xBins      = boost_ctl_cl_pwm_rpms, rpm
          yBins      = boost_ctl_cl_pwm_targboosts, boost_targ_1
          zBins      = boost_ctl_cl_pwm_targs3
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = boostctlCLPWMtargs4, boostctlCLPWMtargsMap4, "Boost Control Bias Duty 4", 15
          xBins      = boost_ctl_cl_pwm_rpms, rpm
          yBins      = boost_ctl_cl_pwm_targboosts, boost_targ_1
          zBins      = boost_ctl_cl_pwm_targs4
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = boostctlCLPWMtargs5, boostctlCLPWMtargsMap5, "Boost Control Bias Duty 5", 15
          xBins      = boost_ctl_cl_pwm_rpms, rpm
          yBins      = boost_ctl_cl_pwm_targboosts, boost_targ_1
          zBins      = boost_ctl_cl_pwm_targs5
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = boostctlCLPWMtargs6, boostctlCLPWMtargsMap6, "Boost Control Bias Duty 6", 15
          xBins      = boost_ctl_cl_pwm_rpms, rpm
          yBins      = boost_ctl_cl_pwm_targboosts, boost_targ_1
          zBins      = boost_ctl_cl_pwm_targs6
          upDownLabel = "HIGHER", "LOWER"
          gridOrient = 250, 0, 340

       table = boostctlTargs2, boostctlTargMap2, "Boost Control Targets 2", 2
        topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#boosttarg2"
          xBins       = boost_ctl_loadtarg_rpm_bins2, rpm
          yBins       = boost_ctl_loadtarg_tps_bins2, throttle
          zBins       = boost_ctl_load_targets2
          upDownLabel = "HIGHER", "LOWER"
          gridOrient  = 250, 0, 340

    ;injector trims
       table = inj_trimaTbl, inj_trimaMap, "Cyl 1 Fuel Trim", 7
          ;             constant,   variable
          xBins       = inj_trim_rpm, rpm
          yBins       = inj_trim_load, fuelload
          zBins       = inj_trima
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = inj_trimbTbl, inj_trimbMap, "Cyl 2 Fuel Trim", 7
          ;             constant,   variable
          xBins       = inj_trim_rpm, rpm, readonly
          yBins       = inj_trim_load, fuelload, readonly
          zBins       = inj_trimb
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = inj_trimcTbl, inj_trimcMap, "Cyl 3 Fuel Trim", 7
          ;             constant,   variable
          xBins       = inj_trim_rpm, rpm, readonly
          yBins       = inj_trim_load, fuelload, readonly
          zBins       = inj_trimc
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = inj_trimdTbl, inj_trimdMap, "Cyl 4 Fuel Trim", 7
          ;             constant,   variable
          xBins       = inj_trim_rpm, rpm, readonly
          yBins       = inj_trim_load, fuelload, readonly
          zBins       = inj_trimd
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = inj_trimeTbl, inj_trimeMap, "Cyl 5 Fuel Trim", 7
          ;             constant,   variable
          xBins       = inj_trim_rpm, rpm, readonly
          yBins       = inj_trim_load, fuelload, readonly
          zBins       = inj_trime
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = inj_trimfTbl, inj_trimfMap, "Cyl 6 Fuel Trim", 7
          ;             constant,   variable
          xBins       = inj_trim_rpm, rpm, readonly
          yBins       = inj_trim_load, fuelload, readonly
          zBins       = inj_trimf
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = inj_trimgTbl, inj_trimgMap, "Cyl 7 Fuel Trim", 7
          ;             constant,   variable
          xBins       = inj_trim_rpm, rpm, readonly
          yBins       = inj_trim_load, fuelload, readonly
          zBins       = inj_trimg
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = inj_trimhTbl, inj_trimhMap, "Cyl 8 Fuel Trim", 7
          ;             constant,   variable
          xBins       = inj_trim_rpm, rpm, readonly
          yBins       = inj_trim_load, fuelload, readonly
          zBins       = inj_trimh
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.


       table = inj_trim1Tbl, inj_trim1Map, "Injector Trim 1", 7
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#injtrim1"
          ;             constant,   variable
          xBins       = inj_trim_rpm, rpm, readonly
          yBins       = inj_trim_load, fuelload, readonly
          zBins       = inj_trimi
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = inj_trim2Tbl, inj_trim2Map, "Injector Trim 2", 7
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#injtrim2"
          ;             constant,   variable
          xBins       = inj_trim_rpm, rpm, readonly
          yBins       = inj_trim_load, fuelload, readonly
          zBins       = inj_trimj
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = inj_trimiTbl, inj_trimiMap, "Cyl 9 Fuel Trim", 7
          ;             constant,   variable
          xBins       = inj_trim_rpm, rpm
          yBins       = inj_trim_load, fuelload
          zBins       = inj_trimi
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = inj_trimjTbl, inj_trimjMap, "Cyl 10 Fuel Trim", 7
          ;             constant,   variable
          xBins       = inj_trim_rpm, rpm, readonly
          yBins       = inj_trim_load, fuelload, readonly
          zBins       = inj_trimj
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = inj_trimkTbl, inj_trimkMap, "Cyl 11 Fuel Trim", 7
          ;             constant,   variable
          xBins       = inj_trim_rpm, rpm, readonly
          yBins       = inj_trim_load, fuelload, readonly
          zBins       = inj_trimk
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = inj_trimlTbl, inj_trimlMap, "Cyl 12 Fuel Trim", 7
          ;             constant,   variable
          xBins       = inj_trim_rpm, rpm, readonly
          yBins       = inj_trim_load, fuelload, readonly
          zBins       = inj_triml
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = inj_trimmTbl, inj_trimmMap, "Cyl 13 Fuel Trim", 7
          ;             constant,   variable
          xBins       = inj_trim_rpm, rpm, readonly
          yBins       = inj_trim_load, fuelload, readonly
          zBins       = inj_trimm
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = inj_trimnTbl, inj_trimnMap, "Cyl 14 Fuel Trim", 7
          ;             constant,   variable
          xBins       = inj_trim_rpm, rpm, readonly
          yBins       = inj_trim_load, fuelload, readonly
          zBins       = inj_trimn
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = inj_trimoTbl, inj_trimoMap, "Cyl 15 Fuel Trim", 7
          ;             constant,   variable
          xBins       = inj_trim_rpm, rpm, readonly
          yBins       = inj_trim_load, fuelload, readonly
          zBins       = inj_trimo
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = inj_trimpTbl, inj_trimpMap, "Cyl 16 Fuel Trim", 7
          ;             constant,   variable
          xBins       = inj_trim_rpm, rpm, readonly
          yBins       = inj_trim_load, fuelload, readonly
          zBins       = inj_trimp
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

;inj timing
       table = inj_timing_tbl, inj_timing_map, "Injector Timing", 7
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#injt1"
          xBins       = inj_timing_rpm, rpm
          yBins       = inj_timing_load, fuelload
          zBins       = inj_timing
          upDownLabel = "ADVANCE", "RETARD"
          gridOrient  = 250,  0, 340

       table = inj_timing_sec_tbl, inj_timing_sec_map, "Secondary Injector Timing", 7
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#injt2"
          xBins       = inj_timing_sec_rpm, rpm
          yBins       = inj_timing_sec_load, fuelload
          zBins       = inj_timing_sec
          upDownLabel = "ADVANCE", "RETARD"
          gridOrient = 250, 0, 340

    ;spark trims
       table = spk_trimaTbl, spk_trimaMap, "Spark Trim 1", 8
          ;             constant,   variable
          xBins       = spk_trim_rpm, rpm
          yBins       = spk_trim_load, ignload
          zBins       = spk_trima
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = spk_trimbTbl, spk_trimbMap, "Spark Trim 2", 8
          ;             constant,   variable
          xBins       = spk_trim_rpm, rpm
          yBins       = spk_trim_load, ignload
          zBins       = spk_trimb
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = spk_trimcTbl, spk_trimcMap, "Spark Trim 3", 8
          ;             constant,   variable
          xBins       = spk_trim_rpm, rpm
          yBins       = spk_trim_load, ignload
          zBins       = spk_trimc
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = spk_trimdTbl, spk_trimdMap, "Spark Trim 4", 8
          ;             constant,   variable
          xBins       = spk_trim_rpm, rpm
          yBins       = spk_trim_load, ignload
          zBins       = spk_trimd
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = spk_trimeTbl, spk_trimeMap, "Spark Trim 5", 8
          ;             constant,   variable
          xBins       = spk_trim_rpm, rpm
          yBins       = spk_trim_load, ignload
          zBins       = spk_trime
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = spk_trimfTbl, spk_trimfMap, "Spark Trim 6", 8
          ;             constant,   variable
          xBins       = spk_trim_rpm, rpm
          yBins       = spk_trim_load, ignload
          zBins       = spk_trimf
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = spk_trimgTbl, spk_trimgMap, "Spark Trim 7", 8
          ;             constant,   variable
          xBins       = spk_trim_rpm, rpm
          yBins       = spk_trim_load, ignload
          zBins       = spk_trimg
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = spk_trimhTbl, spk_trimhMap, "Spark Trim 8", 8
          ;             constant,   variable
          xBins       = spk_trim_rpm, rpm
          yBins       = spk_trim_load, ignload
          zBins       = spk_trimh
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = spk_trimiTbl, spk_trimiMap, "Spark Trim 9", 8
          ;             constant,   variable
          xBins       = spk_trim_rpm, rpm
          yBins       = spk_trim_load, ignload
          zBins       = spk_trimi
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = spk_trimjTbl, spk_trimjMap, "Spark Trim 10", 8
          ;             constant,   variable
          xBins       = spk_trim_rpm, rpm
          yBins       = spk_trim_load, ignload
          zBins       = spk_trimj
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = spk_trimkTbl, spk_trimkMap, "Spark Trim 11", 8
          ;             constant,   variable
          xBins       = spk_trim_rpm, rpm
          yBins       = spk_trim_load, ignload
          zBins       = spk_trimk
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = spk_trimlTbl, spk_trimlMap, "Spark Trim 12", 8
          ;             constant,   variable
          xBins       = spk_trim_rpm, rpm
          yBins       = spk_trim_load, ignload
          zBins       = spk_triml
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = spk_trimmTbl, spk_trimmMap, "Spark Trim 13", 8
          ;             constant,   variable
          xBins       = spk_trim_rpm, rpm
          yBins       = spk_trim_load, ignload
          zBins       = spk_trimm
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = spk_trimnTbl, spk_trimnMap, "Spark Trim 14", 8
          ;             constant,   variable
          xBins       = spk_trim_rpm, rpm
          yBins       = spk_trim_load, ignload
          zBins       = spk_trimn
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = spk_trimoTbl, spk_trimoMap, "Spark Trim 15", 8
          ;             constant,   variable
          xBins       = spk_trim_rpm, rpm
          yBins       = spk_trim_load, ignload
          zBins       = spk_trimo
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

       table = spk_trimpTbl, spk_trimpMap, "Spark Trim 16", 8
          ;             constant,   variable
          xBins       = spk_trim_rpm, rpm
          yBins       = spk_trim_load, ignload
          zBins       = spk_trimp
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

        table = narrowband_tgts_tbl, narrowband_tgts_map, "Narrowband EGO targets", 14
         topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt3_TunerStudio_MS_Lite_Reference-1.5.pdf#narrowtargs"
          xBins       = narrowband_tgts_rpms, rpm
          yBins       = narrowband_tgts_loads, afrload1
          zBins       = narrowband_tgts
          upDownLabel = "RICHER", "LEANER"
          gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.

    ;-------------------------------------------------------------------------------

    [GaugeConfigurations]

       ;-------------------------------------------------------------------------------
       ; Define a gauge's characteristics here, then go to a specific layout
       ; block (Tuning or FrontPage) and use the name you've defined here to
       ; display that gauge in a particular position.
       ;
       ; Name  = Case-sensitive, user-defined name for this gauge configuration.
       ; Var   = Case-sensitive name of variable to be displayed, see the
       ;         OutputChannels block in this file for possible values.
       ; Title = Title displayed at the top of the gauge.
       ; Units = Units displayed below value on gauge.
       ; Lo    = Lower scale limit of gauge.
       ; Hi    = Upper scale limit of gauge.
       ; LoD   = Lower limit at which danger color is used for gauge background.
       ; LoW   = Lower limit at which warning color is used.
       ; HiW   = Upper limit at which warning color is used.
       ; HiD   = Upper limit at which danger color is used.
       ; vd    = Decimal places in displayed value
       ; ld    = Label decimal places for display of Lo and Hi, above.

       ;Name               Var            Title                 Units     Lo     Hi     LoD    LoW   HiW   HiD vd ld

    gaugeCategory = "Outputs 1"
       pulseWidth1Gauge  = pulseWidth1,   "Pulse Width 1",      "ms",    0,  25.5,    1.0,   1.2,   20,   25, 3, 1
       pulseWidth2Gauge  = pulseWidth2,   "Pulse Width 2",      "ms",    0,  25.5,    1.0,   1.2,   20,   25, 3, 1
       pulseWidthSeq1Gauge  = pwseq1,   "Pulse Width Seq 1",    "ms",    0,  25.5,    1.0,   1.2,   20,   25, 3, 1
       pulseWidthSeq2Gauge  = pwseq2,   "Pulse Width Seq 2",    "ms",    0,  25.5,    1.0,   1.2,   20,   25, 3, 1
       pulseWidthSeq3Gauge  = pwseq3,   "Pulse Width Seq 3",    "ms",    0,  25.5,    1.0,   1.2,   20,   25, 3, 1
       pulseWidthSeq4Gauge  = pwseq4,   "Pulse Width Seq 4",    "ms",    0,  25.5,    1.0,   1.2,   20,   25, 3, 1
       pulseWidthSeq5Gauge  = pwseq5,   "Pulse Width Seq 5",    "ms",    0,  25.5,    1.0,   1.2,   20,   25, 3, 1
       pulseWidthSeq6Gauge  = pwseq6,   "Pulse Width Seq 6",    "ms",    0,  25.5,    1.0,   1.2,   20,   25, 3, 1
       pulseWidthSeq7Gauge  = pwseq7,   "Pulse Width Seq 7",    "ms",    0,  25.5,    1.0,   1.2,   20,   25, 3, 1
       pulseWidthSeq8Gauge  = pwseq8,   "Pulse Width Seq 8",    "ms",    0,  25.5,    1.0,   1.2,   20,   25, 3, 1
       pulseWidthSeq9Gauge  = pwseq9,   "Pulse Width Seq 9",    "ms",    0,  25.5,    1.0,   1.2,   20,   25, 3, 1
       pulseWidthSeq10Gauge = pwseq10,  "Pulse Width Seq 10",    "ms",    0,  25.5,    1.0,   1.2,   20,   25, 3, 1
       pulseWidthSeq11Gauge = pwseq11,  "Pulse Width Seq 11",    "ms",    0,  25.5,    1.0,   1.2,   20,   25, 3, 1
       pulseWidthSeq12Gauge = pwseq12,  "Pulse Width Seq 12",    "ms",    0,  25.5,    1.0,   1.2,   20,   25, 3, 1

    gaugeCategory = "Outputs 2"
       IACgauge          = iacstep,       "Idle Stepper position",       "steps",   0,   255,    -1,     -1,  999,  999, 0, 0
       dwellGauge        = dwell,         "Dwell",              "ms",    0,    10,   0.5,    1.0,  6.0,  8.0, 1, 1
       dwelltrlGauge     = dwell_trl,     "Dwell (Trailing)",   "ms",    0,    10,   0.5,    1.0,  6.0,  8.0, 1, 1
    ;  IAC step == idle pwm, when using pwm idle control.
       PWMIdlegauge      = idleDC,        "Idle PWM%",          "%",       0,   100,    -1,     -1,  999,   90, 1, 1
       advdegGauge       = advance,       "Ignition Advance",   "degrees", 0,    50,    -1,     -1,  999,  999, 1, 1
       dutyCycle1Gauge   = dutyCycle1,    "Duty Cycle 1",       "%",       0,   100,     -1,    -1,   85,   90, 1, 1
       dutyCycle2Gauge   = dutyCycle2,    "Duty Cycle 2",       "%",       0,   100,     -1,    -1,   85,   90, 1, 1
       boostdutyGauge    = boostduty,     "Boost Duty",         "%",       0,    100,   -1,     -1,  100,  100, 1, 1
       boostdutyGauge2   = boostduty2,    "Boost Duty 2",         "%",       0,    100,   -1,     -1,  100,  100, 1, 1
       injtimingpriGauge = inj_timing_pri, "Injector timing (pri)",   "degrees", 0,    50,    -1,     -1,  999,  999, 1, 1
       injtimingsecGauge = inj_timing_sec, "Injector timing (sec)",   "degrees", 0,    50,    -1,     -1,  999,  999, 1, 1
       domeFillOut1Gauge = dome_fill_duty1, "Dome channel 1 fill duty", "%", 0, 100, -1, -1, 100, 100, 1, 1
;       domeFillOut2Gauge = dome_fill_duty2, "Dome channel 2 fill duty", "%", 0, 100, -1, -1, 100, 100, 1, 1
       domeEmptyOut1Gauge= dome_empty_duty1, "Dome channel 1 empty duty", "%", 0, 100, -1, -1, 100, 100, 1, 1
;       domeEmptyOut2Gauge= dome_empty_duty2, "Dome channel 2 empty duty", "%", 0, 100, -1, -1, 100, 100, 1, 1
       throttletargGauge = throttle_targ,    "Throttle Target",  "%",   0,   100,     -1,     1,   90,  100, 1, 0

    gaugeCategory = "Outputs 3"
       nitrous1_duty = nitrous1_duty, "Nitrous 1 Duty", "%", 0, 100, 100, 100, 100, 100, 0 ,0
       nitrous2_duty = nitrous2_duty, "Nitrous 2 Duty", "%", 0, 100, 100, 100, 100, 100, 0 ,0
       water_duty = water_duty, "Water Duty", "%", 0, 100, 100, 100, 100, 100, 0 ,0
       duty_pwm_a = duty_pwm_a, "Generic PWM A Duty", "%", 0, 100, 100, 100, 100, 100, 0 ,0
       duty_pwm_b = duty_pwm_b, "Generic PWM B Duty", "%", 0, 100, 100, 100, 100, 100, 0 ,0
       duty_pwm_c = duty_pwm_c, "Generic PWM C Duty", "%", 0, 100, 100, 100, 100, 100, 0 ,0
       duty_pwm_d = duty_pwm_d, "Generic PWM D Duty", "%", 0, 100, 100, 100, 100, 100, 0 ,0
       duty_pwm_e = duty_pwm_e, "Generic PWM E Duty", "%", 0, 100, 100, 100, 100, 100, 0 ,0
       duty_pwm_f = duty_pwm_f, "Generic PWM F Duty", "%", 0, 100, 100, 100, 100, 100, 0 ,0
       vvt_duty1 = vvt_duty1, "VVT 1 duty", "%", 0, 100, 100, 100, 100, 100, 1 ,1
       vvt_duty2 = vvt_duty2, "VVT 2 duty", "%", 0, 100, 100, 100, 100, 100, 1 ,1
       vvt_duty3 = vvt_duty3, "VVT 3 duty", "%", 0, 100, 100, 100, 100, 100, 1 ,1
       vvt_duty4 = vvt_duty4, "VVT 4 duty", "%", 0, 100, 100, 100, 100, 100, 1 ,1
       fp_duty = fp_duty, "Fuel pump duty", "%", 0, 100, 100, 100, 100, 100, 1, 1
       alt_duty = alt_duty, "Alternator Control Duty", "%", 0, 100, 100, 100, 100, 100, 0, 0
       alt_period = alt_period, "Alternator Control Period", "ms", 0, 25, 25, 25, 25, 25, 2, 2
       alt_targv = alt_targv, "Alternator Target Volts", "V",     0,   16,  16,  16,  16,  16, 1, 1
       generic_pid_duty_a = generic_pid_duty_a, "Generic Closed-Loop A Duty", "%", 0, 100, 100, 100, 100, 100, 1, 1 
       generic_pid_duty_b = generic_pid_duty_b, "Generic Closed-Loop B Duty", "%", 0, 100, 100, 100, 100, 100, 1, 1 
       fan1_duty = fan1_duty, "Fan 1 duty", "%", 0, 100, 100, 100, 100, 100, 1, 1

    gaugeCategory = "Calculations 1"
       accelEnrichGauge  = accDecEnrich,  "Accel Enrich%",       "%",      50,   150,     -1,    -1,  999,  999, 0, 0
       accEnrichMSGauge  = accEnrichMS, "Accel Enrich PW",       "ms",      50,   150,     -1,    -1,  999,  999, 3, 3
       gammaEnrichGauge  = gammaEnrich,   "Total cor",   "%",      50,   150,     -1,    -1,  151,  151, 1, 1
       gammaairGauge     = airCorrection, "Air density Correction",        "%",      50,   150,     -1,    -1,  151,  151, 1, 1
       warmupgauge = warmupEnrich,    "Warmup Enrichment",        "%",      50,   150,     -1,    -1,  151,  151, 1, 1
       barocorgauge = baroCorrection,  "Barometric Correction",        "%",      50,   150,     -1,    -1,  151,  151, 1, 1
       WFGauge1 = wallfuel1, "Fuel on the walls 1", "", 0, 40000000, 0, 0, 40000000, 40000000, 0, 0
       WFGauge2 = wallfuel2, "Fuel on the walls 2", "", 0, 40000000, 0, 0, 40000000, 40000000, 0, 0
       EAEGauge1 = EAEFuelCorr1, "EAE Fuel Correction 1", "%",       0,   200,     40,    70,  130,  160, 0, 0
       EAEGauge2 = EAEFuelCorr2, "EAE Fuel Correction 2", "%",       0,   200,     40,    70,  130,  160, 0, 0
       fuelcorr  = fuelCorrection,"E85 Fuel Correction", "%",    100,   200,     99,    99,  164,  170, 0, 0
       fueltemp_cor  = fueltemp_cor,  "Fuel Temperature Correction", "%",    -100,   100,     -100,    -100,  100,  100, 1, 1
       fuelpress_cor = fuelpress_cor, "Fuel Pressure Correction",    "%",    -100,   100,     -100,    -100,  100,  100, 1, 1
       ltt_cor       = ltt_cor, "Long Term Trim Correction",   "%",      -12.7,   12.7,     -12.7,    -12.7,  12.7,  12.7, 1, 1
       veGauge1          = veCurr1,       "VE1 Current",         "%",       0,   120,     -1,    -1,  999,  999, 1, 1
       veGauge2          = veCurr2,       "VE2 Current",         "%",       0,   120,     -1,    -1,  999,  999, 1, 1
       nitrous_addfuel = n2o_addfuel, "Nitrous added fuel", "ms", -5, 20, 20, 20, 20, 20, 3, 3
       tps_accel = tps_accel, "tps_accel", "%/sec", -15000, 15000, 65535, 65535, 65535, 65535, 0, 0
       map_accel = map_accel, "map_accel", "kPa/sec", -15000, 15000, 65535, 65535, 65535, 65535, 0, 0
       total_accel = total_accel, "total_accel", "%/sec", -15000, 15000, 65535, 65535, 65535, 65535, 0, 0
       als_addfuel = als_addfuel, "ALS added fuel", "ms", -5, 20, 20, 20, 20, 20, 3, 3
       reqfuelGauge  = reqfuel,   "Req Fuel (calc)",    "ms",    0,  25.5,    1.0,   1.2,   20,   25, 3, 1
       deadtime1Gauge  = deadtime1,   "DeadTime 1",      "ms",    0,  25.5,    1.0,   1.2,   20,   25, 3, 1

    gaugeCategory = "Calculations 2"
       knockGauge        = knockRetard,   "Knock Retard",       "deg",     0,  25.0,     -1,    -1,  5.0, 10.0, 1, 1
       coldAdvGauge      = coldAdvDeg,    "Cold advance",       "deg",     0,  25.0,     -50,    -50,  50.0, 50.0, 1, 1
       tc_retardGauge    = tc_retard,     "Traction Retard",    "deg",     0,  25.0,     -50,    -50,  50.0, 50.0, 1, 1
       cel_retardGauge   = cel_retard,    "CEL Retard",         "deg",     0,  25.0,     -50,    -50,  50.0, 50.0, 1, 1
       fc_retardGauge    = fc_retard,     "Fuel cut Retard",    "deg",     0,  25.0,     -50,    -50,  50.0, 50.0, 1, 1
       ext_advanceGauge   = ext_advance,    "External Advance",    "deg",     0,  25.0,     -50,    -50,  50.0, 50.0, 1, 1
       base_advanceGauge = base_advance,  "Base Spark Advance", "deg",     0,  25.0,     -50,    -50,  50.0, 50.0, 1, 1
       idle_cor_advanceGauge = idle_cor_advance, "Idle Correction Advance", "deg",     0,  25.0,     -50,    -50,  50.0, 50.0, 1, 1
       mat_retardGauge   = mat_retard,    "MAT Retard",         "deg",     0,  25.0,     -50,    -50,  50.0, 50.0, 1, 1
       flex_advanceGauge = flex_advance,  "Flex Advance",       "deg",     0,  25.0,     -50,    -50,  50.0, 50.0, 1, 1
       adv1Gauge         = adv1,          "Spark Table 1",      "deg",     0,  25.0,     -50,    -50,  50.0, 50.0, 1, 1
       adv2Gauge         = adv2,          "Spark Table 2",      "deg",     0,  25.0,     -50,    -50,  50.0, 50.0, 1, 1
       adv3Gauge         = adv3,          "Spark Table 3",      "deg",     0,  25.0,     -50,    -50,  50.0, 50.0, 1, 1
       adv4Gauge         = adv4,          "Spark Table 4",      "deg",     0,  25.0,     -50,    -50,  50.0, 50.0, 1, 1
       revlim_retardGauge= revlim_retard, "Revlim Retard",      "deg",     0,  25.0,     -50,    -50,  50.0, 50.0, 1, 1
       als_timingGauge   = als_timing,    "ALS Timing",         "deg",     0,  25.0,     -50,    -50,  50.0, 50.0, 1, 1
       launch_timingGauge   = launch_timing,    "Launch Timing",         "deg",     0,  25.0,     -50,    -50,  50.0, 50.0, 1, 1
       step3_timingGauge   = step3_timing,    "3-step Timing",         "deg",     0,  25.0,     -50,    -50,  50.0, 50.0, 1, 1
       launchvss_retardGauge   = launchvss_retard,    "Launch VSS Retard",         "deg",     0,  25.0,     -50,    -50,  50.0, 50.0, 1, 1
       timingerrGauge = timing_err, "Timing pred err", "%", -127, 127, 255,255,255,255,0,0
;       user0Gauge = user0, "User defined", "", 0, 65535, 65535, 65535, 65535, 65535, 0, 0
       nitrous_retard = n2o_retard, "Nitrous retard", "deg", -5, 30, 30, 30, 30, 30, 1, 1
       launch_timer = launch_timer, "Launch timer", "s", 0, 15, 15, 15, 15, 15, 3 ,3
       launch_retard = launch_retard, "Launch timed retard", "deg", -5, 30, 30, 30, 30, 30, 1, 1
       nitrous_timer = nitrous_timer, "Nitrous Timer", "s", 0, 15, 15, 15, 15, 15, 3 ,3

    gaugeCategory = "Calculations 3"
       lostsyncGauge = synccnt, "Lost sync counter", "", 0, 255, 255, 255, 255, 255, 0, 0
       syncreasonGauge = syncreason, "Lost sync reason", "", 0, 255, 255, 255, 255, 255, 0, 0
       clockGauge        = seconds,       "Clock",              "Seconds", 0,  65535,     10,    10,  65535,  65535, 0, 0
       vss1dot = vss1dot, "VSS1 Acceleration", "ms-2", -25, 25, 65535, 65535, 65535, 65535, 0, 0 ; adjust to 50 if running top fuel
       vss2dot = vss2dot, "VSS2 Acceleration", "ms-2", -25, 25, 65535, 65535, 65535, 65535, 0, 0 ; adjust to 50 if running top fuel
       RPMdot = RPMdot, "RPMdot", "rpm/sec", -15000, 15000, 65535, 65535, 65535, 65535, 0, 0
       TPSdot = TPSdot, "TPSdot", "%/sec", -15000, 15000, 65535, 65535, 65535, 65535, 0, 0
       MAPdot = MAPdot, "MAPdot", "kPa/sec", -15000, 15000, 65535, 65535, 65535, 65535, 0, 0
   vvttargGauge1    = vvt_target1,       "VVT 1 target",   "degrees", 0,    50,    -1,     -1,  999,  999, 1, 1
   vvttargGauge2    = vvt_target2,       "VVT 2 target",   "degrees", 0,    50,    -1,     -1,  999,  999, 1, 1
   vvttargGauge3    = vvt_target3,       "VVT 3 target",   "degrees", 0,    50,    -1,     -1,  999,  999, 1, 1
   vvttargGauge4    = vvt_target4,       "VVT 4 target",   "degrees", 0,    50,    -1,     -1,  999,  999, 1, 1
       fuelflowGauge = fuelflow,       "Fuel flow (avg)",         "cc/min",       0,   65535,     -1,    -1,  99999,  99999, 0, 0
    economy_l_100km    = economy_l_100km, "Fuel economy", "l/100km", 0, 300, -1, -1, 900, 900, 1, 1
    economy_mpg_us  = economy_mpg_us, "Fuel economy", "mpg_us", 0, 60, -1, -1, 99, 99, 0, 0
    economy_mpg_uk  = economy_mpg_uk, "Fuel economy", "mpg_uk", 0, 60, -1, -1, 99, 99, 0, 0
    boost_target_1 = boost_targ_1, "Boost Target 1", "kPa", 0, 500, -1, -1, 999, 999, 1, 1
    boost_target_2 = boost_targ_2, "Boost Target 2", "kPa", 0, 500, -1, -1, 999, 999, 1, 1
    boost_dome_target1 = boost_dome_targ1, "Dome Target 1", "kPa", 0, 500, -1, -1, 999, 999, 1, 1
;    boost_dome_target2 = boost_dome_targ2, "Dome Target 2", "kPa", 0, 500, -1, -1, 999, 999, 1, 1
    cl_idle_targ_rpm = cl_idle_targ_rpm, "CL Idle target", "RPM",     0,  20000,    300,   600, {rpmwarn}, {rpmdang}, 0, 0
    tc_slipxtime = tc_slipxtime, "T/C Slip * Time", "", 0, 6553.5, 6553.5, 6553.5, 6553.5, 6553.5, 1, 1
       ve_rawGauge1          = ve_raw1,       "VE1 raw",         "%",       0,   120,     -1,    -1,  999,  999, 1, 1
       ve_rawGauge2          = ve_raw2,       "VE2 raw",         "%",       0,   120,     -1,    -1,  999,  999, 1, 1
       ve_rawGauge3          = ve_raw3,       "VE3 raw",         "%",       0,   120,     -1,    -1,  999,  999, 1, 1
       ve_rawGauge4          = ve_raw4,       "VE4 raw",         "%",       0,   120,     -1,    -1,  999,  999, 1, 1

    gaugeCategory = "EGT inputs"
#if CELSIUS
       egtGauge1          = egt1,           "EGT 01",                   "C",    0,  1250, 0, 0,     1250,   1250, 0, 0
       egtGauge2          = egt2,           "EGT 02",                   "C",    0,  1250, 0, 0,     1250,   1250, 0, 0
       egtGauge3          = egt3,           "EGT 03",                   "C",    0,  1250, 0, 0,     1250,   1250, 0, 0
       egtGauge4          = egt4,           "EGT 04",                   "C",    0,  1250, 0, 0,     1250,   1250, 0, 0
       egtGauge5          = egt5,           "EGT 05",                   "C",    0,  1250, 0, 0,     1250,   1250, 0, 0
       egtGauge6          = egt6,           "EGT 06",                   "C",    0,  1250, 0, 0,     1250,   1250, 0, 0
       egtGauge7          = egt7,           "EGT 07",                   "C",    0,  1250, 0, 0,     1250,   1250, 0, 0
       egtGauge8          = egt8,           "EGT 08",                   "C",    0,  1250, 0, 0,     1250,   1250, 0, 0
       egtGauge9          = egt9,           "EGT 09",                   "C",    0,  1250, 0, 0,     1250,   1250, 0, 0
       egtGauge10         = egt10,          "EGT 10",                  "C",    0,  1250, 0, 0,     1250,   1250, 0, 0
       egtGauge11         = egt11,          "EGT 11",                  "C",    0,  1250, 0, 0,     1250,   1250, 0, 0
       egtGauge12         = egt12,          "EGT 12",                  "C",    0,  1250, 0, 0,     1250,   1250, 0, 0
;       egtGauge13         = egt13,          "EGT 13",                  "C",    0,  1250, 0, 0,     1250,   1250, 0, 0
;       egtGauge14         = egt14,          "EGT 14",                  "C",    0,  1250, 0, 0,     1250,   1250, 0, 0
;       egtGauge15         = egt15,          "EGT 15",                  "C",    0,  1250, 0, 0,     1250,   1250, 0, 0
;       egtGauge16         = egt16,          "EGT 16",                  "C",    0,  1250, 0, 0,     1250,   1250, 0, 0
#else
       egtGauge1          = egt1,           "EGT 01",                   "F",    0,  2280, 0, 0,     2280,   2280, 0, 0
       egtGauge2          = egt2,           "EGT 02",                   "F",    0,  2280, 0, 0,     2280,   2280, 0, 0
       egtGauge3          = egt3,           "EGT 03",                   "F",    0,  2280, 0, 0,     2280,   2280, 0, 0
       egtGauge4          = egt4,           "EGT 04",                   "F",    0,  2280, 0, 0,     2280,   2280, 0, 0
       egtGauge5          = egt5,           "EGT 05",                   "F",    0,  2280, 0, 0,     2280,   2280, 0, 0
       egtGauge6          = egt6,           "EGT 06",                   "F",    0,  2280, 0, 0,     2280,   2280, 0, 0
       egtGauge7          = egt7,           "EGT 07",                   "F",    0,  2280, 0, 0,     2280,   2280, 0, 0
       egtGauge8          = egt8,           "EGT 08",                   "F",    0,  2280, 0, 0,     2280,   2280, 0, 0
       egtGauge9          = egt9,           "EGT 09",                   "F",    0,  2280, 0, 0,     2280,   2280, 0, 0
       egtGauge10         = egt10,          "EGT 10",                  "F",    0,  2280, 0, 0,     2280,   2280, 0, 0
       egtGauge11         = egt11,          "EGT 11",                  "F",    0,  2280, 0, 0,     2280,   2280, 0, 0
       egtGauge12         = egt12,          "EGT 12",                  "F",    0,  2280, 0, 0,     2280,   2280, 0, 0
;       egtGauge13         = egt13,          "EGT 13",                  "F",    0,  2280, 0, 0,     2280,   2280, 0, 0
;       egtGauge14         = egt14,          "EGT 14",                  "F",    0,  2280, 0, 0,     2280,   2280, 0, 0
;       egtGauge15         = egt15,          "EGT 15",                  "F",    0,  2280, 0, 0,     2280,   2280, 0, 0
;       egtGauge16         = egt16,          "EGT 16",                  "F",    0,  2280, 0, 0,     2280,   2280, 0, 0
#endif

    gaugeCategory = "Sensor inputs1"
#if CELSIUS
        cltGauge          = coolant,       "Coolant Temp",       "°C",    {cltlowlim},   {clthighlim},    -100,     -100,   {clthighwarn},  {clthighdang}, 0, 0
       matGauge          = mat,           "Manifold Air Temp",  "°C",    -40,   110,    -15,     0,   95,  100, 0, 0
       airtempGauge          = airtemp,           "Est. Intake Air Temp",  "°C",    -40,   110,    -15,     0,   95,  100, 0, 0
#else
        cltGauge          = coolant,       "Coolant Temp",       "°F",    {cltlowlim},   {clthighlim},      -100,    -100,  {clthighwarn},  {clthighdang}, 0, 0
       matGauge          = mat,           "Manifold Air Temp",  "°F",    -40,   215,      0,    30,  200,  210, 0, 0

       airtempGauge          = airtemp,       "Est. Intake Air Temp",  "°F",    -40,   215,      0,    30,  200,  210, 0, 0
#endif
       voltMeter         = batteryVoltage,"Battery Voltage",    "volts",   7,    21,      8,     9,   15,   16, 2, 2
       tachometer        = rpm,           "Engine Speed",       "RPM",     0,  {rpmhigh},    300,   600, {rpmwarn}, {rpmdang}, 0, 0
       throttleGauge     = throttle,      "Throttle Position",  "%",       0,   100,     -1,     1,   90,  100, 1, 0
       mapGauge          = map,           "Engine MAP",         "kPa",     0,   {loadhigh},      0,    20,  200,  {loadhigh}, 1, 0
       barometerGauge    = barometer,     "Barometer",          "kPa",    60,   120,      0,    20,  200,  245, 1, 0
       fuelloadGauge      = fuelload,     "Fuel Load",          { bitStringValue( algorithmUnits , algorithm  ) },     0,   {loadhigh},      0,    20,  200,  {loadhigh}, 1, 0
       fuelload2Gauge    = fuelload2,     "Secondary Fuel Load", { bitStringValue( algorithmUnits , algorithm2  ) },    0,   {loadhigh},      0,    20,  200,  {loadhigh}, 1, 0
       ignloadGauge      = ignload,       "Ign Load",           { bitStringValue( algorithmUnits , IgnAlgorithm ) },     0,   {loadhigh},      0,    20,  200,  {loadhigh}, 1, 0
       ignload2Gauge     = ignload2,      "Secondary Ign Load", { bitStringValue( algorithmUnits , IgnAlgorithm2 ) },     0,   {loadhigh},      0,    20,  200,  {loadhigh}, 1, 0
       eaeloadGauge      = eaeload1,       "EAE Load",           { bitStringValue( algorithmUnits ,  (eaeload ? eaeload : algorithm) ) },     0,   {loadhigh},      0,    20,  200,  {loadhigh}, 1, 0
       afrloadGauge      = afrload1,       "AFR Load",           { bitStringValue( algorithmUnits ,  (afrload ? afrload : algorithm) ) },     0,   {loadhigh},      0,    20,  200,  {loadhigh}, 1, 0
       mafGauge = maf,  "Mass Air Flow", "g/sec",   0,   {650 * (maf_range + 1)},      0,   {200 * (maf_range + 1)},  {480 * (maf_range + 1)},  {550 * (maf_range + 1)}, 2, 0
       maf_voltsGauge = maf_volts,  "MAF Volts", "V",   0,   5.00,      0,   5.00,  5.00,  5.00, 3, 1
       maf_freqGauge = maf_freq,  "MAF Frequency", "Hz",   0,   30000,      0,   30000,  30000,  30000, 0, 0
       mafloadGauge = mafload, "MAFload", "kPa",       0,   400,      -1,  -1,   999,  999, 1, 0
       boostbarGauge     = boostbar,      "Boost",         "bar",    -1,     3,      -1,    -1,    5,  5,  2, 2
       boostpsigGauge    = boostpsig,     "Boost",        "psig",    -14.7, 21,      -15,    -15,  30, 30, 1, 1
       boostvacGauge     = boostvac,      "Vac/Boost",       "inHg/psig", -30, 30, -30, -30, 30, 30, 1, 1
       knockinGauge      = knock,   "Knock Input",       "%",     0,  100.0,     -1,    -1,  100.0, 100.0, 1, 1
       appGauge          = app,           "Pedal/Grip Position",  "%",       0,   100,     -1,     1,   90,  100, 1, 0

    gaugeCategory = "Sensor inputs2"
       stream_levelGauge = stream_level, "Stream Level", "", 0, 128, 128, 128, 128, 128, 0, 0
       vehiclespeed1     = vss1, "Vehicle Speed 1", { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, 0, { prefSpeedUnits == 0 ? 200 : 300 }, 1000, 1000, 1000, 1000, 0, 0
       vehiclespeed2     = vss2, "Vehicle Speed 2", { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, 0, { prefSpeedUnits == 0 ? 200 : 300 }, 1000, 1000, 1000, 1000, 0, 0
       vehiclespeed3     = vss3, "Vehicle Speed 3", { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, 0, { prefSpeedUnits == 0 ? 200 : 300 }, 1000, 1000, 1000, 1000, 0, 0
       vehiclespeed4     = vss4, "Vehicle Speed 4", { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, 0, { prefSpeedUnits == 0 ? 200 : 300 }, 1000, 1000, 1000, 1000, 0, 0

   shaftspeed1     = ss1, "Shaft Speed 1", "RPM", 0, 10000, 10000, 10000, 10000, 10000, 0, 0
   shaftspeed2     = ss2, "Shaft Speed 2", "RPM", 0, 10000, 10000, 10000, 10000, 10000, 0, 0
   gear  = gear, "Gear", "", -1, 6, 6, 6, 6, 6, 0 ,0
   accelx = accelx, "Accel X", "ms-2", -25, 25, 25, 25, 25, 25, 2, 2 
   accely = accely, "Accel Y", "ms-2", -25, 25, 25, 25, 25, 25, 2, 2 
   accelz = accelz, { bitStringValue( accel_vs_yaw_name ,  accel_vs_yaw ) }, { bitStringValue( accel_vs_yaw_units ,  accel_vs_yaw ) }, -25, 25, 25, 25, 25, 25, 2, 2 ; TODO compute name and units
   fuelcompsn= fuel_pct, "Ethanol Percentage","%",      0,   100,     -1,    -1,   85,  101, 1, 1
#if CELSIUS
    fueltempGauge1 = fuel_temp1,       "Fuel Temp1",       "°C",    -40,   110,    -100,     -100,   95,  105, 0, 0
    fueltempGauge2 = fuel_temp2,       "Fuel Temp2",       "°C",    -40,   110,    -100,     -100,   95,  105, 0, 0
#else
    fueltempGauge1 = fuel_temp1,       "Fuel Temp1",       "°F",    -40,   240,      -100,    -100,  200,  220, 0, 0
    fueltempGauge2 = fuel_temp2,       "Fuel Temp2",       "°F",    -40,   240,      -100,    -100,  200,  220, 0, 0
#endif
    fuelpressGauge1kpa = fuel_press1,     "Fuel Pressure1",   "kPa.d",    -40,   240,      -100,    -100,  200,  220, 0, 0
    fuelpressGauge1psi = fuel_press1_psi, "Fuel Pressure1",   "psi.d",    -40,   240,      -100,    -100,  200,  220, 0, 0
    fuelpressGauge1bar = fuel_press1_bar, "Fuel Pressure1",   "bar.d",    -40,   240,      -100,    -100,  200,  220, 0, 0
    fuelpressGauge2kpa = fuel_press2,     "Fuel Pressure2",   "kPa.d",    -40,   240,      -100,    -100,  200,  220, 0, 0
    fuelpressGauge2psi = fuel_press2_psi, "Fuel Pressure2",   "psi.d",    -40,   240,      -100,    -100,  200,  220, 0, 0
    fuelpressGauge2bar = fuel_press2_bar, "Fuel Pressure1",   "bar.d",    -40,   240,      -100,    -100,  200,  220, 0, 0
       TPSADCGauge     = tpsADC,      "TPS ADC",  "ADC",       0,   1023,     -1,     1,   1024,  1024, 0, 0
       load_duty = load_duty, "Alternator Load Duty", "%", 0, 100, 100, 100, 100, 100, 0, 0
       batt_curr = batt_curr, "Battery Current", "A",     -100,   100,  200,  200,  200,  200, 1, 1

gaugeCategory = "Sensor inputs3"
   vvtGauge1    = vvt_ang1,       "VVT 1 angle",   "degrees", 0,    50,    -1,     -1,  999,  999, 1, 1
   vvtGauge2    = vvt_ang2,       "VVT 2 angle",   "degrees", 0,    50,    -1,     -1,  999,  999, 1, 1
   vvtGauge3    = vvt_ang3,       "VVT 3 angle",   "degrees", 0,    50,    -1,     -1,  999,  999, 1, 1
   vvtGauge4    = vvt_ang4,       "VVT 4 angle",   "degrees", 0,    50,    -1,     -1,  999,  999, 1, 1
   knock01Gauge  = knock_cyl01,   "Knock cyl# 1",      "",    0,    100, 0,  0,  100, 100, 1, 0
   knock02Gauge  = knock_cyl02,   "Knock cyl# 2",      "",    0,    100, 0,  0,  100, 100, 1, 0
   knock03Gauge  = knock_cyl03,   "Knock cyl# 3",      "",    0,    100, 0,  0,  100, 100, 1, 0
   knock04Gauge  = knock_cyl04,   "Knock cyl# 4",      "",    0,    100, 0,  0,  100, 100, 1, 0
   knock05Gauge  = knock_cyl05,   "Knock cyl# 5",      "",    0,    100, 0,  0,  100, 100, 1, 0
   knock06Gauge  = knock_cyl06,   "Knock cyl# 6",      "",    0,    100, 0,  0,  100, 100, 1, 0
   knock07Gauge  = knock_cyl07,   "Knock cyl# 7",      "",    0,    100, 0,  0,  100, 100, 1, 0
   knock08Gauge  = knock_cyl08,   "Knock cyl# 8",      "",    0,    100, 0,  0,  100, 100, 1, 0
   knock09Gauge  = knock_cyl09,   "Knock cyl# 9",      "",    0,    100, 0,  0,  100, 100, 1, 0
   knock10Gauge  = knock_cyl10,   "Knock cyl#10",      "",    0,    100, 0,  0,  100, 100, 1, 0
   knock11Gauge  = knock_cyl11,   "Knock cyl#11",      "",    0,    100, 0,  0,  100, 100, 1, 0
   knock12Gauge  = knock_cyl12,   "Knock cyl#12",      "",    0,    100, 0,  0,  100, 100, 1, 0

gaugeCategory = "Sensor inputs4"
;   gps_latdeggauge       = gps_latdeg, "GPS Latitude deg", "deg", -90, +90, -90, -90, 90, 90, 0, 0
;   gps_latmingauge       = gps_latmin, "GPS Latitude min", "min", 0, +60, 0, 0, 60, 60, 0, 0
;   gps_latsecgauge      = gps_latsec, "GPS Latitude sec", "sec", 0, +60, 0, 0, 60, 60, 3, 3
;   gps_latmmingauge      = gps_latmmin, "GPS Latitude mmin", "mmin", 0, +60, 0, 0, 6000, 6000, 3, 3
;   gps_londeggauge       = gps_londeg, "GPS Longitude deg", "deg", 0, +180, 0, 0, 180, 180, 0, 0
;   gps_lonmingauge       = gps_lonmin, "GPS Longitude min", "min", 0, +60, 0, 0, 60, 60, 0, 0
;   gps_lonsecgauge      = gps_lonsec, "GPS Longitude sec", "sec", 0, +60, 0, 0, 60, 60, 3, 3
;   gps_lonEWgauge        = gps_lonEW, "GPS Longitude E/W", "E/W", 0, 255, 0, 0, 255, 255, 0, 0
   gps_altgauge         = gps_alt, "GPS Altitude", "m", -100, +13000, -100, -100, 13000, 13000, 1, 1
   gps_speedgauge      = gps_speed, "GPS Speed", { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, 0, { prefSpeedUnits == 0 ? 200 : 300 }, 1000, 1000, 1000, 1000, 0, 0
   gps_coursegauge       = gps_course, "GPS Course", "deg", 0, 360, 0, 0, 360, 360, 1, 1

   gps_latitudegauge     = gps_latitude, "GPS Latitude", "deg", -90, +90, -90, -90, 90, 90, 5, 5
   gps_longitudegauge    = gps_longitude, "GPS Longitude", "deg", -180, +180, -180, -180, 180, 180, 5, 5

gaugeCategory = "AFR/EGO inputs"
#if   NARROW_BAND_EGO
   egoV1Gauge        = egov1,    "Exhaust Gas Oxygen 1", "volts",   0,   1,    1,   1,  1,  1, 2, 2
   egoV2Gauge        = egov2,    "Exhaust Gas Oxygen 2", "volts",   0,   1,    1,   1,  1,  1, 2, 2
   egoV3Gauge        = egov3,    "Exhaust Gas Oxygen 3", "volts",   0,   1,    1,   1,  1,  1, 2, 2
   egoV4Gauge        = egov4,    "Exhaust Gas Oxygen 4", "volts",   0,   1,    1,   1,  1,  1, 2, 2
   egoV5Gauge        = egov5,    "Exhaust Gas Oxygen 5", "volts",   0,   1,    1,   1,  1,  1, 2, 2
   egoV6Gauge        = egov6,    "Exhaust Gas Oxygen 6", "volts",   0,   1,    1,   1,  1,  1, 2, 2
   egoV7Gauge        = egov7,    "Exhaust Gas Oxygen 7", "volts",   0,   1,    1,   1,  1,  1, 2, 2
   egoV8Gauge        = egov8,    "Exhaust Gas Oxygen 8", "volts",   0,   1,    1,   1,  1,  1, 2, 2
#elif LAMBDA

   lambda1Gauge      = lambda1,       "Lambda 1",             "",      0.5,   1.5,    0.5,   0.7,    2,  1.1, 2, 2
   lambda2Gauge      = lambda2,       "Lambda 2",             "",      0.5,   1.5,    0.5,   0.7,    2,  1.1, 2, 2
   lambda3Gauge      = lambda3,       "Lambda 3",             "",      0.5,   1.5,    0.5,   0.7,    2,  1.1, 2, 2
   lambda4Gauge      = lambda4,       "Lambda 4",             "",      0.5,   1.5,    0.5,   0.7,    2,  1.1, 2, 2
   lambda5Gauge      = lambda5,       "Lambda 5",             "",      0.5,   1.5,    0.5,   0.7,    2,  1.1, 2, 2
   lambda6Gauge      = lambda6,       "Lambda 6",             "",      0.5,   1.5,    0.5,   0.7,    2,  1.1, 2, 2
   lambda7Gauge      = lambda7,       "Lambda 7",             "",      0.5,   1.5,    0.5,   0.7,    2,  1.1, 2, 2
   lambda8Gauge      = lambda8,       "Lambda 8",             "",      0.5,   1.5,    0.5,   0.7,    2,  1.1, 2, 2

   egoV1Gauge        = egov1,    "Exhaust Gas Oxygen 1", "volts",   0,   5,    5,   5,  5,  5, 2, 2
   egoV2Gauge        = egov2,    "Exhaust Gas Oxygen 2", "volts",   0,   5,    5,   5,  5,  5, 2, 2
   egoV3Gauge        = egov3,    "Exhaust Gas Oxygen 3", "volts",   0,   5,    5,   5,  5,  5, 2, 2
   egoV4Gauge        = egov4,    "Exhaust Gas Oxygen 4", "volts",   0,   5,    5,   5,  5,  5, 2, 2
   egoV5Gauge        = egov5,    "Exhaust Gas Oxygen 5", "volts",   0,   5,    5,   5,  5,  5, 2, 2
   egoV6Gauge        = egov6,    "Exhaust Gas Oxygen 6", "volts",   0,   5,    5,   5,  5,  5, 2, 2
   egoV7Gauge        = egov7,    "Exhaust Gas Oxygen 7", "volts",   0,   5,    5,   5,  5,  5, 2, 2
   egoV8Gauge        = egov8,    "Exhaust Gas Oxygen 8", "volts",   0,   5,    5,   5,  5,  5, 2, 2
#else

   afr1Gauge         = afr1,          "Air:Fuel Ratio 1",     "",       10,  19.4,     12,    13,   15,   16, 2, 2
   afr2Gauge         = afr2,          "Air:Fuel Ratio 2",     "",       10,  19.4,     12,    13,   15,   16, 2, 2
   afr3Gauge         = afr3,          "Air:Fuel Ratio 3",     "",       10,  19.4,     12,    13,   15,   16, 2, 2
   afr4Gauge         = afr4,          "Air:Fuel Ratio 4",     "",       10,  19.4,     12,    13,   15,   16, 2, 2
   afr5Gauge         = afr5,          "Air:Fuel Ratio 5",     "",       10,  19.4,     12,    13,   15,   16, 2, 2
   afr6Gauge         = afr6,          "Air:Fuel Ratio 6",     "",       10,  19.4,     12,    13,   15,   16, 2, 2

   afr7Gauge         = afr7,          "Air:Fuel Ratio 7",     "",       10,  19.4,     12,    13,   15,   16, 2, 2
   afr8Gauge         = afr8,          "Air:Fuel Ratio 8",     "",       10,  19.4,     12,    13,   15,   16, 2, 2

   egoV1Gauge        = egov1,    "Exhaust Gas Oxygen 1", "volts",   0,   5,    5,   5,  5,  5, 2, 2
   egoV2Gauge        = egov2,    "Exhaust Gas Oxygen 2", "volts",   0,   5,    5,   5,  5,  5, 2, 2
   egoV3Gauge        = egov3,    "Exhaust Gas Oxygen 3", "volts",   0,   5,    5,   5,  5,  5, 2, 2
   egoV4Gauge        = egov4,    "Exhaust Gas Oxygen 4", "volts",   0,   5,    5,   5,  5,  5, 2, 2
   egoV5Gauge        = egov5,    "Exhaust Gas Oxygen 5", "volts",   0,   5,    5,   5,  5,  5, 2, 2
   egoV6Gauge        = egov6,    "Exhaust Gas Oxygen 6", "volts",   0,   5,    5,   5,  5,  5, 2, 2
   egoV7Gauge        = egov7,    "Exhaust Gas Oxygen 7", "volts",   0,   5,    5,   5,  5,  5, 2, 2
   egoV8Gauge        = egov8,    "Exhaust Gas Oxygen 8", "volts",   0,   5,    5,   5,  5,  5, 2, 2
#endif

gaugeCategory = "AFR/EGO calculations"
#if   NARROW_BAND_EGO
   afr1targetGauge   = afrtgt1,       "EgoV 1 Target",     "",       0,  1,     20,    20,   20,   20, 3, 3
   afr2targetGauge   = afrtgt2,       "EgoV 2 Target",     "",       0,  1,     20,    20,   20,   20, 3, 3
   afr1errGauge      = afr1err,       "EgoV 1 Error",     "",       -1,  +1,     12,    13,   15,   16, 3, 3
   afr2errGauge      = afr2err,       "EgoV 2 Error",     "",       -1,  +1,     12,    13,   15,   16, 3, 3
#elif LAMBDA
   afr1targetGauge   = afrtgt1,       "Lambda 1 Target",     "",       0.5,  1.5,     20,    20,   20,   20, 2, 2
   afr2targetGauge   = afrtgt2,       "Lambda 2 Target",     "",       0.5,  1.5,     20,    20,   20,   20, 2, 2
   afr1errGauge      = afr1err,       "Lambda 1 Error",     "",       -2,  +2,     12,    13,   15,   16, 2, 2
   afr2errGauge      = afr2err,       "Lambda 2 Error",     "",       -2,  +2,     12,    13,   15,   16, 2, 2
#else
   afr1targetGauge   = afrtgt1,       "AFR 1 Target",     "",       10,  19.4,     20,    20,   20,   20, 2, 2
   afr2targetGauge   = afrtgt2,       "AFR 2 Target",     "",       10,  19.4,     20,    20,   20,   20, 2, 2
   afr1errGauge      = afr1err,       "AFR 1 Error",     "",       -5,  +5,     12,    13,   15,   16, 2, 2
   afr2errGauge      = afr2err,       "AFR 2 Error",     "",       -5,  +5,     12,    13,   15,   16, 2, 2
#endif
   egoCorrGauge1     = egocor1, "EGO Correction 1",   "%",      50,   150,     90,    99,  101,  110, 1, 1
   egoCorrGauge2     = egocor2, "EGO Correction 2",   "%",      50,   150,     90,    99,  101,  110, 1, 1
   egoCorrGauge3     = egocor3, "EGO Correction 3",   "%",      50,   150,     90,    99,  101,  110, 1, 1
   egoCorrGauge4     = egocor4, "EGO Correction 4",   "%",      50,   150,     90,    99,  101,  110, 1, 1
   egoCorrGauge5     = egocor5, "EGO Correction 5",   "%",      50,   150,     90,    99,  101,  110, 1, 1
   egoCorrGauge6     = egocor6, "EGO Correction 6",   "%",      50,   150,     90,    99,  101,  110, 1, 1
   egoCorrGauge7     = egocor7, "EGO Correction 7",   "%",      50,   150,     90,    99,  101,  110, 1, 1
   egoCorrGauge8     = egocor8, "EGO Correction 8",   "%",      50,   150,     90,    99,  101,  110, 1, 1
   stoichGauge       = Stoich,        "Stoich",     "",       10,  19.4,     12,    13,   15,   16, 2, 2

gaugeCategory = "AFR/EGO inputs 9-12"
#if   NARROW_BAND_EGO
;
#elif LAMBDA
   lambda9Gauge       = lambda9,        "Lambda 9",              "",      0.5,   1.5,    0.5,   0.7,    2,  1.1, 2, 2
   lambda10Gauge      = lambda10,       "Lambda 10",             "",      0.5,   1.5,    0.5,   0.7,    2,  1.1, 2, 2
   lambda11Gauge      = lambda11,       "Lambda 11",             "",      0.5,   1.5,    0.5,   0.7,    2,  1.1, 2, 2
   lambda12Gauge      = lambda12,       "Lambda 12",             "",      0.5,   1.5,    0.5,   0.7,    2,  1.1, 2, 2
#else
   afr9Gauge          = afr9,           "Air:Fuel Ratio 9",      "",       10,  19.4,     12,    13,   15,   16, 2, 2
   afr10Gauge         = afr10,          "Air:Fuel Ratio 10",     "",       10,  19.4,     12,    13,   15,   16, 2, 2
   afr11Gauge         = afr11,          "Air:Fuel Ratio 11",     "",       10,  19.4,     12,    13,   15,   16, 2, 2
   afr12Gauge         = afr12,          "Air:Fuel Ratio 12",     "",       10,  19.4,     12,    13,   15,   16, 2, 2
#endif
   egoV9Gauge         = egov9,     "Exhaust Gas Oxygen 9",  "volts",   0,   5,    5,   5,  5,  5, 2, 2
   egoV10Gauge        = egov10,    "Exhaust Gas Oxygen 10", "volts",   0,   5,    5,   5,  5,  5, 2, 2
   egoV11Gauge        = egov11,    "Exhaust Gas Oxygen 11", "volts",   0,   5,    5,   5,  5,  5, 2, 2
   egoV12Gauge        = egov12,    "Exhaust Gas Oxygen 12", "volts",   0,   5,    5,   5,  5,  5, 2, 2

gaugeCategory = "AFR/EGO calculations 9-12"
   egoCorrGauge9      = egocor9,  "EGO Correction 9",    "%",      50,   150,     90,    99,  101,  110, 1, 1
   egoCorrGauge10     = egocor10, "EGO Correction 10",   "%",      50,   150,     90,    99,  101,  110, 1, 1
   egoCorrGauge11     = egocor11, "EGO Correction 11",   "%",      50,   150,     90,    99,  101,  110, 1, 1
   egoCorrGauge12     = egocor12, "EGO Correction 12",   "%",      50,   150,     90,    99,  101,  110, 1, 1

gaugeCategory = "Generic sensor inputs"
   sensor01Gauge  = sensor01,   { stringValue(sensor01Alias) },      "",    -3000,    3000, -3277,  -3277,  3277, 3277, 1, 1
   sensor02Gauge  = sensor02,   { stringValue(sensor02Alias) },      "",    -3000,    3000, -3277,  -3277,  3277, 3277, 1, 1
   sensor03Gauge  = sensor03,   { stringValue(sensor03Alias) },      "",    -3000,    3000, -3277,  -3277,  3277, 3277, 1, 1
   sensor04Gauge  = sensor04,   { stringValue(sensor04Alias) },      "",    -3000,    3000, -3277,  -3277,  3277, 3277, 1, 1
   sensor05Gauge  = sensor05,   { stringValue(sensor05Alias) },      "",    -3000,    3000, -3277,  -3277,  3277, 3277, 1, 1
   sensor06Gauge  = sensor06,   { stringValue(sensor06Alias) },      "",    -3000,    3000, -3277,  -3277,  3277, 3277, 1, 1
   sensor07Gauge  = sensor07,   { stringValue(sensor07Alias) },      "",    -3000,    3000, -3277,  -3277,  3277, 3277, 1, 1
   sensor08Gauge  = sensor08,   { stringValue(sensor08Alias) },      "",    -3000,    3000, -3277,  -3277,  3277, 3277, 1, 1
   sensor09Gauge  = sensor09,   { stringValue(sensor09Alias) },      "",    -3000,    3000, -3277,  -3277,  3277, 3277, 1, 1
   sensor10Gauge  = sensor10,   { stringValue(sensor10Alias) },      "",    -3000,    3000, -3277,  -3277,  3277, 3277, 1, 1
   sensor11Gauge  = sensor11,   { stringValue(sensor11Alias) },      "",    -3000,    3000, -3277,  -3277,  3277, 3277, 1, 1
   sensor12Gauge  = sensor12,   { stringValue(sensor12Alias) },      "",    -3000,    3000, -3277,  -3277,  3277, 3277, 1, 1
   sensor13Gauge  = sensor13,   { stringValue(sensor13Alias) },      "",    -3000,    3000, -3277,  -3277,  3277, 3277, 1, 1
   sensor14Gauge  = sensor14,   { stringValue(sensor14Alias) },      "",    -3000,    3000, -3277,  -3277,  3277, 3277, 1, 1
   sensor15Gauge  = sensor15,   { stringValue(sensor15Alias) },      "",    -3000,    3000, -3277,  -3277,  3277, 3277, 1, 1
   sensor16Gauge  = sensor16,   "ECU temp.",      "",    -40,    200, -3277,  -3277,  3277, 3277, 0, 0

gaugeCategory = "CAN board inputs/outputs"
   canin1_8Gauge   = canin1_8,    "CAN inputs 1-8",   "",    0,  255,    255, 255,  255,   255,0, 0
   canout1_8Gauge  = canout1_8,   "CAN outputs 1-8",  "",    0,  255,    255, 255,  255,   255,0, 0
   canout9_16Gauge = canout9_16,  "CAN outputs 9-16", "",    0,  255,    255, 255,  255,   255,0, 0
   canpwmin0Gauge  = canpwmin0,   "CAN PWMin 0",      "",    0,  65535,    65535, 65535,  65535,   65535,0, 0
   canpwmin1Gauge  = canpwmin1,   "CAN PWMin 1",      "",    0,  65535,    65535, 65535,  65535,   65535,0, 0
   canpwmin2Gauge  = canpwmin2,   "CAN PWMin 2",      "",    0,  65535,    65535, 65535,  65535,   65535,0, 0
   canpwmin3Gauge  = canpwmin3,   "CAN PWMin 3",      "",    0,  65535,    65535, 65535,  65535,   65535,0, 0

gaugeCategory = "X-Code dev"
    status1Gauge  = status1,   "Status 1",      "",    0,  255,    255, 255,  255,   255, 0, 0
    status2Gauge  = status2,   "Status 2",      "",    0,  255,    255, 255,  255,   255, 0, 0
    status3Gauge  = status3,   "Status 3",      "",    0,  255,    255, 255,  255,   255, 0, 0
    status4Gauge  = status4,   "Status 4",      "",    0,  255,    255, 255,  255,   255, 0, 0
    status5Gauge  = status5,   "Status 5",      "",    0,  65535,    65535, 65535,  65535,   65535,0, 0
    status5sGauge  = status5s,  "Status 5 (signed)", "",-32767,  65535,    65535, 65535,  65535,   65535,0, 0
    status6Gauge  = status6,   "Status 6",      "",    0,  255,    255, 255,  255,   255, 0, 0
    status7Gauge  = status7,   "Status 7",      "",    0,  255,    255, 255,  255,   255, 0, 0
    status8Gauge  = status8,   "Status 8",      "",    0,  255,    255, 255,  255,   255, 0, 0
    status9Gauge  = status9,   "Status 9",      "",    0,  255,    255, 255,  255,   255, 0, 0
    status10Gauge  = status10,   "Status 10",      "",    0,  255,    255, 255,  255,   255, 0, 0
    injcountGauge  = status5,   "Injection Count",      "pulses",    0,  1000,    65535, 65535,  65535,   65535,0, 0
    looptimeGauge = looptime,   "Mainloop time",      "us",    0,  10000,    -1, -1,  1000,   6000, 0, 0
    sd_filenum = sd_filenum, "SDcard file number", "", 0, 9999, 9999, 9999, 9999, 9999, 0 ,0
    sd_error = sd_error, "SDcard error", "", 0, 255, 255, 255, 255, 255, 0 ,0
    sd_status = sd_status, "SDcard status", "", 0, 255, 255, 255, 255, 255, 0 ,0
    sd_phase = sd_phase, "SDcard phase", "", 0, 255, 255, 255, 255, 255, 0 ,0
    deadGauge         = deadValue,     "---",                "",        0,     1,     -1,    -1,    2,    2, 0, 0
       advBucketGauge    = veTuneValue,   "Advance Bucket",     "degrees", 0,    55,    -1,     -1,  999,  999, 1, 1
       veBucketGauge     = veTuneValue,   "VE Value",           "%",       0,   120,     -1,    -1,  999,  999, 0, 0
    cel_statusGauge  = cel_status,   "CEL Status",      "",    0,  65535,    65535, 65535,  65535,   65535, 0, 0
    cel_status2Gauge  = cel_status2,   "CEL Status2",      "",    0,  65535,    65535, 65535,  65535,   65535, 0, 0
    cel_errorcodeGauge  = cel_errorcode,   "CEL Error code",      "",    0,  32,    32, 32,  32,   32, 0, 0
   loopGauge  = loop,   "Loop bits 1-8",  "",    0,  255,    255, 255,  255,   255,0, 0
    can_errorGauge = can_error, "CAN error bits", "",    0,  255,    255, 255,  255,   255,0, 0
    can_error_countGauge = can_error_cnt, "CAN error count", "",    0,  255,    255, 255,  255,   255,0, 0
;------------------------------------------------------------------------------

[FrontPage]
#if   NARROW_BAND_EGO
   egoLEDs         =  0.0, 1.0,  0.5 ; Voltage settings.
#elif LAMBDA
   egoLEDs         =  1.5, 0.5,  1.0 ; Lambda settings.
#else
   egoLEDs         = 19.7, 9.7, 14.7 ; Afr settings.
#endif

   ; Gauges are numbered left to right, top to bottom.
   ;
   ;    1  2  3  4
   ;    5  6  7  8

   gauge1 = tachometer
;   gauge2 = EAEGauge1
   gauge2 = throttleGauge
   gauge3 = pulseWidth1Gauge
   gauge4 = cltGauge
   gauge5 = advdegGauge
   gauge6 = fuelloadGauge
#if   NARROW_BAND_EGO
   gauge7 = egoV1Gauge
#elif LAMBDA
   gauge7 = lambda1Gauge
#else
   gauge7 = afr1Gauge
#endif
;   gauge7 = dwellGauge
;   gauge8 = matGauge
   gauge8 = lostsyncGauge

   ;----------------------------------------------------------------------------
   ; Indicators
   ;               expr         off-label          on-label, off-bg, off-fg, on-bg, on-fg

   indicator = { ready              }, "Not Ready",    "Ready",         white, black, green, black
   indicator = { crank              }, "Not Cranking", "Cranking",      white, black, green, black
   indicator = { startw             }, "ASE OFF",      "ASE",           white, black, green, black
   indicator = { warmup             }, "WUE OFF",      "WUE",           white, black, green, black
   indicator = { tpsaccaen          }, "TPS Accel",    "TPS Accel",     white, black, green, black
   indicator = { mapaccaen          }, "MAP Accel",    "MAP Accel",     white, black, green, black
   indicator = { tpsaccden          }, "TPS Decel", "TPS Decel",        white, black, green, black
   indicator = { mapaccden          }, "MAP Decel", "MAP Decel",        white, black, green, black
;   indicator = { tps > floodClear && crank }, "", "FLOOD CLEAR", white, black, red,   black

   indicator = { status1 & 1}, "Need Burn",   "Need Burn",     white, black, red, black
   indicator = { status1 & 2}, "Data Lost",   "Lost Data",     white, black, red, black
   indicator = { status1 & 4}, "Config Error", "Config Error", white, black, red,   black
   indicator = { status1 & 8}, "Not RPM synced", "RPM Synced",         red,   black, green, black
   indicator = { status1 & 32}, "VE1/2", "VE3/4",               white, black, green, black
   indicator = { status1 & 64}, "SPK1/2", "SPK3/4",             white, black, green, black
   indicator = { status1 & 128}, "Half-RPM sync", "Full-RPM sync",       white, black, green, black

   indicator = { status2 & 1}, "N2O 1 off", "N2O 1 on",        white, black, green, black
   indicator = { status2 & 2}, "N2O 2 off", "N2O 2 on",        white, black, green, black
   indicator = { status2 & 4}, "No Launch", "Launch in",       white, black, green, black
   indicator = { status2 & 16}, "No Flat shift", "Flat shift",  white, black, green, black
   indicator = { status2 & 32}, "Spark cut", "Spark cut",       white, black, red, black
   indicator = { status2 & 64}, "Over boost", "Over boost",     white, black, red, black
   indicator = { status2 & 128}, "CL Idle off", "CL idle on",    white, black, green, black

   indicator = { status3 & 1}, "No Fuel cut", "Fuel cut",      white, black, red, black
   indicator = { status3 & 2}, "T-log", "T-log",               white, black, green, black
   indicator = { status3 & 4}, "3 step off", "3 step on",      white, black, green, black
   indicator = { status3 & 8}, "Test mode", "Test mode",       white, black, yellow, black
   indicator = { status3 & 16}, "No 3 step", "3 step in",       white, black, green, black
   indicator = { status3 & 32}, "No soft limit", "Soft limiter",white, black, red, black
   indicator = { status3 & 64}, "No seq. shift", "Seq. Shift",  white, black, red, black
   indicator = { status3 & 128}, "Launch Off", "Launch on",      white, black, red, black

   indicator = { status6 & 1}, "EGT warn", "EGT warn",         white, black, red, black
   indicator = { status6 & 2}, "EGT shutdown", "EGT shutdown", white, black, red, black
   indicator = { status6 & 4}, "AFR warn", "AFR warn",         white, black, red, black
   indicator = { status6 & 8}, "AFR shutdown", "AFR shutdown", white, black, red, black
   indicator = { status6 & 16}, "Idle VE", "Idle VE",           white, black, green, black
   indicator = { status6 & 32}, "Idle Adv", "Idle Adv",          white, black, green, black
   indicator = { status6 & 64}, "Fan", "Fan",                   white, black, green, black
   indicator = { status6 & 128}, "MAPsample error!", "MAPsample error!", white, black, red, black

   indicator = { status7 & 1}, "VVT1 err", "VVT1 err",         white, black, red, black
   indicator = { status7 & 2}, "VVT2 err", "VVT2 err",         white, black, red, black
   indicator = { status7 & 4}, "VVT3 err", "VVT3 err",         white, black, red, black
   indicator = { status7 & 8}, "VVT4 err", "VVT4 err",         white, black, red, black
   indicator = { status7 & 16},      "No Knock", "Knock",            white, black, red, black
   indicator = { status7 & 32},      "AC", "AC",                     white, black, green, black
   indicator = { status7 & 64},      "Check Engine", "Check Engine", white, black, red, black
   indicator = { status7 & 128},      "Limp mode", "Limp mode",       white, black, red, black

   indicator = { status8 & 4}, "W.I. low", "W.I. low!",         white, black, red, black
   indicator = { status8 & 16}, "VSS launch L/O", "VSS launch L/O", white, black, red, black
   indicator = { status8 & 32}, "VSS launch on", "VSS launch on",   white, black, red, black
   indicator = { status8 & 128}, "DBW fault", "DBW fault",   white, black, red, black

   indicator = { status9 & 1}, "Oil shutdown", "Oil shutdown",         white, black, red, black
   indicator = { status9 & 2}, "Fuel press shutdown", "Fuel press shutdown",         white, black, red, black
   indicator = { status9 & 4}, "Overrun fuel cut", "Overrun fuel cut",         white, black, red, black
   indicator = { status9 & 8}, "Stoich switching", "Stoich switching",         white, black, red, black
   indicator = { status9 & 16}, "ReqFuel switching", "ReqFuel switching",         white, black, red, black
   indicator = { status9 & 32}, "SD Warn", "SD Warn",         white, black, red, black
   indicator = { status9 & 64}, "Boost switching", "Boost switching",         white, black, red, black
   indicator = { status9 & 128}, "Safety shutdown", "Safety shutdown", white, black, red, black ; 2

   indicator = { status10 & 1}, "CAN RX", "CAN RX",         white, black, green, black
   indicator = { status10 & 2}, "CAN TX", "CAN TX",         white, black, green, black
   indicator = { status10 & 4}, "IObox1", "IObox1",         white, black, green, black
   indicator = { status10 & 8}, "IObox2", "IObox2",         white, black, green, black
   indicator = { status10 & 16}, "IObox3", "IObox3",         white, black, green, black
;   indicator = { status10 & 32}, "CANEGT1", "CANEGT1",         white, black, green, black
;   indicator = { status10 & 64}, "CANEGT2", "CANEGT2",         white, black, green, black
   indicator = { status10 & 128}, "L.T.Trim", "L.T.Trim",         white, black, green, black

   indicator = { sd_status & 1}, "No SD", "SD in",             white, black, green, black
   indicator = { sd_status & 4}, "SD ready", "SD ready",       white, black, green, black
   indicator = { sd_status & 8}, "SD Log", "SD Log",           white, black, green, black
   indicator = { sd_status & 16}, "SD Err", "SD Err",           white, black, red, black

   indicator = { (gammaEnrich < 70) }, "-", "Tune error", white, black, red, black
   
   indicator = { wbo2_stat1 & 1 }, "Int. WB err", "Int. WB err", white, black, red, black
   indicator = { wbo2_stat1 & 2 }, "Int. WB Not Ready", "Int. WB Ready", white, black, green, black
   indicator = { wbo2_stat1 & 4 }, "CAN WB err", "CAN WB err", white, black, red, black
   indicator = { wbo2_stat1 & 8 }, "CAN WB Not Ready", "CAN WB Ready", white, black, green, black

#if PORT_STATUS
   indicator = { porta0 }, "PORTA0", "PORTA0", white, black, green, black
   indicator = { porta1 }, "PORTA1", "PORTA1", white, black, green, black
   indicator = { porta2 }, "PORTA2", "PORTA2", white, black, green, black
   indicator = { porta3 }, "PORTA3", "PORTA3", white, black, green, black
   indicator = { porta4 }, "PORTA4", "PORTA4", white, black, green, black
   indicator = { porta5 }, "PORTA5", "PORTA5", white, black, green, black
   indicator = { porta6 }, "PORTA6", "PORTA6", white, black, green, black
   indicator = { porta7 }, "PORTA7", "PORTA7", white, black, green, black

   indicator = { portb0 }, "PORTB0", "PORTB0", white, black, green, black
   indicator = { portb1 }, "PORTB1", "PORTB1", white, black, green, black
   indicator = { portb2 }, "PORTB2", "PORTB2", white, black, green, black
   indicator = { portb3 }, "PORTB3", "PORTB3", white, black, green, black
   indicator = { portb4 }, "PORTB4", "PORTB4", white, black, green, black
   indicator = { portb5 }, "PORTB5", "PORTB5", white, black, green, black
   indicator = { portb6 }, "PORTB6", "PORTB6", white, black, green, black
   indicator = { portb7 }, "PORTB7", "PORTB7", white, black, green, black

   indicator = { porte0 }, "PORTE0", "PORTE0", white, black, green, black
   indicator = { porte1 }, "PORTE1", "PORTE1", white, black, green, black
   indicator = { porte2 }, "PORTE2", "PORTE2", white, black, green, black
   indicator = { porte4 }, "PORTE4", "PORTE4", white, black, green, black
   indicator = { porth6 }, "PORTH6", "PORTH6", white, black, green, black
   indicator = { porth7 }, "PORTH7", "PORTH7", white, black, green, black

   indicator = { portk0 }, "PORTK0", "PORTK0", white, black, green, black
   indicator = { portk1 }, "PORTK1", "PORTK1", white, black, green, black
   indicator = { portk2 }, "PORTK2", "PORTK2", white, black, green, black
   indicator = { portk3 }, "PORTK3", "PORTK3", white, black, green, black
   indicator = { portk7 }, "PORTK7", "PORTK7", white, black, green, black

   indicator = { portj0 }, "PORTJ0", "PORTJ0", white, black, green, black
   indicator = { portj1 }, "PORTJ1", "PORTJ1", white, black, green, black
   indicator = { portm2 }, "PORTM2", "PORTM2", white, black, green, black
   indicator = { portm3 }, "PORTM3", "PORTM3", white, black, green, black
   indicator = { portm4 }, "PORTM4", "PORTM4", white, black, green, black
   indicator = { portm5 }, "PORTM5", "PORTM5", white, black, green, black
   indicator = { portj7 }, "PORTJ7", "PORTJ7", white, black, green, black

   indicator = { portp2 }, "PORTP2", "PORTP2", white, black, green, black
   indicator = { portp3 }, "PORTP3", "PORTP3", white, black, green, black
   indicator = { portp4 }, "PORTP4", "PORTP4", white, black, green, black
   indicator = { portp5 }, "PORTP5", "PORTP5", white, black, green, black
   indicator = { portp6 }, "PORTP6", "PORTP6", white, black, green, black
   indicator = { portp7 }, "PORTP7", "PORTP7", white, black, green, black

   indicator = { portt0 }, "PORTT0", "PORTT0", white, black, green, black
   indicator = { portt1 }, "PORTT1", "PORTT1", white, black, green, black
   indicator = { portt2 }, "PORTT2", "PORTT2", white, black, green, black
   indicator = { portt3 }, "PORTT3", "PORTT3", white, black, green, black
   indicator = { portt4 }, "PORTT4", "PORTT4", white, black, green, black
   indicator = { portt5 }, "PORTT5", "PORTT5", white, black, green, black
   indicator = { portt6 }, "PORTT6", "PORTT6", white, black, green, black

   indicator = { portm6 }, "PORTM6", "PORTM6", white, black, green, black
   indicator = { portm7 }, "PORTM7", "PORTM7", white, black, green, black
   indicator = { portt7 }, "PORTT7", "PORTT7", white, black, green, black
   indicator = { ports3 }, "PORTS3", "PORTS3", white, black, green, black
   indicator = { ports4 }, "PORTS4", "PORTS4", white, black, green, black
   indicator = { ports5 }, "PORTS5", "PORTS5", white, black, green, black
   indicator = { portk4 }, "PORTK4", "PORTK4", white, black, green, black
   indicator = { portk5 }, "PORTK5", "PORTK5", white, black, green, black

   indicator = { canin1_8 & 1 }, "CANIN1", "CANIN1", white, black, green, black
   indicator = { canin1_8 & 2 }, "CANIN2", "CANIN2", white, black, green, black
   indicator = { canin1_8 & 4 }, "CANIN3", "CANIN3", white, black, green, black
   indicator = { canin1_8 & 8 }, "CANIN4", "CANIN4", white, black, green, black
   indicator = { canin1_8 & 16 }, "CANIN5", "CANIN5", white, black, green, black
   indicator = { canin1_8 & 32 }, "CANIN6", "CANIN6", white, black, green, black
   indicator = { canin1_8 & 64 }, "CANIN7", "CANIN7", white, black, green, black
   indicator = { canin1_8 & 128}, "CANIN8", "CANIN8", white, black, green, black
#endif

   indicator = { cel_status_map }, "MAP fault", "MAP fault", white, black, red, black ; 1
   indicator = { cel_status_mat }, "MAT fault", "MAT fault", white, black, red, black ; 2
   indicator = { cel_status_clt }, "CLT fault", "CLT fault", white, black, red, black ; 4
   indicator = { cel_status_tps }, "TPS fault", "TPS fault", white, black, red, black ; 8
   indicator = { cel_status_batt }, "BATT fault", "BATT fault", white, black, red, black ; 16
   indicator = { cel_status_afr0 }, "AFR0 fault", "AFR0 fault", white, black, red, black ; 32
   indicator = { cel_status_sync }, "SYNC fault", "SYNC fault", white, black, red, black ; 64
   indicator = { cel_status_egt }, "EGT fault", "EGT fault", white, black, red, black ; 128
   indicator = { cel_status_flex }, "Flex fault", "Flex fault", white, black, red, black ;256
   indicator = { cel_status_maf }, "MAF fault", "MAF fault", white, black, red, black ; 512
   indicator = { cel_status_knock }, "Knock fault", "Knock fault", white, black, red, black ; 1024
   indicator = { cel_status_cam }, "Cam fault", "Cam fault", white, black, red, black ; 2048
   indicator = { cel_status_oil}, "Oil fault", "Oil fault", white, black, red, black ; 4096
   indicator = { cel_status_fp}, "Fuel press.", "Fuel press.", white, black, red, black ; 4096
   indicator = { cel_status_egtshut}, "CEL EGT shutdown", "CEL EGT shutdown", white, black, red, black ; 16384
   indicator = { cel_status_afrshut}, "CEL AFR shutdown", "CEL AFR shutdown", white, black, red, black ; 32768

   indicator = { cel_status2_winj}, "CEL W.Inj low", "CEL W.Inj low", white, black, red, black ; 1
;   indicator = { cel_status2_shutd}, "CEL Safety shutdown", "CEL Safety shutdown", white, black, red, black ; 2

   indicator = { engine_state_cruise }, "Cruise", "Cruise", white, black, green, black
   indicator = { engine_state_accel_slow }, "Accel", "Accel", white, black, green, black
;   indicator = { engine_state_accel_fast }, "Fast accel", "Fast Accel", white, black, green, black
   indicator = { engine_state_decel_slow }, "Decel", "Decel", white, black, green, black
;   indicator = { engine_state_decel_fast }, "Fast decel", "Fast Decel", white, black, green, black
   indicator = { engine_state_overrun }, "Overrun", "Overrun", white, black, green, black
   indicator = { engine_state_idle }, "Idle", "Idle", white, black, green, black
   indicator = { engine_state_wot }, "WOT", "WOT", white, black, green, black

;-------------------------------------------------------------------------------

[RunTime]
   barHysteresis = 2.5 ; Seconds
   coolantBar    = {cltlowlim},  {clthighlim}
   matBar        = -40,  {mathigh}
   batteryBar    =   6,   15
   dutyCycleBar  =   0,  100

#if   NARROW_BAND_EGO
   egoBar        = 0.0 ,  1.0
#elif LAMBDA
   egoBar        = 0.5,   1.5
#else
   egoBar        = 9.7,  19.7
#endif

   gammaEBar     =   0,  200
   mapBar        =   0,  255
   pulseWidthBar =   0,   25.5
   rpmBar        =   0, {rpmhigh}
   throttleBar   =   0,  100
   egoCorrBar    =   0,  200
   baroCorrBar   =   0,  200
   warmupCorrBar =   0,  200
   airdenCorrBar =   0,  200
   veCorrBar     =   0,  200
   accCorrBar    =   0,  100

;-------------------------------------------------------------------------------

[Tuning]
#if   NARROW_BAND_EGO
   egoLEDs         =  0.0, 1.0,  0.5 ; Voltage settings.
#elif LAMBDA
   egoLEDs         =  1.5, 0.5,  1.0 ; Lambda settings.
#else
   egoLEDs         = 19.7, 9.7, 14.7 ; Afr settings.
#endif

;  font            = "Lucida Console", 12

;  font            = "Courier", 14
   spotDepth       =   2 ; 0 = no indicators, 1 = Z only, 2 = XYZ indicators.
   cursorDepth     =   2 ; Same as spot depth.

   ; The four radio buttons on the tuning screen select a "page" of six
   ; gauges.  The gauge numbering is the same as the front page, across
   ; then down.
   ;             1  2
   ;             3  4
   ;             5  6
   ;
   ; gaugeColumns allows you to hide or show gauges in column 2 (i.e.,
   ; gauges 2, 4 and 6).

   gaugeColumns = 2 ; Only 1 or 2 are valid.

   ;              Page 1            Page 2             Page 3            Page 4
   pageButtons  = "&EGO",           "&WUE",            "PW&1",           "PW&2"
   gauge1       = tachometer,       tachometer,        tachometer,       tachometer
   gauge2       = mapGauge,         mapGauge,          mapGauge,         mapGauge
#if   NARROW_BAND_EGO
   gauge3       = egoV1Gauge,         egoV1Gauge,          egoV1Gauge,         egoV1Gauge
#elif LAMBDA
   gauge3       = lambda1Gauge,     lambda1Gauge,      lambda1Gauge,     lambda1Gauge
#else
   gauge3       = afr1Gauge,        afr1Gauge,         afr1Gauge,        afr1Gauge
#endif
   gauge4       = egoCorrGauge1,     warmupEnrichGauge, pulseWidth1Gauge, pulseWidth2Gauge
   gauge5       = veBucketGauge,    veBucketGauge,     veBucketGauge,    veBucketGauge
   gauge6       = egoCorrGauge2, accelEnrichGauge,  dutyCycle1Gauge,  dutyCycle2Gauge

;-------------------------------------------------------------------------------

[AccelerationWizard]
   tpsDotBar = 0, 800
   mapDotBar = 0, 700

;-------------------------------------------------------------------------------

[BurstMode]
;   getCommand       = "a\x00\x06"
   getCommand       = "A"

[OutputChannels]
   deadValue        = { 0 } ; Convenient unchanging value.
   ochBlockSize     = 512 ; change this if adding extra data to outpc
;Note! More than 512 bytes requires moving "datax1" offset and TS 2.6.x doesn't support that as RTC is hardcoded.
#if CAN_COMMANDS
   ochGetCommand    = "r\$tsCanId\x07%2o%2c" ; leave this alone
#else
; fast get via serial
   ochGetCommand       = "A"
#endif

   scatteredOffsetArray = qfrtfielddata
   scatteredOchGetCommand = "g"
   scatteredGetEnabled =  { scatterRuntimeEnabled && (tsLocalCanId == tsCanId) }

   seconds          = scalar, U16,    0, "s",   1.000, 0.0
   secl = { seconds % 256 }, "s" ; For runtime screen.
   pulseWidth1      = scalar, U16,    2, "ms",   0.001, 0.0
   pulseWidth2      = scalar, U16,    4, "ms",   0.001, 0.0
   pulseWidth       = { pulseWidth1 }, "ms" ; For runtime screen.

   rpm              = scalar, U16,    6, "RPM", 1.000, 0.0
   advance          = scalar, S16,    8, "deg", 0.100, 0.0

   ; unsigned char squirt,engine,afrtgt1,afrtgt2;    // afrtgt in afr x 10
   squirt           = scalar, U08,   10, "bit", 1.000, 0.0
   ; Squirt Event Scheduling Variables - bit fields for "squirt" variable above
   ; inj1:    equ    3       ; 0 = no squirt         1 = squirt
   ; inj2:    equ    5       ; 0 = no squirt         1 = squirt
   ; sched1:  equ    2       ; 0 = nothing scheduled 1 = scheduled to squirt
   ; firing1: equ    0       ; 0 = not squirting     1 = squirting
   ; sched2:  equ    4
   ; firing2: equ    1
   firing1          = bits,   U08,   10, [0:0]
   firing2          = bits,   U08,   10, [1:1]
   sched1           = bits,   U08,   10, [2:2]
   inj1             = bits,   U08,   10, [3:3]
   sched2           = bits,   U08,   10, [4:4]
   inj2             = bits,   U08,   10, [5:5]

   engine           = scalar, U08,   11, "bit", 1.000, 0.0
   ; Engine Operating/Status variables - bit fields for "engine" variable above
   ; ready:  equ     0       ; 0 = engine not ready 1 = ready to run
   ; crank:  equ     1       ; 0 = engine not cranking 1 = engine cranking
   ; startw: equ     2       ; 0 = not in startup warmup 1 = in warmup enrichment
   ; warmup: equ     3       ; 0 = not in warmup 1 = in warmup
   ; tpsaen: equ     4       ; 0 = not in TPS acceleration mode 1 = TPS acceleration mode
   ; tpsden: equ     5       ; 0 = not in deacceleration mode 1 = in deacceleration mode
   ready            = bits,   U08,   11, [0:0]
   crank            = bits,   U08,   11, [1:1]
   startw           = bits,   U08,   11, [2:2]
   warmup           = bits,   U08,   11, [3:3]
   tpsaccaen        = bits,   U08,   11, [4:4]
   tpsaccden        = bits,   U08,   11, [5:5]
   mapaccaen      = bits,   U08,   11, [6:6]
   mapaccden        = bits,   U08,   11, [7:7]

#if NARROW_BAND_EGO
   afrtgt1          = scalar, U08,   12, "Volts", 0.00489, 0.0
   afrtgt2          = scalar, U08,   13, "Volts", 0.00489, 0.0
#elif LAMBDA
   afrtgt1raw       = scalar, U08,   12, "Lambda", 0.1, 0.0
   afrtgt2raw       = scalar, U08,   13, "Lambda", 0.1, 0.0
#else
   afrtgt1          = scalar, U08,   12, "AFR", 0.1, 0.0
   afrtgt2          = scalar, U08,   13, "AFR", 0.1, 0.0
#endif
   ; unsigned char wbo2_en1,wbo2_en2; // from wbo2 - indicates whether wb afr has fault
   wbo2_stat1         = scalar, U08,   14, "",    1.000, 0.0
   wbo2_en2         = scalar, U08,   15, "",    1.000, 0.0

   ; int baro,map,mat,clt,tps,batt,ego1,ego2,knock, // baro   - kpa x 10
   ;                                                // map    - kpa x 10
   ;                                                // mat, clt deg(C/F)x 10
   ;                                                // tps    - % x 10
   ;                                                // batt   - vlts x 10
   ;                                                // ego1,2 - afr x 10
   ;                                                // knock  - volts x 10
   barometer        = scalar, S16,   16, "kPa", 0.100, 0.0
   map              = scalar, S16,   18, "kPa", 0.100, 0.0
#if CELSIUS
   mat              = scalar, S16,   20, "°C",  0.05555, -320.0
   coolant          = scalar, S16,   22, "°C",  0.05555, -320.0
#else
   mat              = scalar, S16,   20, "°F",  0.100, 0.0
   coolant          = scalar, S16,   22, "°F",  0.100, 0.0
#endif
   tps              = scalar, S16,   24, "%",   0.100, 0.0
   throttle         = { tps }, "%"
   batteryVoltage   = scalar, S16,   26, "v",   0.100, 0.0
   afr1_old         = scalar, S16,   28, "AFR", 0.100, 0.0
   afr2_old         = scalar, S16,   30, "AFR", 0.100, 0.0
   knock            = scalar, S16,   32, "%",   0.100, 0.0

   ; egocor1,egocor2,aircor,warmcor,     // all in %
   egoCorrection1   = scalar, S16,   34, "%",   0.1000, 0.0
   egoCorrection = { ( egoCorrection1 + egoCorrection2) / 2 }, "%" ; Alias for old gauges.
   egoCorrection2   = scalar, S16,   36, "%",   0.1000, 0.0
   airCorrection    = scalar, S16,   38, "%",   0.1000, 0.0
   warmupEnrich     = scalar, S16,   40, "%",   1.000, 0.0

   ; tpsaccel,tpsfuelcut,barocor,gammae, // tpsaccel - acc enrich(.1 ms units)
   ;                                     // tpsfuelcut - %
   ;                                     // barcor,gammae - %
   accelEnrich      = scalar, S16,   42, "ms", 0.100, 0.0
   tpsfuelcut       = scalar, S16,   44, "%",   1.000, 0.0
   baroCorrection   = scalar, S16,   46, "%",   0.1000, 0.0
   gammaEnrich      = scalar, S16,   48, "%",   1.000, 0.0

   ;  vecurr1,vecurr2,iacstep,cold_adv_deg;           // vecurr - %
   ;                                                  // iacstep - steps
   ;                                                  // cold_adv_deg - deg x 10
   veCurr1          = scalar, S16,   50, "%",   0.1000, 0.0
   veCurr2          = scalar, S16,   52, "%",   0.1000, 0.0
   veCurr           = { veCurr1 }, "%" ; For runtime display.
   iacstep          = scalar, S16,   54, "",    1.000, 0.0
   idleDC           = scalar, S16,   54, "%",    0.392, 0.0
   coldAdvDeg       = scalar, S16,   56, "deg", 0.100, 0.0
   TPSdot           = scalar, S16,   58, "%/s",   0.100, 0.0
   MAPdot           = scalar, S16,   60, "kPa/s", 1.000, 0.0
   dwell            = scalar, U16,   62, "ms",    0.1000, 0.0
   mafload          = scalar, S16,   64, "kPa",     0.1000, 0.0
   fuelload         = scalar, S16,   66, { bitStringValue( algorithmUnits , algorithm  ) },   0.100, 0.0 ; Blend of MAP and TPS, depends on algorithm
   fuelCorrection   = scalar, S16,   68, "%",     1.000, 0.0 ; Correction based on percent alcohol in fuel.
   sd_status        = scalar, U08,   70,  "", 1.0, 0.0
   knockRetard      = scalar, U08,   71, "deg",     0.1, 0.0
   EAEFuelCorr1     = scalar, U16,   72, "%",  1.0, 0.0
   egoV             = scalar, S16,   74, "V", 0.01, 0.0 ; was omitted
   egoV2            = scalar, S16,   76, "V", 0.01, 0.0 ; was omitted
   status1          = scalar, U08,   78, "", 1.0, 0.0 ; status1
   status2          = scalar, U08,   79, "", 1.0, 0.0 ; status2
   status3          = scalar, U08,   80, "", 1.0, 0.0 ; status3
   status4          = scalar, U08,   81, "", 1.0, 0.0 ; status4
   status6          = scalar, U08,   82, "", 1.0, 0.0
   status7          = scalar, U08,   83, "", 1.0, 0.0
   status5          = scalar, U16,   84, "", 1, 0 ; istatus5
   status5s         = scalar, S16,   84, "", 1, 0 ; istatus5
   cel_status        = scalar, U16,   86, "bit",   1.000, 0.0 ; engine fault bits
   cel_status_map    = bits,   U08,   87, [0:0] ; low byte
   cel_status_mat    = bits,   U08,   87, [1:1]
   cel_status_clt    = bits,   U08,   87, [2:2]
   cel_status_tps    = bits,   U08,   87, [3:3]
   cel_status_batt   = bits,   U08,   87, [4:4]
   cel_status_afr0   = bits,   U08,   87, [5:5]
   cel_status_sync   = bits,   U08,   87, [6:6]
   cel_status_egt    = bits,   U08,   87, [7:7]
   cel_status_flex   = bits,   U08,   86, [0:0] ; high byte
   cel_status_maf    = bits,   U08,   86, [1:1] ; high byte
   cel_status_knock  = bits,   U08,   86, [2:2] ; high byte
   cel_status_cam    = bits,   U08,   86, [3:3] ; high byte
   cel_status_oil    = bits,   U08,   86, [4:4] ; high byte
   cel_status_fp     = bits,   U08,   86, [5:5] ; high byte
   cel_status_egtshut= bits,   U08,   86, [6:6] ; high byte
   cel_status_afrshut= bits,   U08,   86, [7:7] ; high byte
   fuelload2        = scalar, S16,   88, { bitStringValue( algorithmUnits , algorithm2  ) },    0.100, 0.0
   ignload              = scalar, S16,   90, "%",    0.100, 0.0
   ignload2             = scalar, S16,   92, "%",    0.100, 0.0
   synccnt          = scalar, U08,   94, "", 1, 0
   syncreason       = scalar, U08,   95,  "", 1.0, 0.0
   wallfuel1        = scalar, U32,   96, "us", 1.000, 0.0
   wallfuel2        = scalar, U32,  100, "us", 1.000, 0.0
   sensor01             = scalar, S16,  104, "",   0.1000, 0.0
   sensor02         = scalar, S16,  106, "",   0.1000, 0.0
   sensor03             = scalar, S16,  108, "",   0.1000, 0.0
   sensor04             = scalar, S16,  110, "",   0.1000, 0.0
   sensor05             = scalar, S16,  112, "",   0.1000, 0.0
   sensor06             = scalar, S16,  114, "",   0.1000, 0.0
   sensor07             = scalar, S16,  116, "",   0.1000, 0.0
   sensor08             = scalar, S16,  118, "",   0.1000, 0.0
   sensor09             = scalar, S16,  120, "",   0.1000, 0.0
   sensor10         = scalar, S16,  122, "",   0.1000, 0.0
   sensor11         = scalar, S16,  124, "",   0.1000, 0.0
   sensor12         = scalar, S16,  126, "",   0.1000, 0.0
   sensor13         = scalar, S16,  128, "",   0.1000, 0.0
   sensor14         = scalar, S16,  130, "",   0.1000, 0.0
   sensor15         = scalar, S16,  132, "",   0.1000, 0.0
   sensor16         = scalar, S16,  134, "",   0.1000, 0.0
   canin1_8             = scalar, U08,  136, "",   1.000, 0.0
   canout1_8        = scalar, U08,  137, "",   1.000, 0.0
   canout9_16       = scalar, U08,  138, "",   1.000, 0.0
   boostduty        = scalar, U08,  139 , "%",  1.0, 0.0
   n2o_addfuel      = scalar, S16,  140, "ms",  0.001, 0
   n2o_retard       = scalar, S16,  142, "deg",  0.1, 0
   pwseq1           = scalar, U16,  144,  "ms", 0.001, 0.0
   pwseq2           = scalar, U16,  146,  "ms", 0.001, 0.0
   pwseq3           = scalar, U16,  148,  "ms", 0.001, 0.0
   pwseq4           = scalar, U16,  150,  "ms", 0.001, 0.0
   pwseq5           = scalar, U16,  152,  "ms", 0.001, 0.0
   pwseq6           = scalar, U16,  154,  "ms", 0.001, 0.0
   pwseq7           = scalar, U16,  156,  "ms", 0.001, 0.0
   pwseq8           = scalar, U16,  158,  "ms", 0.001, 0.0
   pwseq9           = scalar, U16,  160,  "ms", 0.001, 0.0
   pwseq10          = scalar, U16,  162,  "ms", 0.001, 0.0
   pwseq11          = scalar, U16,  164,  "ms", 0.001, 0.0
   pwseq12          = scalar, U16,  166,  "ms", 0.001, 0.0
;   pwseq13          = scalar, U16,  168,  "ms", 0.001, 0.0
;   pwseq14          = scalar, U16,  170,  "ms", 0.001, 0.0
;   pwseq15          = scalar, U16,  172,  "ms", 0.001, 0.0
;   pwseq16          = scalar, U16,  174,  "ms", 0.001, 0.0
   nitrous1_duty   = scalar, U08,  176, "%", 1, 0
   nitrous2_duty   = scalar, U08,  177, "%", 1, 0
#if CELSIUS
   egt1            = scalar, S16,  178, "°C",  0.05555, -320
   egt2            = scalar, S16,  180, "°C",  0.05555, -320
   egt3            = scalar, S16,  182, "°C",  0.05555, -320
   egt4            = scalar, S16,  184, "°C",  0.05555, -320
   egt5            = scalar, S16,  186, "°C",  0.05555, -320
   egt6            = scalar, S16,  188, "°C",  0.05555, -320
   egt7            = scalar, S16,  190, "°C",  0.05555, -320
   egt8            = scalar, S16,  192, "°C",  0.05555, -320
   egt9            = scalar, S16,  194, "°C",  0.05555, -320
   egt10           = scalar, S16,  196, "°C",  0.05555, -320
   egt11           = scalar, S16,  198, "°C",  0.05555, -320
   egt12           = scalar, S16,  200, "°C",  0.05555, -320
;   egt13           = scalar, S16,  202, "°C",  0.05555, -320
;   egt14           = scalar, S16,  204, "°C",  0.05555, -320
;   egt15           = scalar, S16,  206, "°C",  0.05555, -320
;   egt16           = scalar, S16,  208, "°C",  0.05555, -320
#else
   egt1            = scalar, S16,  178, "°F", 0.1, 0
   egt2            = scalar, S16,  180, "°F", 0.1, 0
   egt3            = scalar, S16,  182, "°F", 0.1, 0
   egt4            = scalar, S16,  184, "°F", 0.1, 0
   egt5            = scalar, S16,  186, "°F", 0.1, 0
   egt6            = scalar, S16,  188, "°F", 0.1, 0
   egt7            = scalar, S16,  190, "°F", 0.1, 0
   egt8            = scalar, S16,  192, "°F", 0.1, 0
   egt9            = scalar, S16,  194, "°F", 0.1, 0
   egt10           = scalar, S16,  196, "°F", 0.1, 0
   egt11           = scalar, S16,  198, "°F", 0.1, 0
   egt12           = scalar, S16,  200, "°F", 0.1, 0
;   egt13           = scalar, S16,  202, "°F", 0.1, 0
;   egt14           = scalar, S16,  204, "°F", 0.1, 0
;   egt15           = scalar, S16,  206, "°F", 0.1, 0
;   egt16           = scalar, S16,  208, "°F", 0.1, 0
#endif
    ; start repurposed zone
   dome_fill_duty1 = scalar, U08, 202, "%", 1, 0
   dome_fill_duty2 = scalar, U08, 203, "%", 1, 0
   dome_empty_duty1= scalar, U08, 204, "%", 1, 0
   dome_empty_duty2= scalar, U08, 205, "%", 1, 0
   app             = scalar, S16, 206, "%", 0.0100, 0.0
   throttle_targ   = scalar, S16, 208, "%", 0.0100, 0.0
    ;end repurposed zone
   maf             = scalar, U16,  210, "g/sec", { 0.010 * (maf_range + 1) }, 0.0
   canpwmin0        = scalar, U16,  212, "",   1.000, 0.0
   canpwmin1        = scalar, U16,  214, "",   1.000, 0.0
   canpwmin2        = scalar, U16,  216, "",   1.000, 0.0
   canpwmin3        = scalar, U16,  218, "",   1.000, 0.0
   fuelflow         = scalar, U16,  220, "cc/min",   1, 0.0
   fuelcons         = scalar, U16,  222, "l/km",   1, 0.0
   EAEFuelCorr2     = scalar, U16,  224 , "%",  1.0, 0.0
   tpsADC           = scalar, U16,  226, "ADC", 1, 0 ; REAL for calibrator
    eaeload1         = scalar, S16,  228, { bitStringValue( algorithmUnits ,  (eaeload ? eaeload : algorithm) ) },  0.1000, 0.0
    afrload1         = scalar, S16,  230, { bitStringValue( algorithmUnits ,  (afrload ? afrload : algorithm) ) },  0.1000, 0.0
    gear            = scalar, S08,  232, "", 1, 0
   timing_err       = scalar, S08,  233, "%", 1, 0 ; accuracy of timing prediction
    RPMdot          = scalar, S16,  234, "rpm/sec", 10, 0
    vss1dot         = scalar, S16,  236, "ms-2", 0.1, 0
    vss2dot         = scalar, S16,  238, "ms-2", 0.1, 0
    accelx          = scalar, S16,  240, "ms-2", 0.001, 0
    accely          = scalar, S16,  242, "ms-2", 0.001, 0
    accelz          = scalar, S16,  244, { bitStringValue( accel_vs_yaw_units ,  accel_vs_yaw ) }, 0.001, 0
    duty_pwm_a      = scalar, U08,  246, "%", 1, 0
    duty_pwm_b      = scalar, U08,  247, "%", 1, 0
    duty_pwm_c      = scalar, U08,  248, "%", 1, 0
    duty_pwm_d      = scalar, U08,  249, "%", 1, 0
    duty_pwm_e      = scalar, U08,  250, "%", 1, 0
    duty_pwm_f      = scalar, U08,  251, "%", 1, 0
    afr1            = scalar, U08,  252, "AFR", 0.1, 0.0
    afr2            = scalar, U08,  253, "AFR", 0.1, 0.0
    afr3            = scalar, U08,  254, "AFR", 0.1, 0.0
    afr4            = scalar, U08,  255, "AFR", 0.1, 0.0
    afr5            = scalar, U08,  256, "AFR", 0.1, 0.0
    afr6            = scalar, U08,  257, "AFR", 0.1, 0.0
    afr7            = scalar, U08,  258, "AFR", 0.1, 0.0
    afr8            = scalar, U08,  259, "AFR", 0.1, 0.0
    afr9            = scalar, U08,  260, "AFR", 0.1, 0.0
    afr10           = scalar, U08,  261, "AFR", 0.1, 0.0
    afr11           = scalar, U08,  262, "AFR", 0.1, 0.0
    afr12           = scalar, U08,  263, "AFR", 0.1, 0.0
;    afr13           = scalar, U08,  264, "AFR", 0.1, 0.0
;    afr14           = scalar, U08,  265, "AFR", 0.1, 0.0
;    afr15           = scalar, U08,  266, "AFR", 0.1, 0.0
;    afr16           = scalar, U08,  267, "AFR", 0.1, 0.0
    egov1           = scalar, U16,  268, "V",  0.00489, 0.0
    egov2           = scalar, U16,  270, "V",  0.00489, 0.0
    egov3           = scalar, U16,  272, "V",  0.00489, 0.0
    egov4           = scalar, U16,  274, "V",  0.00489, 0.0
    egov5           = scalar, U16,  276, "V",  0.00489, 0.0
    egov6           = scalar, U16,  278, "V",  0.00489, 0.0
    egov7           = scalar, U16,  280, "V",  0.00489, 0.0
    egov8           = scalar, U16,  282, "V",  0.00489, 0.0
    egov9           = scalar, U16,  284, "V",  0.00489, 0.0
    egov10          = scalar, U16,  286, "V",  0.00489, 0.0
    egov11          = scalar, U16,  288, "V",  0.00489, 0.0
    egov12          = scalar, U16,  290, "V",  0.00489, 0.0
;    egov13          = scalar, U16,  292, "V",  0.00489, 0.0
;    egov14          = scalar, U16,  294, "V",  0.00489, 0.0
;    egov15          = scalar, U16,  296, "V",  0.00489, 0.0
;    egov16          = scalar, U16,  298, "V",  0.00489, 0.0
    ve_raw1         =  scalar, S16,   292, "%",   0.1000, 0.0
    ve_raw2         =  scalar, S16,   294, "%",   0.1000, 0.0
    ve_raw3         =  scalar, S16,   296, "%",   0.1000, 0.0
    ve_raw4         =  scalar, S16,   298, "%",   0.1000, 0.0
    egocor1         = scalar, S16,  300, "%",  0.1000, 0.0
    egocor2         = scalar, S16,  302, "%",  0.1000, 0.0
    egocor3         = scalar, S16,  304, "%",  0.1000, 0.0
    egocor4         = scalar, S16,  306, "%",  0.1000, 0.0
    egocor5         = scalar, S16,  308, "%",  0.1000, 0.0
    egocor6         = scalar, S16,  310, "%",  0.1000, 0.0
    egocor7         = scalar, S16,  312, "%",  0.1000, 0.0
    egocor8         = scalar, S16,  314, "%",  0.1000, 0.0
    egocor9         = scalar, S16,  316, "%",  0.1000, 0.0
    egocor10        = scalar, S16,  318, "%",  0.1000, 0.0
    egocor11        = scalar, S16,  320, "%",  0.1000, 0.0
    egocor12        = scalar, S16,  322, "%",  0.1000, 0.0
;    egocor13        = scalar, S16,  324, "%",  0.1000, 0.0
;    egocor14        = scalar, S16,  326, "%",  0.1000, 0.0
;    egocor15        = scalar, S16,  328, "%",  0.1000, 0.0
;    egocor16        = scalar, S16,  330, "%",  0.1000, 0.0
   ports             = scalar, U08,   324, "bit",   1.000, 0.0 ; raw i/o port status bits
   ports0            = bits,   U08,   324, [0:0]
   ports1            = bits,   U08,   324, [1:1]
   ports2            = bits,   U08,   324, [2:2]
   ports3            = bits,   U08,   324, [3:3]
   ports4            = bits,   U08,   324, [4:4]
   ports5            = bits,   U08,   324, [5:5]
   ports6            = bits,   U08,   324, [6:6]
   ports7            = bits,   U08,   324, [7:7]

   portm             = scalar, U08,   325, "bit",   1.000, 0.0 ; raw i/o port status bits
   portm0            = bits,   U08,   325, [0:0]
   portm1            = bits,   U08,   325, [1:1]
;   portm2            = bits,   U08,   325, [2:2]
;   portm3            = bits,   U08,   325, [3:3]
;   portm4            = bits,   U08,   325, [4:4]
;   portm5            = bits,   U08,   325, [5:5]
   portm6            = bits,   U08,   325, [6:6]
   portm7            = bits,   U08,   325, [7:7]
   boost_dome_targ1 = scalar, S16,   326, "kPa", 0.1, 0
   boost_dome_targ2 = scalar, S16,   328, "kPa", 0.1, 0
   status9          = scalar, U08, 330, "", 1, 0
   status10         = scalar, U08, 331, "", 1, 0
   stream_level     = scalar, U08,  332,  "", 1,0
   water_duty       = scalar, U08,  333, "%", 1, 0
   dwell_trl        = scalar, U16,  334,  "ms", 0.1000, 0.0
   vss1             = scalar, U16,  336, { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale }, 0.0
   vss2             = scalar, U16,  338, { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale }, 0.0
   vss1_ms_1        = scalar, U16,  336, "ms-1", 0.1, 0.0 ; see calcs converting this raw number into kph or mph
   vss2_ms_1        = scalar, U16,  338, "ms-1", 0.1, 0.0
   ss1             = scalar, U16,  340, "RPM", 10.000, 0.0 ; now in steps of 10 rpm
   ss2             = scalar, U16,  342, "RPM", 10.000, 0.0
   nitrous_timer   = scalar, U16,  344, "s", 0.001, 0
   sd_filenum      = scalar, U16,  346, "", 1, 0
   sd_error        = scalar, U08,  348, "", 1, 0
   sd_phase        = scalar, U08,  349, "", 1, 0
   boostduty2      = scalar, U08,  350 , "%",  1.0, 0.0
   status8         = scalar, U08,  351, "", 1.0, 0.0
   vvt_ang1        = scalar, S16,  352, "deg", 0.100, 0.0
   vvt_ang2        = scalar, S16,  354, "deg", 0.100, 0.0
   vvt_ang3        = scalar, S16,  356, "deg", 0.100, 0.0
   vvt_ang4        = scalar, S16,  358, "deg", 0.100, 0.0
   inj_timing_pri  = scalar, S16,  360, "deg", 0.100, 0.0
   inj_timing_sec  = scalar, S16,  362, "deg", 0.100, 0.0
   vvt_target1     = scalar, S16,  364, "deg", 0.100, 0.0
   vvt_target2     = scalar, S16,  366, "deg", 0.100, 0.0
   vvt_target3     = scalar, S16,  368, "deg", 0.100, 0.0
   vvt_target4     = scalar, S16,  370, "deg", 0.100, 0.0
   vvt_duty1       = scalar, U08,  372 , "%",    0.392, 0.0
   vvt_duty2       = scalar, U08,  373 , "%",    0.392, 0.0
   vvt_duty3       = scalar, U08,  374 , "%",    0.392, 0.0
   vvt_duty4       = scalar, U08,  375 , "%",    0.392, 0.0
   fuel_pct        = scalar, U16,  376,  "%",  0.1000, 0.0
#if CELSIUS
   fuel_temp1        = scalar, S16,  378, "°C",  0.05555, -320.0
   fuel_temp2        = scalar, S16,  380, "°C",  0.05555, -320.0
#else
   fuel_temp1        = scalar, S16,  378, "°F",  0.100, 0.0
   fuel_temp2        = scalar, S16,  380, "°C",  0.05555, -320.0
#endif
   tps_accel       = scalar, S16,  382,  "%",  0.1000, 0.0
   map_accel       = scalar, S16,  384,  "%",  0.1000, 0.0
   total_accel     = scalar, S16,  386,  "%",  0.1000, 0.0
    knock_cyl01         = scalar, U08, 388, "%", 0.4, 0
    knock_cyl02         = scalar, U08, 389, "%", 0.4, 0
    knock_cyl03         = scalar, U08, 390, "%", 0.4, 0
    knock_cyl04         = scalar, U08, 391, "%", 0.4, 0
    knock_cyl05         = scalar, U08, 392, "%", 0.4, 0
    knock_cyl06         = scalar, U08, 393, "%", 0.4, 0
    knock_cyl07         = scalar, U08, 394, "%", 0.4, 0
    knock_cyl08         = scalar, U08, 395, "%", 0.4, 0
    knock_cyl09         = scalar, U08, 396, "%", 0.4, 0
    knock_cyl10         = scalar, U08, 397, "%", 0.4, 0
    knock_cyl11         = scalar, U08, 398, "%", 0.4, 0
    knock_cyl12         = scalar, U08, 399, "%", 0.4, 0
   fan1_duty            = scalar, U08,  400, "%",  1, 0.0
;gap
   launch_timer   = scalar, U16,  404, "s", 0.001, 0
   launch_retard  = scalar, S16,  406, "deg",  0.1, 0
   maf_volts   = scalar, U16,   408, "V",   0.001, 0.0
   porta             = scalar, U08,   410, "bit",   1.000, 0.0 ; raw i/o port status bits
   porta0            = bits,   U08,   410, [0:0]
   porta1            = bits,   U08,   410, [1:1]
   porta2            = bits,   U08,   410, [2:2]
   porta3            = bits,   U08,   410, [3:3]
   porta4            = bits,   U08,   410, [4:4]
   porta5            = bits,   U08,   410, [5:5]
   porta6            = bits,   U08,   410, [6:6]
   porta7            = bits,   U08,   410, [7:7]

   portb             = scalar, U08,   411, "bit",   1.000, 0.0 ; raw i/o port status bits
   portb0            = bits,   U08,   411, [0:0]
   portb1            = bits,   U08,   411, [1:1]
   portb2            = bits,   U08,   411, [2:2]
   portb3            = bits,   U08,   411, [3:3]
   portb4            = bits,   U08,   411, [4:4]
   portb5            = bits,   U08,   411, [5:5]
   portb6            = bits,   U08,   411, [6:6]
   portb7            = bits,   U08,   411, [7:7]

   porteh            = scalar, U08,   412, "bit",   1.000, 0.0 ; raw i/o port status bits
   porte0            = bits,   U08,   412, [0:0]
   porte1            = bits,   U08,   412, [1:1]
   porte2            = bits,   U08,   412, [2:2]
   porte4            = bits,   U08,   412, [4:4]
   porth6            = bits,   U08,   412, [6:6]
   porth7            = bits,   U08,   412, [7:7]

   portk             = scalar, U08,   413, "bit",   1.000, 0.0 ; raw i/o port status bits
   portk0            = bits,   U08,   413, [0:0]
   portk1            = bits,   U08,   413, [1:1]
   portk2            = bits,   U08,   413, [2:2]
   portk3            = bits,   U08,   413, [3:3]
   portk4            = bits,   U08,   413, [4:4]
   portk5            = bits,   U08,   413, [5:5]
   portk7            = bits,   U08,   413, [7:7]

   portmj            = scalar, U08,   414, "bit",   1.000, 0.0 ; raw i/o port status bits
   portj0            = bits,   U08,   414, [0:0]
   portj1            = bits,   U08,   414, [1:1]
   portm2            = bits,   U08,   414, [2:2]
   portm3            = bits,   U08,   414, [3:3]
   portm4            = bits,   U08,   414, [4:4]
   portm5            = bits,   U08,   414, [5:5]
   portj7            = bits,   U08,   414, [7:7]

   portp             = scalar, U08,   415, "bit",   1.000, 0.0 ; raw i/o port status bits
   portp2            = bits,   U08,   415, [2:2]
   portp3            = bits,   U08,   415, [3:3]
   portp4            = bits,   U08,   415, [4:4]
   portp5            = bits,   U08,   415, [5:5]
   portp6            = bits,   U08,   415, [6:6]
   portp7            = bits,   U08,   415, [7:7]

   portt             = scalar, U08,   416, "bit",   1.000, 0.0 ; raw i/o port status bits
   portt0            = bits,   U08,   416, [0:0]
   portt1            = bits,   U08,   416, [1:1]
   portt2            = bits,   U08,   416, [2:2]
   portt3            = bits,   U08,   416, [3:3]
   portt4            = bits,   U08,   416, [4:4]
   portt5            = bits,   U08,   416, [5:5]
   portt6            = bits,   U08,   416, [6:6]
   portt7            = bits,   U08,   416, [7:7]
   cel_errorcode     = scalar, U08,  417, "bit", 1, 0.0
   boost_targ_1      = scalar, S16,   418, "kPa", 0.1, 0
   boost_targ_2      = scalar, S16,   420, "kPa", 0.1, 0
#if CELSIUS
   airtemp          = scalar, S16,   422, "°C",  0.05555, -320.0
#else
   airtemp          = scalar, S16,   422, "°F",  0.100, 0.0
#endif
   looptime         = scalar, U16,   424, "us", 1.0, 0.0
   vss3             = scalar, U16,  426, { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale }, 0.0
   vss4             = scalar, U16,  428, { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale }, 0.0
   vss3_ms_1        = scalar, U16,  426, "ms-1", 0.1, 0.0
   vss4_ms_1        = scalar, U16,  428, "ms-1", 0.1, 0.0
   fuel_press1      = scalar, S16,  430, "kPa", 0.100, 0.0
   fuel_press2      = scalar, S16,  432, "kPa", 0.100, 0.0
   cl_idle_targ_rpm = scalar, U16,  434, "rpm", 1, 0
   fp_duty          = scalar, U08,  436, "%",   0.392, 0.0
   alt_duty         = scalar, U08,  437, "%",   1, 0.0
   alt_period       = scalar, U08,  437, "ms",  0.128, 0.0
   load_duty        = scalar, U08,  438, "%",   1, 0.0
   alt_targv        = scalar, U08,  439, "V",   0.100, 0.0
   batt_curr        = scalar, S16,  440, "A",   0.1, 0.0
   fueltemp_cor     = scalar, S16,  442, "%",   0.100, 0.0
   fuelpress_cor    = scalar, S16,  444, "%",   0.100, 0.0
   ltt_cor          = scalar, S08,  446, "%",   0.100, 0.0
   engine_state_cruise = bits, U08, 447, [0:0]
   engine_state_accel_slow = bits, U08, 447, [1:1]
;   engine_state_accel_fast = bits, U08, 447, [2:2]
   engine_state_decel_slow = bits, U08, 447, [3:3]
;   engine_state_decel_fast = bits, U08, 447, [4:4]
   engine_state_overrun = bits, U08, 447, [5:5]
   engine_state_idle = bits, U08, 447, [6:6]
   engine_state_wot = bits, U08, 447, [7:7]
   tc_retard        = scalar, S16,    448, "deg", 0.100, 0.0
   cel_retard       = scalar, S16,    450, "deg", 0.100, 0.0
   fc_retard        = scalar, S16,    452, "deg", 0.100, 0.0
   ext_advance       = scalar, S16,    454, "deg", 0.100, 0.0
   base_advance     = scalar, S16,    456, "deg", 0.100, 0.0
   idle_cor_advance = scalar, S16,    458, "deg", 0.100, 0.0
   mat_retard       = scalar, S16,    460, "deg", 0.100, 0.0
   flex_advance     = scalar, S16,    462, "deg", 0.100, 0.0
   adv1             = scalar, S16,    464, "deg", 0.100, 0.0
   adv2             = scalar, S16,    466, "deg", 0.100, 0.0
   adv3             = scalar, S16,    468, "deg", 0.100, 0.0
   adv4             = scalar, S16,    470, "deg", 0.100, 0.0
   revlim_retard    = scalar, S16,    472, "deg", 0.100, 0.0
   als_timing       = scalar, S16,    474, "deg", 0.100, 0.0
   als_addfuel      = scalar, S16,    476, "ms", 0.001, 0.0
   deadtime1        = scalar, S16,    478, "ms", 0.001, 0.0
   launch_timing    = scalar, S16,    480, "deg", 0.100, 0.0
   step3_timing     = scalar, S16,    482, "deg", 0.100, 0.0
   launchvss_retard = scalar, S16,    484, "deg", 0.100, 0.0
;   cel_status2_xx   = bits,   U08,   486, [0:0] ; high byte
   cel_status2        = scalar, U16,   486, "bit",   1.000, 0.0 ; engine fault bits
   cel_status2_winj   = bits,   U08,   487, [0:0] ; low byte
   cel_status2_shutd  = bits,   U08,   487, [1:1]
   gps_latdeg       = scalar, S08,  488, "", 1,0
   gps_latmin       = scalar, S08,  489, "", 1,0
   gps_latmmin      = scalar, S16,  490, "", 1,0
   gps_londeg       = scalar, U08,  492, "", 1,0
   gps_lonmin       = scalar, U08,  493, "", 1,0
   gps_lonmmin      = scalar, U16,  494, "", 1,0
   gps_outstatus    = scalar, U08,  496, "", 1,0
   gps_altk         = scalar, S08,  497, "", 1,0
   gps_altm         = scalar, S16,  498, "", 0.1,0
   gps_speed       = scalar, U16,  500, { bitStringValue( prefSpeedUnits ,  prefSpeedUnits ) }, { msToPrefUnitsScale }, 0.0
   gps_speed_ms_1        = scalar, U16,  500, "ms-1", 0.1, 0.0
   gps_course       = scalar, U16,  502, "", 0.1,0
   generic_pid_duty_a = scalar, U08,  504, "%", 0.392, 0.0
   generic_pid_duty_b = scalar, U08,  505, "%", 0.392, 0.0
   tc_slipxtime     = scalar, U16,  506, "", 0.1,0
   loop            = scalar, U08, 508, "", 1, 0
    can_error_cnt   = scalar, U08, 509, "", 1,0
    can_error       = scalar, U16, 510, "", 1,0
;    can_error_rxovr       = bits, U08, 510, [0:0]
;    can_error_rxwrn       = bits, U08, 510, [0:0]
;    can_error_rxerr       = bits, U08, 510, [0:0]
;    can_error_txwrn       = bits, U08, 510, [0:0]
;    can_error_txerr       = bits, U08, 510, [0:0]
;    can_error_pass       = bits, U08, 510, [0:0]
;    can_error_oor       = bits, U08, 510, [0:0]
;    can_error_pass2       = bits, U08, 510, [0:0]

    accDecEnrich     = { (pulseWidth1 > 0) ? (((accEnrichMS + decEnrichMS)/pulseWidth1*100) + 100) : 100 }, "%"
    accDecEnrichPcnt = { (pulseWidth1 > 0) ? (accelEnrich/pulseWidth1 + (tpsaccden ? tpsfuelcut : accelEnrich/pulseWidth1*100)) : 100 }, "%"
    accEnrichPcnt    = { (pulseWidth1 > 0) ? (100 + (accelEnrich/pulseWidth1*100)) : 100 }, "%"
    accEnrichMS      = { accelEnrich                  }, "ms"
    decEnrichPcnt    = { (tpsaccden ? tpsfuelcut : 100)  }, "%"
    decEnrichMS      = { (pulseWidth1 > 0) ? ((tpsfuelcut/100*pulseWidth1)-pulseWidth1) : 100 }, "ms" ; approximation because doesn't include deadtime

   time             = { timeNow                                        }, "s"
   rpm100           = { rpm / 100.0                                    }

   cycleTime1       = { rpm ? (60000.0 / rpm * (2.0-(twoStroke&1))) : 0 }, "ms"
   nSquirts1        = { nCylinders/divider}
   altDiv1          = { alternate ? 2 : 1                              }
   dcfactor1        = { (sequential == 0) ? nSquirts1/altDiv1 : ( (sequential == 1) ? 2 : 1) }
   dutyCycle1       = { cycleTime1 ? (100.0*dcfactor1*pulseWidth1/cycleTime1) : 0}, "%"

   cycleTime2       = { rpm ? (60000.0 / rpm * (2.0-(twoStroke&1))) : 0 }, "ms"
   nSquirts2        = { nCylinders/divider                             }
   altDiv2          = { alternate ? 2 : 1                              } ; ought to look at staging parameters too
   dcfactor2a       = { (sequential == 0) ? nSquirts2/altDiv2 : ( (sequential == 1) ? 2 : 1) } ; ought to look at staging parameters too
   dcfactor2b       = { (staged_first_param && staged_extended_opts_use_v3) ? 1 : dcfactor2a }
   dutyCycle2       = { cycleTime2 ? (100.0*dcfactor2b*pulseWidth2/cycleTime2) : 0}, "%"

#if   NARROW_BAND_EGO
   egoVoltage = { egoV }, "V"      ; For LED bars...
   afr1err = { egov1 - afrtgt1 }
   afr2err = { egov2 - afrtgt2 }
#elif LAMBDA
   lambda1          = { afr1 / stoich }, "Lambda"
   lambda2          = { afr2 / stoich }, "Lambda2"
   lambda3          = { afr3 / stoich }, "Lambda3"
   lambda4          = { afr4 / stoich }, "Lambda4"
   lambda5          = { afr5 / stoich }, "Lambda5"
   lambda6          = { afr6 / stoich }, "Lambda6"
   lambda7          = { afr7 / stoich }, "Lambda7"
   lambda8          = { afr8 / stoich }, "Lambda8"
   egoVoltage = { lambda1          }, "Lambda" ; For LED bars...
   afrtgt1 = { afrtgt1raw / stoich * (egoType == 2) } ; return zero if NB because of mixed units with target in volts
   afrtgt2 = { afrtgt2raw / stoich * (egoType == 2) }
   afr1err = { (afr1 - afrtgt1raw) / stoich * (egoType == 2)}
   afr2err = { (afr2 - afrtgt2raw) / stoich * (egoType == 2)}
#else
   egoVoltage = { afr1             }, "AFR"    ; For LED bars...
   afr1err = { afr1 - afrtgt1 }
   afr2err = { afr2 - afrtgt2 }
#endif

    pwma_load = { getChannelValueByOffset( pwm_opt_load_a_offset ) }
    pwmb_load = { getChannelValueByOffset( pwm_opt_load_b_offset ) }
    pwmc_load = { getChannelValueByOffset( pwm_opt_load_c_offset ) }
    pwmd_load = { getChannelValueByOffset( pwm_opt_load_d_offset ) }
    pwme_load = { getChannelValueByOffset( pwm_opt_load_e_offset ) }
    pwmf_load = { getChannelValueByOffset( pwm_opt_load_f_offset ) }
    maxafrload = { (maxafr_opt1_load & 1) ? tps : map }

    vvt_load = { (vvt_opt7_yaxis == 0) ? fuelload : ((vvt_opt7_yaxis == 1) ? map : ( (vvt_opt7_yaxis == 2) ? (map*100/barometer) : ((vvt_opt7_yaxis == 3) ? tps : ((vvt_opt7_yaxis == 4) ? mafload : fuelload ) ) ) )  }

    reqfuel = { reqFuel }
    Stoich = { (status9 & 8) ? stoich_alt : stoich }

  ; Vacuum and Boost Gauges
    boostbar = { (map - barometer) / 100}
    boostpsig = { (map - barometer) * 0.14504}
   vacuum = { (barometer-map)*0.2953007 } ; Calculate vacuum in in-Hg.
   boostvac = { map < barometer ? -vacuum : boostpsig }

; calculate instantaneous economy from fuel flow (not calculated in firmware at this time)
    economy_l_km = { vss1_ms_1 ? (fuelflow / (vss1_ms_1 * 60)) : 0 }
;    economy_mpg_us  = { (1 / economy_l_km) * 3.800 / 1.609344 }
    economy_mpg_us  = { vss1_ms_1 ? (2.361 / economy_l_km) : 0 }
    economy_mpg_uk  = { vss1_ms_1 ? (2.825 / economy_l_km) : 0 }
    economy_l_100km = { economy_l_km * 100 }

    pwmidle_cl_initialvalue_matorclt_follower = { pwmidle_cl_opts_initval_clt ? coolant : mat }
   rpm_target_error_follower = { rpm - cl_idle_targ_rpm }, "rpm"

#if CELSIUS
    cltlowlim   = { clt_exp ? -40 : -40 }
    clthighlim  = { clt_exp ? 230 : 120 }
    cltlowdang  = { clt_exp ? 65 : 10 }
    cltlowwarn  = { clt_exp ? 93 : 65 }
    clthighwarn = { clt_exp ? 162 : 93 }
    clthighdang = { clt_exp ? 176 : 104 }
    mathigh = { 110 }
#else ; fahrenheit
    cltlowlim   = { clt_exp ? -40 : -40 }
    clthighlim  = { clt_exp ? 450 : 250 }
    cltlowdang  = { clt_exp ? 150 : 50 }
    cltlowwarn  = { clt_exp ? 200 : 150 }
    clthighwarn = { clt_exp ? 325 : 200 }
    clthighdang = { clt_exp ? 350 : 220 }
    mathigh = { 215 }
#endif

;synthetic air flow
    calcflow = { fuelload * rpm * veCurr1/100 }
    maf_freq = { MAFOption_t ? (maf_freq0 + ((maf_freq1 - maf_freq0) * maf_volts / 5)) : 0 }

;old names
   tpsDOT = { TPSdot }
   mapDOT = { MAPdot }

;fuel pressures
  fuel_press1_psi = {fuel_press1 * 0.14504 }, "psi"
  fuel_press2_psi = {fuel_press2 * 0.14504 }, "psi"
  fuel_press1_bar = {fuel_press1 / 100.00 }, "bar"
  fuel_press2_bar = {fuel_press2 / 100.00 }, "bar"

  msToPrefUnitsScale = { prefSpeedUnits == 0 ?  0.22369 :  0.36 }, ""

  kpadToPrefFuelPressUnitsScale = { prefFuelPressUnits == 0 ? 0.1 : (prefFuelPressUnits == 1 ? 0.0145038 : 0.001) }, ""
	fuel_press1_user = {fuel_press1 * 10 * kpadToPrefFuelPressUnitsScale}

    gps_latsec = { 60 * gps_latmmin / 10000 }
    gps_lonsec = { 60 * gps_lonmmin / 10000 }
    gps_alt = { gps_altk * 1000 + gps_altm }
   gps_latitude = { gps_latdeg + (gps_latmin / 60) + (gps_latsec / 3600) }
   gps_long = { gps_londeg + (gps_lonmin / 60) + (gps_lonsec / 3600) }
    gps_lonEW = { (gps_outstatus & 1) ? 1 : 0 }
   gps_longitude = { gps_lonEW ? 0-gps_long : gps_long } ; the 0 is redundant, but causes a TS error otherwise

  generic_pid_load_a = { getChannelValueByOffset( generic_pid_load_offset_a ) }
  generic_pid_load_b = { getChannelValueByOffset( generic_pid_load_offset_b ) }

 sdlog_maxnumbytes = { (log_style_block == 2) ? 119 : 55 }
    pedal = {app}

    maxspeed = { prefSpeedUnits == 0 ?  300 :  480 }, ""
    accel_vs_yaw = { canrx1_opt_accel == 2 ? 1 : 0}

    oil_pressure = { ((oilpress_in == 1) * sensor01) + ((oilpress_in == 2) * sensor02) + ((oilpress_in == 3) * sensor03) + ((oilpress_in == 4) * sensor04) + ((oilpress_in == 5) * sensor05) + ((oilpress_in == 6) * sensor06) + ((oilpress_in == 7) * sensor07) + ((oilpress_in == 8) * sensor08) + ((oilpress_in == 9) * sensor09) + ((oilpress_in == 10) * sensor10) + ((oilpress_in == 11) * sensor11) + ((oilpress_in == 12) * sensor12) + ((oilpress_in == 13) * sensor13) + ((oilpress_in == 14) * sensor14) + ((oilpress_in == 15) * sensor15) } 

	injOpen1 = { deadtime1 }   ; TS appears to require injOpen1 for an internal formula.

	needBurnYesNo               = {status1 & 1}
	dataLostYesNo               = {status1 & 2}
	configErrYesNo              = {status1 & 4}
	rpmSyncedYesNo              = {status1 & 8}
	fueltswYesNo                = {status1 & 0x20}
	spktswYesNo                 = {status1 & 0x40}
	fullsyncYesNo               = {status1 & 128}
	
	n2o1OnOff                   = {status2 & 1}, ""
    n2o2OnOff                   = {status2 & 2}, ""
	launchYesNo                 = {status2 & 4}, ""
	launchActive                = {status2 & 8}, ""
	flatShiftYesNo              = {status2 & 16}, ""
	sparkCutActive              = {status2 & 32}, ""
	overBoostActive             = {status2 & 64}, ""
	clIdleOnOff                 = {status2 & 128}, ""

    fuelCutActive               = {status3 & 1}, ""
    tLogOnOff                   = {status3 & 2}, ""	 
    3stepOnOff                  = {status3 & 4}, ""	 
    testModeActive              = {status3 & 8}, ""
    3stepActive                 = {status3 & 16}, ""
    softLimitActive             = {status3 & 32}, ""
    seqShiftActive              = {status3 & 64}, ""
    launchOnOff                 = {status3 & 128}, ""

    egtWarnActive               = {status6 & 1}, ""
    egtShutDwnActive            = {status6 & 2}, ""
	afrWarnActive               = {status6 & 4}, ""
    afrShutDwnActive            = {status6 & 8}, ""
    idleVeActive                = {status6 & 16}, ""
    idleAdvanceActive           = {status6 & 32}, ""	 	 
    fanOnOff                    = {status6 & 64}, ""
    mapSampleErrorActive        = {status6 & 128}, ""	 
	
    vvt1ErrYesNo                = {status7 & 1}, ""
    vvt2ErrYesNo                = {status7 & 2}, ""
    vvt3ErrYesNo                = {status7 & 4}, ""	 
    vvt4ErrYesNo                = {status7 & 8}, ""
    knockYesNo                  = {status7 & 16}, ""
    acOnOff                     = {status7 & 32}, ""	 
    checkEngineOnOff            = {status7 & 64}, ""	 
	limpModeOnOff               = {status7 & 128}, ""	 
	 
    injdisActive                = {status8 & 1}, ""
    spkdisActive                = {status8 & 2}, ""
    wiLowActive                 = {status8 & 4}, ""
    pw4xOnOff                   = {status8 & 8}, ""	
    vssLaunchL/oActive          = {status8 & 16}, ""	
    vssLaunchOnOff              = {status8 & 32}, ""
    dbwFaultActive              = {status8 & 128}, ""

    oilShutDwnActive            = { status9 & 1}, ""
    fuelPressShutDwnActive      = { status9 & 2}, ""
	overRunFuelCutActive        = { status9 & 4}, ""
	stoichSwitchingActive       = { status9 & 8}, ""
    reqFuelSwitchingActive      = { status9 & 16}, ""
	sdWarnActive                = { status9 & 32}, ""
	boostSwitchingActive		= { status9 & 64}, ""
	safetyShutdownActive        = { status9 &128}, ""
	
    canRxOnOff                  =  { status10 & 1}, ""
	canTxOnOff                  =  { status10 & 2}, ""
	iobox1Active                =  { status10 & 4}, ""
	iobox2Active                =  { status10 & 8}, ""
	iobox3Active                =  { status10 & 16}, ""
	canegt1Active               =  { status10 & 32}, ""
	canegt2Active               =  { status10 & 64}, ""
	ltTrimActive                =  { status10 & 128}, ""

    sdcardLogActive             = { sd_status & 8}, ""
    sdcardYesNo                 = { sd_status & 1}, ""    
    sdCardErrYesNo              = { sd_status & 16}, ""
    sdcardReadyYesNo            = { sd_status & 4}, ""
    
	gammTuneErrYesNo            = {(gammaEnrich < 70)}, ""
	
	canIn1OnOff                 = { canin1_8 & 1 }, ""
	canIn2OnOff                 = { canin1_8 & 2 }, ""
	canIn3OnOff                 = { canin1_8 & 4 }, ""
	canIn4OnOff                 = { canin1_8 & 8 }, ""
	canIn5OnOff                 = { canin1_8 & 16 }, ""
    canIn6OnOff                 = { canin1_8 & 32 }, ""
	canIn7OnOff                 = { canin1_8 & 64 }, ""
	canIn8OnOff                 = { canin1_8 & 128}, ""
	
;-------------------------------------------------------------------------------
;--  The entries are saved in the datalog file in the order in which they     --
;--  appear in the list below.                                                --
;--                                                                           --
;--   Channel - Case sensitive name of output channel to be logged.           --
;--   Label   - String written to header line of log.                       --
;--   Type    - Data type of output, converted before writing.                --
;--   Format  - C-style output format of data.                                --

[Datalog]
   ;       Channel          Label          Type    Format
   ;       --------------   ----------     -----   ------
   entry = time,            "Time",        float,  "%.3f"
   entry = seconds,         "SecL",        int,    "%d"
   entry = rpm,             "RPM",         int,    "%d"
   entry = map,             "MAP",         float,  "%.1f"
   entry = boostpsig,       "Boost psi",   float,  "%.1f"
   entry = throttle,        "TPS",         float,  "%.1f"
   entry = tpsADC,          "TPSADC",      int,    "%d"   ; for debug
   entry = maf,             "MAF",         float,  "%.2f", { MAFOption || MAFOption_t }
   entry = mafload,         "MAFload",      float,  "%.1f", { MAFOption || MAFOption_t }
   entry = maf_volts,       "MAF volts",   float,  "%.3f", { MAFOption }
   entry = maf_freq,        "MAF Freq",    int,    "%d", { MAFOption_t }
#if   NARROW_BAND_EGO
   entry = egov1     ,      "O2",          float,  "%.3f", {egonum > 0}
   entry = egov2     ,      "O2 #2",          float,  "%.3f", {egonum > 1}
   entry = egov3     ,      "O2 #3",          float,  "%.3f", {egonum > 2}
   entry = egov4     ,      "O2 #4",          float,  "%.3f", {egonum > 3}
   entry = egov5     ,      "O2 #5",          float,  "%.3f", {egonum > 4}
   entry = egov6     ,      "O2 #6",          float,  "%.3f", {egonum > 5}
   entry = egov7     ,      "O2 #7",          float,  "%.3f", {egonum > 6}
   entry = egov8     ,      "O2 #8",          float,  "%.3f", {egonum > 7}
#elif LAMBDA
   entry = lambda1,         "Lambda",      float,  "%.3f", {egonum > 0}
   entry = lambda2,         "Lambda2",      float,  "%.3f", {egonum > 1}
   entry = lambda3,         "Lambda3",      float,  "%.3f", {egonum > 2}
   entry = lambda4,         "Lambda4",      float,  "%.3f", {egonum > 3}
   entry = lambda5,         "Lambda5",      float,  "%.3f", {egonum > 4}
   entry = lambda6,         "Lambda6",      float,  "%.3f", {egonum > 5}
   entry = lambda7,         "Lambda7",      float,  "%.3f", {egonum > 6}
   entry = lambda8,         "Lambda8",      float,  "%.3f", {egonum > 7}
#else
   entry = afr1,            "AFR",         float,  "%.2f", {egonum > 0}
   entry = afr2,            "AFR2",         float,  "%.2f", {egonum > 1}
   entry = afr3,            "AFR3",         float,  "%.2f", {egonum > 2}
   entry = afr4,            "AFR4",         float,  "%.2f", {egonum > 3}
   entry = afr5,            "AFR5",         float,  "%.2f", {egonum > 4}
   entry = afr6,            "AFR6",         float,  "%.2f", {egonum > 5}
   entry = afr7,            "AFR7",         float,  "%.2f", {egonum > 6}
   entry = afr8,            "AFR8",         float,  "%.2f", {egonum > 7}
#endif
   entry = mat,             "MAT",         float,  "%.1f"
   entry = coolant,         "CLT",         float,  "%.1f"
   entry = engine,          "Engine",      int,    "%d"
   entry = batteryVoltage,  "Batt V",      float,  "%.1f"

   entry = egocor1,         "EGO cor1",        int,    "%.1f"
   entry = egocor2,         "EGO cor2",        int,    "%.1f", {egonum > 1}
   entry = egocor3,         "EGO cor3",        int,    "%.1f", {egonum > 2}
   entry = egocor4,         "EGO cor4",        int,    "%.1f", {egonum > 3}
   entry = egocor5,         "EGO cor5",        int,    "%.1f", {egonum > 4}
   entry = egocor6,         "EGO cor6",        int,    "%.1f", {egonum > 5}
   entry = egocor7,         "EGO cor7",        int,    "%.1f", {egonum > 6}
   entry = egocor8,         "EGO cor8",        int,    "%.1f", {egonum > 7}

   entry = airCorrection,   "Fuel: Air cor",        int,    "%.1f"
   entry = warmupEnrich,    "Fuel: Warmup cor",       int,    "%d"
   entry = baroCorrection,  "Fuel: Baro cor",       int,    "%.1f"
   entry = gammaEnrich,     "Fuel: Total cor",      int,    "%d"
   entry = accDecEnrich,    "Fuel: Accel enrich",      int,    "%d"
   entry = accEnrichMS,     "Fuel: Accel PW",    float,  "%.3f"

   entry = veCurr1,         "VE1",         int,    "%.1f"
   entry = pulseWidth1,     "PW",          float,  "%.3f"
   entry = dutyCycle1,      "Duty Cycle1",  float,  "%.1f"

   entry = veCurr2,         "VE2",        int,    "%.1f"
   entry = pulseWidth2,     "PW2",         float,  "%.3f"
   entry = dutyCycle2,      "Duty Cycle2",  float,  "%.1f"

   entry = ve_raw1,         "VE1 raw",        int,    "%.1f"
   entry = ve_raw2,         "VE2 raw",        int,    "%.1f"
   entry = ve_raw3,         "VE3 raw",        int,    "%.1f"
   entry = ve_raw4,         "VE4 raw",        int,    "%.1f"

   entry = pwseq1,          "Seq PW1",      float,  "%.3f", { sequential }
   entry = pwseq2,          "Seq PW2",      float,  "%.3f", { sequential }
   entry = pwseq3,          "Seq PW3",      float,  "%.3f", { sequential }
   entry = pwseq4,          "Seq PW4",      float,  "%.3f", { sequential }
   entry = pwseq5,          "Seq PW5",      float,  "%.3f", { sequential }
   entry = pwseq6,          "Seq PW6",      float,  "%.3f", { sequential }
   entry = pwseq7,          "Seq PW7",      float,  "%.3f", { sequential }
   entry = pwseq8,          "Seq PW8",      float,  "%.3f", { sequential }
   entry = pwseq9,          "Seq PW9",      float,  "%.3f", { sequential }
   entry = pwseq10,         "Seq PW10",     float,  "%.3f", { sequential }
   entry = pwseq11,         "Seq PW11",     float,  "%.3f", { sequential }
   entry = pwseq12,         "Seq PW12",     float,  "%.3f", { sequential }

   entry = advance,         "SPK: Spark Advance",    float,  "%.1f"
   entry = knockRetard,     "SPK: Knock retard",     float,  "%.1f"
   entry = knock,           "Knock in",         float,  "%.1f"
   entry = coldAdvDeg,      "SPK: Cold advance",     float,  "%.1f"
   entry = tc_retard,       "SPK: Traction retard",   float,  "%.1f"
   entry = cel_retard,      "SPK: CEL retard",        float,  "%.1f"
   entry = fc_retard,       "SPK: Fuel cut retard",   float,  "%.1f"
   entry = ext_advance,     "SPK: External advance",   float,  "%.1f"
   entry = base_advance,    "SPK: Base Spark Advance",float,  "%.1f"
   entry = idle_cor_advance,"SPK: Idle Correction Advance", float,  "%.1f"
   entry = mat_retard,      "SPK: MAT Retard",         float,  "%.1f"
   entry = flex_advance,    "SPK: Flex Advance",       float,  "%.1f"
   entry = adv1,            "SPK: Spark Table 1",      float,  "%.1f"
   entry = adv2,            "SPK: Spark Table 2",      float,  "%.1f"
   entry = adv3,            "SPK: Spark Table 3",      float,  "%.1f"
   entry = adv4,            "SPK: Spark Table 4",      float,  "%.1f"
   entry = revlim_retard,   "SPK: Revlim Retard",      float,  "%.1f"
   entry = als_timing,      "SPK: ALS Timing",         float,  "%.1f"
   entry = launch_timing,   "SPK: Launch Timing",         float,  "%.1f"
   entry = step3_timing,    "SPK: 3-step Timing",      float,  "%.1f"
   entry = launchvss_retard,"SPK: Launch VSS Retard",float,  "%.1f"
   entry = n2o_retard,      "SPK: Nitrous Retard", float, "%.1f", { N2Oopt_2 }

   entry = dwell,           "Dwell",            float,  "%.2f"
   entry = barometer,       "Barometer",         float,  "%.1f"
   entry = iacstep,         "Stepper Idle position",     int,    "%d", {IdleCtl == 3}
   entry = idleDC, "PWM Idle duty", float, "%.1f", {(IdleCtl == 2) || (IdleCtl == 4)}
   entry = cl_idle_targ_rpm, "Closed-loop idle target RPM", int, "%d", { ((IdleCtl > 1) && (IdleCtl_alg == 1)) || idle_special_ops_timing_assist } 
   entry = rpm_target_error_follower, "Closed-loop idle RPM error", int, "%d", { ((IdleCtl > 1) && (IdleCtl_alg == 1)) || idle_special_ops_timing_assist } 
   entry = boostduty,  "Boost duty", int, "%d", { boost_ctl_settings_on }
   entry = boost_targ_1, "Boost target 1", int, "%d", { boost_ctl_settings_on && (boost_ctl_settings_cl || boost_ctl_settings_dome) }
   entry = boostduty2,  "Boost duty 2", int, "%d", { boost_ctl_settings_on &&  boost_ctl_settings_on2 }
   entry = boost_targ_2, "Boost target 2", int, "%d", { boost_ctl_settings_on && (boost_ctl_settings_cl || boost_ctl_settings_dome) && boost_ctl_settings_on2 }
   entry = boost_dome_targ1, "Dome target 1", int, "%d", { boost_ctl_settings_on && boost_ctl_settings_dome }
;   entry = boost_dome_targ2, "Dome target 2", int, "%d", { boost_ctl_settings_on && boost_ctl_settings_dome }

#if NARROW_BAND_EGO
   entry = afrtgt1,    "EgoV 1 Target", float, "%.3f"
   entry = afrtgt2,    "EgoV 2 Target", float, "%.3f"
   entry = afr1err,    "EgoV 1 Error", float, "%.3f"
   entry = afr2err,    "EgoV 2 Error", float, "%.3f"
#elif LAMBDA
   entry = afrtgt1,    "Lambda 1 Target", float, "%.3f"
   entry = afrtgt2,    "Lambda 2 Target", float, "%.3f"
   entry = afr1err,    "Lambda 1 Error", float, "%.3f"
   entry = afr2err,    "Lambda 2 Error", float, "%.3f"
#else
   entry = afrtgt1,    "AFR 1 Target", float, "%.1f"
   entry = afrtgt2,    "AFR 2 Target", float, "%.1f"
   entry = afr1err,    "AFR 1 Error", float, "%.1f"
   entry = afr2err,    "AFR 2 Error", float, "%.1f"
#endif
   entry = TPSdot,          "TPSdot",      float,  "%.1f"
   entry = MAPdot,          "MAPdot",      float,  "%.1f"
   entry = RPMdot,          "RPMdot", int, "%d"

   entry = wallfuel1,        "Wall fuel1",    int,    "%d", {EAEOption}
   entry = wallfuel2,        "Wall fuel2",   int,     "%d", {EAEOption}

   entry = EAEFuelCorr1,     "EAE1",       int,    "%d", {EAEOption}
   entry = EAEFuelCorr2,     "EAE2",      int, "%d", {EAEOption}
   entry = fuelload,         "Load",        float,  "%.1f"
   entry = fuelload2,        "Secondary load", float, "%.1f"
   entry = ignload,          "Ign load",   float,    "%.1f"
   entry = ignload2,         "Secondary ign load", float, "%.1f"
   entry = eaeload1,          "EAE load", float, "%.1f", {EAEOption}
   entry = afrload1,          "AFR load", float, "%.1f"

   entry = inj_timing_pri,    "Injector timing pri", float, "%.1f"
   entry = inj_timing_sec,    "Injector timing sec", float, "%.1f"

   entry = egt1,         "EGT1", int, "%d", {egt_num > 0}
   entry = egt2,         "EGT2", int, "%d", {egt_num > 1}
   entry = egt3,         "EGT3", int, "%d", {egt_num > 2}
   entry = egt4,         "EGT4", int, "%d", {egt_num > 3}
   entry = egt5,         "EGT5", int, "%d", {egt_num > 4}
   entry = egt6,         "EGT6", int, "%d", {egt_num > 5}
   entry = egt7,         "EGT7", int, "%d", {egt_num > 6}
   entry = egt8,         "EGT8", int, "%d", {egt_num > 7}
   entry = egt9,         "EGT9", int, "%d", {egt_num > 8}
   entry = egt10,        "EGT10", int, "%d", {egt_num > 9}
   entry = egt11,        "EGT11", int, "%d", {egt_num > 10}
   entry = egt12,        "EGT12", int, "%d", {egt_num > 11}
;   entry = egt13,        "EGT13", int, "%d", {egt_num > 12}
;   entry = egt14,        "EGT14", int, "%d", {egt_num > 13}
;   entry = egt15,        "EGT15", int, "%d", {egt_num > 14}
;   entry = egt16,        "EGT16", int, "%d", {egt_num > 15}

; for debug, enable these always
   entry = sensor01, { stringValue(sensor01Alias) }, float, "%.1f", { sensor01_source }
   entry = sensor02, { stringValue(sensor02Alias) }, float, "%.1f", { sensor02_source }
   entry = sensor03, { stringValue(sensor03Alias) }, float, "%.1f", { sensor03_source }
   entry = sensor04, { stringValue(sensor04Alias) }, float, "%.1f", { sensor04_source }
   entry = sensor05, { stringValue(sensor05Alias) }, float, "%.1f", { sensor05_source }
   entry = sensor06, { stringValue(sensor06Alias) }, float, "%.1f", { sensor06_source }
   entry = sensor07, { stringValue(sensor07Alias) }, float, "%.1f", { sensor07_source }
   entry = sensor08, { stringValue(sensor08Alias) }, float, "%.1f", { sensor08_source }
   entry = sensor09, { stringValue(sensor09Alias) }, float, "%.1f", { sensor09_source }
   entry = sensor10, { stringValue(sensor10Alias) }, float, "%.1f", { sensor10_source }
   entry = sensor11, { stringValue(sensor11Alias) }, float, "%.1f", { sensor11_source }
   entry = sensor12, { stringValue(sensor12Alias) }, float, "%.1f", { sensor12_source }
   entry = sensor13, { stringValue(sensor13Alias) }, float, "%.1f", { sensor13_source }
   entry = sensor14, { stringValue(sensor14Alias) }, float, "%.1f", { sensor14_source }
   entry = sensor15, { stringValue(sensor15Alias) }, float, "%.1f", { sensor15_source }
   entry = sensor16, "ECU Temperature", float, "%.1f"

   entry = canpwmin0, "CANpwmin0", int, "%d", { enable_pollPWM }
   entry = canpwmin1, "CANpwmin1", int, "%d", { enable_pollPWM }
   entry = canpwmin2, "CANpwmin2", int, "%d", { enable_pollPWM }
   entry = canpwmin3, "CANpwmin3", int, "%d", { enable_pollPWM }
   entry = canin1_8,    "canin1_8",     int, "%d"
   entry = canout1_8,   "canout1_8",    int, "%d"
   entry = canout9_16,  "canout9_16",   int, "%d"

   entry = timing_err, "Timing err", float, "%.1f"
   entry = synccnt, "Lost sync count", int, "%d"
   entry = syncreason, "Lost sync reason", int, "%d"

   entry = fuelflow, "Fuel flow cc/min", int, "%d"

   entry = vss1,             "VSS1",         int,  "%.1f", {vss_opt0_1}
   entry = vss2,             "VSS2",         int,  "%.1f", {vss_opt0_2}
   entry = vss3,             "VSS3",         int,  "%.1f", {vss_opt0_3}
   entry = vss4,             "VSS4",         int,  "%.1f", {vss_opt0_4}
   entry = vss1_ms_1,        "VSS1 ms-1",    int,  "%.1f", {vss_opt0_1}
   entry = vss2_ms_1,        "VSS2 ms-1",    int,  "%.1f", {vss_opt0_2}
   entry = vss3_ms_1,        "VSS3 ms-1",    int,  "%.1f", {vss_opt0_3}
   entry = vss4_ms_1,        "VSS4 ms-1",    int,  "%.1f", {vss_opt0_4}

   entry = economy_mpg_us,   "MPG(USA)",      int,  "%.1f", {vss_opt0_1 && (prefSpeedUnits == 0)}
   entry = economy_mpg_uk,   "MPG(UK)",       int,  "%.1f", {vss_opt0_1 && (prefSpeedUnits == 0)}
   entry = economy_l_100km,  "l/100km",       int,  "%d",   {vss_opt0_1 && (prefSpeedUnits == 1)}

   entry = ss1,             "Shaft rpm 1",         int,  "%d", { ss_opt1 }
   entry = ss2,             "Shaft rpm 2",         int,  "%d", { ss_opt2 }
   entry = n2o_addfuel,     "Nitrous added fuel",  float, "%.3f", { N2Oopt_2 }
   entry = nitrous1_duty,   "Nitrous 1 duty", int, "%d", { N2Oopt_2 }
   entry = nitrous2_duty,   "Nitrous 2 duty", int, "%d", { N2Oopt_2 }
   entry = nitrous_timer,   "Nitrous Timer", float, "%.3f", { N2Oopt_2 }
   entry = water_duty,      "Water inj duty", int,  "%d", { water_freq_on }
   entry = als_addfuel,     "ALS added fuel",  float, "%.3f", { als_in_pin }
   entry = als_timing,      "ALS timing", float, "%.1f", { als_in_pin }
   entry = sd_filenum,      "SDcard file number", int, "%d", { log_style_on2 }
   entry = sd_status,      "SDcard status", int, "%d", { log_style_on2 }
   entry = sd_phase,      "SDcard phase", int, "%d", { log_style_on2 }
   entry = sd_error,      "SDcard error", int, "%d", { log_style_on2 }
   entry = gear,          "Gear", int, "%d", { gear_method }
   entry = vss1dot,       "VSS1dot", float, "%.1f", {vss_opt0_1}
   entry = vss2dot,       "VSS2dot", float, "%.1f", {vss_opt0_2}
   entry = accelx,        "Accel X", float, "%.2f", { accXport || (canrx1_opt_accel >= 1) }
   entry = accely,        "Accel Y", float, "%.2f", { accYport || (canrx1_opt_accel >= 1) }
   entry = accelz,        { bitStringValue( accel_vs_yaw_name ,  accel_vs_yaw ) }, float, "%.2f", { accZport || (canrx1_opt_accel >= 1) }
   entry = duty_pwm_a,   "PWM A duty", int, "%d", { pwm_opt_on_a }
   entry = duty_pwm_b,   "PWM B duty", int, "%d", { pwm_opt_on_b }
   entry = duty_pwm_c,   "PWM C duty", int, "%d", { pwm_opt_on_c }
   entry = duty_pwm_d,   "PWM D duty", int, "%d", { pwm_opt_on_d }
   entry = duty_pwm_e,   "PWM E duty", int, "%d", { pwm_opt_on_e }
   entry = duty_pwm_f,   "PWM F duty", int, "%d", { pwm_opt_on_f }
   entry = generic_pid_duty_a, "Generic Closed-Loop A duty", float, "%.1f", { generic_pid_flags_a_on }
   entry = generic_pid_duty_b, "Generic Closed-Loop B duty", float, "%.1f", { generic_pid_flags_b_on }
   entry = status1, "Status1", int, "%d"
   entry = status2, "Status2", int, "%d"
   entry = status3, "Status3", int, "%d"
   entry = status4, "Status4", int, "%d"
   entry = status5, "Status5", int, "%d"
   entry = status5s, "Status5s", int, "%d"
   entry = status6, "Status6", int, "%d"
   entry = status7, "Status7", int, "%d"
   entry = status8, "Status8", int, "%d"
   entry = status9, "Status9", int, "%d"
   entry = status10, "Status10", int, "%d"
   entry = vvt_ang1, "VVT angle 1", int, "%.1f", { vvt_opt1_on }
   entry = vvt_ang2, "VVT angle 2", int, "%.1f", { vvt_opt1_on > 1}
   entry = vvt_ang3, "VVT angle 3", int, "%.1f", { vvt_opt1_on > 2}
   entry = vvt_ang4, "VVT angle 4", int, "%.1f", { vvt_opt1_on > 2}
   entry = vvt_target1, "VVT target 1", int, "%.1f", { vvt_opt1_on }
   entry = vvt_target2, "VVT target 2", int, "%.1f", { vvt_opt1_on > 1}
   entry = vvt_target3, "VVT target 3", int, "%.1f", { vvt_opt1_on > 2}
   entry = vvt_target4, "VVT target 4", int, "%.1f", { vvt_opt1_on > 2}
   entry = vvt_duty1, "VVT duty 1", int, "%.1f", { vvt_opt1_on }
   entry = vvt_duty2, "VVT duty 2", int, "%.1f", { vvt_opt1_on > 1}
   entry = vvt_duty3, "VVT duty 3", int, "%.1f", { (vvt_opt1_on > 2) || (vvt_opt4_decode == 2) }
   entry = vvt_duty4, "VVT duty 4", int, "%.1f", {  (vvt_opt1_on > 2) || (vvt_opt4_decode == 2) }
   entry = tps_accel, "TPS accel", int, "%.1f", { AE_options & 0x1 }
   entry = map_accel, "MAP accel", int, "%.1f", { AE_options & 0x1 }
   entry = total_accel, "Total accel", int, "%.1f", { AE_options & 0x1 }
   entry = launch_timer,   "Launch timer", float, "%.3f", { launch_opt_on }
   entry = launch_retard,  "Launch timed retard", float, "%.1f", { launch_opt_on && launch_opt_retard }

   entry = knock_cyl01, "Knock cyl# 1", float, "%.1f", {(knk_option_an == 3) && knock_conf_percyl && (nCylinders > 0)}
   entry = knock_cyl02, "Knock cyl# 2", float, "%.1f", {(knk_option_an == 3) && knock_conf_percyl && (nCylinders > 1)}
   entry = knock_cyl03, "Knock cyl# 3", float, "%.1f", {(knk_option_an == 3) && knock_conf_percyl && (nCylinders > 2)}
   entry = knock_cyl04, "Knock cyl# 4", float, "%.1f", {(knk_option_an == 3) && knock_conf_percyl && (nCylinders > 3)}
   entry = knock_cyl05, "Knock cyl# 5", float, "%.1f", {(knk_option_an == 3) && knock_conf_percyl && (nCylinders > 4)}
   entry = knock_cyl06, "Knock cyl# 6", float, "%.1f", {(knk_option_an == 3) && knock_conf_percyl && (nCylinders > 5)}
   entry = knock_cyl07, "Knock cyl# 7", float, "%.1f", {(knk_option_an == 3) && knock_conf_percyl && (nCylinders > 6)}
   entry = knock_cyl08, "Knock cyl# 8", float, "%.1f", {(knk_option_an == 3) && knock_conf_percyl && (nCylinders > 7)}
   entry = knock_cyl09, "Knock cyl#09", float, "%.1f", {(knk_option_an == 3) && knock_conf_percyl && (nCylinders > 8)}
   entry = knock_cyl10, "Knock cyl#10", float, "%.1f", {(knk_option_an == 3) && knock_conf_percyl && (nCylinders > 9)}
   entry = knock_cyl11, "Knock cyl#11", float, "%.1f", {(knk_option_an == 3) && knock_conf_percyl && (nCylinders > 10)}
   entry = knock_cyl12, "Knock cyl#12", float, "%.1f", {(knk_option_an == 3) && knock_conf_percyl && (nCylinders > 11)}

   entry = porta, "porta", int, "%d"
   entry = portb, "portb", int, "%d"
   entry = porteh, "porteh", int, "%d"
   entry = portk, "portk", int, "%d"
   entry = portmj, "portmj", int, "%d"
   entry = portp, "portp", int, "%d"
   entry = portt, "portt", int, "%d"
   entry = portm, "portm", int, "%d"
   entry = ports, "ports", int, "%d"

   entry = cel_status, "CEL status", int, "%d"
   entry = cel_status2, "CEL status2", int, "%d"
   entry = cel_errorcode, "CEL error code", int, "%d"

   entry = fuel_pct, "Ethanol Percentage", float, "%.1f", { flexFuel > 0 }
   entry = fuelCorrection, "E85 Fuel Correction", int, "%d", { flexFuel > 0 }
   entry =  fuel_temp1, "Fuel Temp1",       float, "%.1f", { (flexFuel && (fueltemp1 == 1)) || (fueltemp1 > 15)}
   entry =  fuel_temp2, "Fuel Temp2",       float, "%.1f", { dualfuel_temp_sens }

   entry =  fuel_press1, "Fuel Pressure1_kPa",  float, "%.1f", { fp_press_in }
   entry =  fuel_press1_psi, "Fuel Pressure1_psi",  float, "%.1f", { fp_press_in }
   entry =  fuel_press1_bar, "Fuel Pressure1_bar",  float, "%.1f", { fp_press_in }

   entry =  fuel_press2, "Fuel Pressure2_kPa",  float, "%.1f", { dualfuel_press_sens }
   entry =  fuel_press2_psi, "Fuel Pressure2_psi",  float, "%.1f", { dualfuel_press_sens }
   entry =  fuel_press2_bar, "Fuel Pressure2_bar",  float, "%.1f", { dualfuel_press_sens }

   entry = fp_duty, "Fuel pump control duty", int, "%d", { fp_opt_mode }
   entry = fan1_duty, "Fan 1 control duty", int, "%d", { fanctl1_mode }

   entry = alt_targv, "Alternator target voltage", float,  "%.1f", {alternator_opt_mode > 1}
   entry = alt_period, "Alternator control period", float,  "%.1f", {alternator_opt_mode == 2}
   entry = alt_duty, "Alternator control duty",    int,    "%d", {alternator_opt_mode > 2}
   entry = load_duty, "Alternator load",           int,  "%d", {alternator_opt_mode && alternator_freq_monin}
   entry = batt_curr, "Battery current",           float,  "%.1f", {alternator_opt_mode && alternator_freq_currin}
   entry = fueltemp_cor, "Fuel temperature cor", float, "%.1f"
   entry = fuelpress_cor, "Fuel pressure cor", float, "%.1f"
   entry = ltt_cor, "Long term fuel trim cor", float, "%.1f", {ltt_opt_on}
;   entry = gps_latdeg,      "GPS Lat. deg", int,    "%d",      { can_poll2_gps }
;   entry = gps_latmin,      "GPS Lat. min", int,    "%d",      { can_poll2_gps }
;   entry = gps_latsec,      "GPS Lat. sec", float,  "%.3f",    { can_poll2_gps }
;   entry = gps_londeg,      "GPS Lon. deg", int,    "%d",      { can_poll2_gps }
;   entry = gps_lonmin,      "GPS Lon. min", int,    "%d",      { can_poll2_gps }
;   entry = gps_lonsec,      "GPS Lon. sec", float,  "%.3f",    { can_poll2_gps }
;   entry = gps_lonEW,       "GPS Lon. E/W", int,    "%d",      { can_poll2_gps }
   entry = gps_alt,         "GPS Altitude", float, "%.1f",     { can_poll2_gps }
   entry = gps_speed,       "GPS Speed",    float, "%.1f",     { can_poll2_gps }
   entry = gps_speed_ms_1,  "GPS Speed ms-1",float, "%.1f",    { can_poll2_gps }
   entry = gps_course,      "GPS Course (deg)", float, "%.1f", { can_poll2_gps }
   entry = gps_latitude,    "GPS Latitude",  float,   "%.5f",  { can_poll2_gps }
   entry = gps_longitude,   "GPS Longitude", float,   "%.5f",  { can_poll2_gps }
   entry = engine_state_cruise, "Engine in cruise state", int, "%d" 
   entry = engine_state_accel_slow, "Engine accelerating slowly", int, "%d"
;   entry = engine_state_accel_fast, "Engine accelerating quickly", int, "%d"
   entry = engine_state_decel_slow, "Engine decelerating slowly", int, "%d"
;   entry = engine_state_decel_fast, "Engine decelerating quickly", int, "%d"
   entry = engine_state_overrun, "Engine in overrun", int, "%d"
   entry = engine_state_idle, "Engine idling", int, "%d"
   entry = engine_state_wot, "Engine WOT", int, "%d"
   entry = tc_slipxtime, "TC slip * time", float, "%.1f"
   entry = loop, "Loop", int, "%d"
   entry = can_error, "CAN error bits", int, "%d"
   entry = can_error_cnt, "CAN error count", int, "%d"
   entry = dome_fill_duty1, "Dome channel 1 fill duty", int, "%d", { boost_ctl_settings_on && boost_ctl_settings_dome }
;   entry = dome_fill_duty2, "Dome channel 2 fill duty", int, "%d", { boost_dome_settings2_on }
   entry = dome_empty_duty1, "Dome channel 1 empty duty", int, "%d", { boost_ctl_settings_on && boost_ctl_settings_dome }
;   entry = dome_empty_duty2, "Dome channel 2 empty duty", int, "%d", { boost_dome_settings2_on }
   entry = app, "Accelerator Pedal/Grip Position", float, "%.2f", { etc_opt_on }
   entry = throttle_targ, "Throttle Target", float, "%.2f", { etc_opt_on }
    entry = looptime, "Mainloop time", int, "%d"
;status flag bits
;	 entry = needBurnYesNo,           "status: Need Burn",                  int,   "yesNo"
;     entry = dataLostYesNo,           "status: Data Lost",                  int,   "yesNo"
;     entry = configErrYesNo,          "status: Config Error",               int,   "yesNo"
     entry = rpmSyncedYesNo,          "status: RPM Sync",                   int,   "yesNo"
	 entry = fueltswYesNo             "status: Fuel tableswitch",           int,   "yesNo"
	 entry = spktswYesNo              "status: Spark tableswitch",          int,   "yesNo"
     entry = fullsyncYesNo,         "status: Full RPM Sync",    int,   "yesNo"
	
     entry = n2o1OnOff,               "status: N2O 1",                     int,   "onOff",          {N2Oopt_2}
     entry = n2o2OnOff,               "status: N2O 2",                     int,   "onOff",          {N2Oopt_3}
     entry = launchYesNo,             "status: Launch Armed",              int,   "onOff",          {launch_opt_on > 0}
     entry = launchActive,            "status: Launch Active",             int,   "activeInactive", {launch_opt_on > 0}
     entry = flatShiftYesNo,          "status: Flat Shift",                int,   "yesNo",          {launch_opt_on = 3}
     entry = sparkCutActive,          "status: Spark Cut",                 int,   "activeInactive"
     entry = overBoostActive,         "status: Over Boost",                int,   "activeInactive", {OverBoostOption}
     entry = clIdleOnOff,             "status: CL Idle",                   int,   "onOff",          {IdleCtl_alg}
													 
	 entry = fuelCutActive,           "status: Fuel Cut",                  int,   "activeInactive"
;     entry = tLogOnOff,               "status: T-Log",                     int,   "onOff"
     entry = 3stepOnOff,              "status: 3 Step",                    int,   "onOff",          {launch_3step_in}
     entry = testModeActive,          "status: Test Mode",                 int,   "activeInactive"
     entry = 3stepActive,             "status: 3 Step",                    int,   "activeInactive", {launch_3step_in}
     entry = softLimitActive,         "status: Soft Limit",                int,   "activeInactive"
     entry = seqShiftActive,          "status: Seq. Shift",                int,   "activeInactive", {shift_cut_on}
     entry = launchOnOff,             "status: Launch On",                 int,   "onOff",          {launch_opt_on > 0}
													 
	 entry = egtWarnActive,           "status: EGT Warn",                  int,   "activeInactive", {egt_conf_action}
     entry = egtShutDwnActive,        "status: EGT Shutdown",              int,   "activeInactive", {egt_conf_shutdown}
     entry = afrWarnActive,           "status: AFR Warn",                  int,   "activeInactive", {maxafr_opt1_on}
     entry = afrShutDwnActive,        "status: AFR Shutdown",              int,   "activeInactive", {maxafr_opt1_on}
     entry = idleVeActive,            "status: Idle VE",                   int,   "activeInactive", {idleve_on} 
     entry = idleAdvanceActive,       "status: Idle Adv",                  int,   "activeInactive", {idleadvance_on}
     entry = fanOnOff,                "status: Fan",                       int,   "onOff",          {fanctl_settings_on}
     entry = mapSampleErrorActive,    "status: MAP Sample Error",          int,   "activeInactive"
													 
	 entry = vvt1ErrYesNo,            "status: VVT 1 Error",                int,   "yesNo", {vvt_out1}
     entry = vvt2ErrYesNo,            "status: VVT 2 Error",                int,   "yesNo", {vvt_out2}
     entry = vvt3ErrYesNo,            "status: VVT 3 Error",                int,   "yesNo", {vvt_out3}
     entry = vvt4ErrYesNo,            "status: VVT 4 Error",                int,   "yesNo", {vvt_out4}
     entry = knockYesNo,              "status: Knock",                      int,   "yesNo", {knk_option}
     entry = acOnOff,                 "status: A/C",                        int,   "onOff", {ac_idleup_settings}
     entry = checkEngineOnOff,        "status: Check Engine",               int,   "onOff", {cel_port}
     entry = limpModeOnOff,           "status: Limp Mode",                  int,   "onOff", {cel_action1_map || cel_action1_mat || cel_action1_clt || cel_action1_tps || cel_action1_batt || cel_action1_ego || cel_action2_flex || cel_action2_egt || cel_action2_oil}
													 
	 entry = wiLowActive,             "status: Water Inj Low",             int,   "activeInactive"
     entry = vssLaunchL/oActive,      "status: VSS Launch L/O",            int,   "activeInactive"
     entry = vssLaunchOnOff,          "status: VSS Launch",                int,   "onOff"
     entry = dbwFaultActive,          "status: DBW Fault",                 int,   "activeInactive"
													 
	 entry = oilShutDwnActive,        "status: Oil Shutdown",              int,   "activeInactive"
     entry = fuelPressShutDwnActive,  "status: Fuel Press. Shutdown",      int,   "activeInactive", {fp_opt_safety}
     entry = overRunFuelCutActive,    "status: Overrun Fuel Cut",          int,   "activeInactive"
     entry = stoichSwitchingActive,   "status: Stoich Switching",          int,   "activeInactive", {tsw_pin_stoich}
     entry = reqFuelSwitchingActive,  "status: ReqFuel Switching",         int,   "activeInactive", {tsw_pin_rf}		
	 entry = boostSwitchingActive,    "status: Boost Switching",            int,   "activeInactive", {boost_feats_tsw}
	 entry = safetyShutdownActive,    "status: Safety Shutdown",            int,   "activeInactive"
		
     entry = canRxOnOff,              "status: CAN RX",                      int,   "onOff",   
     entry = canTxOnOff,              "status: CAN TX",                      int,   "onOff", 
     entry = iobox1Active,            "status: I/O Box 1",                   int,   "activeInactive", {iobox_opta1}
     entry = iobox2Active,            "status: I/O Box 2",                   int,   "activeInactive", {iobox_opta2}
     entry = iobox3Active,            "status: I/O Box 3",                   int,   "activeInactive", {iobox_opta3}
     entry = canegt1Active,           "status: CANEGT1",                     int,   "activeInactive", {(egt_num > 0) && (egt_conf_input ==1)}
     entry = canegt2Active,           "status: CANEGT2",                     int,   "activeInactive", {(egt_num > 0) && (egt_conf_input ==1)}
     entry = ltTrimActive,            "status: L.T Trim",                    int,   "activeInactive", 
		
	 entry = sdWarnActive,            "status: SD Warn",                   int,   "activeInactive", { log_style_on2 > 0 }
     entry = sdcardYesNo,             "status: SD Card",                   int,   "yesNo", { log_style_on2 > 0 }
     entry = sdcardReadyYesNo,        "status: SD Ready",                  int,   "yesNo", { log_style_on2 > 0 }
     entry = sdcardLogActive,         "status: SD Log",                    int,   "activeInactive", { log_style_on2 > 0 }
     entry = sdCardErrYesNo,          "status: SD Error",                  int,   "yesNo", { log_style_on2 > 0 }
													 
	 entry = gammTuneErrYesNo,        "status: Tune Error",                int,   "yesNo"
													 
	 entry = porta0,                  "port:A0 Injector A",             int,   "highLow"
     entry = porta1,                  "port:A1 Injector B",             int,   "highLow"
     entry = porta2,                  "port:A2 Injector C",             int,   "highLow"
     entry = porta3,                  "port:A3 Injector D",             int,   "highLow"
     entry = porta4,                  "port:A4 Injector E",             int,   "highLow"
     entry = porta5,                  "port:A5 Injector F",             int,   "highLow"
     entry = porta6,                  "port:A6 Injector G",             int,   "highLow"
     entry = porta7,                  "port:A7 Injector H",             int,   "highLow"
													 
	 entry = portb0,                  "port:B0 Spark A",                int,   "highLow"
     entry = portb1,                  "port:B1 Spark B",                int,   "highLow"
     entry = portb2,                  "port:B2 Spark C",                int,   "highLow"
     entry = portb3,                  "port:B3 Spark D",                int,   "highLow"
     entry = portb4,                  "port:B4 Spark E",                int,   "highLow"
     entry = portb5,                  "port:B5 Spark F",                int,   "highLow"
     entry = portb6,                  "port:B6 Spark G",                int,   "highLow"
     entry = portb7,                  "port:B7 Spark H",                int,   "highLow"
													 
	 entry = porte0,                  "port:E0 Digital Switched In 4",   int,   "highLow"
     entry = porte1,                  "port:E1 Digital Switched In 5",   int,   "highLow"
     entry = porte1,                  "port:E1 PE1",   int,   "highLow"
     entry = porte2,                  "port:E2 Digital Switched In 1",   int,   "highLow"
     entry = porte4,                  "port:E4 Fuel Pump",              int,   "highLow"
     entry = porth6,                  "port:H6 Digital Switched In 3",   int,   "highLow"
     entry = porth7,                  "port:H7 Digital Switched 12v In", int,   "highLow"
													 
	 entry = portk0,                  "port:K0 Tach Out",               int,   "highLow"
     entry = portk2,                  "port:K2 Digital Switched In 2",int,   "highLow"
													 
	 entry = portj0,                  "port:J0 Stepper Out 1",          int,   "highLow"
     entry = portj1,                  "port:J1 Stepper Out 2",          int,   "highLow"
     entry = portm2,                  "port:M2 Knock Interface",        int,   "highLow"
     entry = portm3,                  "port:M3 knock Interface",        int,   "highLow"
     entry = portm4,                  "port:M4 Knock Interface",        int,   "highLow"
     entry = portm5,                  "port:M5 Knock Interface",        int,   "highLow"
     entry = portm6,                  "port:M6 IAC EN",         int,   "highLow"
     entry = portj7,                  "port:J7 Knock Interface",        int,   "highLow"
													 
     entry = portp2,                  "port:P2 PWM Out 2",              int,   "highLow"
     entry = portp3,                  "port:P3 High Current Out 3",     int,   "highLow"

     entry = portp4,                  "port:P4 High Current Out 1",     int,   "highLow"
     entry = portp5,                  "port:P5 High Current Out 2",     int,   "highLow"
     entry = portp6,                  "port:P6 PWM Out3",               int,   "highLow"
     entry = portp7,                  "port:P7 PWM / Idle Out 1",       int,   "highLow"
													 
	 entry = portt0,                  "port:T0 CKP",                    int,   "highLow"
     entry = portt1,                  "port:T1 Injector I",             int,   "highLow"
     entry = portt2,                  "port:T2 CMP",                    int,   "highLow"
     entry = portt3,                  "port:T3 Injector J",             int,   "highLow"
     entry = portt4,                  "port:T4 Digital Frequency In 2", int,   "highLow"
     entry = portt5,                  "port:T5 Digital Frequency In 3", int,   "highLow"
     entry = portt6,                  "port:T6 Digital I/O 5",          int,   "highLow"
													 
	 entry = canIn1OnOff,             "port:CAN IN 1",                   int,   "highLow", {enable_pollports_digin }
     entry = canIn2OnOff,             "port:CAN IN 2",                   int,   "highLow", {enable_pollports_digin }
     entry = canIn3OnOff,             "port:CAN IN 3",                   int,   "highLow", {enable_pollports_digin }
     entry = canIn4OnOff,             "port:CAN IN 4",                   int,   "highLow", {enable_pollports_digin }
     entry = canIn5OnOff,             "port:CAN IN 5",                   int,   "highLow", {enable_pollports_digin }
     entry = canIn6OnOff,             "port:CAN IN 6",                   int,   "highLow", {enable_pollports_digin }
     entry = canIn7OnOff,             "port:CAN IN 7",                   int,   "highLow", {enable_pollports_digin }
     entry = canIn8OnOff,             "port:CAN IN 8",                   int,   "highLow", {enable_pollports_digin }
													 
	 entry = cel_status_map,          "cel:MAP Fualt",                  int,   "activeInactive", {cel_opt2_map}
     entry = cel_status_mat,          "cel:MAT Fault",                  int,   "activeInactive", {cel_opt2_mat}
     entry = cel_status_clt,          "cel:CLT Fault",                  int,   "activeInactive", {cel_opt2_clt}
     entry = cel_status_tps,          "cel:TPS Fault",                  int,   "activeInactive", {cel_opt2_tps}
     entry = cel_status_batt,         "cel:Batt Fault",                 int,   "activeInactive", {cel_opt2_batt}
     entry = cel_status_afr0,         "cel:AFR0 Fault",                 int,   "activeInactive", {cel_opt2_afr0}
     entry = cel_status_sync,         "cel:SYNC Fault",                 int,   "activeInactive", {cel_opt2_sync}
     entry = cel_status_egt,          "cel:EGT Fault",                  int,   "activeInactive", {cel_opt2_egt}
     entry = cel_status_flex,         "cel:Flex Fault",                 int,   "activeInactive", {cel_opt3_flex}
     entry = cel_status_maf,          "cel:MAF Fault",                  int,   "activeInactive", 
     entry = cel_status_knock,        "cel:Knock Fault",                int,   "activeInactive", {knk_option}
     entry = cel_status_cam,          "cel:CAM Fault",                  int,   "activeInactive",
     entry = cel_status_oil,          "cel:Oil Fault",                  int,   "activeInactive", 
     entry = cel_status_fp,           "cel:Fuel Press Fault",           int,   "activeInactive", {fp_opt_safety}
     entry = cel_status_egtshut,      "cel:CEL EGT Shutdown",           int,   "activeInactive",
     entry = cel_status_afrshut,      "cel:CEL AFR Shutdown",           int,   "activeInactive", 
     entry = cel_status2_winj,        "cel:CEL W. Inj Low",             int,   "activeInactive", 
													 
	 entry = engine_state_cruise,     "state:Cruise",                     int,   "activeInactive"
     entry = engine_state_accel_slow, "state:Accel",                      int,   "activeInactive"
     entry = engine_state_decel_slow, "state:Decel",                      int,   "activeInactive"
     entry = engine_state_overrun,    "state:Overrun",                    int,   "activeInactive"
     entry = engine_state_idle,       "state:Idle",                       int,   "activeInactive"
     entry = engine_state_wot,        "state:Wot",                        int,   "activeInactive"

#if INTERNAL_LOG_FIELDS
   ;internalLogField = fieldName, class, type, offset, units, scale, translate, digits
    internalLogField = "Tooth number",scalar, U08, 1024, "#", 1,0,0
    internalLogField = "Synch",scalar, U08, 1025, "", 1,0,0
    internalLogField = "Cumulative cycles",scalar, U16, 1026, "#", 1,0,0
    internalLogField = "Cumulative teeth",scalar, U16, 1028, "#", 1,0,0
    internalLogField = "coilsel",scalar, U16, 1030, "", 1,0,0
    internalLogField = "dwellsel",scalar, U16, 1032, "", 1,0,0
    internalLogField = "PTM",scalar, U08, 1034, "", 1,0,0
    internalLogField = "PTJ",scalar, U08, 1035, "", 1,0,0
    internalLogField = "PTT",scalar, U08, 1036, "", 1,0,0
    internalLogField = "PORTA",scalar, U08, 1037, "", 1,0,0
    internalLogField = "PORTB",scalar, U08, 1038, "", 1,0,0
    internalLogField = "next_dwell.tooth",scalar, U08, 1039, "", 1,0,0
    internalLogField = "next_spark.tooth",scalar, U08, 1040, "", 1,0,0
    internalLogField = "next_inj0.tooth",scalar, U08, 1041, "", 1,0,0
    internalLogField = "next_inj1.tooth",scalar, U08, 1042, "", 1,0,0
    internalLogField = "next_inj2.tooth",scalar, U08, 1043, "", 1,0,0
    internalLogField = "next_inj3.tooth",scalar, U08, 1044, "", 1,0,0
    internalLogField = "next_inj4.tooth",scalar, U08, 1045, "", 1,0,0
    internalLogField = "next_inj5.tooth",scalar, U08, 1046, "", 1,0,0
    internalLogField = "next_inj6.tooth",scalar, U08, 1047, "", 1,0,0
    internalLogField = "next_inj7.tooth",scalar, U08, 1048, "", 1,0,0
;    internalLogField = "fuel_ovflo",scalar, U08, 1049, "", 1,0,0
    internalLogField = "wheeldec_ovflo",scalar, U08, 1050, "", 1,0,0
    internalLogField = "next_dwell.time32",scalar, U32, 1051, "", 1,0,0
    internalLogField = "next_spark.time32",scalar, U32, 1055, "", 1,0,0
    internalLogField = "TIE",scalar, U08, 1059, "", 1,0,0
    internalLogField = "TFLG1",scalar, U08, 1060, "", 1,0,0
    internalLogField = "TIMTIE",scalar, U08, 1061, "", 1,0,0
    internalLogField = "TIMTFLG1",scalar, U08, 1062, "", 1,0,0
    internalLogField = "next_inj[0].time",scalar, U16, 1063, "", 1,0,0
    internalLogField = "next_inj[1].time",scalar, U16, 1065, "", 1,0,0
    internalLogField = "next_inj[2].time",scalar, U16, 1067, "", 1,0,0
    internalLogField = "next_inj[3].time",scalar, U16, 1069, "", 1,0,0
    internalLogField = "next_inj[4].time",scalar, U16, 1071, "", 1,0,0
    internalLogField = "next_inj[5].time",scalar, U16, 1073, "", 1,0,0
    internalLogField = "next_inj[6].time",scalar, U16, 1075, "", 1,0,0
    internalLogField = "next_inj[7].time",scalar, U16, 1077, "", 1,0,0
    internalLogField = "XGSEM",scalar, U08, 1079, "", 1,0,0
    internalLogField = "pwcalc1",scalar, U16, 1080, "", 1,0,0
    internalLogField = "pwcalc2",scalar, U16, 1082, "", 1,0,0
    internalLogField = "next_map_start_event.tooth",scalar, U08, 1084, "", 1,0,0
    internalLogField = "XGCHID",scalar, U08, 1085, "", 1,0,0
    internalLogField = "XGSWT",scalar, U08, 1086, "", 1,0,0
    internalLogField = "xgate_deadman",scalar, U08, 1087, "", 1,0,0
    internalLogField = "XGMCTL",scalar, U08, 1088, "", 1,0,0
    internalLogField = "xgpc",scalar, U16, 1089, "", 1,0,0
    internalLogField = "xgswe_count",scalar, U08, 1091, "", 1,0,0
    internalLogField = "next_fuel",scalar, U08, 1092, "", 1,0,0
    internalLogField = "inj1_cnt",scalar, U16, 1093, "", 1,0,0
    internalLogField = "inj2_cnt",scalar, U16, 1095, "", 1,0,0
    internalLogField = "inj3_cnt",scalar, U16, 1097, "", 1,0,0
    internalLogField = "inj4_cnt",scalar, U16, 1099, "", 1,0,0
    internalLogField = "inj5_cnt",scalar, U16, 1101, "", 1,0,0
    internalLogField = "inj6_cnt",scalar, U16, 1103, "", 1,0,0
    internalLogField = "inj7_cnt",scalar, U16, 1105, "", 1,0,0
    internalLogField = "inj8_cnt",scalar, U16, 1107, "", 1,0,0
    internalLogField = "pid_log_idle_p",scalar, S32, 1109, "", 0.00001,0,5
    internalLogField = "pid_log_idle_i",scalar, S32, 1113, "", 0.00001,0,5
    internalLogField = "pid_log_idle_d",scalar, S32, 1117, "", 0.00001,0,5
    internalLogField = "pid_log_idle_count",scalar, U08, 1121, "", 1,0,0
    internalLogField = "pid_log_boost1_p",scalar, S32, 1122, "", 0.00001,0,5
    internalLogField = "pid_log_boost1_i",scalar, S32, 1126, "", 0.00001,0,5
    internalLogField = "pid_log_boost1_d",scalar, S32, 1130, "", 0.00001,0,5
    internalLogField = "pid_log_boost1_count",scalar, U08, 1134, "", 1,0,0
    internalLogField = "pid_log_afr1_p",scalar, S32, 1135, "", 0.00001,0,5
    internalLogField = "pid_log_afr1_i",scalar, S32, 1139, "", 0.00001,0,5
    internalLogField = "pid_log_afr1_d",scalar, S32, 1143, "", 0.00001,0,5
    internalLogField = "pid_log_afr1_count",scalar, U08, 1147, "", 1,0,0
    internalLogField = "pid_log_vvt1_p",scalar, S32, 1148, "", 0.00001,0,5
    internalLogField = "pid_log_vvt1_i",scalar, S32, 1152, "", 0.00001,0,5
    internalLogField = "pid_log_vvt1_d",scalar, S32, 1156, "", 0.00001,0,5
    internalLogField = "pid_log_vvt1_count",scalar, U08, 1160, "", 1,0,0
    internalLogField = "pid_log_vvt2_p",scalar, S32, 1161, "", 0.00001,0,5
    internalLogField = "pid_log_vvt2_i",scalar, S32, 1165, "", 0.00001,0,5
    internalLogField = "pid_log_vvt2_d",scalar, S32, 1169, "", 0.00001,0,5
    internalLogField = "pid_log_vvt2_count",scalar, U08, 1173, "", 1,0,0
    internalLogField = "pid_log_vvt3_p",scalar, S32, 1174, "", 0.00001,0,5
    internalLogField = "pid_log_vvt3_i",scalar, S32, 1178, "", 0.00001,0,5
    internalLogField = "pid_log_vvt3_d",scalar, S32, 1182, "", 0.00001,0,5
    internalLogField = "pid_log_vvt3_count",scalar, U08, 1186, "", 1,0,0
    internalLogField = "pid_log_vvt4_p",scalar, S32, 1187, "", 0.00001,0,5
    internalLogField = "pid_log_vvt4_i",scalar, S32, 1191, "", 0.00001,0,5
    internalLogField = "pid_log_vvt4_d",scalar, S32, 1195, "", 0.00001,0,5
    internalLogField = "pid_log_vvt4_count",scalar, U08, 1199, "", 1,0,0
#endif

;-------------------------------------------------------------------------------
