;-------------------------------------------------------------------------------
#unset CAN_COMMANDS
#unset enablehardware_test

[MegaTune]
   MTversion      = 2.25

   queryCommand   = "Q"
   signature      = "speeduino 201902"
;[PJSC v1.01]   signature      = "PJSC v102"     ;[PJSC v1.02]
   versionInfo    = "S" ;This info is what is displayed to user

[TunerStudio]
   iniSpecVersion = 3.51

;-------------------------------------------------------------------------------

[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 = boostUnits, "Boost table units"
    ;settingOption = DEFAULT, "kPa"
    ;settingOption = BOOSTPSI, "PSI"
    settingGroup = enablehardware_test, "Enable Hardware Test Page"

    settingGroup = resetcontrol_group, "Reset Control Features"
    settingOption = resetcontrol_standard, "Basic Options Only"
;[PJSC v1.02]    settingOption = resetcontrol_adv, "Advanced Features (16u2 Firmware Update Required)"

    settingGroup = table4_usage_group, "Selection of table4 usage"                           ;[PJSC v1.01] For switching 4th table
;[PJSC v1.01] For debug    settingOption = table4_spark, "Spark advance table"                                      ;[PJSC v1.01] For switching 4th table
    settingOption = table4_fuel, "VE table4"                                                 ;[PJSC v1.01] For switching 4th table

    settingGroup = menuoption_group, "Tuning menu option"                                    ;[PJSC v1.02]
    settingOption = full_option, "Full option"                                               ;[PJSC v1.02]
;[PJSC v1.02]    settingOption = simple_menu, "Simple menu"                                               ;[PJSC v1.02]

[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], "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"
    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
    maphigh = scalar,   U16,    "kPa", 1, 0, 0, 30000, 0    ;[PJSC v1.02]
    mapwarn = scalar,   U16,    "kPa", 1, 0, 0, 30000, 0    ;[PJSC v1.02]
    mapdang = scalar,   U16,    "kPa", 1, 0, 0, 30000, 0    ;[PJSC v1.02]

    idleUnits = bits,   U08,    [0:2], "None", "On/Off", "Duty Cycle", "Duty Cycle", "Steps", "Steps"


    #define loadSourceNames = "MAP", "TPS", "IMAP/EMAP", "INVALID",   "INVALID", "INVALID", "INVALID", "INVALID"
    #define loadSourceUnits = "kPa",           "% TPS",   "%",         "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
    algorithmNames = bits,    U08,   [0:2], $loadSourceNames
    ;algorithmUnits = bits,    U08,   [0:2], $loadSourceUnits
    algorithmUnits = bits,    U08,   [0:2], "kPa",           "% TPS",   "%",         "% TPS", "INVALID", "INVALID", "INVALID", "INVALID"
    algorithmUnits2 = bits,   U08,   [3:5], "kPa",           "% TPS",   "%",         "% TPS", "INVALID", "INVALID", "INVALID", "INVALID"  ;[PJSC v1.01] For Secondary Fuel
;[PJSC v1.01]    algorithmUnits3 = bits,   U08,   [0:2], "kPa",           "% TPS",   "%",         "% TPS", "INVALID", "INVALID", "INVALID", "INVALID"  ;[PJSC v1.01] For switching table3
    algorithmLimits= array,   U16,   [8],   "", 1.0, 0, 0, 511, 0, noMsqSave
    #define all_IO_Pins     = "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "INVALID"
    #define IO_Pins_no_def  = "INVALID", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "INVALID"

    boostTableLabels = bits,    U08,   [0:1], "Duty Cycle %", "kPa"

    fuelLoadMax    = scalar, U08, "", 1, 0, 0, 511, 0
;[PJSC v1.01]    ignLoadMax     = scalar, U08, "", 1, 0, 0, 511, 0
;[PJSC v1.01]    fuelLoadMax    = scalar, U08, "", 1, 0, 0, 255, 0                  ;[PJSC v1.01]
    ignLoadMax     = scalar, U08, "", 1, 0, 0, 255, 0                  ;[PJSC v1.01]
	AUXin00Alias  = string, ASCII, 20
	AUXin01Alias  = string, ASCII, 20 
    AUXin02Alias  = string, ASCII, 20 
    AUXin03Alias  = string, ASCII, 20 
    AUXin04Alias  = string, ASCII, 20 
    AUXin05Alias  = string, ASCII, 20 
    AUXin06Alias  = string, ASCII, 20 
    AUXin07Alias  = string, ASCII, 20 
    AUXin08Alias  = string, ASCII, 20 
    AUXin09Alias  = string, ASCII, 20 
    AUXin10Alias  = string, ASCII, 20 
    AUXin11Alias  = string, ASCII, 20 
    AUXin12Alias  = string, ASCII, 20 
    AUXin13Alias  = string, ASCII, 20 
    AUXin14Alias  = string, ASCII, 20 
    AUXin15Alias  = string, ASCII, 20

    ;Define aliases for all the triggers. Naming pattern matches that used in decoders.ino
    #define trigger_missingTooth        = 0
    #define trigger_BasicDistributor    = 1
    #define trigger_DualWheel           = 2
    #define trigger_GM7X                = 3
    #define trigger_4G63                = 4
    #define trigger_24X                 = 5
    #define trigger_Jeep2000            = 6
    #define trigger_Audi135             = 7
    #define trigger_HondaD17            = 8
    #define trigger_Miata9905           = 9
    #define trigger_MazdaAU             = 10
    #define trigger_non360              = 11
    #define trigger_Nissan360           = 12
    #define trigger_Subaru67            = 13
    #define trigger_Daihatsu            = 14
    #define trigger_Harley              = 15
    #define trigger_ThirtySixMinus222   = 16
    

[Constants]

   ;----------------------------------------------------------------------------
   ; Constants Definition
   ; --------------------
   ;
   ; Scalar Values
   ; -------------
   ; The scaling and translation values are used as follows:
   ;    msValue   = userValue / scale - translate
   ;    userValue = (msValue + translate) * scale
   ;
   ;
   ; Temperatures are fine, check out the Fielding IAC example (fastIdleT).
   ;
   ; 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).
   ;
   ; If you specify a label as "INVALID" (all upper case), then it will
   ; not be displayed in the combo box, so you can leave out values that
   ; make no sense.
   ;
   ;----------------------------------------------------------------------------

    endianness          = little
;[PJSC]    nPages              = 10
    ;pageSize            = 288,   128,     288,    128,     288,    128,    240,     192,    192,    192
;[PJSC]    pageSize            = 128,   288,     288,    128,     288,    128,    240,     192,    192,    192
    nPages              = 11                                                                                        ;[PJSC]
    pageSize            = 128,   288,     288,    128,     288,    128,    240,     192,    192,    288,    288     ;[PJSC v1.01]

    ;burnCommand         = "B"
    ;pageActivate        = "P\001",   "P\002", "P\003", "P\004", "P\005", "P\006", "P\007", "P\010", "P\011", "P\012", "P\013"
    ;pageReadCommand     = "V",       "V",     "V",     "V",     "V",     "V",     "V",     "V",      "V",    "V",    "V"
    ;pageValueWrite      = "W%2o%v",   "W%o%v", "W%2o%v", "W%o%v", "W%2o%v", "W%o%v", "W%o%v", "W%o%v", "W%o%v",	"W%o%v",	"W%o%v"

    ; New commands
    ;pageSize            = 288,   128,     288,    128,     288,    128,     128,    160,     192,    192,    192
;[PJSC]    pageIdentifier      = "\$tsCanId\x01", "\$tsCanId\x02", "\$tsCanId\x03", "\$tsCanId\x04", "\$tsCanId\x05", "\$tsCanId\x06", "\$tsCanId\x07", "\$tsCanId\x08", "\$tsCanId\x09", "\$tsCanId\x0A"
;[PJSC]    burnCommand         = "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i"
;[PJSC]    pageReadCommand     = "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c"
;[PJSC]    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"
;[PJSC]    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"

    ;[PJSC] New commands for PJSC
    pageIdentifier      = "\$tsCanId\x01", "\$tsCanId\x02", "\$tsCanId\x03", "\$tsCanId\x04", "\$tsCanId\x05", "\$tsCanId\x06", "\$tsCanId\x07", "\$tsCanId\x08", "\$tsCanId\x09", "\$tsCanId\x0A", "\$tsCanId\x0B"  ;[PJSC v1.01]
    burnCommand         = "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i", "b%2i"                                                                                                     ;[PJSC v1.01]
    pageReadCommand     = "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c", "p%2i%2o%2c"                                   ;[PJSC v1.01]
    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"             ;[PJSC]
    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"             ;[PJSC]

    blockingFactor = 2048
    tableBlockingFactor = 2048
    delayAfterPortOpen=1000
    ;validateArrayBounds = true
    blockReadTimeout = 2000
    ;tsWriteBlocks = on
    interWriteDelay = 5 ;Ignored when tsWriteBlocks is on
    pageActivationDelay = 10

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

    #define PIN_OUT10inv = "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
    #define PIN_OUT16inv = "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
    #define PIN_16inv = "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
	
	#define ANALOG_PIN = "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", $PIN_16inv, $PIN_16inv, $PIN_16inv
	#define DIGITAL_PIN = "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
    #define ANALOG_DIG_PIN_LIST = $DIGITAL_PIN, $ANALOG_PIN
	#define tsCanId_list      	  = "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"
    #define CAN_ADDRESS_HEX_inv255 = $PIN_OUT16inv, $PIN_OUT16inv, $PIN_OUT16inv, $PIN_OUT16inv, $PIN_OUT16inv, $PIN_OUT16inv, $PIN_OUT16inv, $PIN_OUT16inv, $PIN_OUT16inv, $PIN_OUT16inv, $PIN_OUT16inv, $PIN_OUT16inv, $PIN_OUT16inv, $PIN_OUT16inv, $PIN_OUT16inv, $PIN_OUT10inv, "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
    #define CAN_ADDRESS_HEX_00XX = "INVALID", "0x001", "0x002", "0x003", "0x004", "0x005", "0x006", "0x007", "0x008", "0x009", "0x00A", "0x00B", "0x00C", "0x00D", "0x00E", "0x00F", "0x010", "0x011", "0x012", "0x013", "0x014", "0x015", "0x016", "0x017", "0x018", "0x019", "0x01A", "0x01B", "0x01C", "0x01D", "0x01E", "0x01F", "0x020", "0x021", "0x022", "0x023", "0x024", "0x025", "0x026", "0x027", "0x028", "0x029", "0x02A", "0x02B", "0x02C", "0x02D", "0x02E", "0x02F", "0x030", "0x031", "0x032", "0x033", "0x034", "0x035", "0x036", "0x037", "0x038", "0x039", "0x03A", "0x03B", "0x03C", "0x03D", "0x03E", "0x03F", "0x040", "0x041", "0x042", "0x043", "0x044", "0x045", "0x046", "0x047", "0x048", "0x049", "0x04A", "0x04B", "0x04C", "0x04D", "0x04E", "0x04F", "0x050", "0x051", "0x052", "0x053", "0x054", "0x055", "0x056", "0x057", "0x058", "0x059", "0x05A", "0x05B", "0x05C", "0x05D", "0x05E", "0x05F" ,"0x060", "0x061", "0x062", "0x063", "0x064", "0x065", "0x066", "0x067", "0x068", "0x069", "0x06A", "0x06B", "0x06C", "0x06D", "0x06E", "0x06F", "0x070", "0x071", "0x072", "0x073", "0x074", "0x075", "0x076", "0x077", "0x078", "0x079", "0x07A", "0x07B", "0x07C", "0x07D", "0x07E", "0x07F", "0x080", "0x081", "0x082", "0x083", "0x084", "0x085", "0x086", "0x087", "0x088", "0x089", "0x08A", "0x08B", "0x08C", "0x08D", "0x08E", "0x08F" ,"0x090", "0x091", "0x092", "0x093", "0x094", "0x095", "0x096", "0x097", "0x098", "0x099", "0x09A", "0x09B", "0x09C", "0x09D", "0x09E", "0x09F", "0x0A0", "0x0A1", "0x0A2", "0x0A3", "0x0A4", "0x0A5", "0x0A6", "0x0A7", "0x0A8", "0x0A9", "0x0AA", "0x0AB", "0x0AC", "0x0AD", "0x0AE", "0x0AF", "0x0B0", "0x0B1", "0x0B2", "0x0B3", "0x0B4", "0x0B5", "0x0B6", "0x0B7", "0x0B8", "0x0B9", "0x0BA", "0x0BB", "0x0BC", "0x0BD", "0x0BE", "0x0BF" ,"0x0C0", "0x0C1", "0x0C2", "0x0C3", "0x0C4", "0x0C5", "0x0C6", "0x0C7", "0x0C8", "0x0C9", "0x0CA", "0x0CB", "0x0CC", "0x0CD", "0x0CE", "0x0CF", "0x0D0", "0x0D1", "0x0D2", "0x0D3", "0x0D4", "0x0D5", "0x0D6", "0x0D7", "0x0D8", "0x0D9", "0x0DA", "0x0DB", "0x0DC", "0x0DD", "0x0DE", "0x0DF", "0x0E0", "0x0E1", "0x0E2", "0x0E3", "0x0E4", "0x0E5", "0x0E6", "0x0E7", "0x0E8", "0x0E9", "0x0EA", "0x0EB", "0x0EC", "0x0ED", "0x0EE", "0x0EF" ,"0x0F0", "0x0F1", "0x0F2", "0x0F3", "0x0F4", "0x0F5", "0x0F6", "0x0F7", "0x0F8", "0x0F9", "0x0FA", "0x0FB", "0x0FC", "0x0FD", "0x0FE", "0x0FF"
    #define CAN_ADDRESS_HEX_01XX = "0x100", "0x101", "0x102", "0x103", "0x104", "0x105", "0x106", "0x107", "0x108", "0x109", "0x10A", "0x10B", "0x10C", "0x10D", "0x10E", "0x10F", "0x110", "0x111", "0x112", "0x113", "0x114", "0x115", "0x116", "0x117", "0x118", "0x119", "0x11A", "0x11B", "0x11C", "0x11D", "0x11E", "0x11F", "0x120", "0x121", "0x122", "0x123", "0x124", "0x125", "0x126", "0x127", "0x128", "0x129", "0x12A", "0x12B", "0x12C", "0x12D", "0x12E", "0x12F", "0x130", "0x131", "0x132", "0x133", "0x134", "0x135", "0x136", "0x137", "0x138", "0x139", "0x13A", "0x13B", "0x13C", "0x13D", "0x13E", "0x13F", "0x140", "0x141", "0x142", "0x143", "0x144", "0x145", "0x146", "0x147", "0x148", "0x149", "0x14A", "0x14B", "0x14C", "0x14D", "0x14E", "0x14F", "0x150", "0x151", "0x152", "0x153", "0x154", "0x155", "0x156", "0x157", "0x158", "0x159", "0x15A", "0x15B", "0x15C", "0x15D", "0x15E", "0x15F" ,"0x160", "0x161", "0x162", "0x163", "0x164", "0x165", "0x166", "0x167", "0x168", "0x169", "0x16A", "0x16B", "0x16C", "0x16D", "0x16E", "0x16F", "0x170", "0x171", "0x172", "0x173", "0x174", "0x175", "0x176", "0x177", "0x178", "0x179", "0x17A", "0x17B", "0x17C", "0x17D", "0x17E", "0x17F", "0x180", "0x181", "0x182", "0x183", "0x184", "0x185", "0x186", "0x187", "0x188", "0x189", "0x18A", "0x18B", "0x18C", "0x18D", "0x18E", "0x18F" ,"0x190", "0x191", "0x192", "0x193", "0x194", "0x195", "0x196", "0x197", "0x198", "0x199", "0x19A", "0x19B", "0x19C", "0x19D", "0x19E", "0x19F", "0x1A0", "0x1A1", "0x1A2", "0x1A3", "0x1A4", "0x1A5", "0x1A6", "0x1A7", "0x1A8", "0x1A9", "0x1AA", "0x1AB", "0x1AC", "0x1AD", "0x1AE", "0x1AF", "0x1B0", "0x1B1", "0x1B2", "0x1B3", "0x1B4", "0x1B5", "0x1B6", "0x1B7", "0x1B8", "0x1B9", "0x1BA", "0x1BB", "0x1BC", "0x1BD", "0x1BE", "0x1BF" ,"0x1C0", "0x1C1", "0x1C2", "0x1C3", "0x1C4", "0x1C5", "0x1C6", "0x1C7", "0x1C8", "0x1C9", "0x1CA", "0x1CB", "0x1CC", "0x1CD", "0x1CE", "0x1CF", "0x1D0", "0x1D1", "0x1D2", "0x1D3", "0x1D4", "0x1D5", "0x1D6", "0x1D7", "0x1D8", "0x1D9", "0x1DA", "0x1DB", "0x1DC", "0x1DD", "0x1DE", "0x1DF", "0x1E0", "0x1E1", "0x1E2", "0x1E3", "0x1E4", "0x1E5", "0x1E6", "0x1E7", "0x1E8", "0x1E9", "0x1EA", "0x1EB", "0x1EC", "0x1ED", "0x1EE", "0x1EF" ,"0x1F0", "0x1F1", "0x1F2", "0x1F3", "0x1F4", "0x1F5", "0x1F6", "0x1F7", "0x1F8", "0x1F9", "0x1FA", "0x1FB", "0x1FC", "0x1FD", "0x1FE", "0x1FF"
    #define CAN_ADDRESS_HEX_02XX = "0x200", "0x201", "0x202", "0x203", "0x204", "0x205", "0x206", "0x207", "0x208", "0x209", "0x20A", "0x20B", "0x20C", "0x20D", "0x20E", "0x20F", "0x210", "0x211", "0x212", "0x213", "0x214", "0x215", "0x216", "0x217", "0x218", "0x219", "0x21A", "0x21B", "0x21C", "0x21D", "0x21E", "0x21F", "0x220", "0x221", "0x222", "0x223", "0x224", "0x225", "0x226", "0x227", "0x228", "0x229", "0x22A", "0x22B", "0x22C", "0x22D", "0x22E", "0x22F", "0x230", "0x231", "0x232", "0x233", "0x234", "0x235", "0x236", "0x237", "0x238", "0x239", "0x23A", "0x23B", "0x23C", "0x23D", "0x23E", "0x23F", "0x240", "0x241", "0x242", "0x243", "0x244", "0x245", "0x246", "0x247", "0x248", "0x249", "0x24A", "0x24B", "0x24C", "0x24D", "0x24E", "0x24F", "0x250", "0x251", "0x252", "0x253", "0x254", "0x255", "0x256", "0x257", "0x258", "0x259", "0x25A", "0x25B", "0x25C", "0x25D", "0x25E", "0x25F" ,"0x260", "0x261", "0x262", "0x263", "0x264", "0x265", "0x266", "0x267", "0x268", "0x269", "0x26A", "0x26B", "0x26C", "0x26D", "0x26E", "0x26F", "0x270", "0x271", "0x272", "0x273", "0x274", "0x275", "0x276", "0x277", "0x278", "0x279", "0x27A", "0x27B", "0x27C", "0x27D", "0x27E", "0x27F", "0x280", "0x281", "0x282", "0x283", "0x284", "0x285", "0x286", "0x287", "0x288", "0x289", "0x28A", "0x28B", "0x28C", "0x28D", "0x28E", "0x28F" ,"0x290", "0x291", "0x292", "0x293", "0x294", "0x295", "0x296", "0x297", "0x298", "0x299", "0x29A", "0x29B", "0x29C", "0x29D", "0x29E", "0x29F", "0x2A0", "0x2A1", "0x2A2", "0x2A3", "0x2A4", "0x2A5", "0x2A6", "0x2A7", "0x2A8", "0x2A9", "0x2AA", "0x2AB", "0x2AC", "0x2AD", "0x2AE", "0x2AF", "0x2B0", "0x2B1", "0x2B2", "0x2B3", "0x2B4", "0x2B5", "0x2B6", "0x2B7", "0x2B8", "0x2B9", "0x2BA", "0x2BB", "0x2BC", "0x2BD", "0x2BE", "0x2BF" ,"0x2C0", "0x2C1", "0x2C2", "0x2C3", "0x2C4", "0x2C5", "0x2C6", "0x2C7", "0x2C8", "0x2C9", "0x2CA", "0x2CB", "0x2CC", "0x2CD", "0x2CE", "0x2CF", "0x2D0", "0x2D1", "0x2D2", "0x2D3", "0x2D4", "0x2D5", "0x2D6", "0x2D7", "0x2D8", "0x2D9", "0x2DA", "0x2DB", "0x2DC", "0x2DD", "0x2DE", "0x2DF", "0x2E0", "0x2E1", "0x2E2", "0x2E3", "0x2E4", "0x2E5", "0x2E6", "0x2E7", "0x2E8", "0x2E9", "0x2EA", "0x2EB", "0x2EC", "0x2ED", "0x2EE", "0x2EF" ,"0x2F0", "0x2F1", "0x2F2", "0x2F3", "0x2F4", "0x2F5", "0x2F6", "0x2F7", "0x2F8", "0x2F9", "0x2FA", "0x2FB", "0x2FC", "0x2FD", "0x2FE", "0x2FF"
    #define CAN_ADDRESS_HEX_03XX = "0x300", "0x301", "0x302", "0x303", "0x304", "0x305", "0x306", "0x307", "0x308", "0x309", "0x30A", "0x30B", "0x30C", "0x30D", "0x30E", "0x30F", "0x310", "0x311", "0x312", "0x313", "0x314", "0x315", "0x316", "0x317", "0x318", "0x319", "0x31A", "0x31B", "0x31C", "0x31D", "0x31E", "0x31F", "0x320", "0x321", "0x322", "0x323", "0x324", "0x325", "0x326", "0x327", "0x328", "0x329", "0x32A", "0x32B", "0x32C", "0x32D", "0x32E", "0x32F", "0x330", "0x331", "0x332", "0x333", "0x334", "0x335", "0x336", "0x337", "0x338", "0x339", "0x33A", "0x33B", "0x33C", "0x33D", "0x33E", "0x33F", "0x340", "0x341", "0x342", "0x343", "0x344", "0x345", "0x346", "0x347", "0x348", "0x349", "0x34A", "0x34B", "0x34C", "0x34D", "0x34E", "0x34F", "0x350", "0x351", "0x352", "0x353", "0x354", "0x355", "0x356", "0x357", "0x358", "0x359", "0x35A", "0x35B", "0x35C", "0x35D", "0x35E", "0x35F" ,"0x360", "0x361", "0x362", "0x363", "0x364", "0x365", "0x366", "0x367", "0x368", "0x369", "0x36A", "0x36B", "0x36C", "0x36D", "0x36E", "0x36F", "0x370", "0x371", "0x372", "0x373", "0x374", "0x375", "0x376", "0x377", "0x378", "0x379", "0x37A", "0x37B", "0x37C", "0x37D", "0x37E", "0x37F", "0x380", "0x381", "0x382", "0x383", "0x384", "0x385", "0x386", "0x387", "0x388", "0x389", "0x38A", "0x38B", "0x38C", "0x38D", "0x38E", "0x38F" ,"0x390", "0x391", "0x392", "0x393", "0x394", "0x395", "0x396", "0x397", "0x398", "0x399", "0x39A", "0x39B", "0x39C", "0x39D", "0x39E", "0x39F", "0x3A0", "0x3A1", "0x3A2", "0x3A3", "0x3A4", "0x3A5", "0x3A6", "0x3A7", "0x3A8", "0x3A9", "0x3AA", "0x3AB", "0x3AC", "0x3AD", "0x3AE", "0x3AF", "0x3B0", "0x3B1", "0x3B2", "0x3B3", "0x3B4", "0x3B5", "0x3B6", "0x3B7", "0x3B8", "0x3B9", "0x3BA", "0x3BB", "0x3BC", "0x3BD", "0x3BE", "0x3BF" ,"0x3C0", "0x3C1", "0x3C2", "0x3C3", "0x3C4", "0x3C5", "0x3C6", "0x3C7", "0x3C8", "0x3C9", "0x3CA", "0x3CB", "0x3CC", "0x3CD", "0x3CE", "0x3CF", "0x3D0", "0x3D1", "0x3D2", "0x3D3", "0x3D4", "0x3D5", "0x3D6", "0x3D7", "0x3D8", "0x3D9", "0x3DA", "0x3DB", "0x3DC", "0x3DD", "0x3DE", "0x3DF", "0x3E0", "0x3E1", "0x3E2", "0x3E3", "0x3E4", "0x3E5", "0x3E6", "0x3E7", "0x3E8", "0x3E9", "0x3EA", "0x3EB", "0x3EC", "0x3ED", "0x3EE", "0x3EF" ,"0x3F0", "0x3F1", "0x3F2", "0x3F3", "0x3F4", "0x3F5", "0x3F6", "0x3F7", "0x3F8", "0x3F9", "0x3FA", "0x3FB", "0x3FC", "0x3FD", "0x3FE", "0x3FF"
    #define CAN_ADDRESS_HEX_04XX = "0x400", "0x401", "0x402", "0x403", "0x404", "0x405", "0x406", "0x407", "0x408", "0x409", "0x40A", "0x40B", "0x40C", "0x40D", "0x40E", "0x40F", "0x410", "0x411", "0x412", "0x413", "0x414", "0x415", "0x416", "0x417", "0x418", "0x419", "0x41A", "0x41B", "0x41C", "0x41D", "0x41E", "0x41F", "0x420", "0x421", "0x422", "0x423", "0x424", "0x425", "0x426", "0x427", "0x428", "0x429", "0x42A", "0x42B", "0x42C", "0x42D", "0x42E", "0x42F", "0x430", "0x431", "0x432", "0x433", "0x434", "0x435", "0x436", "0x437", "0x438", "0x439", "0x43A", "0x43B", "0x43C", "0x43D", "0x43E", "0x43F", "0x440", "0x441", "0x442", "0x443", "0x444", "0x445", "0x446", "0x447", "0x448", "0x449", "0x44A", "0x44B", "0x44C", "0x44D", "0x44E", "0x44F", "0x450", "0x451", "0x452", "0x453", "0x454", "0x455", "0x456", "0x457", "0x458", "0x459", "0x45A", "0x45B", "0x45C", "0x45D", "0x45E", "0x45F" ,"0x460", "0x461", "0x462", "0x463", "0x464", "0x465", "0x466", "0x467", "0x468", "0x469", "0x46A", "0x46B", "0x46C", "0x46D", "0x46E", "0x46F", "0x470", "0x471", "0x472", "0x473", "0x474", "0x475", "0x476", "0x477", "0x478", "0x479", "0x47A", "0x47B", "0x47C", "0x47D", "0x47E", "0x47F", "0x480", "0x481", "0x482", "0x483", "0x484", "0x485", "0x486", "0x487", "0x488", "0x489", "0x48A", "0x48B", "0x48C", "0x48D", "0x48E", "0x48F" ,"0x490", "0x491", "0x492", "0x493", "0x494", "0x495", "0x496", "0x497", "0x498", "0x499", "0x49A", "0x49B", "0x49C", "0x49D", "0x49E", "0x49F", "0x4A0", "0x4A1", "0x4A2", "0x4A3", "0x4A4", "0x4A5", "0x4A6", "0x4A7", "0x4A8", "0x4A9", "0x4AA", "0x4AB", "0x4AC", "0x4AD", "0x4AE", "0x4AF", "0x4B0", "0x4B1", "0x4B2", "0x4B3", "0x4B4", "0x4B5", "0x4B6", "0x4B7", "0x4B8", "0x4B9", "0x4BA", "0x4BB", "0x4BC", "0x4BD", "0x4BE", "0x4BF" ,"0x4C0", "0x4C1", "0x4C2", "0x4C3", "0x4C4", "0x4C5", "0x4C6", "0x4C7", "0x4C8", "0x4C9", "0x4CA", "0x4CB", "0x4CC", "0x4CD", "0x4CE", "0x4CF", "0x4D0", "0x4D1", "0x4D2", "0x4D3", "0x4D4", "0x4D5", "0x4D6", "0x4D7", "0x4D8", "0x4D9", "0x4DA", "0x4DB", "0x4DC", "0x4DD", "0x4DE", "0x4DF", "0x4E0", "0x4E1", "0x4E2", "0x4E3", "0x4E4", "0x4E5", "0x4E6", "0x4E7", "0x4E8", "0x4E9", "0x4EA", "0x4EB", "0x4EC", "0x4ED", "0x4EE", "0x4EF" ,"0x4F0", "0x4F1", "0x4F2", "0x4F3", "0x4F4", "0x4F5", "0x4F6", "0x4F7", "0x4F8", "0x4F9", "0x4FA", "0x4FB", "0x4FC", "0x4FD", "0x4FE", "0x4FF"
    #define CAN_ADDRESS_HEX_05XX = "0x500", "0x501", "0x502", "0x503", "0x504", "0x505", "0x506", "0x507", "0x508", "0x509", "0x50A", "0x50B", "0x50C", "0x50D", "0x50E", "0x50F", "0x510", "0x511", "0x512", "0x513", "0x514", "0x515", "0x516", "0x517", "0x518", "0x519", "0x51A", "0x51B", "0x51C", "0x51D", "0x51E", "0x51F", "0x520", "0x521", "0x522", "0x523", "0x524", "0x525", "0x526", "0x527", "0x528", "0x529", "0x52A", "0x52B", "0x52C", "0x52D", "0x52E", "0x52F", "0x530", "0x531", "0x532", "0x533", "0x534", "0x535", "0x536", "0x537", "0x538", "0x539", "0x53A", "0x53B", "0x53C", "0x53D", "0x53E", "0x53F", "0x540", "0x541", "0x542", "0x543", "0x544", "0x545", "0x546", "0x547", "0x548", "0x549", "0x54A", "0x54B", "0x54C", "0x54D", "0x54E", "0x54F", "0x550", "0x551", "0x552", "0x553", "0x554", "0x555", "0x556", "0x557", "0x558", "0x559", "0x55A", "0x55B", "0x55C", "0x55D", "0x55E", "0x55F" ,"0x560", "0x561", "0x562", "0x563", "0x564", "0x565", "0x566", "0x567", "0x568", "0x569", "0x56A", "0x56B", "0x56C", "0x56D", "0x56E", "0x56F", "0x570", "0x571", "0x572", "0x573", "0x574", "0x575", "0x576", "0x577", "0x578", "0x579", "0x57A", "0x57B", "0x57C", "0x57D", "0x57E", "0x57F", "0x580", "0x581", "0x582", "0x583", "0x584", "0x585", "0x586", "0x587", "0x588", "0x589", "0x58A", "0x58B", "0x58C", "0x58D", "0x58E", "0x58F" ,"0x590", "0x591", "0x592", "0x593", "0x594", "0x595", "0x596", "0x597", "0x598", "0x599", "0x59A", "0x59B", "0x59C", "0x59D", "0x59E", "0x59F", "0x5A0", "0x5A1", "0x5A2", "0x5A3", "0x5A4", "0x5A5", "0x5A6", "0x5A7", "0x5A8", "0x5A9", "0x5AA", "0x5AB", "0x5AC", "0x5AD", "0x5AE", "0x5AF", "0x5B0", "0x5B1", "0x5B2", "0x5B3", "0x5B4", "0x5B5", "0x5B6", "0x5B7", "0x5B8", "0x5B9", "0x5BA", "0x5BB", "0x5BC", "0x5BD", "0x5BE", "0x5BF" ,"0x5C0", "0x5C1", "0x5C2", "0x5C3", "0x5C4", "0x5C5", "0x5C6", "0x5C7", "0x5C8", "0x5C9", "0x5CA", "0x5CB", "0x5CC", "0x5CD", "0x5CE", "0x5CF", "0x5D0", "0x5D1", "0x5D2", "0x5D3", "0x5D4", "0x5D5", "0x5D6", "0x5D7", "0x5D8", "0x5D9", "0x5DA", "0x5DB", "0x5DC", "0x5DD", "0x5DE", "0x5DF", "0x5E0", "0x5E1", "0x5E2", "0x5E3", "0x5E4", "0x5E5", "0x5E6", "0x5E7", "0x5E8", "0x5E9", "0x5EA", "0x5EB", "0x5EC", "0x5ED", "0x5EE", "0x5EF" ,"0x5F0", "0x5F1", "0x5F2", "0x5F3", "0x5F4", "0x5F5", "0x5F6", "0x5F7", "0x5F8", "0x5F9", "0x5FA", "0x5FB", "0x5FC", "0x5FD", "0x5FE", "0x5FF"
    #define CAN_ADDRESS_HEX_06XX = "0x600", "0x601", "0x602", "0x603", "0x604", "0x605", "0x606", "0x607", "0x608", "0x609", "0x60A", "0x60B", "0x60C", "0x60D", "0x60E", "0x60F", "0x610", "0x611", "0x612", "0x613", "0x614", "0x615", "0x616", "0x617", "0x618", "0x619", "0x61A", "0x61B", "0x61C", "0x61D", "0x61E", "0x61F", "0x620", "0x621", "0x622", "0x623", "0x624", "0x625", "0x626", "0x627", "0x628", "0x629", "0x62A", "0x62B", "0x62C", "0x62D", "0x62E", "0x62F", "0x630", "0x631", "0x632", "0x633", "0x634", "0x635", "0x636", "0x637", "0x638", "0x639", "0x63A", "0x63B", "0x63C", "0x63D", "0x63E", "0x63F", "0x640", "0x641", "0x642", "0x643", "0x644", "0x645", "0x646", "0x647", "0x648", "0x649", "0x64A", "0x64B", "0x64C", "0x64D", "0x64E", "0x64F", "0x650", "0x651", "0x652", "0x653", "0x654", "0x655", "0x656", "0x657", "0x658", "0x659", "0x65A", "0x65B", "0x65C", "0x65D", "0x65E", "0x65F" ,"0x660", "0x661", "0x662", "0x663", "0x664", "0x665", "0x666", "0x667", "0x668", "0x669", "0x66A", "0x66B", "0x66C", "0x66D", "0x66E", "0x66F", "0x670", "0x671", "0x672", "0x673", "0x674", "0x675", "0x676", "0x677", "0x678", "0x679", "0x67A", "0x67B", "0x67C", "0x67D", "0x67E", "0x67F", "0x680", "0x681", "0x682", "0x683", "0x684", "0x685", "0x686", "0x687", "0x688", "0x689", "0x68A", "0x68B", "0x68C", "0x68D", "0x68E", "0x68F" ,"0x690", "0x691", "0x692", "0x693", "0x694", "0x695", "0x696", "0x697", "0x698", "0x699", "0x69A", "0x69B", "0x69C", "0x69D", "0x69E", "0x69F", "0x6A0", "0x6A1", "0x6A2", "0x6A3", "0x6A4", "0x6A5", "0x6A6", "0x6A7", "0x6A8", "0x6A9", "0x6AA", "0x6AB", "0x6AC", "0x6AD", "0x6AE", "0x6AF", "0x6B0", "0x6B1", "0x6B2", "0x6B3", "0x6B4", "0x6B5", "0x6B6", "0x6B7", "0x6B8", "0x6B9", "0x6BA", "0x6BB", "0x6BC", "0x6BD", "0x6BE", "0x6BF" ,"0x6C0", "0x6C1", "0x6C2", "0x6C3", "0x6C4", "0x6C5", "0x6C6", "0x6C7", "0x6C8", "0x6C9", "0x6CA", "0x6CB", "0x6CC", "0x6CD", "0x6CE", "0x6CF", "0x6D0", "0x6D1", "0x6D2", "0x6D3", "0x6D4", "0x6D5", "0x6D6", "0x6D7", "0x6D8", "0x6D9", "0x6DA", "0x6DB", "0x6DC", "0x6DD", "0x6DE", "0x6DF", "0x6E0", "0x6E1", "0x6E2", "0x6E3", "0x6E4", "0x6E5", "0x6E6", "0x6E7", "0x6E8", "0x6E9", "0x6EA", "0x6EB", "0x6EC", "0x6ED", "0x6EE", "0x6EF" ,"0x6F0", "0x6F1", "0x6F2", "0x6F3", "0x6F4", "0x6F5", "0x6F6", "0x6F7", "0x6F8", "0x6F9", "0x6FA", "0x6FB", "0x6FC", "0x6FD", "0x6FE", "0x6FF"
    #define CAN_ADDRESS_HEX_07XX = "0x700", "0x701", "0x702", "0x703", "0x704", "0x705", "0x706", "0x707", "0x708", "0x709", "0x70A", "0x70B", "0x70C", "0x70D", "0x70E", "0x70F", "0x710", "0x711", "0x712", "0x713", "0x714", "0x715", "0x716", "0x717", "0x718", "0x719", "0x71A", "0x71B", "0x71C", "0x71D", "0x71E", "0x71F", "0x720", "0x721", "0x722", "0x723", "0x724", "0x725", "0x726", "0x727", "0x728", "0x729", "0x72A", "0x72B", "0x72C", "0x72D", "0x72E", "0x72F", "0x730", "0x731", "0x732", "0x733", "0x734", "0x735", "0x736", "0x737", "0x738", "0x739", "0x73A", "0x73B", "0x73C", "0x73D", "0x73E", "0x73F", "0x740", "0x741", "0x742", "0x743", "0x744", "0x745", "0x746", "0x747", "0x748", "0x749", "0x74A", "0x74B", "0x74C", "0x74D", "0x74E", "0x74F", "0x750", "0x751", "0x752", "0x753", "0x754", "0x755", "0x756", "0x757", "0x758", "0x759", "0x75A", "0x75B", "0x75C", "0x75D", "0x75E", "0x75F" ,"0x760", "0x761", "0x762", "0x763", "0x764", "0x765", "0x766", "0x767", "0x768", "0x769", "0x76A", "0x76B", "0x76C", "0x76D", "0x76E", "0x76F", "0x770", "0x771", "0x772", "0x773", "0x774", "0x775", "0x776", "0x777", "0x778", "0x779", "0x77A", "0x77B", "0x77C", "0x77D", "0x77E", "0x77F", "0x780", "0x781", "0x782", "0x783", "0x784", "0x785", "0x786", "0x787", "0x788", "0x789", "0x78A", "0x78B", "0x78C", "0x78D", "0x78E", "0x78F" ,"0x790", "0x791", "0x792", "0x793", "0x794", "0x795", "0x796", "0x797", "0x798", "0x799", "0x79A", "0x79B", "0x79C", "0x79D", "0x79E", "0x79F", "0x7A0", "0x7A1", "0x7A2", "0x7A3", "0x7A4", "0x7A5", "0x7A6", "0x7A7", "0x7A8", "0x7A9", "0x7AA", "0x7AB", "0x7AC", "0x7AD", "0x7AE", "0x7AF", "0x7B0", "0x7B1", "0x7B2", "0x7B3", "0x7B4", "0x7B5", "0x7B6", "0x7B7", "0x7B8", "0x7B9", "0x7BA", "0x7BB", "0x7BC", "0x7BD", "0x7BE", "0x7BF" ,"0x7C0", "0x7C1", "0x7C2", "0x7C3", "0x7C4", "0x7C5", "0x7C6", "0x7C7", "0x7C8", "0x7C9", "0x7CA", "0x7CB", "0x7CC", "0x7CD", "0x7CE", "0x7CF", "0x7D0", "0x7D1", "0x7D2", "0x7D3", "0x7D4", "0x7D5", "0x7D6", "0x7D7", "0x7D8", "0x7D9", "0x7DA", "0x7DB", "0x7DC", "0x7DD", "0x7DE", "0x7DF", "0x7E0", "0x7E1", "0x7E2", "0x7E3", "0x7E4", "0x7E5", "0x7E6", "0x7E7", "0x7E8", "0x7E9", "0x7EA", "0x7EB", "0x7EC", "0x7ED", "0x7EE", "0x7EF" ,"0x7F0", "0x7F1", "0x7F2", "0x7F3", "0x7F4", "0x7F5", "0x7F6", "0x7F7", "0x7F8", "0x7F9", "0x7FA", "0x7FB", "0x7FC", "0x7FD", "0x7FE", "0x7FF"
    #define CAN_ADDRESS_HEX =  $CAN_ADDRESS_HEX_01XX, $CAN_ADDRESS_HEX_02XX, $CAN_ADDRESS_HEX_03XX, $CAN_ADDRESS_HEX_04XX, $CAN_ADDRESS_HEX_05XX, $CAN_ADDRESS_HEX_06XX, $CAN_ADDRESS_HEX_07XX, $CAN_ADDRESS_HEX_inv255


;--------------------------------------------------
;Start Page 1
;Page 1 is all general settings. Note that some of these (algorithm and ignAlgorithm) MUST come before their use in the bitStringValue() calls in the fuel and ignition tables
;--------------------------------------------------
page = 1
      unused2-1     = scalar, S08,       0,         "kPa",      1.0,       0.0,   -127,    127,       0
      unused2-2     = scalar, U08,       1,         "kPa",      1.0,       0.0,   0.0,    255,       0
      asePct        = scalar, U08,       2,         "%",        1.0,       0.0,   0.0,    95.0,      0
      aseCount      = scalar, U08,       3,         "s",        1.0,       0.0,   0.0,    255,       0
      wueRates      = array,  U08,       4, [10],   "%",        1.0,       0.0,   0.0,    255,      0
      crankingPct   = scalar, U08,      14,         "%",        1.0,       0.0,   0.0,    255,       0
;[PJSC]      pinLayout     = bits,   U08,      15, [0:7],  "Speeduino v0.1", "Speeduino v0.2", "Speeduino v0.3", "Speeduino v0.4", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "NA6 MX5 PNP", "Turtana PCB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Plazomat I/O 0.1", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Daz V6 Shield 0.1", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "NO2C", "UA4C", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "dvjcodec Teensy RevA", "dvjcodec Teensy RevB", "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", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
      pinLayout     = bits,   U08,      15, [0:7],  "Speeduino v0.1", "Speeduino v0.2", "Speeduino v0.3", "Speeduino v0.4", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "NA6 MX5 PNP", "Turtana PCB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Plazomat I/O 0.1", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "Daz V6 Shield 0.1", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "NO2C", "UA4C", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "dvjcodec Teensy RevA", "dvjcodec Teensy RevB", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "PJSC v1.0", "PJSC v0.2", "PJSC v0.3", "PJSC v0.4", "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", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" ;[PJSC] Boad ID: PJSC boad ver1.0/0.2/0.3 (2018/20/19)
      tachoPin      = bits,   U08,      16, [0:5],  "Board Default", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
      tachoDiv      = bits,   U08,      16, [6:7],  "Normal", "Half", "INVALID", "INVALID"
      unused2-17    = scalar, U08,      17,         "ms",       0.1,       0.0,   0.0,    25.5,      1
      unused2-18    = scalar, U08,      18,         "ms",       0.1,       0.0,   0.0,    25.5,      1
      tpsThresh     = scalar, U08,      19,         "%/s",      1.0,       0.0,   0.0,    255,       0
      taeTime       = scalar, U08,      20,         "ms",        10,       0.0,   0.0,    2550,      0

      ; Display (Options for what the display is showing)
      display       = bits,   U08,      21, [0:2],  "Unused", "Adafruit 128x32", "Generic 128x32", "Adafruit 128x64", "Generic 128x64", "INVALID", "INVALID", "INVALID"
      display1      = bits    U08,      21, [3:5],  "RPM", "PW", "Advance", "VE", "GammaE", "TPS", "IAT", "CLT"
      display2      = bits    U08,      21, [6:7],  "O2", "Voltage", "CPU", "Mem"

      display3      = bits    U08,      22, [0:2],  "RPM", "PW", "Advance", "VE", "GammaE", "TPS", "IAT", "CLT"
      display4      = bits    U08,      22, [3:4],  "O2", "Voltage", "CPU", "Mem"
      display5      = bits    U08,      22, [5:7],  "RPM", "PW", "Advance", "VE", "GammaE", "TPS", "IAT", "CLT"

      displayB1     = bits    U08,      23, [0:3],  "RPM", "PW", "Advance", "VE", "GammaE", "TPS", "IAT", "CLT"
      displayB2     = bits    U08,      23, [4:7],  "RPM", "PW", "Advance", "VE", "GammaE", "TPS", "IAT", "CLT"

      reqFuel       = scalar, U08,      24,        "ms",        0.1,       0.0,   0.0,    25.5,      1
      divider       = scalar, U08,      25,        "",          1.0,       0.0
      alternate     = bits,   U08,      26, [0:0], "Simultaneous", "Alternating"
      multiplyMAP   = bits,   U08,      26, [1:1], "No",       "Yes"
      includeAFR    = bits,   U08,      26, [2:2], "No",       "Yes"
      hardCutType   = bits,   U08,      26, [3:3], "Full",      "Rolling"
      ignAlgorithm  = bits,   U08,      26, [4:6], $loadSourceNames
      indInjAng     = bits,   U08,      26, [7:7], "Disabled", "Enabled"
;[PJSC v1.01]      injOpen       = scalar, U08,      27,        "ms",        0.1,       0.0,   0.1,    25.5,      1
      injOpen       = scalar, U08,      27,        "ms",       0.01,      0.00,  0.01,   2.55,       2
      inj1Ang       = scalar, U16,      28,        "deg",       1.0,       0.0,   0.0,    360,       0
      inj2Ang       = scalar, U16,      30,        "deg",       1.0,       0.0,   0.0,    360,       0
      inj3Ang       = scalar, U16,      32,        "deg",       1.0,       0.0,   0.0,    360,       0
      inj4Ang       = scalar, U16,      34,        "deg",       1.0,       0.0,   0.0,    360,       0

      ; Config1
      mapSample     = bits,   U08,      36, [0:1], "Instantaneous", "Cycle Average", "Cycle Minimum", "INVALID"
      twoStroke     = bits,   U08,      36, [2:2], "Four-stroke", "Two-stroke"
      injType       = bits,   U08,      36, [3:3], "Port", "Throttle Body"
      nCylinders    = bits,   U08,      36, [4:7], "INVALID","1","2","3","4","5","6","INVALID","8","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"

      ; Config2
      algorithm     = bits,   U08,      37, [0:2], $loadSourceNames ;Has to be called algorithm for the req fuel calculator to work :(
      fixAngEnable  = bits,   U08,      37, [3:3], "Off", "On"
      nInjectors    = bits,   U08,      37, [4:7], "INVALID","1","2","3","4","5","6","INVALID","8","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"

      ; Config3
      engineType    = bits,   U08,      38, [0:0], "Even fire",     "Odd fire"
      flexEnabled   = bits,   U08,      38, [1:1], "Off", "On"
      unused2_38c   = bits,   U08,      38, [2:2], "Speed Density", "Alpha-N"
      baroCorr      = bits,   U08,      38, [3:3], "Off",           "On"
      injLayout     = bits,   U08,      38, [4:5], "Paired", "Semi-Sequential", "INVALID", "Sequential"
      perToothIgn   = bits,   U08,      38, [6:6], "No", "Yes"
      dfcoEnabled   = bits,   U08,      38, [7:7], "Off",       "On"

      primePulse    = scalar, U08,      39,        "ms",        0.1,       0.0,   0.0,     25.5,     1
      dutyLim       = scalar, U08,      40,        "%",         1.0,       0.0,   0.0,     95.0,     0
      flexFreqLow   = scalar, U08,      41,        "Hz",        1.0,       0.0,   0.0,     250.0,    0
      flexFreqHigh  = scalar, U08,      42,        "Hz",        1.0,       0.0,   0.0,     250.0,    0

      boostMaxDuty  = scalar, U08,      43,        "%",         1.0,       0.0,   0.0,     100.0,    0
      tpsMin        = scalar, U08,      44,        "ADC",       1.0,       0.0,   0.0,     255.0,    0
      tpsMax        = scalar, U08,      45,        "ADC",       1.0,       0.0,   0.0,     255.0,    0
      mapMin        = scalar, S08,      46,        "kpa",       1.0,       0.0,  -100,     127.0,    0
      mapMax        = scalar, U16,      47,        "kpa",       1.0,       0.0,   0.0,     25500,    0
      fpPrime       = scalar, U08,      49,        "s",         1.0,       0.0,   0.0,     255.0,    0
      stoich        = scalar, U08,      50,        ":1",        0.1,       0.0,   0.0,     25.5,     1
      oddfire2      = scalar, U16,      51,        "deg",       1.0,       0.0,   0.0,     720,      0 ; * (  2 byte)
      oddfire3      = scalar, U16,      53,        "deg",       1.0,       0.0,   0.0,     720,      0 ; * (  2 byte)
      oddfire4      = scalar, U16,      55,        "deg",       1.0,       0.0,   0.0,     720,      0 ; * (  2 byte)

      idleUpPin     = bits,   U08,      57, [0:5], "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "INVALID"
      idleUpPolarity= bits,   U08,      57, [6:6], "Normal", "Inverted"
      idleUpEnabled = bits,   U08,      57, [7:7], "Off", "On"
      idleUpAdder   = scalar, U08,      58,        "% / Steps"  1.0,       0.0,   0.0,     250.0,    0
      taeTaperMin   = scalar, U08,      59,        "RPM",       100,       0.0,   1000,    10000,    0
      taeTaperMax   = scalar, U08,      60,        "RPM",       100,       0.0,   2000,    10000,    0

      iacCLminDuty  = scalar, U08,      61,        "%",         1.0,       0.0,   0.0,     100.0,    0 ; Minimum and maximum duty cycles when using closed loop idle
      iacCLmaxDuty  = scalar, U08,      62,        "%",         1.0,       0.0,   0.0,     100.0,    0
      boostMinDuty  = scalar, U08,      63,        "%",         1.0,       0.0,   0.0,     100.0,    0 ; Minimum and maximum duty cycles for boost control

      baroMin       = scalar, S08,      64,        "kpa",       1.0,       0.0,  -100,     127.0,    0
      baroMax       = scalar, U16,      65,        "kpa",       1.0,       0.0,   0.0,     25500,    0
      EMAPMin       = scalar, S08,      67,        "kpa",       1.0,       0.0,  -100,     127.0,    0
      EMAPMax       = scalar, U16,      68,        "kpa",       1.0,       0.0,   0.0,     25500,    0

      fanWhenOff   = bits,   U08,     70, [0:0], "No",        "Yes" 
      unused_fan_bits = bits,  U08,    70,[1:7]

;[PJSC]      unused2-67    = array,  U08,      71, [56],   "%",        1.0,       0.0,   0.0,     255,      0
      pjscFreq                 = scalar, U08, 71,         "Hz",        2.0,       0.0,    10,     511,      0                             ;[PJSC]
      exValvePosMin            = scalar, U08, 72,         "ADC",       1.0,       0.0,   0.0,     255.0,    0                             ;  |
      exValvePosMax            = scalar, U08, 73,         "ADC",       1.0,       0.0,   0.0,     255.0,    0                             ;  |
      exTrigHysteresis         = scalar, U08, 74,         "deg",       1.0,       0.0,   0.0,     255.0,    0                             ;  V
      squirtDeviceType         = bits,   U08, 75,  [0:0], "Injector", "Pump Jet"                                                          ;[PJSC]
      multiVEmapEnabled        = bits,   U08, 75,  [1:1], "Disable", "Enable"                                                             ;[PJSC v1.01] For Dual Fuel Load
      mapSeparationEnabled     = bits,   U08, 75,  [2:2], "Disable", "Enable"                                                             ;[PJSC v1.01] For Dual Fuel Load
      mapSwitchingEnabled      = bits,   U08, 75,  [3:3], "Disable", "Enable"                                                             ;[PJSC v1.01] For Dual Fuel Load
      dualFuelEnabled          = bits,   U08, 75,  [4:4], "Disable", "Enable"                                                             ;[PJSC v1.01] For Dual Fuel Load
;[PJSC v1.03]      secondaryFuelUsage       = bits,   U08, 75,  [5:5], "additive", "multiply"                                                 ;[PJSC v1.01] For Dual Fuel Load
      secondaryFuelUsage       = bits,   U08, 75,  [5:5], "multiply", "additive"                                                          ;[PJSC v1.03] For Dual Fuel Load fix
;[PJSC v1.01]      unused2_75               = bits,   U08, 75,  [6:7]                                                                         ;[PJSC v1.01]
;[PJSC v1.03]      fuelCorrectionEnabled    = bits,   U08, 75,  [6:6], "Disable", "Enable"                                                    ;[PJSC v1.01]
      swBatVCorrection         = bits,   U08, 75,  [6:6], "Off",    "On"                                                                  ;[PJSC v1.03]
;[PJSC v1.03]      unused2_75               = bits,   U08, 75,  [7:7]                                                                         ;[PJSC v1.01]
      vvtSamplingRate          = bits,   U08, 75,  [7:7], "4Hz", "30Hz"                                                                   ;[PJSC v1.03]
      exTrigModeSelect         = bits,   U08, 76,  [0:2], "Disable",  "Spark timing capture", "MAP select switch", "Misfire Detection", "Viecle Speed", "INVALID", "INVALID", "INVALID"    ;[PJSC v1.03]
;[PJSC v1.03]      exTrigModeSelect         = bits,   U08, 76,  [0:1], "Disable",  "Spark timing capture", "MAP select switch", "Misfire Detection"    ;[PJSC]
;[PJSC v1.03]      externalTrigEdge         = bits,   U08, 76,  [2:2], "Rising",   "Falling"                                                           ;  |
      externalTrigEdge         = bits,   U08, 76,  [3:3], "Rising",   "Falling"                                                           ;[PJSC v1.03]
;[PJSC v1.02]      exValveCaptureEnabled    = bits,   U08, 76,  [3:3], "Disable",  "Exhaust Valve Position capture"                           ;  |
;[PJSC v1.02]      exValveCalibrationMode   = bits,   U08, 76,  [4:4], "Off",      "On"                                                       ;[PJSC]
;[PJSC v1.02]      unused2_76               = bits,   U08, 76,  [5:7]                                                                         ;[PJSC v1.01]
;[PJSC v1.03]      exValveCalibrationMode   = bits,   U08, 76,  [3:3], "Off",      "On"                                                                ;[PJSC v1.02]
      analogInputPortSelect    = bits,   U08, 76,  [4:5], "Disable",  "Exhaust Valve Position capture", "Secondary AFR/O2", "INVALID"     ;[PJSC v1.02]
      analogInputPortSelect2   = bits,   U08, 76,  [6:7], "Disable",  "Barometric sensor", "Exhaust Gas Temperature", "INVALID"           ;[PJSC v1.03]
      dutyPulseCaptureEnabled  = bits,   U08, 77,  [0:0], "Disable",  "PWM input"                                                         ;[PJSC v1.01]
      dutyPulseCaptureEnabled2 = bits,   U08, 77,  [1:1], "Disable",  "PWM input"                                                         ;  |
      dutyPulseOnLevel         = bits,   U08, 77,  [2:2], "High",     "Low"                                                               ;  |
      dutyPulseOnLevel2        = bits,   U08, 77,  [3:3], "High",     "Low"                                                               ;  V
;[PJSC v1.03]      unused2_77               = bits,   U08, 77,  [4:7]                                                                         ;[PJSC v1.01]
      swIATcorrection          = bits,   U08, 77,  [4:4], "Off",    "On"                                                                  ;[PJSC v1.03]
      swTAE                    = bits,   U08, 77,  [5:5], "Off",    "On"                                                                  ;[PJSC v1.03]
      swWUE                    = bits,   U08, 77,  [6:6], "Off",    "On"                                                                  ;[PJSC v1.03]
      swCrankingEnrichment     = bits,   U08, 77,  [7:7], "Off",    "On"                                                                  ;[PJSC v1.03]
#if table4_spark                                                                                                                          ;[PJSC v1.01] For switching table4
      veMapSelection1Pri       = bits,   U08, 78,  [0:3], "VE Table 1","VE Table 2","VE Table 3","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection1Sec       = bits,   U08, 78,  [4:7], "VE Table 1","VE Table 2","VE Table 3","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection2Pri       = bits,   U08, 79,  [0:3], "VE Table 1","VE Table 2","VE Table 3","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection2Sec       = bits,   U08, 79,  [4:7], "VE Table 1","VE Table 2","VE Table 3","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection3Pri       = bits,   U08, 80,  [0:3], "VE Table 1","VE Table 2","VE Table 3","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection3Sec       = bits,   U08, 80,  [4:7], "VE Table 1","VE Table 2","VE Table 3","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection4Pri       = bits,   U08, 81,  [0:3], "VE Table 1","VE Table 2","VE Table 3","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection4Sec       = bits,   U08, 81,  [4:7], "VE Table 1","VE Table 2","VE Table 3","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection1_2Pri     = bits,   U08, 82,  [0:3], "VE Table 1","VE Table 2","VE Table 3","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection1_2Sec     = bits,   U08, 82,  [4:7], "VE Table 1","VE Table 2","VE Table 3","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection2_2Pri     = bits,   U08, 83,  [0:3], "VE Table 1","VE Table 2","VE Table 3","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection2_2Sec     = bits,   U08, 83,  [4:7], "VE Table 1","VE Table 2","VE Table 3","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection3_2Pri     = bits,   U08, 84,  [0:3], "VE Table 1","VE Table 2","VE Table 3","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection3_2Sec     = bits,   U08, 84,  [4:7], "VE Table 1","VE Table 2","VE Table 3","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection4_2Pri     = bits,   U08, 85,  [0:3], "VE Table 1","VE Table 2","VE Table 3","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection4_2Sec     = bits,   U08, 85,  [4:7], "VE Table 1","VE Table 2","VE Table 3","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
#endif                                                                                                                           ;[PJSC v1.01] For switching table4
#if table4_fuel                                                                                                                  ;[PJSC v1.01]
      veMapSelection1Pri       = bits,   U08, 78,  [0:3], "VE Table 1","VE Table 2","VE Table 3","VE Table 4","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection1Sec       = bits,   U08, 78,  [4:7], "VE Table 1","VE Table 2","VE Table 3","VE Table 4","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection2Pri       = bits,   U08, 79,  [0:3], "VE Table 1","VE Table 2","VE Table 3","VE Table 4","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection2Sec       = bits,   U08, 79,  [4:7], "VE Table 1","VE Table 2","VE Table 3","VE Table 4","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection3Pri       = bits,   U08, 80,  [0:3], "VE Table 1","VE Table 2","VE Table 3","VE Table 4","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection3Sec       = bits,   U08, 80,  [4:7], "VE Table 1","VE Table 2","VE Table 3","VE Table 4","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection4Pri       = bits,   U08, 81,  [0:3], "VE Table 1","VE Table 2","VE Table 3","VE Table 4","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection4Sec       = bits,   U08, 81,  [4:7], "VE Table 1","VE Table 2","VE Table 3","VE Table 4","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection1_2Pri     = bits,   U08, 82,  [0:3], "VE Table 1","VE Table 2","VE Table 3","VE Table 4","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection1_2Sec     = bits,   U08, 82,  [4:7], "VE Table 1","VE Table 2","VE Table 3","VE Table 4","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection2_2Pri     = bits,   U08, 83,  [0:3], "VE Table 1","VE Table 2","VE Table 3","VE Table 4","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection2_2Sec     = bits,   U08, 83,  [4:7], "VE Table 1","VE Table 2","VE Table 3","VE Table 4","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection3_2Pri     = bits,   U08, 84,  [0:3], "VE Table 1","VE Table 2","VE Table 3","VE Table 4","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection3_2Sec     = bits,   U08, 84,  [4:7], "VE Table 1","VE Table 2","VE Table 3","VE Table 4","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection4_2Pri     = bits,   U08, 85,  [0:3], "VE Table 1","VE Table 2","VE Table 3","VE Table 4","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      veMapSelection4_2Sec     = bits,   U08, 85,  [4:7], "VE Table 1","VE Table 2","VE Table 3","VE Table 4","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
#endif                                                                                                                           ;[PJSC v1.01] For switching table4
      dutyFreqTst1             = scalar, U08, 86,         "Hz",        2.0,       0.0,    10,     511,      0                    ;[PJSC v1.01]
      dutyFreqTst2             = scalar, U08, 87,         "Hz",        2.0,       0.0,    10,     511,      0                    ;  |
      dutyFreqTst3             = scalar, U08, 88,         "Hz",        2.0,       0.0,    10,     511,      0                    ;  |
      dutyFreqTst4             = scalar, U08, 89,         "Hz",        2.0,       0.0,    10,     511,      0                    ;  |
      dutyFreqTst5             = scalar, U08, 90,         "Hz",        2.0,       0.0,    10,     511,      0                    ;  |
      dutyFreqTst6             = scalar, U08, 91,         "Hz",        2.0,       0.0,    10,     511,      0                    ;  |
      dutyFreqTst7             = scalar, U08, 92,         "Hz",        2.0,       0.0,    10,     511,      0                    ;  |
      dutyFreqTst8             = scalar, U08, 93,         "Hz",        2.0,       0.0,    10,     511,      0                    ;  |
      dutyFreqTst9             = scalar, U08, 94,         "Hz",        2.0,       0.0,    10,     511,      0                    ;  |
      dutyFreqTst10            = scalar, U08, 95,         "Hz",        2.0,       0.0,    10,     511,      0                    ;  |
      dutyFreqTst11            = scalar, U08, 96,         "Hz",        2.0,       0.0,    10,     511,      0                    ;  |
      dutyFreqTst12            = scalar, U08, 97,         "Hz",        2.0,       0.0,    10,     511,      0                    ;  |
      dutyRatioTst1            = scalar, U08, 98,         "%",         1.0,       0.0,   0.0,   100.0,      0                    ;  |
      dutyRatioTst2            = scalar, U08, 99,         "%",         1.0,       0.0,   0.0,   100.0,      0                    ;  |
      dutyRatioTst3            = scalar, U08, 100,        "%",         1.0,       0.0,   0.0,   100.0,      0                    ;  |
      dutyRatioTst4            = scalar, U08, 101,        "%",         1.0,       0.0,   0.0,   100.0,      0                    ;  |
      dutyRatioTst5            = scalar, U08, 102,        "%",         1.0,       0.0,   0.0,   100.0,      0                    ;  |
      dutyRatioTst6            = scalar, U08, 103,        "%",         1.0,       0.0,   0.0,   100.0,      0                    ;  |
      dutyRatioTst7            = scalar, U08, 104,        "%",         1.0,       0.0,   0.0,   100.0,      0                    ;  |
      dutyRatioTst8            = scalar, U08, 105,        "%",         1.0,       0.0,   0.0,   100.0,      0                    ;  |
      dutyRatioTst9            = scalar, U08, 106,        "%",         1.0,       0.0,   0.0,   100.0,      0                    ;  |
      dutyRatioTst10           = scalar, U08, 107,        "%",         1.0,       0.0,   0.0,   100.0,      0                    ;  |
      dutyRatioTst11           = scalar, U08, 108,        "%",         1.0,       0.0,   0.0,   100.0,      0                    ;  |
      dutyRatioTst12           = scalar, U08, 109,        "%",         1.0,       0.0,   0.0,   100.0,      0                    ;  |
      testop_fp                = bits,   U08, 110, [0:0], "Off",      "On"                                                       ;  |
      testop_inj               = bits,   U08, 110, [1:2], "Off",      "One", "INVALID", "All"                                    ;  |
      testop_coil              = bits,   U08, 110, [3:4], "Off",      "One", "INVALID", "INVALID"                                ;  |
      testsel_inj              = bits,   U08, 110, [5:6], "Inj1",     "Inj2", "Inj3", "Inj4"                                     ;  |
      testsel_coil             = bits,   U08, 110, [7:7], "CoilA",    "CoilB"                                                    ;  |
      testint                  = scalar, U16, 111,        "ms",       0.01,      0.00,     0,  655.35,      1                    ;  V
      testrpm                  = scalar, U16, 111,        "RPM",       1.0, { 60000/testint }, 0, 60000,    0                    ;[PJSC v1.01]
      testpw                   = scalar, U16, 113,        "ms",       0.01,      0.00,     0,  655.35,      1                    ; * (  1 byte)
      testinjcnt               = scalar, U16, 115,        "",            1,         0,     0,   65535,      0,   noLocalUpdate   ;
#if table4_spark                                                                                                                 ;[PJSC v1.01]
      muxout1selection         = bits,   U08, 117, [0:3], "Disable/Test Mode", "IDLE control", "Thermo Fan control", "Launch control", "Fuel pump control", "Boost control", "VVT control", "Tach output", "INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      muxout2selection         = bits,   U08, 117, [4:7], "Disable/Test Mode", "IDLE control", "Thermo Fan control", "Launch control", "Fuel pump control", "Boost control", "VVT control", "Tach output", "INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      muxout3selection         = bits,   U08, 118, [0:3], "Disable/Test Mode", "IDLE control", "Thermo Fan control", "Launch control", "Fuel pump control", "Boost control", "VVT control", "Tach output", "INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
      muxout4selection         = bits,   U08, 118, [4:7], "Disable/Test Mode", "IDLE control", "Thermo Fan control", "Launch control", "Fuel pump control", "Boost control", "VVT control", "Tach output", "INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID"
#endif                                                                                                                           ;[PJSC v1.01]
#if table4_fuel                                                                                                                  ;[PJSC v1.01]
      muxout1selection         = bits,   U08, 117, [0:3], "Disable/Test Mode", "IDLE control", "Thermo Fan control", "INVALID", "Fuel pump control", "Boost control", "VVT control", "Tach output", "INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" ;[PJSC v1.01]
      muxout2selection         = bits,   U08, 117, [4:7], "Disable/Test Mode", "IDLE control", "Thermo Fan control", "INVALID", "Fuel pump control", "Boost control", "VVT control", "Tach output", "INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" ;[PJSC v1.01]
      muxout3selection         = bits,   U08, 118, [0:3], "Disable/Test Mode", "IDLE control", "Thermo Fan control", "INVALID", "Fuel pump control", "Boost control", "VVT control", "Tach output", "INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" ;[PJSC v1.01]
      muxout4selection         = bits,   U08, 118, [4:7], "Disable/Test Mode", "IDLE control", "Thermo Fan control", "INVALID", "Fuel pump control", "Boost control", "VVT control", "Tach output", "INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID","INVALID" ;[PJSC v1.01]
#endif                                                                                                                           ;[PJSC v1.01]
      algorithm2               = bits,   U08, 119, [0:2], $loadSourceNames                                                       ;[PJSC v1.01] For Dual Fuel Load
      algorithm3               = bits,   U08, 119, [3:5], $loadSourceNames                                                       ;[PJSC v1.01]
;[PJSC v1.03]      unused2_119              = bits,   U08, 119, [6:7]                                                                         ;[PJSC v1.01]
      swASE                    = bits,   U08, 119, [6:6], "Off",    "On"                                                         ;[PJSC v1.03]
      exValveCalibrationMode   = bits,   U08, 119, [7:7], "Off",      "On"                                                       ;[PJSC v1.03]
;[PJSC v1.03]      unused2_119              = bits,   U08, 119, [7:7]                                                                         ;[PJSC v1.03]
      table4Usage              = bits,   U08, 120, [0:0], "Fuel", "Spark"                                                        ;[PJSC v1.01]
      unused2_120              = bits,   U08, 120, [1:7]                                                                         ;[PJSC v1.01]
      inj1SquirtStartEnd       = bits,   U08, 121, [0:0], "End angle", "Start angle"                                             ;[PJSC v1.01]
      inj2SquirtStartEnd       = bits,   U08, 121, [1:1], "End angle", "Start angle"                                             ;[PJSC v1.01]
      inj3SquirtStartEnd       = bits,   U08, 121, [2:2], "End angle", "Start angle"                                             ;[PJSC v1.01]
      inj4SquirtStartEnd       = bits,   U08, 121, [3:3], "End angle", "Start angle"                                             ;[PJSC v1.01]
      afr_sensor_selection1    = bits,   U08, 121, [4:4], "Primary", "Secondary"                                                 ;[PJSC v1.02] For AFR sensor selection
      afr_sensor_selection2    = bits,   U08, 121, [5:5], "Primary", "Secondary"                                                 ;[PJSC v1.02]
      afr_sensor_selection3    = bits,   U08, 121, [6:6], "Primary", "Secondary"                                                 ;[PJSC v1.02]
      afr_sensor_selection4    = bits,   U08, 121, [7:7], "Primary", "Secondary"                                                 ;[PJSC v1.02]
      squirtDeviceTypeCh1      = bits,   U08, 122, [0:0], "Injector", "Pump Jet"                                                 ;[PJSC v1.03]
      squirtDeviceTypeCh2      = bits,   U08, 122, [1:1], "Injector", "Pump Jet"                                                 ;[PJSC v1.03]
      squirtDeviceTypeCh3      = bits,   U08, 122, [2:2], "Injector", "Pump Jet"                                                 ;[PJSC v1.03]
      squirtDeviceTypeCh4      = bits,   U08, 122, [3:3], "Injector", "Pump Jet"                                                 ;[PJSC v1.03]
      solenoidValveDirectionCh1= bits,   U08, 122, [4:4], "Normal, 0%=off", "Inverted, 100%=off"                                 ;[PJSC v1.03]
      solenoidValveDirectionCh2= bits,   U08, 122, [5:5], "Normal, 0%=off", "Inverted, 100%=off"                                 ;[PJSC v1.03]
      solenoidValveDirectionCh3= bits,   U08, 122, [6:6], "Normal, 0%=off", "Inverted, 100%=off"                                 ;[PJSC v1.03]
      solenoidValveDirectionCh4= bits,   U08, 122, [7:7], "Normal, 0%=off", "Inverted, 100%=off"                                 ;[PJSC v1.03]
      EGTvoltage1              = scalar, U08, 123,        "V",        0.05,         0,     0,   25.5,      2                     ;[PJSC v1.03]
      EGTvoltage2              = scalar, U08, 124,        "V",        0.05,         0,     0,   25.5,      2                     ;[PJSC v1.03]
      EGTtemperature1          = scalar, S08, 125,        "C",           1,         0,  -255,    255,      0                     ;[PJSC v1.03]
      EGTtemperature2          = scalar, U16, 126,        "C",           1,         0,     0,  65535,      0                     ;[PJSC v1.03]


;Page 2 is the fuel map and axis bins only
page = 2
   ;  name       = bits,   type,    offset, bits
   ;  name       = array,  type,    offset, shape, units,     scale, translate,    lo,      hi, digits
   ;  name       = scalar, type,    offset,        units,     scale, translate,    lo,      hi, digits
      veTable    = array,  U08,       0, [16x16],"%",          1.0,      0.0,   0.0,   255.0,      0
      rpmBins    = array,  U08,     256, [  16], "RPM",      100.0,      0.0,   100.0, 25500.0,      0
;[PJSC v1.01]      fuelLoadBins = array,  U08,   272, [  16], { bitStringValue(algorithmUnits ,  algorithm) },        2.0,      0.0,   0.0,   {fuelLoadMax},      0
      fuelLoadBins = array,  U08,   272, [  16], { bitStringValue(algorithmUnits ,  algorithm) },        1.0,      0.0,   0.0,   {fuelLoadMax},      0      ;[PJSC v1.01]
      ;fuelLoadBins = array,  U08,   272, [  16], { bitStringValue(algorithmUnits ,  algorithm) },        2.0,      0.0,   0.0,   { arrayValue(rpmBins , algorithm) },      0

;--------------------------------------------------
;Start Ignition table (Page 3)
;--------------------------------------------------
page = 3
      advTable1  = array,  U08,     0,[16x16],  "deg",       1.0,       -40,   -40,   215.0,      0
      rpmBins2   = array,  U08,   256,[   16],  "RPM",       100.0,     0.0,   100,   25500,      0
;[PJSC v1.01]      mapBins1= array,  U08,   272, [  16], { bitStringValue(algorithmUnits ,  ignAlgorithm) },        2.0,      0.0,   0.0,   {ignLoadMax},      0 ; This name has to be used in order for the table to show up in MLVs table. I can't find the regexs that make this work :(
      mapBins1= array,  U08,   272, [  16], { bitStringValue(algorithmUnits ,  ignAlgorithm) },        1.0,      0.0,   0.0,   {ignLoadMax},      0         ;[PJSC v1.01]

;--------------------------------------------------
;Start Page 4
;These are primarily ignition related settings (Previously part of page 2)
;--------------------------------------------------
page = 4
      TrigAng    = scalar, S16,      0,         "Deg",       1,        0,     -360,     360,        0
      FixAng     = scalar, S08,      2,         "Deg",       1,        0,     -64,      64,         0 ; Allow negative values here
      CrankAng   = scalar, U08,      3,         "Deg",       1,        0,     -10,      80,         0
      TrigAngMul = scalar, U08,      4,         "",          1,        0,     0,        88,         0 ; Multiplier for tooth counts that don't evenly divide into 360
      TrigEdge   = bits,   U08,      5,[0:0],    "RISING", "FALLING"
      TrigSpeed  = bits,   U08,      5,[1:1],    "Crank Speed", "Cam Speed"
      IgInv      = bits,   U08,      5,[2:2],    "Going Low",        "Going High"
      TrigPattern= bits,   U08,      5,[3:7],    "Missing Tooth", "Basic Distributor", "Dual Wheel", "GM 7X", "4G63 / Miata / 3000GT", "GM 24X", "Jeep 2000", "Audi 135", "Honda D17", "Miata 99-05", "Mazda AU", "Non-360 Dual", "Nissan 360", "Subaru 6/7", "Daihatsu +1", "Harley EVO", "36-2-2-2", "NSR", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
      TrigEdgeSec= bits,   U08,      6,[0:0],    "RISING", "FALLING"
      fuelPumpPin= bits  , U08,      6,[1:6],    "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "INVALID"
      useResync  = bits,   U08,      6,[7:7],    "No",        "Yes"
      sparkDur   = scalar, U08,      7,          "ms",        0.1, 0, 0, 25.5, 1 ; Spark duration
      trigPatternSec = bits,   U08,      8,[0:7],    "Single tooth cam", "4-1 cam", "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", "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", "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", "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", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"

;Reset Control
      bootloaderCaps  = scalar, U08, 9,        "level",    1, 0, 0, 255, 0
#if resetcontrol_adv
      resetControl =    bits,   U08, 10,[0:1], "Disabled", "Prevent When Running", "Prevent Always", "Serial Command"
#else
      resetControl =    bits,   U08, 10,[0:1], "Disabled", "INVALID", "INVALID", "Serial Command"
#endif
      resetControlPin = bits,   U08, 10,[2:7],  "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "INVALID"

      SkipCycles  = scalar, U08,     11,         "cycles",    1,    0,    0,  255, 0

   ;  name       = array,  type,    offset, shape, units,     scale, translate,    lo,      hi, digits
   ;  name       = scalar, type,    offset,      units,     scale, translate,    lo,      hi, digits
;Dwell control
      boostType     = bits,   U08,     12, [0:0],  "Open Loop",  "Closed Loop"
      useDwellLim   = bits,   U08,		 12, [1:1],	 "Off",		"On"
      sparkMode     = bits,   U08,     12, [2:4],  "Wasted Spark", "Single Channel",   "Wasted COP", "Sequential", "Rotary", "INVALID", "INVALID", "INVALID"
      TrigFilter    = bits,   U08,     12, [5:6],  "Off", "Weak", "Medium", "Aggressive"
      ignCranklock  = bits,   U08,     12, [7:7],  "Off",  "On"
      dwellcrank    = scalar, U08,     13,         "ms",       0.1,    0,    0, 25, 1
      dwellrun      = scalar, U08,     14,         "ms",       0.1,    0,    0, 8, 1 ;running dwell variable railed to 8 - who needs more than 8ms?
      numTeeth      = scalar, U08,     15,         "teeth",    1.0,    0.0,  0.0,     255,       0
      missingTeeth  = scalar, U08,     16,         "teeth",    1.0,    0.0,  0.0,     255,       0

      crankRPM      = scalar, U08,     17,         "rpm",      10,    0.0,  100, 1000, 0
      tpsflood      = scalar, U08,     18,         "%",        1.0,    0.0,  0.0,   255.0,      0

;Rev Limits
      SoftRevLim    = scalar, U08,  19,         "rpm",      100,    0.0,  100, 25500, 0
      SoftLimRetard = scalar, U08,  20,         "deg",      1.0,    0.0,  0.0,   80,   0
      SoftLimMax    = scalar, U08,  21,         "s",        0.1,    0.0,  0.0,  25.5,   1
      HardRevLim    = scalar, U08,  22,         "rpm",      100,    0.0, 100, 25500,  0

;TPS based acceleration enrichment
      taeBins    = array,  U08,     23, [ 4],   "%/s",      10.0,   0.0,  0.00,   2550.0,      0
      taeRates   = array,  U08,     27, [ 4],   "%",        1.0,    0.0,  0.00, 255.0,      0 ; 4 bytes
;WUE Bins (Needed somewhere to put these
    #if CELSIUS
      wueBins    = array,  U08,     31, [10],   "C",        1.0, -40,  -40,  102.0,      0
    #else
      wueBins    = array,  U08,     31, [10],   "F",        1.8,   -22.23,  -40,  215.0,      0
    #endif
;Dwell config options
      dwellLim   = scalar, U08,     41,         "ms",       1,      0,        0, 32, 0
      dwellRates = array,  U08,     42, [6],    "%",        1.0,    0.0,      0.00,   255.0,      0

;IAT (Inlet air temp) timing retard
    #if CELSIUS
      iatRetBins   = array,  U08,     48, [ 6],   "C",      1.0,    0.0,  0.00,   255.0,      0
    #else
      iatRetBins   = array,  U08,     48, [ 6],   "F",      1.8,    17.77,  0.00,   255.0,      0 ; No -40 degree offset here
    #endif
      iatRetRates  = array,  U08,     54, [ 6],   "deg",    1.0,    0.0,  0.00,   255.0,      0
;Decelleration Fuel Cut Off (DFCO)
      dfcoRPM      = scalar, U08,      60,        "RPM",      10.0,  0.0,   100,     2550,    0
      dfcoHyster   = scalar, U08,      61,        "RPM",      1.0,  0.0,   100,     255.0,    0
      dfcoTPSThresh= scalar, U08,      62,        "%",        1.0,  0.0,   0,     100.0,    0
;Cranking ignition bypass
        ignBypassEnable = bits,   U08,		63, [0:0],      "Off",        "On"
        ignBypassPin    = bits  , U08,      63, [1:6],      "INVALID", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
        ignBypassHiLo   = bits,   U08,		63, [7:7],      "LOW",        "HIGH"
;Analog input filter levels (Note max values are 254 so that default values of 255 can be overwirtten on bootup)
        ADCFILTER_TPS   = scalar, U08,      64, "%",          1.0,  0.0,   0,     240,    0
        ADCFILTER_CLT   = scalar, U08,      65, "%",          1.0,  0.0,   0,     240,    0
        ADCFILTER_IAT   = scalar, U08,      66, "%",          1.0,  0.0,   0,     240,    0
        ADCFILTER_O2    = scalar, U08,      67, "%",          1.0,  0.0,   0,     240,    0
        ADCFILTER_BAT   = scalar, U08,      68, "%",          1.0,  0.0,   0,     240,    0
        ADCFILTER_MAP   = scalar, U08,      69, "%",          1.0,  0.0,   0,     240,    0
        ADCFILTER_BARO  = scalar, U08,      70, "%",          1.0,  0.0,   0,     240,    0

;[PJSC v1.01]        unused4-64      = array,  U08,      71, [56],   "%",        1.0,       0.0,   0.0,     255,      0

      baroDenBins       = array,  U08,      71, [9],   "kPa",      1.0,      0.0,    0.0,   255.0,      0                     ;[PJSC v1.01] Bins for the Barometric density correction curve
      baroDenRates      = array,  U08,      80, [9],   "%",        1.0,      0.0,    0.0,   255.0,      0                     ;[PJSC v1.01] Values for the \Barometric density correction curve
;[PJSC v1.02]      unused4-89        = array,  U08,      89, [38],  "%",        1.0,       0.0,   0.0,     255,      0                     ;[PJSC v1.01]
      crankingFilter    = bits,   U08,		89, [0:0], "Enable",        "Disable"                                             ;[PJSC v1.02]
      unused4-89        = bits,   U08,      89, [1:7]                                                                         ;[PJSC v1.02]
      numSparkPerRev      = scalar, U08,      90,        "sparks",     1,    0,       0,     255,      0                      ;[PJSC v1.03] For misfire detection
      misfireDetectThresh = scalar, U08,      91,        "rpm",       10,    0.0,   100,    1000,      0                      ;[PJSC v1.03] For misfire detection
      numSpeedPulsePerRev = scalar, U08,      92,        "pulse",      1,    0,       0,     255,      0                      ;[PJSC v1.03] For capturing viecle speed
      tireCircumference   = scalar, U16,      93,        "mm",         1,    0,       0,   65535,      0                      ;[PJSC v1.03] For capturing viecle speed
      unused4-95          = array,  U08,      95, [32],  "%",        1.0,    0.0,   0.0,     255,      0                      ;[PJSC v1.03] For misfire detection

;--------------------------------------------------
;Start AFR page
;--------------------------------------------------
page = 5
#if LAMBDA
        afrTable    = array,  U08,     0,[16x16], "Lambda",  { 0.1 / stoich },   0.0000,  0.00,    2.00,      3
#else
        afrTable    = array,  U08,     0,[16x16],    "AFR",      0.1,       0.0,   7,   25.5,      1
#endif

        rpmBinsAFR  = array,  U08,   256,[   16],    "RPM",   100.0,     0.0,   100,   25500,      0
    #if SPEED_DENSITY
        mapBinsAFR  = array,  U08,   272,[   16],    "kPa",   2.0,      0.0,   0.0,   511.0,      0
    #elif ALPHA_N
        tpsBinsAFR  = array,  U08,   272,[   16],    "TPS",   2.0,      0.0,   0.0,   100.0,      0
    #endif

;--------------------------------------------------
;Start page 6
; Page 6 is all settings associated with O2/AFR
;--------------------------------------------------
page = 6
        egoAlgorithm= bits  , U08,       0,      [0:1], "Simple", "INVALID", "PID", "No correction" ; * (  1 byte)
        egoType     = bits  , U08,       0,      [2:3], "Disabled", "Narrow Band", "Wide Band", "INVALID"                  ; egoOption
        boostEnabled= bits,   U08,       0,      [4:4], "Off", "On"
        vvtEnabled  = bits,   U08,       0,      [5:5], "Off", "On"
#if table4_spark                                                                                                                 ;[PJSC v1.01]
        boostCutType= bits,   U08,       0,      [6:7], "Off", "Spark Only", "Fuel Only","Both"
#endif                                                                                                                           ;[PJSC v1.01]
#if table4_fuel                                                                                                                  ; |
        boostCutType= bits,   U08,       0,      [6:7], "Off", "INVALID", "Fuel Only","INVALID"                                  ; V
#endif                                                                                                                           ;[PJSC v1.01]

        egoKP       = scalar, U08,       1,             "%",        1.0,   0.0,  0.0,  200.0,      0 ; * (  1 byte)
        egoKI       = scalar, U08,       2,             "%",        1.0,   0.0,  0.0,  200.0,      0 ; * (  1 byte)
        egoKD       = scalar, U08,       3,             "%",        1.0,   0.0,  0.0,  200.0,      0 ; * (  1 byte)
    #if CELSIUS
        egoTemp    = scalar, U08,        4,             "C",        1.0, -40,  -40,  102.0,      0
    #else
        egoTemp    = scalar, U08,        4,             "F",       1.8,   -22.23,  -40,  215.0,      0
    #endif
        egoCount    = scalar, U08,       5,             "",         4.0,    0.0,  4.0,  255.0,      0 ; * (  1 byte)
        unused6-6   = scalar, U08,       6,             "%",        1.0,    0.0,  0.0,  255.0,      0
        egoLimit    = scalar, U08,       7,             "",         1,      0,    0,    16,         0
        ego_min     = scalar, U08,       8,             "AFR",      0.1,    0.0,  7,    25,         1
        ego_max     = scalar, U08,       9,             "AFR",      0.1,    0.0,  7,    25,         1
        ego_sdelay  = scalar, U08,      10,             "sec",      1,      0,    0,    120,        0
        egoRPM      = scalar, U08,      11,             "rpm",      100,    0.0,  100,  25500,      0
        egoTPSMax   = scalar, U08,      12,             "%",        1,      0,    0,    120,        0
        vvtPin      = bits  , U08,      13, [0:5],      "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
        useExtBaro  =   bits, U08,      13, [6:6],      "No", "Yes"
        boostMode   =   bits, U08,      13, [7:7],      "Simple", "Full"
        boostPin    =   bits, U08,      14, [0:5],      "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
        VVTasOnOff  =   bits, U08,      14, [6:6],      "No", "Yes"
        useEMAP     =   bits, U08,      14, [7:7],      "No", "Yes"
        brvBins     = array,  U08,      15, [6],        "V",        0.1,    0,    6,    24,         1 ; Bins for the battery reference voltage
        injBatRates = array,  U08,      21, [6],        "%",        1,      0,    0,    255,        0 ;Values for injector pulsewidth vs voltage
    #if CELSIUS
        airDenBins  = array,  U08,      27, [9],        "C",        1.0,    -40,  -40,  215,        0 ; Bins for the air density correction curve
    #else
        airDenBins  = array,  U08,      27, [9],        "F",        1.8,    -22.23,  -40,  215,        0 ; Bins for the air density correction curve
    #endif
        airDenRates = array,  U08,      36, [9],        "%",        1.0,    0.0,  0,    255,        0 ; Values for the air density correction curve

; PWM Frequencies
        boostFreq   = scalar, U08,      45,             "Hz",       2.0,    0.0,  10,   511,        0
        vvtFreq     = scalar, U08,      46,             "Hz",       2.0,    0.0,  10,   511,        0
        idleFreq    = scalar, U08,      47,             "Hz",       2.0,    0.0,  10,   511,        0

; Launch Control
        launchPin   = bits  , U08,      48, [0:5],      "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID"
        launchEnable= bits,   U08,      48, [6:6],      "No",        "Yes"
        launchHiLo  = bits,   U08,      48, [7:7],    "LOW",        "HIGH"

        lnchSoftLim = scalar, U08,      49,             "rpm",      100,    0.0,    100, 25500, 0
        lnchRetard  = scalar, S08,      50,             "deg",      1.0,    0.0,    -30,   40,   0
        lnchHardLim = scalar, U08,      51,             "rpm",      100,    0.0,    100, 25500,  0
        lnchFuelAdd = scalar, U08,      52,             "%",        1.0,    0.0,    0.0,   80,   0

        idleKP       = scalar, U08,     53,             "%",        1.0,   0.0,  0.0,  200.0,      0 ; * (  1 byte)
        idleKI       = scalar, U08,     54,             "%",        1.0,   0.0,  0.0,  200.0,      0 ; * (  1 byte)
        idleKD       = scalar, U08,     55,             "%",        1.0,   0.0,  0.0,  200.0,      0 ; * (  1 byte)
        boostLimit   = scalar, U08,     56,             "kPa",      2.0,   0.0,  0.0,  511.0,      0
        boostKP      = scalar, U08,     57,             "%",        1.0,   0.0,  0.0,  200.0,      0 ; * (  1 byte)
        boostKI      = scalar, U08,     58,             "%",        1.0,   0.0,  0.0,  200.0,      0 ; * (  1 byte)
        boostKD      = scalar, U08,     59,             "%",        1.0,   0.0,  0.0,  200.0,      0 ; * (  1 byte)

	    lnchPullRes  =   bits, U08,      60,        [0:1],      "Float"  , "Pullup", "INVALID", "INVALID"
        fuelTrimEnabled= bits, U08,      60,        [2:2],      "No",        "Yes"
        flatSEnable  =   bits, U08,      60,        [3:3],      "No",        "Yes"
; Baro Sensor pin
        baroPin      =   bits, U08,      60,        [4:7],      "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A8", "A10", "A11", "A12", "A13", "A14", "A15"

; Flat shift
        flatSSoftWin = scalar, U08,      61,             "rpm",      100,    0.0,  100, 25500,  0
        flatSRetard  = scalar, U08,      62,             "deg",      1.0,    0.0,  0.0,   80,   0
        flatSArm     = scalar, U08,      63,             "rpm",      100,    0.0,  100, 25500,  0

        iacCLValues  = array, U08,       64, [10],        "RPM",    10.0,  0.0,      0,  2550,     0
        iacOLStepVal = array, U08,       74, [10],       "Steps",      3,    0,      0,		765,    0
        iacOLPWMVal  = array, U08,       84, [10],       "Duty %",   1.0,    0,      0,      100,    0
    #if CELSIUS
        iacBins      = array, U08,       94, [10],       "C",        1.0,    -40,    -40,    215,      0
    #else
        iacBins      = array, U08,       94, [10],       "F",        1.8,    -22.23,    -40,    215,      0
    #endif
        iacCrankSteps= array, U08,      104, [4],        "Steps",      3,    0,  	0,  	765,    0
        iacCrankDuty = array, U08,      108, [4],        "Duty %",   1.0,    0,  0,  100,    0
    #if CELSIUS
        iacCrankBins = array, U08,      112, [4],        "C",        1.0,    -40,    -40,    215,      0
    #else
        iacCrankBins = array, U08,      112, [4],        "F",        1.8,    -22.23,    -40,    215,      0
    #endif

;[PJSC]        iacAlgorithm = bits , U08,      116, [0:2],      "None", "On/Off", "PWM Open loop", "PWM Closed loop", "Stepper Open Loop", "Stepper Closed Loop", "INVALID", "INVALID"
        iacAlgorithm = bits , U08,      116, [0:2],      "None", "On/Off", "PWM Open loop", "PWM Closed loop", "INVALID", "INVALID", "INVALID", "INVALID"            ;[PJSC]
        iacStepTime  = bits , U08,      116, [3:5],      "INVALID","1", "2", "3", "4", "5", "6","INVALID"
        iacChannels  = bits,  U08,      116, [6:6],      "1", "2"
        iacPWMdir    = bits , U08,      116, [7:7],      "Normal", "Reverse"

    #if CELSIUS
        iacFastTemp  = scalar, U08,     117,             "C",        1.0,    -40,    -40,    215,      0
    #else
        iacFastTemp  = scalar, U08,     117,             "F",        1.8,    -22.23,    -40,    215,      0
    #endif

        iacStepHome  = scalar, U08,     118,             "Steps",     3,    0,  0,  765,    0
        iacStepHyster= scalar, U08,     119,             "Steps",         1,  0.0,  0.0,  10,   0

        ; Begin fan control vairables
        fanInv       = bits,   U08,     120, [0:0], "No",        "Yes"
        fanEnable    = bits,   U08,     120, [1:1], "Off",       "On/Off"
        fanPin       = bits,   U08,     120, [2:7], "Board Default", "INVALID", "INVALID", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", "54", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "INVALID"
    #if CELSIUS
        fanSP        = scalar, U08,     121,        "C",        1.0,       -40,     -40,     215.0,    0
        fanHyster    = scalar, U08,     122,        "C",        1.0,       0.0,  0.0,     40,    0
    #else
        fanSP        = scalar, U08,     121,        "F",        1.8,       -22.23,  -40,     215.0,    0
        fanHyster    = scalar, U08,     122,        "F",        1.0,       0.0,  0.0,     40,    0
    #endif
        fanFreq      = scalar, U08 ,    123,        "Hz",        2.0,        0.0,    10,     511,       0
    #if CELSIUS
        fanPWMBins = array, U08,      124, [4],        "C",        1.0,    -40,    -40,    215,      0
    #else
        fanPWMBins = array, U08,      124, [4],        "F",        1.8,    -22.23,    -40,    215,      0
    #endif

;--------------------------------------------------
;Boost and vvt maps (Page 7)
;--------------------------------------------------
page = 7
;notes for boostTable in PSI~~~There are 6.895 psis to a kPa then x 2 like the kPa ver~~~div atmos. pressure in kPa by 2 and make neg so to subtract instead of add
;    #if BOOSTPSI
;        boostTable    = array,  U08,    0,[8x8],    "PSI",        0.29007547546041846,   -50.6625,   0,       74,      0
;    #else
        boostTable    = array,  U08,    0,[8x8],    { bitStringValue( boostTableLabels, boostType ) },        2.0,        0.0,   0,       boostTableLimit,      0
;    #endif
        rpmBinsBoost  = array,  U08,    64,[  8],   "RPM",      100.0,      0.0,   100,     25500,      0
        tpsBinsBoost  = array,  U08,    72,[  8],   "TPS",      1.0,        0.0,   0.0,     255.0,      0
        vvtTable      = array,  U08,    80,[8x8],    "%",        1.0,        0.0,   0,       100,      0
        rpmBinsVVT    = array,  U08,    144,[  8],   "RPM",      100.0,      0.0,   100,     25500,      0
        tpsBinsVVT    = array,  U08,    152,[  8],   "TPS",      1.0,        0.0,   0.0,     255.0,      0
;Fuel staging Table
        stagingTable  = array,  U08,    160, [8x8], "%",          1.0,      0.0,   0.0,   100.0,      0
        rpmBinsStaging= array,  U08,    224, [  8], "RPM",      100.0,      0.0,   100.0, 25500.0,      0
        #if SPEED_DENSITY
        mapBinsStaging= array,  U08,    232, [  8], "kPa",        2.0,      0.0,   0.0,   511.0,      0
        #elif ALPHA_N
        tpsBinsStaging= array,  U08,    232, [  8], "TPS",        2.0,      0.0,   0.0,   100.0,      0
        #endif

;--------------------------------------------------
;Sequential fuel trim tables (Page 8)
;--------------------------------------------------
;[PJSC v1.01]page = 8
;[PJSC v1.01]        fuelTrim1Table      = array,  U08,     0,[6x6],     "%",    1.0,    -128,   -50,    50,        0
;[PJSC v1.01]        fuelTrim1rpmBins    = array,  U08,    36,[  6],     "RPM",  100.0,  0.0,   0,     25500,      0
;[PJSC v1.01]#if SPEED_DENSITY
;[PJSC v1.01]        fuelTrim1loadBins   = array,  U08,    42,[  6],     "kPa",  2.0,    0.0,   0.0,     511.0,      0
;[PJSC v1.01]#elif ALPHA_N
;[PJSC v1.01]        fuelTrim1loadBins   = array,  U08,    42,[  6],     "TPS",  2.0,    0.0,   0.0,     100.0,      0
;[PJSC v1.01]#endif
;[PJSC v1.01]
;[PJSC v1.01]        fuelTrim2Table      = array,  U08,    48,[6x6],     "%",    1.0,    -128,   -50,    50,         0
;[PJSC v1.01]        fuelTrim2rpmBins    = array,  U08,    84,[  6],     "RPM",  100.0,  0.0,   0,     25500,      0
;[PJSC v1.01]#if SPEED_DENSITY
;[PJSC v1.01]        fuelTrim2loadBins   = array,  U08,    90,[  6],     "kPa",  2.0,    0.0,   0.0,     511.0,      0
;[PJSC v1.01]#elif ALPHA_N
;[PJSC v1.01]        fuelTrim2loadBins   = array,  U08,    90,[  6],     "TPS",  2.0,    0.0,   0.0,     100.0,      0
;[PJSC v1.01]#endif
;[PJSC v1.01]
;[PJSC v1.01]        fuelTrim3Table      = array,  U08,    96,[6x6],     "%",    1.0,    -128,  -50,     50,         0
;[PJSC v1.01]        fuelTrim3rpmBins    = array,  U08,   132,[  6],     "RPM",  100.0,  0.0,   0,     25500,      0
;[PJSC v1.01]#if SPEED_DENSITY
;[PJSC v1.01]        fuelTrim3loadBins   = array,  U08,   138,[  6],     "kPa",  2.0,    0.0,   0.0,     511.0,      0
;[PJSC v1.01]#elif ALPHA_N
;[PJSC v1.01]        fuelTrim3loadBins   = array,  U08,   138,[  6],     "TPS",  2.0,    0.0,   0.0,     100.0,      0
;[PJSC v1.01]#endif
;[PJSC v1.01]
;[PJSC v1.01]        fuelTrim4Table      = array,  U08,   144,[6x6],     "%",    1.0,    -128,  -50,     50,         0
;[PJSC v1.01]        fuelTrim4rpmBins    = array,  U08,   180,[  6],     "RPM",  100.0,  0.0,   0,     25500,      0
;[PJSC v1.01]#if SPEED_DENSITY
;[PJSC v1.01]        fuelTrim4loadBins   = array,  U08,   186,[  6],     "kPa",  2.0,    0.0,   0.0,     511.0,      0
;[PJSC v1.01]#elif ALPHA_N
;[PJSC v1.01]        fuelTrim4loadBins   = array,  U08,   186,[  6],     "TPS",  2.0,    0.0,   0.0,     100.0,      0
;[PJSC v1.01]#endif

;--------------------------------------------------
;CANBUS control and Auxillary io(Page 9)
;--------------------------------------------------
;[PJSC v1.01]page = 9
page = 8     ;[PJSC v1.01]
        enable_secondarySerial    = bits,   U08,     0, [0:0], "Disable", "Enable"
        intcan_available          = bits,   U08,     0, [1:1], "Disable", "Enable"
		enable_intcan             = bits,   U08,     0, [2:2], "Disable", "Enable"
		 
        caninput_sel0a            = bits,   U08,     1, [0:1], "Off", "INVALID", "Analog_local", "Digital_local"
        caninput_sel0b            = bits,   U08,     1, [2:3], "Off", "External Source", "Analog_local", "Digital_local"
		caninput_sel0extsourcea   = bits,   U08,     1, [5:5], "Via Secondary Serial", "INVALID"
		caninput_sel0extsourceb   = bits,   U08,     1, [6:6], "Via Secondary Serial", "Via Internal CAN"        
		caninput_sel0extsourcec   = bits,   U08,     1, [7:7], "INVALID", "Via Internal CAN"

        caninput_sel1a            = bits,   U08,     2, [0:1], "Off", "INVALID", "Analog_local", "Digital_local"
        caninput_sel1b            = bits,   U08,     2, [2:3], "Off", "External Source", "Analog_local", "Digital_local"
		caninput_sel1extsourcea   = bits,   U08,     2, [5:5], "Via Secondary Serial", "INVALID"
		caninput_sel1extsourceb   = bits,   U08,     2, [6:6], "Via Secondary Serial", "Via Internal CAN"       
		caninput_sel1extsourcec   = bits,   U08,     2, [7:7], "INVALID", "Via Internal CAN"		

        caninput_sel2a            = bits,   U08,     3, [0:1], "Off", "INVALID", "Analog_local", "Digital_local"
        caninput_sel2b            = bits,   U08,     3, [2:3], "Off", "External Source", "Analog_local", "Digital_local"
		caninput_sel2extsourcea   = bits,   U08,     3, [5:5], "Via Secondary Serial", "INVALID"
		caninput_sel2extsourceb   = bits,   U08,     3, [6:6], "Via Secondary Serial", "Via Internal CAN"
		caninput_sel2extsourcec   = bits,   U08,     3, [7:7], "INVALID", "Via Internal CAN"		

        caninput_sel3a            = bits,   U08,     4, [0:1], "Off", "INVALID", "Analog_local", "Digital_local"
        caninput_sel3b            = bits,   U08,     4, [2:3], "Off", "External Source", "Analog_local", "Digital_local"
		caninput_sel3extsourcea   = bits,   U08,     4, [5:5], "Via Secondary Serial", "INVALID"
		caninput_sel3extsourceb   = bits,   U08,     4, [6:6], "Via Secondary Serial", "Via Internal CAN"
		caninput_sel3extsourcec   = bits,   U08,     4, [7:7], "INVALID", "Via Internal CAN"		

        caninput_sel4a            = bits,   U08,     5, [0:1], "Off", "INVALID", "Analog_local", "Digital_local"
        caninput_sel4b            = bits,   U08,     5, [2:3], "Off", "External Source", "Analog_local", "Digital_local"
		caninput_sel4extsourcea   = bits,   U08,     5, [5:5], "Via Secondary Serial", "INVALID"
		caninput_sel4extsourceb   = bits,   U08,     5, [6:6], "Via Secondary Serial", "Via Internal CAN"
		caninput_sel4extsourcec   = bits,   U08,     5, [7:7], "INVALID", "Via Internal CAN"		

        caninput_sel5a            = bits,   U08,     6, [0:1], "Off", "INVALID", "Analog_local", "Digital_local"
        caninput_sel5b            = bits,   U08,     6, [2:3], "Off", "External Source", "Analog_local", "Digital_local"
		caninput_sel5extsourcea   = bits,   U08,     6, [5:5], "Via Secondary Serial", "INVALID"
		caninput_sel5extsourceb   = bits,   U08,     6, [6:6], "Via Secondary Serial", "Via Internal CAN"
		caninput_sel5extsourcec   = bits,   U08,     6, [7:7], "INVALID", "Via Internal CAN"				

        caninput_sel6a            = bits,   U08,     7, [0:1], "Off", "INVALID", "Analog_local", "Digital_local"
        caninput_sel6b            = bits,   U08,     7, [2:3], "Off", "External Source", "Analog_local", "Digital_local"
		caninput_sel6extsourcea   = bits,   U08,     7, [5:5], "Via Secondary Serial", "INVALID"
		caninput_sel6extsourceb   = bits,   U08,     7, [6:6], "Via Secondary Serial", "Via Internal CAN"
		caninput_sel6extsourcec   = bits,   U08,     7, [7:7], "INVALID", "Via Internal CAN"		

        caninput_sel7a            = bits,   U08,     8, [0:1], "Off", "INVALID", "Analog_local", "Digital_local"
        caninput_sel7b            = bits,   U08,     8, [2:3], "Off", "External Source", "Analog_local", "Digital_local"
		caninput_sel7extsourcea   = bits,   U08,     8, [5:5], "Via Secondary Serial", "INVALID"
		caninput_sel7extsourceb   = bits,   U08,     8, [6:6], "Via Secondary Serial", "Via Internal CAN"
		caninput_sel7extsourcec   = bits,   U08,     8, [7:7], "INVALID", "Via Internal CAN"		

        caninput_sel8a            = bits,   U08,     9, [0:1], "Off", "INVALID", "Analog_local", "Digital_local"
        caninput_sel8b            = bits,   U08,     9, [2:3], "Off", "External Source", "Analog_local", "Digital_local"
		caninput_sel8extsourcea   = bits,   U08,     9, [5:5], "Via Secondary Serial", "INVALID"
		caninput_sel8extsourceb   = bits,   U08,     9, [6:6], "Via Secondary Serial", "Via Internal CAN"
		caninput_sel8extsourcec   = bits,   U08,     9, [7:7], "INVALID", "Via Internal CAN"		

        caninput_sel9a            = bits,   U08,     10, [0:1], "Off", "INVALID", "Analog_local", "Digital_local"
        caninput_sel9b            = bits,   U08,     10, [2:3], "Off", "External Source", "Analog_local", "Digital_local"
		caninput_sel9extsourcea   = bits,   U08,     10, [5:5], "Via Secondary Serial", "INVALID"
		caninput_sel9extsourceb   = bits,   U08,     10, [6:6], "Via Secondary Serial", "Via Internal CAN"
		caninput_sel9extsourcec   = bits,   U08,     10, [7:7], "INVALID", "Via Internal CAN"		
		
        caninput_sel10a           = bits,   U08,     11, [0:1], "Off", "INVALID", "Analog_local", "Digital_local"
        caninput_sel10b           = bits,   U08,     11, [2:3], "Off", "External Source", "Analog_local", "Digital_local"
		caninput_sel10extsourcea  = bits,   U08,     11, [5:5], "Via Secondary Serial", "INVALID"
		caninput_sel10extsourceb  = bits,   U08,     11, [6:6], "Via Secondary Serial", "Via Internal CAN"
		caninput_sel10extsourcec  = bits,   U08,     11, [7:7], "INVALID", "Via Internal CAN"		

        caninput_sel11a           = bits,   U08,     12, [0:1], "Off", "INVALID", "Analog_local", "Digital_local"
        caninput_sel11b           = bits,   U08,     12, [2:3], "Off", "External Source", "Analog_local", "Digital_local"
		caninput_sel11extsourcea  = bits,   U08,     12, [5:5], "Via Secondary Serial", "INVALID"
		caninput_sel11extsourceb  = bits,   U08,     12, [6:6], "Via Secondary Serial", "Via Internal CAN"
		caninput_sel11extsourcec  = bits,   U08,     12, [7:7], "INVALID", "Via Internal CAN"		

        caninput_sel12a           = bits,   U08,     13, [0:1], "Off", "INVALID", "Analog_local", "Digital_local"
        caninput_sel12b           = bits,   U08,     13, [2:3], "Off", "External Source", "Analog_local", "Digital_local"
		caninput_sel12extsourcea  = bits,   U08,     13, [5:5], "Via Secondary Serial", "INVALID"
		caninput_sel12extsourceb  = bits,   U08,     13, [6:6], "Via Secondary Serial", "Via Internal CAN"
		caninput_sel12extsourcec  = bits,   U08,     13, [7:7], "INVALID", "Via Internal CAN"		

        caninput_sel13a           = bits,   U08,     14, [0:1], "Off", "INVALID", "Analog_local", "Digital_local"
        caninput_sel13b           = bits,   U08,     14, [2:3], "Off", "External Source", "Analog_local", "Digital_local"
		caninput_sel13extsourcea  = bits,   U08,     14, [5:5], "Via Secondary Serial", "INVALID"
		caninput_sel13extsourceb  = bits,   U08,     14, [6:6], "Via Secondary Serial", "Via Internal CAN"
		caninput_sel13extsourcec  = bits,   U08,     14, [7:7], "INVALID", "Via Internal CAN"		

        caninput_sel14a           = bits,   U08,     15, [0:1], "Off", "INVALID", "Analog_local", "Digital_local"
        caninput_sel14b           = bits,   U08,     15, [2:3], "Off", "External Source", "Analog_local", "Digital_local"
		caninput_sel14extsourcea  = bits,   U08,     15, [5:5], "Via Secondary Serial", "INVALID"
		caninput_sel14extsourceb  = bits,   U08,     15, [6:6], "Via Secondary Serial", "Via Internal CAN"
		caninput_sel14extsourcec  = bits,   U08,     15, [7:7], "INVALID", "Via Internal CAN"		

        caninput_sel15a           = bits,   U08,     16, [0:1], "Off", "INVALID", "Analog_local", "Digital_local"
        caninput_sel15b           = bits,   U08,     16, [2:3], "Off", "External Source", "Analog_local", "Digital_local"
		caninput_sel15extsourcea  = bits,   U08,     16, [5:5], "Via Secondary Serial", "INVALID"
		caninput_sel15extsourceb  = bits,   U08,     16, [6:6], "Via Secondary Serial", "Via Internal CAN"
		caninput_sel15extsourcec  = bits,   U08,     16, [7:7], "INVALID", "Via Internal CAN"		
		       
        caninput_source_can_address0 = bits,   U16,     17, 		    [0:10], $CAN_ADDRESS_HEX
        caninput_source_can_address1 = bits,   U16,     19, 		    [0:10], $CAN_ADDRESS_HEX
        caninput_source_can_address2 = bits,   U16,     21, 		    [0:10], $CAN_ADDRESS_HEX
        caninput_source_can_address3 = bits,   U16,     23, 		    [0:10], $CAN_ADDRESS_HEX
        caninput_source_can_address4 = bits,   U16,     25, 		    [0:10], $CAN_ADDRESS_HEX
        caninput_source_can_address5 = bits,   U16,     27, 		    [0:10], $CAN_ADDRESS_HEX
        caninput_source_can_address6 = bits,   U16,     29, 		    [0:10], $CAN_ADDRESS_HEX
        caninput_source_can_address7 = bits,   U16,     31, 		    [0:10], $CAN_ADDRESS_HEX
        caninput_source_can_address8 = bits,   U16,     33, 		    [0:10], $CAN_ADDRESS_HEX
        caninput_source_can_address9 = bits,   U16,     35, 		    [0:10], $CAN_ADDRESS_HEX
        caninput_source_can_address10 = bits,  U16,     37, 		    [0:10], $CAN_ADDRESS_HEX
        caninput_source_can_address11 = bits,  U16,     39, 		    [0:10], $CAN_ADDRESS_HEX
        caninput_source_can_address12 = bits,  U16,     41, 		    [0:10], $CAN_ADDRESS_HEX
        caninput_source_can_address13 = bits,  U16,     43, 		    [0:10], $CAN_ADDRESS_HEX
        caninput_source_can_address14 = bits,  U16,     45, 		    [0:10], $CAN_ADDRESS_HEX
        caninput_source_can_address15 = bits,  U16,     47, 		    [0:10], $CAN_ADDRESS_HEX

        caninput_source_start_byte0 = bits,   U08,     49, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        caninput_source_start_byte1 = bits,   U08,     50, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        caninput_source_start_byte2 = bits,   U08,     51, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        caninput_source_start_byte3 = bits,   U08,     52, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        caninput_source_start_byte4 = bits,   U08,     53, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        caninput_source_start_byte5 = bits,   U08,     54, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        caninput_source_start_byte6 = bits,   U08,     55, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        caninput_source_start_byte7 = bits,   U08,     56, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        caninput_source_start_byte8 = bits,   U08,     57, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        caninput_source_start_byte9 = bits,   U08,     58, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        caninput_source_start_byte10 = bits,   U08,     59, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        caninput_source_start_byte11 = bits,   U08,     60, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        caninput_source_start_byte12 = bits,   U08,     61, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        caninput_source_start_byte13 = bits,   U08,     62, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        caninput_source_start_byte14 = bits,   U08,     63, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        caninput_source_start_byte15 = bits,   U08,     64, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"

        caninput_source_num_bytes0 = bits,    U16,     65, [0:0], "1", "2"
        caninput_source_num_bytes1 = bits,    U16,     65, [1:1], "1", "2"
        caninput_source_num_bytes2 = bits,    U16,     65, [2:2], "1", "2"
        caninput_source_num_bytes3 = bits,    U16,     65, [3:3], "1", "2"
        caninput_source_num_bytes4 = bits,    U16,     65, [4:4], "1", "2"
        caninput_source_num_bytes5 = bits,    U16,     65, [5:5], "1", "2"
        caninput_source_num_bytes6 = bits,    U16,     65, [6:6], "1", "2"
        caninput_source_num_bytes7 = bits,    U16,     65, [7:7], "1", "2"
        caninput_source_num_bytes8 = bits,    U16,     65, [8:8], "1", "2"
        caninput_source_num_bytes9 = bits,    U16,     65, [9:9], "1", "2"
        caninput_source_num_bytes10 = bits,   U16,     65, [10:10], "1", "2"
        caninput_source_num_bytes11 = bits,   U16,     65, [11:11], "1", "2"
        caninput_source_num_bytes12 = bits,   U16,     65, [12:12], "1", "2"
        caninput_source_num_bytes13 = bits,   U16,     65, [13:13], "1", "2"
        caninput_source_num_bytes14 = bits,   U16,     65, [14:14], "1", "2"
        caninput_source_num_bytes15 = bits,   U16,     65, [15:15], "1", "2"

        unused10_67         = scalar, U08,     67,        "",       1, 0, 0, 255, 0
        unused10_68         = scalar, U08,     68,        "",       1, 0, 0, 255, 0
		
        enable_intcandata_out  = bits,   U08,     69, [0:0], "Off", "On"
        canoutput_sel0       = bits,   U08,    70, [0:0], "Off", "On"
        canoutput_sel1       = bits,   U08,    71, [0:0], "Off", "On"
        canoutput_sel2       = bits,   U08,    72, [0:0], "Off", "On"
        canoutput_sel3       = bits,   U08,    73, [0:0], "Off", "On"
        canoutput_sel4       = bits,   U08,    74, [0:0], "Off", "On"
        canoutput_sel5       = bits,   U08,    75, [0:0], "Off", "On"
        canoutput_sel6       = bits,   U08,    76, [0:0], "Off", "On"
        canoutput_sel7       = bits,   U08,    77, [0:0], "Off", "On"
        canoutput_param_group  = array ,  U16,   78,    	[  8],	"",		1, 0, 0, 65535, 0
        canoutput_param_start_byte0 = bits,   U08,     94, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        canoutput_param_start_byte1 = bits,   U08,     95, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        canoutput_param_start_byte2 = bits,   U08,     96, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        canoutput_param_start_byte3 = bits,   U08,     97, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        canoutput_param_start_byte4 = bits,   U08,     98, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        canoutput_param_start_byte5 = bits,   U08,     99, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
        canoutput_param_start_byte6 = bits,   U08,     100, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
    	canoutput_param_start_byte7 = bits,   U08,     101, [0:2], "0", "1", "2", "3", "4", "5", "6", "7"
    	canoutput_param_num_bytes0 = bits,   U08,     102, [0:1], "INVALID", "1", "2", "INVALID"
        canoutput_param_num_bytes1 = bits,   U08,     103, [0:1], "INVALID", "1", "2", "INVALID"
        canoutput_param_num_bytes2 = bits,   U08,     104, [0:1], "INVALID", "1", "2", "INVALID"
        canoutput_param_num_bytes3 = bits,   U08,     105, [0:1], "INVALID", "1", "2", "INVALID"
        canoutput_param_num_bytes4 = bits,   U08,     106, [0:1], "INVALID", "1", "2", "INVALID"
        canoutput_param_num_bytes5 = bits,   U08,     107, [0:1], "INVALID", "1", "2", "INVALID"
        canoutput_param_num_bytes6 = bits,   U08,     108, [0:1], "INVALID", "1", "2", "INVALID"
    	canoutput_param_num_bytes7 = bits,   U08,     109, [0:1], "INVALID", "1", "2", "INVALID"

        unused10_110         = scalar, U08,     110,        "",       1, 0, 0, 255, 0
        unused10_111         = scalar, U08,     111,        "",       1, 0, 0, 255, 0
        unused10_112         = scalar, U08,     112,        "",       1, 0, 0, 255, 0
        unused10_113         = scalar, U08,     113,        "",       1, 0, 0, 255, 0

		speeduino_tsCanId	   = bits,	 U08,	  114, 		[0:3],  $tsCanId_list
        true_address           = bits,   U16,     115, 		[0:10], $CAN_ADDRESS_HEX
        realtime_base_address  = bits,   U16,     117,   	[0:10], $CAN_ADDRESS_HEX
        obd_address            = bits,   U16,     119, 	    [0:10], $CAN_ADDRESS_HEX

        Auxin0pina        = bits,	 U08,	  121, 		[0:5],  $ANALOG_PIN
        Auxin1pina        = bits,	 U08,	  122, 		[0:5],  $ANALOG_PIN
        Auxin2pina        = bits,	 U08,	  123, 		[0:5],  $ANALOG_PIN
        Auxin3pina        = bits,	 U08,	  124, 		[0:5],  $ANALOG_PIN
        Auxin4pina        = bits,	 U08,	  125, 		[0:5],  $ANALOG_PIN
        Auxin5pina        = bits,	 U08,	  126, 		[0:5],  $ANALOG_PIN
        Auxin6pina        = bits,	 U08,	  127, 		[0:5],  $ANALOG_PIN
        Auxin7pina        = bits,	 U08,	  128, 		[0:5],  $ANALOG_PIN
        Auxin8pina        = bits,	 U08,	  129, 		[0:5],  $ANALOG_PIN
        Auxin9pina        = bits,	 U08,	  130, 		[0:5],  $ANALOG_PIN
        Auxin10pina       = bits,	 U08,	  131, 		[0:5],  $ANALOG_PIN
        Auxin11pina       = bits,	 U08,	  132, 		[0:5],  $ANALOG_PIN
        Auxin12pina       = bits,	 U08,	  133, 		[0:5],  $ANALOG_PIN
        Auxin13pina       = bits,	 U08,	  134, 		[0:5],  $ANALOG_PIN
		Auxin14pina       = bits,	 U08,	  135, 		[0:5],  $ANALOG_PIN
        Auxin15pina       = bits,	 U08,	  136, 		[0:5],  $ANALOG_PIN
		
		Auxin0pinb        = bits,	 U08,	  137, 		[0:5],  $DIGITAL_PIN
        Auxin1pinb        = bits,	 U08,	  138, 		[0:5],  $DIGITAL_PIN
        Auxin2pinb        = bits,	 U08,	  139, 		[0:5],  $DIGITAL_PIN
        Auxin3pinb        = bits,	 U08,	  140, 		[0:5],  $DIGITAL_PIN
        Auxin4pinb        = bits,	 U08,	  141, 		[0:5],  $DIGITAL_PIN
        Auxin5pinb        = bits,	 U08,	  142, 		[0:5],  $DIGITAL_PIN
        Auxin6pinb        = bits,	 U08,	  143, 		[0:5],  $DIGITAL_PIN
        Auxin7pinb        = bits,	 U08,	  144, 		[0:5],  $DIGITAL_PIN
        Auxin8pinb        = bits,	 U08,	  145, 		[0:5],  $DIGITAL_PIN
        Auxin9pinb        = bits,	 U08,	  146, 		[0:5],  $DIGITAL_PIN
        Auxin10pinb       = bits,	 U08,	  147, 		[0:5],  $DIGITAL_PIN
        Auxin11pinb       = bits,	 U08,	  148, 		[0:5],  $DIGITAL_PIN
        Auxin12pinb       = bits,	 U08,	  149, 		[0:5],  $DIGITAL_PIN
        Auxin13pinb       = bits,	 U08,	  150, 		[0:5],  $DIGITAL_PIN
		Auxin14pinb       = bits,	 U08,	  151, 		[0:5],  $DIGITAL_PIN
        Auxin15pinb       = bits,	 U08,	  152, 		[0:5],  $DIGITAL_PIN
        
		;unused10_137        = scalar, U08,    137,       "",       1, 0, 0, 255, 0
        ;unused10_138        = scalar, U08,    138,       "",       1, 0, 0, 255, 0
        ;unused10_139        = scalar, U08,    139,       "",       1, 0, 0, 255, 0
        ;unused10_140        = scalar, U08,    140,       "",       1, 0, 0, 255, 0
        ;unused10_141        = scalar, U08,    141,       "",       1, 0, 0, 255, 0
		;unused10_142        = scalar, U08,    142,       "",       1, 0, 0, 255, 0
        ;unused10_143        = scalar, U08,    143,       "",       1, 0, 0, 255, 0
        ;unused10_144        = scalar, U08,    144,       "",       1, 0, 0, 255, 0
        ;unused10_145        = scalar, U08,    145,       "",       1, 0, 0, 255, 0
        ;unused10_146        = scalar, U08,    146,       "",       1, 0, 0, 255, 0
        ;unused10_147        = scalar, U08,    147,       "",       1, 0, 0, 255, 0
        ;unused10_148        = scalar, U08,    148,       "",       1, 0, 0, 255, 0
		;unused10_149        = scalar, U08,    149,       "",       1, 0, 0, 255, 0
        ;unused10_150        = scalar, U08,    150,       "",       1, 0, 0, 255, 0
        ;unused10_151        = scalar, U08,    151,       "",       1, 0, 0, 255, 0
        ;unused10_152        = scalar, U08,    152,       "",       1, 0, 0, 255, 0
        ;unused10_153        = scalar, U08,    153,       "",       1, 0, 0, 255, 0
        iacStepperInv  = bits,   U08,     153, [0:0], "No",        "Yes"

        unused10_154        = scalar, U08,    154,       "",       1, 0, 0, 255, 0
        unused10_155        = scalar, U08,    155,       "",       1, 0, 0, 255, 0
		unused10_156        = scalar, U08,    156,       "",       1, 0, 0, 255, 0
        unused10_157        = scalar, U08,    157,       "",       1, 0, 0, 255, 0
        unused10_158        = scalar, U08,    158,       "",       1, 0, 0, 255, 0
        unused10_159        = scalar, U08,    159,       "",       1, 0, 0, 255, 0
        unused10_160        = scalar, U08,    160,       "",       1, 0, 0, 255, 0
        unused10_161        = scalar, U08,    161,       "",       1, 0, 0, 255, 0
        unused10_162        = scalar, U08,    162,       "",       1, 0, 0, 255, 0		
		unused10_163        = scalar, U08,    163,       "",       1, 0, 0, 255, 0
        unused10_164        = scalar, U08,    164,       "",       1, 0, 0, 255, 0
        unused10_165        = scalar, U08,    165,       "",       1, 0, 0, 255, 0
        unused10_166        = scalar, U08,    166,       "",       1, 0, 0, 255, 0
        unused10_167        = scalar, U08,    167,       "",       1, 0, 0, 255, 0
        unused10_168        = scalar, U08,    168,       "",       1, 0, 0, 255, 0
        unused10_169        = scalar, U08,    169,       "",       1, 0, 0, 255, 0
		unused10_170        = scalar, U08,    170,       "",       1, 0, 0, 255, 0
        unused10_171        = scalar, U08,    171,       "",       1, 0, 0, 255, 0
        unused10_172        = scalar, U08,    172,       "",       1, 0, 0, 255, 0
        unused10_173        = scalar, U08,    173,       "",       1, 0, 0, 255, 0
        unused10_174        = scalar, U08,    174,       "",       1, 0, 0, 255, 0
        unused10_175        = scalar, U08,    175,       "",       1, 0, 0, 255, 0
        unused10_176        = scalar, U08,    176,       "",       1, 0, 0, 255, 0
		unused10_177        = scalar, U08,    177,       "",       1, 0, 0, 255, 0
        unused10_178        = scalar, U08,    178,       "",       1, 0, 0, 255, 0
        unused10_179        = scalar, U08,    179,       "",       1, 0, 0, 255, 0
        unused10_180        = scalar, U08,    180,       "",       1, 0, 0, 255, 0
        unused10_181        = scalar, U08,    181,       "",       1, 0, 0, 255, 0
        unused10_182        = scalar, U08,    182,       "",       1, 0, 0, 255, 0
        unused10_183        = scalar, U08,    183,       "",       1, 0, 0, 255, 0
		unused10_184        = scalar, U08,    184,       "",       1, 0, 0, 255, 0
        unused10_185        = scalar, U08,    185,       "",       1, 0, 0, 255, 0
        unused10_186        = scalar, U08,    186,       "",       1, 0, 0, 255, 0
        unused10_187        = scalar, U08,    187,       "",       1, 0, 0, 255, 0
        unused10_188        = scalar, U08,    188,       "",       1, 0, 0, 255, 0
        unused10_189        = scalar, U08,    189,       "",       1, 0, 0, 255, 0
        unused10_190        = scalar, U08,    190,       "",       1, 0, 0, 255, 0
        blankfield          = bits,   U08,    191,      [0:0], "",""
		
;[PJSC v1.01]page = 10
page = 9     ;[PJSC v1.01]
#if CELSIUS
        crankingEnrichBins  = array,  U08,       0, [4],  "C",        1.0,    -40,    -40,    215,      0
#else
        crankingEnrichBins  = array,  U08,       0, [4],  "F",        1.8,    -22.23,    -40,    215,      0
#endif
;[PJSC v1.03]        crankingEnrichValues= array,  U08,       4, [4],  "%",        1.0,    0.0,  0,    255,        0 ; Values for the cranking enrichment curve
        crankingEnrichValues= array,  U08,       4, [4],  "%",        5.0,    0.0,  0,    1275,       0 ;[PJSC v1.03] Values for the cranking enrichment curve

        rotaryType          = bits ,  U08,       8, [0:1],           "FC", "FD", "RX8", "INVALID"
        stagingEnabled      = bits ,  U08,       8, [2:2],           "Off","On"
        stagingMode         = bits ,  U08,       8, [3:3],           "Table","Automatic"
        EMAPPin             = bits,   U08,       8, [4:7],      "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A8", "A10", "A11", "A12", "A13", "A14", "A15"

        rotarySplitValues   = array,  U08,       9, [8],   "degrees", 1.0,    0.0,   0.0,     40,         0
#if SPEED_DENSITY
        rotarySplitBins     = array,  U08,      17, [8],     "kPa",  2.0,    0.0,   0.0,     511.0,      0
#elif ALPHA_N
        rotarySplitBins     = array,  U08,      17, [8],     "TPS",  2.0,    0.0,   0.0,     100.0,      0
#endif
        boostSens           = scalar, U16,      25,      "",       1, 0, 0, 5000, 0
        boostIntv           = scalar, U08,      27,      "ms",     1, 0,  0,  250, 0
        stagedInjSizePri    = scalar, U16,      28,      "cc/min",       1, 0, 0, 1500, 0
        stagedInjSizeSec    = scalar, U16,      30,      "cc/min",       1, 0, 0, 1500, 0
        lnchCtrlTPS         = scalar, U08,      32,      "%TPS",         1, 0, 0, 100, 0

        flexBoostBins       = array,  U08,      33, [6], "%",    1.0,       0.0,   0.0,     250.0,    0
        ; The boost range is obviously arbitrary since int16_t has ~32k in both directions
        flexBoostAdj        = array,  S16,      39, [6], "kPa",  1.0,       0.0,   -500.0,  500.0,    0
        flexFuelBins        = array,  U08,      51, [6], "%",    1.0,       0.0,   0.0,     250.0,    0
        flexFuelAdj         = array,  U08,      57, [6], "%",    1.0,       0.0,   0.0,     250.0,    0
        flexAdvBins         = array,  U08,      63, [6], "%",    1.0,       0.0,   0.0,     250.0,    0
        flexAdvAdj          = array,  S08,      69, [6], "Deg",  1.0,       0.0,   -125,    125.0,    0

        n2o_enable          = bits ,  U08,      75, [0:1],           "Off","1 Stage","2 stage", "INVALID"
        n2o_arming_pin      = bits ,  U08,      75, [2:7],           $IO_Pins_no_def
#if CELSIUS
        n2o_minCLT          = scalar, U08,      76,      "C",        1.0,    -40,    -40,    215,      0
#else
        n2o_minCLT          = scalar, U08,      76,      "F",        1.8,    -22.23,    -40,    215,      0
#endif
        n2o_maxMAP          = scalar, U08,      77,      "kPa",      2.0,   0.0,  0.0,  511.0,      0
        n2o_minTPS          = scalar, U08,      78,      "%TPS",     1.0,   0.0,  0.0,  100,        0
        n2o_maxAFR          = scalar, U08,      79,      "AFR",      0.1,   0.0,  0.0,  25.5,       1
        
        n2o_stage1_pin      = bits ,  U08,      80, [0:5],           $IO_Pins_no_def
        n2o_pin_polarity    = bits ,  U08,      80, [6:6],           "HIGH", "LOW"
        n2o_unused          = bits ,  U08,      80, [7:7],           "No", "Yes"
        n2o_stage1_minRPM   = scalar, U08,      81,      "RPM",       100,       0.0,   1000,    10000,    0
        n2o_stage1_maxRPM   = scalar, U08,      82,      "RPM",       100,       0.0,   1000,    10000,    0
        n2o_stage1_adderMin = scalar, U08,      83,      "ms",        0.1,       0,        0,     25.5,    1
        n2o_stage1_adderMax = scalar, U08,      84,      "ms",        0.1,       0,        0,     25.5,    1
        n2o_stage1_retard   = scalar, U08,      85,      "Deg",       1.0,       0.0,   0.0,     250.0,    0

        n2o_stage2_pin      = bits ,  U08,      86, [0:5],           $IO_Pins_no_def
        n2o_stage2_unused   = bits ,  U08,      86, [6:7],           "No", "Yes", "INVALID", "INVALID"
        n2o_stage2_minRPM   = scalar, U08,      87,      "RPM",       100,       0.0,   1000,    10000,    0
        n2o_stage2_maxRPM   = scalar, U08,      88,      "RPM",       100,       0.0,   1000,    10000,    0
        n2o_stage2_adderMin = scalar, U08,      89,      "ms",        0.1,       0,        0,       32,    1
        n2o_stage2_adderMax = scalar, U08,      90,      "ms",        0.1,       0,        0,       32,    1
        n2o_stage2_retard   = scalar, U08,      91,      "Deg",       1.0,       0.0,   0.0,     250.0,    0
        
        ; Knock settings
        knock_mode          = bits ,  U08,      92, [0:1],           "Off","Digital","Analog", "INVALID"
        knock_pin           = bits ,  U08,      92, [2:7],           "INVALID", "INVALID", "2", "3", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "18", "19", "20", "21", "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", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "INVALID"

        knock_trigger       = bits ,  U08,      93, [0:0],           "HIGH", "LOW"
        knock_pullup        = bits ,  U08,      93, [1:1],           "Off", "Internal pullup"
        knock_limiterDisable= bits ,  U08,      93, [2:2],           "No", "Yes"
        knock_unused        = bits ,  U08,      93, [3:4],           "INVALID", "1", "2", "3"

        ;Knock detection / filters
        knock_count         = bits ,  U08,      93, [5:7],           "INVALID", "1", "2", "3", "4", "5", "6", "7"
        knock_threshold     = scalar, U08,      94,      "Volts",    0.1,    0.0,  0.0,  5.0,          1
        knock_maxMAP        = scalar, U08,      95,      "kPa",      2.0,    0.0,  0.0,  511.0,        0
        knock_maxRPM        = scalar, U08,      96,      "RPM",      100.0,  0.0,   0,     10000,      0
        knock_window_rpms   = array,  U08,      97, [6], "RPM",      100.0,  0.0,   0,     10000,      0
        knock_window_angle  = array,  U08,     103, [6], "deg",      1.0,    -50,   -50,     100,      0
        knock_window_dur    = array,  U08,     109, [6], "deg",      1.0,    0.0,   0,       100,      0 ;Knock window duration

        ;Retard and recovery
        knock_maxRetard     = scalar, U08,     115,      "Deg",      1.0,       0.0,   0.0,     50,    0
        knock_firstStep     = scalar, U08,     116,      "Deg",      1.0,       0.0,   0.0,     50,    0
        knock_stepSize      = scalar, U08,     117,      "Deg",      1.0,       0.0,   0.0,     50,    0
        knock_stepTime      = scalar, U08,     118,      "Sec",      0.1,       0.0,   0.0,     2.5,   1
        
        knock_duration      = scalar, U08,     119,      "Sec",      0.1,       0.0,   0.0,     2.5,   1 ;//Time after knock retard starts that it should start recovering
        knock_recoveryStepTime  = scalar, U08, 120,      "Sec",      0.1,       0.0,   0.0,     2.5,   1
        knock_recoveryStep  = scalar, U08,     121,      "Deg",      1.0,       0.0,   0.0,     50,    0

        unused11_122_191     = array,  U08,    122,[69],"RPM",  100.0,      0.0,  100,     25500,    0

;-------------------------------------------------------
;Page 11 is the fuel map and axis bins only [PJSC v1.01]
;-------------------------------------------------------
;[PJSC v1.01]page = 11
page = 10       ;[PJSC v1.01]
   ;  name       = bits,   type,    offset, bits
   ;  name       = array,  type,    offset, shape, units,     scale, translate,    lo,      hi, digits
   ;  name       = scalar, type,    offset,        units,     scale, translate,    lo,      hi, digits
      veTable2      = array,  U08,     0, [16x16],"%",          1.0,      0.0,   0.0,   255.0,      0
      rpmBinsVE2    = array,  U08,   256,  [  16], "RPM",     100.0,      0.0,   100.0, 25500.0,    0
      fuelLoadBins2 = array,  U08,   272,  [  16], { bitStringValue(algorithmUnits2 ,  algorithm2) },        1.0,      0.0,   0.0,   {fuelLoadMax},      0

;-------------------------------------------------------
;Page 12 is the fuel map and axis bins only [PJSC v1.01]
;-------------------------------------------------------
;[PJSC v1.01]page = 12
page = 11       ;[PJSC v1.01]
   ;  name       = bits,   type,    offset, bits
   ;  name       = array,  type,    offset, shape, units,     scale, translate,    lo,      hi, digits
   ;  name       = scalar, type,    offset,        units,     scale, translate,    lo,      hi, digits
      veTable3      = array,  U08,     0, [16x16],"%",          1.0,      0.0,   0.0,   255.0,      0
      rpmBinsVE3    = array,  U08,   256,  [  16], "RPM",      100.0,      0.0,   100.0, 25500.0,      0
      fuelLoadBins3 = array,  U08,   272,  [  16], { bitStringValue(algorithmUnits2 ,  algorithm3) },        1.0,      0.0,   0.0,   {fuelLoadMax},      0

;-------------------------------------------------------------------------------

[ConstantsExtensions]
    requiresPowerCycle = nCylinders
    requiresPowerCycle = pinLayout
    requiresPowerCycle = fanPin
    requiresPowerCycle = reqFuel
    requiresPowerCycle = numTeeth
    requiresPowerCycle = missingTeeth
    requiresPowerCycle = trigPatternSec
    requiresPowerCycle = injOpen
    requiresPowerCycle = IgInv
    requiresPowerCycle = fanInv
    requiresPowerCycle = boostEnabled
    requiresPowerCycle = vvtEnabled
;	requiresPowerCycle = vvtChannels
    requiresPowerCycle = boostFreq
    requiresPowerCycle = vvtFreq
    requiresPowerCycle = idleFreq
    requiresPowerCycle = sparkMode
    requiresPowerCycle = launchPin
    requiresPowerCycle = launchEnable
    requiresPowerCycle = launchHiLo
    requiresPowerCycle = flexEnabled
    requiresPowerCycle = oddfire2
    requiresPowerCycle = oddfire3
    requiresPowerCycle = oddfire4
    requiresPowerCycle = iacCLminDuty
    requiresPowerCycle = iacCLmaxDuty
    requiresPowerCycle = useExtBaro
    requiresPowerCycle = useEMAP
    requiresPowerCycle = baroPin
    requiresPowerCycle = rotaryType
    requiresPowerCycle = stagedInjSizePri
    requiresPowerCycle = stagedInjSizeSec
    requiresPowerCycle = stagingEnabled
    requiresPowerCycle = resetControl
    requiresPowerCycle = resetControlPin
    requiresPowerCycle = n2o_enable
    requiresPowerCycle = n2o_arming_pin
    requiresPowerCycle = n2o_pin_polarity
    requiresPowerCycle = knock_mode
    requiresPowerCycle = knock_pin
    requiresPowerCycle = knock_trigger
    requiresPowerCycle = knock_pullup
    requiresPowerCycle = idleUpEnabled
    requiresPowerCycle = pjscFreq                   ;[PJSC]
    requiresPowerCycle = squirtDeviceType           ;  |
    requiresPowerCycle = multiVEmapEnabled          ;  V
    requiresPowerCycle = exTrigModeSelect           ;[PJSC]
;[PJSC v1.02]    requiresPowerCycle = exValveCaptureEnabled      ;  |
    requiresPowerCycle = analogInputPortSelect      ;[PJSC v1.02]
    requiresPowerCycle = analogInputPortSelect2     ;[PJSC v1.03]
    requiresPowerCycle = dutyPulseCaptureEnabled    ;[PJSC]
    requiresPowerCycle = dutyPulseCaptureEnabled2   ;[PJSC]
    requiresPowerCycle = muxout1selection           ;[PJSC v1.01]
    requiresPowerCycle = muxout2selection           ;[PJSC v1.01]
    requiresPowerCycle = muxout3selection           ;[PJSC v1.01]
    requiresPowerCycle = muxout4selection           ;[PJSC v1.01]
    requiresPowerCycle = algorithm2                 ;[PJSC v1.01]
    requiresPowerCycle = algorithm3                 ;[PJSC v1.01]
    requiresPowerCycle = secondaryFuelUsage         ;[PJSC v1.01]
    requiresPowerCycle = table4Usage                ;[PJSC v1.01]

	requiresPowerCycle = caninput_sel0a
	requiresPowerCycle = caninput_sel0b
	requiresPowerCycle = caninput_sel1a
	requiresPowerCycle = caninput_sel1b
    requiresPowerCycle = caninput_sel2a
	requiresPowerCycle = caninput_sel2b
	requiresPowerCycle = caninput_sel3a
	requiresPowerCycle = caninput_sel3b
	requiresPowerCycle = caninput_sel4a
	requiresPowerCycle = caninput_sel4b
	requiresPowerCycle = caninput_sel5a
	requiresPowerCycle = caninput_sel5b
	requiresPowerCycle = caninput_sel6a
	requiresPowerCycle = caninput_sel6b
	requiresPowerCycle = caninput_sel7a
	requiresPowerCycle = caninput_sel7b
	requiresPowerCycle = caninput_sel8a
	requiresPowerCycle = caninput_sel8b
	requiresPowerCycle = caninput_sel9a
	requiresPowerCycle = caninput_sel9b
	requiresPowerCycle = caninput_sel10a
	requiresPowerCycle = caninput_sel10b
	requiresPowerCycle = caninput_sel11a
	requiresPowerCycle = caninput_sel11b
	requiresPowerCycle = caninput_sel12a
	requiresPowerCycle = caninput_sel12b
	requiresPowerCycle = caninput_sel13a
	requiresPowerCycle = caninput_sel13b
	requiresPowerCycle = caninput_sel14a
	requiresPowerCycle = caninput_sel14b
	requiresPowerCycle = caninput_sel15a
	requiresPowerCycle = caninput_sel15b

    defaultValue = pinLayout,   1
    defaultValue = TrigPattern, 0
    defaultValue = useResync,   1
    defaultValue = trigPatternSec,  0
    defaultValue = sparkMode,   0
    defaultValue = indInjAng,   0
    defaultValue = inj1Ang,     355
    defaultValue = inj2Ang,     355
    defaultValue = inj3Ang,     355
    defaultValue = inj4Ang,     355
    defaultValue = nInjectors,  4
    defaultValue = dutyLim,     80
    defaultValue = mapMin,      10
    defaultValue = mapMax,      260
    defaultValue = baroMin      10
    defaultValue = baroMax,     260
    defaultValue = useEMAP,     0
    defaultValue = EMAPMin,     10
    defaultValue = EMAPMax,     260
    defaultValue = fpPrime,     3
    defaultValue = TrigFilter,  0
    defaultValue = ignCranklock,0
    defaultValue = multiplyMAP, 0
    defaultValue = includeAFR,  0
    defaultValue = stoich,      14.7
    defaultValue = flexEnabled, 0
    defaultValue = oddfire2,    0
    defaultValue = oddfire3,    0
    defaultValue = oddfire4,    0
    defaultValue = flexFreqLow, 50
    defaultValue = flexFreqHigh,150
    defaultValue = fuelPumpPin, 0
    defaultValue = fanPin,      0
    defaultValue = iacCLminDuty,0
    defaultValue = iacCLmaxDuty,100
    defaultValue = boostMinDuty,0
    defaultValue = boostMaxDuty,100
    defaultValue = boostSens,   2000
    defaultValue = boostIntv,   30
    defaultValue = sparkDur,    1.0
    defaultValue = fixAngEnable,0
    defaultValue = n2o_enable,  0
	defaultValue = speeduino_tsCanId, 0
	defaultValue = true_address, 256
	defaultValue = realtime_base_address, 336
    defaultValue = VVTasOnOff,  0
    defaultValue = stagingEnabled, 0
    defaultValue = lnchCtrlTPS, 0
    defaultValue = resetControl, 0
    defaultValue = bootloaderCaps, 0
    defaultValue = taeTaperMin, 1000
    defaultValue = taeTaperMax, 5000
	 ; defaultValue = obd_address, 0

    defaultValue = multiVEmapEnabled,        0 ;[PJSC]
    defaultValue = pjscFreq,                14 ; |
    defaultValue = veMapSelection1Pri,       0 ; |
    defaultValue = veMapSelection1Sec,       0 ; |
    defaultValue = veMapSelection2Pri,       0 ; |
    defaultValue = veMapSelection2Sec,       0 ; |
    defaultValue = veMapSelection3Pri,       0 ; |
    defaultValue = veMapSelection3Sec,       0 ; |
    defaultValue = veMapSelection4Pri,       0 ; |
    defaultValue = veMapSelection4Sec,       0 ; |
    defaultValue = veMapSelection1_2Pri,     0 ; |
    defaultValue = veMapSelection1_2Sec,     0 ; |
    defaultValue = veMapSelection2_2Pri,     0 ; |
    defaultValue = veMapSelection2_2Sec,     0 ; |
    defaultValue = veMapSelection3_2Pri,     0 ; |
    defaultValue = veMapSelection3_2Sec,     0 ; |
    defaultValue = veMapSelection4_2Pri,     0 ; |
    defaultValue = veMapSelection4_2Sec,     0 ; V
    defaultValue = exTrigModeSelect,         0 ;[PJSC]
;[PJSC v1.02]    defaultValue = exValveCaptureEnabled,    1 ; |
    defaultValue = analogInputPortSelect,    1 ;[PJSC v1.02]
    defaultValue = analogInputPortSelect2,   1 ;[PJSC v1.03]
    defaultValue = dutyPulseCaptureEnabled,  0 ;[PJSC]
    defaultValue = dutyPulseCaptureEnabled2, 0 ;[PJSC]
    defaultValue = exValveCalibrationMode,   0 ;[PJSC v1.01]
    defaultValue = exValvePosMin,            0 ; |
    defaultValue = exValvePosMax,          100 ; |
    defaultValue = exTrigHysteresis,        10 ; |
    defaultValue = squirtDeviceType,         0 ; |
    defaultValue = externalTrigEdge,         0 ; |
    defaultValue = dutyPulseOnLevel,         0 ; |
    defaultValue = dutyPulseOnLevel2,        0 ; |
    defaultValue = dutyFreqTst1,            10 ; |
    defaultValue = dutyFreqTst2,            10 ; |
    defaultValue = dutyFreqTst3,            10 ; |
    defaultValue = dutyFreqTst4,            10 ; |
    defaultValue = dutyRatioTst1,           50 ; |
    defaultValue = dutyRatioTst2,           50 ; |
    defaultValue = dutyRatioTst3,           50 ; |
    defaultValue = dutyRatioTst4,           50 ; |
    defaultValue = testop_fp,                0 ; |
    defaultValue = testop_inj,               0 ; |
    defaultValue = testop_coil,              0 ; |
    defaultValue = testsel_inj,              0 ; |
    defaultValue = testsel_coil,             0 ; |
    defaultValue = testint,               10.0 ; |
    defaultValue = testpw,                   0 ; |
    defaultValue = testinjcnt,               0 ; |
    defaultValue = muxout1selection,         0 ; V
    defaultValue = muxout2selection,         0 ;[PJSC v1.01]
    defaultValue = muxout3selection,         0 ;[PJSC v1.01]
    defaultValue = muxout4selection,         0 ;[PJSC v1.01]
#if table4_fuel                                ;[PJSC v1.01] For switching table4
    defaultValue = table4Usage,              0 ;[PJSC v1.01]
#endif                                         ;[PJSC v1.01] For switching table4
#if table4_spark                               ;[PJSC v1.01] For switching table4
    defaultValue = table4Usage,              1 ;[PJSC v1.01]
#endif                                         ;[PJSC v1.01] For switching table4
    defaultValue = inj1SquirtStartEnd,       0 ;[PJSC v1.01]
    defaultValue = inj2SquirtStartEnd,       0 ;[PJSC v1.01]
    defaultValue = inj3SquirtStartEnd,       0 ;[PJSC v1.01]
    defaultValue = inj4SquirtStartEnd,       0 ;[PJSC v1.01]
    defaultValue = baroCorr,                 0 ;[PJSC v1.03]
    defaultValue = swIATcorrection,          1 ; |
    defaultValue = swTAE,                    1 ; |
    defaultValue = dfcoEnabled,              0 ; |
    defaultValue = swCrankingEnrichment,     1 ; |
    defaultValue = swWUE,                    1 ; |
    defaultValue = swASE,                    1 ; V
    defaultValue = swBatVCorrection,         1 ;[PJSC v1.03]

    ;Default pins
    defaultValue = fanPin,      0
    defaultValue = vvtPin,      0
    defaultValue = launchPin,   0
    defaultValue = boostPin,    0
    defaultValue = fuelPumpPin, 0
    defaultValue = tachoPin,    0
    defaultValue = perToothIgn, 0
    defaultValue = resetControlPin, 0

    ;Default ADC filter values
    defaultValue = ADCFILTER_TPS  50
    defaultValue = ADCFILTER_CLT  180
    defaultValue = ADCFILTER_IAT  180
    defaultValue = ADCFILTER_O2   100
    defaultValue = ADCFILTER_BAT  128
    defaultValue = ADCFILTER_MAP   20 ;This is only used on Instantaneous MAP readings and is intentionally very weak to allow for faster response
    defaultValue = ADCFILTER_BARO  64
    ;Force the controller priority for the filters (Controller knows best here when in doubt)
    controllerPriority = ADCFILTER_TPS
    controllerPriority = ADCFILTER_CLT
    controllerPriority = ADCFILTER_IAT
    controllerPriority = ADCFILTER_O2
    controllerPriority = ADCFILTER_BAT
    controllerPriority = ADCFILTER_MAP
    controllerPriority = ADCFILTER_BARO
    ;Again, force the setting from the controller for the trigger edges. This is particularly useful for the Oct 2018 update where the names of the dges changed
    controllerPriority = TrigEdge
    controllerPriority = TrigEdgeSec

    ;These are the limits for each of the load algorithms (Refer to the PC Variables section)
    ;Order is:                        MAP   TPS   IMAP/EMAP ITB UNUSED  UNUSED  UNUSED  UNUSED
;[PJSC v1.01]    defaultValue = algorithmLimits,   511   100   511       511 100     100     100     100
    defaultValue = algorithmLimits,   255   100   255       255 100     100     100     100
#if SPEED_DENSITY
;[PJSC v1.01]    defaultValue = fuelLoadMax, 511
;[PJSC v1.01]    defaultValue = ignLoadMax, 511
    defaultValue = fuelLoadMax, 255
    defaultValue = ignLoadMax, 255
#else
;[PJSC v1.01]    defaultValue = fuelLoadMax, 511
;[PJSC v1.01]    defaultValue = ignLoadMax, 511
    defaultValue = fuelLoadMax, 255
    defaultValue = ignLoadMax, 255
#endif

    controllerPriority = bootloaderCaps

    defaultValue = AUXin00Alias  Aux0
	defaultValue = AUXin01Alias  Aux1 
    defaultValue = AUXin02Alias  Aux2 
    defaultValue = AUXin03Alias  Aux3 
    defaultValue = AUXin04Alias  Aux4 
    defaultValue = AUXin05Alias  Aux5 
    defaultValue = AUXin06Alias  Aux6 
    defaultValue = AUXin07Alias  Aux7 
    defaultValue = AUXin08Alias  Aux8 
    defaultValue = AUXin09Alias  Aux9 
    defaultValue = AUXin10Alias  Aux10 
    defaultValue = AUXin11Alias  Aux11 
    defaultValue = AUXin12Alias  Aux12 
    defaultValue = AUXin13Alias  Aux13 
    defaultValue = AUXin14Alias  Aux14 
    defaultValue = AUXin15Alias  Aux15

    defaultValue = rpmwarn, 3000       ;[PJSC v1.02]
    defaultValue = rpmdang, 5000       ;
    defaultValue = rpmhigh, 8000       ;
    defaultValue = mapwarn, 200        ;
    defaultValue = mapdang, 245        ;
    defaultValue = maphigh, 255        ;[PJSC v1.02]
    defaultValue = vvtSamplingRate, 0  ;[PJSC v1.03]

[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_separator
   ;
   ;  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 = "Settings"
      subMenu = engine_constants,   "Engine Constants"
;[PJSC v1.01]      subMenu = injChars,           "Injector Characteristics"
      subMenu = triggerSettings,    "Trigger Setup"
      ;subMenu = OLED,               "OLED Setup"
;[PJSC v1.03]      subMenu = airdensity_curve,   "IAT Density"

      subMenu = std_separator                                                           ;[PJSC v1.02]
      subMenu = gaugeLimits, "Gauge Limits"                                             ; |
#if full_option                                                                                                                                     ;[PJSC v1.02] For simple menu
      subMenu = std_separator                                                           ; V
      subMenu = reset_control,      "Reset Control"
      subMenu = io_summary, "I/O Summary"                                               ;[PJSC v1.02]
#endif                                                                                                                                              ;[PJSC v1.02] For simple menu

   menu = "&Tuning"
      subMenu = std_realtime,       "Realtime Display"
      subMenu = std_separator                                                           ;[PJSC v1.01]
      subMenu = injChars,           "Injector Characteristics"                          ;[PJSC v1.01]
      subMenu = accelEnrichments,   "Acceleration Enrichment"
      subMenu = airdensity_curve,   "IAT Density",          { swIATcorrection }         ;[PJSC v1.03]
      subMenu = barodensity_curve,  "Baro Density",         { baroCorr }                ; V
      subMenu = correctionSelect,   "Fuel correnction"                                  ;[PJSC v1.03]
      subMenu = egoControl,         "AFR/O2", 3
#if table4_spark                                                                                                                                    ;[PJSC v1.01] For switching table4
      subMenu = RevLimiterS,        "Limiters",       2
#endif                                                                                                                                              ;[PJSC v1.01] For switching table4
;[PJSC]      subMenu = flexFueling,        "Flex Fuel",        2
;[PJSC]      subMenu = veTableDialog,      "VE Table",       0
;[PJSC]      subMenu = sparkTbl,           "Spark Table",    2
      subMenu = std_separator                                                           ;[PJSC v1.01]
      subMenu = veMapSelectDialog,   "VE Table configuration"                           ;[PJSC]
      subMenu = veTable1Dialog,      "&VE Table 1",     0                               ;  V
      subMenu = veTable2Dialog,      "&VE Table 2",     0,  { multiVEmapEnabled }       ;[PJSC]
      subMenu = veTable3Dialog,      "&VE Table 3",     0,  { multiVEmapEnabled }       ;[PJSC v1.01]
#if table4_fuel                                                                         ;[PJSC v1.01] For switching table4
      subMenu = veTable4Dialog,      "&VE Table 4",     0,  { multiVEmapEnabled }       ;[PJSC v1.01]
#endif                                                                                  ;[PJSC v1.01] For switching table4
      subMenu = afrTable1Tbl,        "AFR Table",       5
#if full_option                                                                                                                                     ;[PJSC v1.02] For simple menu
      subMenu = std_separator
;[PJSC v1.01]      subMenu = inj_trimad,         "Sequential fuel trim", 9
      subMenu = stagingTableDialog, "Staged Injection", 10, { nCylinders <= 4 } ; Can't do staging on more than 4 cylinder engines
#endif                                                                                                                                              ;[PJSC v1.02] For simple menu

#if table4_spark                                                                                                                                    ;[PJSC v1.01] For switching table4
   menu = "&Spark"
      subMenu = sparkSettings,          "Spark Settings"
      subMenu = sparkTbl,               "Spark Table", 2
      subMenu = dwellSettings,          "Dwell settings"
      subMenu = dwell_correction_curve, "Dwell Compensation"
      subMenu = iat_retard_curve,       "IAT Retard"
      ;subMenu = knockSettings,          "Knock Settings"
      subMenu = rotary_ignition,        "Rotary Ignition",    { sparkMode == 4 }
#endif                                                                                                                                              ;[PJSC v1.01] For switching table4

   menu = "&Starting/Idle"
        subMenu = crankPW,              "Cranking Settings"
        subMenu = warmup,               "Warmup Enrichment"
        subMenu = std_separator
;[PJSC v1.01]        subMenu = idleSettings,         "Idle Control"
;[PJSC v1.01]        subMenu = iacClosedLoop_curve,  "Idle - Closed loop targets", 7, { iacAlgorithm == 3 || iacAlgorithm == 5 }
;[PJSC v1.01]        subMenu = iacPwm_curve,         "Idle - PWM Duty Cycle", 7, { iacAlgorithm == 2 }
;[PJSC v1.01]        subMenu = iacPwmCrank_curve,    "Idle - PWM Cranking Duty Cycle", 7, { iacAlgorithm == 2 }
;[PJSC v1.01]        subMenu = iacStep_curve,        "Idle - Stepper Motor", 7, { iacAlgorithm == 4 }
;[PJSC v1.01]        subMenu = iacStepCrank_curve,   "Idle - Stepper Motor Cranking", 7, { iacAlgorithm == 4 }
;[PJSC v1.01]        subMenu = std_separator
;[PJSC v1.01]        subMenu = idleUpSettings,       "Idle Up Settings", { iacAlgorithm == 2 || iacAlgorithm == 3 || iacAlgorithm == 4 || iacAlgorithm == 5 }
        subMenu = idleSettings,         "Idle Control",                      { muxout1selection == 1 || muxout2selection == 1 }                                               ;[PJSC v1.01] For MUX selection
        subMenu = iacClosedLoop_curve,  "Idle - Closed loop targets", 7,     { (iacAlgorithm == 3 || iacAlgorithm == 5) && (muxout1selection == 1 || muxout2selection == 1) } ;  |
        subMenu = iacPwm_curve,         "Idle - PWM Duty Cycle", 7,          { iacAlgorithm == 2 && (muxout1selection == 1 || muxout2selection == 1) }                        ;  V
        subMenu = iacPwmCrank_curve,    "Idle - PWM Cranking Duty Cycle", 7, { iacAlgorithm == 2 && (muxout1selection == 1 || muxout2selection == 1) }                        ;[PJSC v1.01] For MUX selection

    menu = "&Accessories"
        subMenu = muxoutSetting,        "MUX Output Port Setting"                                                                                    ;[PJSC v1.01]
        subMenu = std_separator                                                                                                                      ;[PJSC v1.01]
;[PJSC v1.01]        subMenu = fanSettings,          "Thermo Fan"
#if table4_spark                                                                                                                                     ;[PJSC v1.01] For switching table4
        subMenu = LaunchControl,        "Launch Control / Flat Shift"
;[PJSC v1.01]        subMenu = fuelpump,             "Fuel Pump"
        subMenu = NitrousControl,       "Nitrous"
#endif                                                                                                                                               ;[PJSC v1.01] For switching table4
;[PJSC v1.01]        subMenu = std_separator
;[PJSC v1.01]        subMenu = boostSettings,        "Boost Control"
;[PJSC v1.01]        subMenu = boostLoad,             "Boost Targets/Load", 8,  { boostEnabled }
;[PJSC v1.01]        subMenu = std_separator
;[PJSC v1.01]        subMenu = vvtSettings,          "VVT Control"
;[PJSC v1.01]        subMenu = vvtTbl,               "VVT duty cycle", 8,  { vvtEnabled }
;[PJSC v1.01]        subMenu = std_separator
;[PJSC v1.01]        subMenu = tacho,                "Tacho Output"
        subMenu = fanSettings,          "Thermo Fan",                   { muxout1selection == 2 || muxout2selection == 2 }                           ;[PJSC v1.01] For MUX selection
        subMenu = fuelpump,             "Fuel Pump",                    { muxout1selection == 4 || muxout2selection == 4 }                           ;  |
        subMenu = std_separator                                                                                                                      ;  |
        subMenu = boostSettings,        "Boost Control",                { muxout1selection == 5 || muxout2selection == 5 }                           ;  |
        subMenu = boostTbl,             "Boost target", 8,              { boostEnabled && (muxout1selection == 5 || muxout2selection == 5) }         ;  |
        subMenu = std_separator                                                                                                                      ;  |
        subMenu = vvtSettings,          "VVT Control",                  { muxout1selection == 6 || muxout2selection == 6 }                           ;  |
        subMenu = vvtTbl,               "VVT duty cycle", 8,            { vvtEnabled && (muxout1selection == 6 || muxout2selection == 6) }           ;  |
        subMenu = std_separator                                                                                                                      ;  V
        subMenu = tacho,                "Tacho Output",                 { muxout1selection == 7 || muxout2selection == 7 }                           ;[PJSC v1.01] For MUX selection

        subMenu = std_separator                                                                                                                      ;[PJSC]
        subMenu = inputPortSetting,     "Input Port Setting"                                                                                         ;[PJSC]

        subMenu = std_separator

		#if CAN_COMMANDS
        subMenu = can_serial3IO,        "Canbus/Secondary Serial IO Interface"
		subMenu = std_separator
        subMenu = Canin_config,         "External Auxillary Input Channel Configuration", {enable_secondarySerial || (enable_intcan && intcan_available)}
		subMenu = Auxin_config,         "Local Auxillary Input Channel Configuration"
		    ;subMenu = std_separator
		    ;subMenu = Canout_config, "Canbus Output Configuration"
		#else
		subMenu = serial3IO,            "Canbus/Secondary Serial IO Interface"
		subMenu = std_separator
        subMenu = Canin_config,         "External Auxillary Input Channel Configuration", {enable_secondarySerial || (enable_intcan && intcan_available)}		
		subMenu = Auxin_config,         "Local Auxillary Input Channel Configuration"
		#endif

  menuDialog = main
   menu = "Tools"
      subMenu = mapCal,           "Calibrate Pressure Sensors"
      subMenu = std_ms2gentherm,  "Calibrate Temperature Sensors", 0
      subMenu = std_ms2geno2,     "Calibrate AFR Sensor", 0
      subMenu = sensorFilters,    "Set analog sensor filters"

   menuDialog = main
      menu = "3D &Tuning Maps"
;[PJSC]        subMenu = veTable1Map,    "Fuel Table"
;[PJSC]        subMenu = sparkMap,       "Spark Table", 3
        subMenu = veTable1Map, "Fuel Table 1"                            ;[PJSC]
        subMenu = veTable2Map, "Fuel Table 2"                            ;[PJSC]
        subMenu = veTable3Map, "Fuel Table 3"                            ;[PJSC v1.01] For switching table4
#if table4_fuel                                                          ;[PJSC v1.01] For switching table4
        subMenu = sparkMap,    "Fuel Table 4"                            ;[PJSC v1.01] For switching table4
#endif                                                                   ;[PJSC v1.01] For switching table4
        subMenu = afrTable1Map,   "AFR Target Table"
#if table4_spark                                                         ;[PJSC v1.01] For switching table4
        subMenu = sparkMap,       "Spark Table", 3                       ;[PJSC v1.01] For switching table4
#endif                                                                   ;[PJSC v1.01] For switching table4


#if enablehardware_test
   menuDialog = main
	  menu = "Hardware Testing"
;[PJSC v1.01]		subMenu = outputtest1, "Test Output Hardware"
        subMenu = outputtest1, "Output Test Mode - PWM"                  ;[PJSC v1.01]
        subMenu = outputtest2, "Output Test Mode - Pulse"                ;[PJSC v1.01]
#endif

		menu = "Help"
        subMenu = helpGeneral,     "Speeduino Help"
;-------------------------------------------------------------------------------

[SettingContextHelp]
; constantName = "Help Text"
; These provide the context help in the dialog when these variables are used
    nCylinders  = "Cylinder count"
    alternate   = "Whether or not the injectors should be fired at the same time. This setting is ignored when Sequential is selected below, however it will still affect the req_fuel value."
    engineType  = "Engines with an equal number of degrees between all firings (This is most engines) should select Even fire. Some 2 and 6 cylinder engines are Odd fire however."
    twoStroke   = "Four-Stroke (most engines), Two-stroke."
    nInjectors  = "Number of primary injectors."
    mapSample   = "The method used for calculating the MAP reading\nFor 1-2 Cylinder engines, Cycle Minimum is recommended.\nFor more than 2 cylinders Cycle Average is recommended"
    stoich      = "The stoichiometric ration of the fuel being used. For flex fuel, choose the primary fuel"
    injLayout   = "The injector layout and timing to be used. Options are: \n 1. Paired - 2 injectors per output. Outputs active is equal to half the number of cylinders. Outputs are timed over 1 crank revolution. \n 2. Semi-sequential: Same as paired except that injector channels are mirrored (1&4, 2&3) meaning the number of outputs used are equal to the number of cylinders. Only valid for 4 cylinders or less. \n 3. Banked: 2 outputs only used. \n 4. Sequential: 1 injector per output and outputs used equals the number of cylinders. Injection is timed over full cycle. "

    TrigPattern = "The type of input trigger decoder to be used."
	useResync   = "If enabled, sync will be rechecked once every full cycle from the cam input. This is good for accuracy, however if your cam input is noisy then this can cause issues."
	trigPatternSec  = "Cam mode/type also known as Secondary Trigger Pattern."
    numTeeth    = "Number of teeth on Primary Wheel."
    TrigSpeed   = "Primary trigger speed."
    missingTeeth= "Number of Missing teeth on Primary Wheel."
    TrigAng     = "The Angle ATDC when tooth No:1 on the primary wheel passes the primary sensor. The range of this field is -360 to +360 degrees."
    TrigAngMul  = "A multiplier used by non-360 degree tooth wheels (i.e. Wheels where the tooth count doesn't divide evenly into 360. Usage: (360 * <multiplier>) / tooth_count = Whole number"
    SkipCycles   = "The number of revolutions that will be skipped during cranking before the injectors and coils are fired."
	TrigEdge    = "The Trigger edge of the primary sensor.\nLeading.\nTrailing."
	TrigEdgeSec = "The Trigger edge of the secondary (Cam) sensor.\nLeading.\nTrailing."
	TrigFilter  = "Tuning of the trigger filter algorithm. The more aggressive the setting, the more noise will be removed, however this increases the chance of some true readings being filtered out (False positive). Medium is safe for most setups. Only select 'Aggressive' if no other options are working"

	sparkMode   = "Wasted Spark: Ignition outputs are on the channels <= half the number of cylinders. Eg 4 cylinder outputs on IGN1 and IGN2.\nSingle Channel: All ignition pulses are output on IGN1.\nWasted COP: Ignition pulses are output on all ignition channels up to the number of cylinders. Eg 4 cylinder outputs on all ignition channels. No valid for >4 cylinders"
	IgInv       = "Whether the spark fires when the ignition signal goes high or goes low. Nearly all ignition systems use 'Going Low' but please verify this as damage to coils can result from the incorrect selection. (NOTE: THIS IS NOT MEGASQUIRT. THIS SETTING IS USUALLY THE OPPOSITE OF WHAT THEY USE!)"
    sparkDur    = "The duration of the spark at full dwell. Typically around 1ms"
    fixAngEnable= "If enabled, timing will be locked/fixed and the ignition map will be ignored. Note that this value will be overriden by the fixed cranking value when cranking"
    FixAng      = "Timing will be locked at this value if the above is enabled"

    crankRPM    = "The cranking RPM threshold. When RPM is lower than this value (and above 0) the system will be considered to be cranking"

	fanInv      = ""
	fanHyster   = "The number of degrees of hysteresis to be used in controlling the fan. Recommended values are between 2 and 5"

	taeTime     = "The duration of the acceleration enrichment"

	iacChannels = "The number of output channels used for PWM valves. Select 1 for 2-wire valves or 2 for 3-wire valves."
	iacStepTime = "Pause time between each step. Values that are too low can cause the motor to behave erratically or not at all"
    iacStepHome = "Homing steps to perform on startup. Must be greater than the fully open steps value"
	iacStepHyster = "The minimum number of steps to move in any one go."
	iacAlgorithm = "Selects method of idle control.\nNone = no idle control valve.\nOn/Off valve.\nPWM valve (2,3 wire).\nStepper Valve (4,6,8 wire)."
	iacPWMdir   = "Normal PWM valves increase RPM with higher duty. If RPM decreases with higher duty then select Reverse"
	iacCLminDuty= "When using closed loop idle control, this is the minimum duty cycle that the PID loop will allow. Combined with the maximum value, this specifies the working range of your idle valve"
	iacCLmaxDuty= "When using closed loop idle control, this is the maximum duty cycle that the PID loop will allow. Combined with the minimum value, this specifies the working range of your idle valve"
	iacFastTemp = "Below this temperature, the idle output will be high (On). Above this temperature, it will turn off."
    idleUpPolarity = "Normal polarity is a ground switch where an earthed signal activates the Idle Up. The internal pullup will be enabled with Normal polarity. \n Inverted may be used if a 5v signal is used to enable the Idle Up."
    idleUpAdder = "The amount (In either Duty Cycle % or Steps (Depending on the idle control method in use), that the idle control will increase by when Idle Up is active"

	oddfire2    = "The ATDC angle of channel 2 for oddfire engines. This is relative to the TDC angle of channel 1"
    oddfire3    = "The ATDC angle of channel 3 for oddfire engines. This is relative to the TDC angle of channel 1 (NOT channel 2)"
    oddfire4    = "The ATDC angle of channel 4 for oddfire engines. This is relative to the TDC angle of channel 1 (NOT channel 3)"

	dfcoRPM     = "The RPM above which DFCO will be active. Typically set a few hundred RPM above maximum idle speed"
    dfcoHyster  = "Hysteresis for DFCO RPM. 200-300 RPM is typical for this, however a higher value may be needed if the RPM is fluctuating around the cutout speed"
    dfcoTPSThresh= "The TPS value below which DFCO will be active. Typical value is 5%-10%, but higher may be needed if TPS signal is noisy"

    launchPin   = "The ARDUINO pin that the clutch switch is connected to. This is NOT the pin on the connector, but the pin it relates to on the arduino"
    launchHiLo  = "Whether the signal is High or Low when the clutch pedal is engaged. For a ground switching input (Most clutch switches), this should be LOW"
    lnchPullRes = "Whether the internal pullup resistor is enabled or left floating. For a ground switching input (Most clutch switches), select Pullup. For a 0v-5v input, select Floating"
    ignBypassPin = "The ARDUINO pin that the ignition bypass is connected to. This is NOT the pin on the connector, but the pin it relates to on the arduino"
    ignBypassEnable = "If turned on, a ground signal will be output during cranking on the specified pin. This is used to bypass the Speeduino ignition control during cranking."
    ignCranklock = "On certain low resolution ignition patterns, the cranking timing can be locked to occur when a pulse is recieved."

    multiplyMAP = "If enabled, the MAP reading is included directly into the pulsewidth calculation by multiplying the VE lookup value by the MAP:Baro ratio. This results in a flatter VE table that can be easier to tune in some instances. VE table must be retuned when this value is changed."
    includeAFR  = "When enabled, the current AFR reading is incorporated directly in the pulsewidth calculation as a percentage of the current target ratio. VE table must be retuned when this value is changed. "
    useExtBaro  = "By Default, Speeduino will measure barometric pressure upon startup. Optionally however, a 2nd pressure sensor can be used to perform live barometric readings whilst the system is on."

    flexEnabled  = "Turns on readings from the Flex sensor and enables the below adjustments"
    flexFreqLow  = "The frequency of the sensor at 0% ethanol (50Hz for standard GM/Continental sensor)"
    flexFreqHigh = "The frequency of the sensor at 100% ethanol (150Hz for standard GM/Continental sensor)"
    flexFuelAdj  = "Fuel % to be used for the current ethanol % (Typically 100% @ 0%, 163% @ 100%)"
    flexAdvAdj   = "Additional advance (in degrees) for the current ethanol % (Typically 0 @ 0%, 10-20 @ 100%)"
    flexBoostAdj = "Adjustment, in kPa, to the boost target for the current ethanol %. Negative values are allowed to lower boost at lower ethanol % if necessary."

    n2o_arming_pin = "Pin that the nitrous arming/enagement switch is on."
    n2o_pin_polarity = "Whether Nitrous is active (Armed) when the pin is LOW or HIGH. If LOW is selected, the internal pullup will be used."

    flatSArm    = "The RPM switch point that determines whether an eganged clutch is for launch control or flat shift. Below this figure, an engaged clutch is considered to be for launch, above this figure an active clutch input will be considered a flat shift. This should be set at least several hundred RPM above idle"
    flatSSoftWin= "The number of RPM below the flat shift point where the softlimit will be applied (aka Soft limit window). Recommended values are 200-1000"
    flatSRetard = "The absolute timing (BTDC) that will be used when within the soft limit window"
    hardCutType = "How hard cuts should be performed for rev/launch limits. Full cut will stop all ignition events, Rolling cut will step through all ignition outputs, only cutting 1 per revolution"

	enable_secondarySerial = "This Enables the secondary serial port . Secondary serial is serial3 on mega2560 processor, and Serial2 on STM32 and Teensy processor "

	;speeduino_tsCanId = "This is the TsCanId that the Speeduino ECU will respond to. This should match the main controller CAN ID in project properties if it is connected directy to TunerStudio, Otherwise the device ID if connected via CAN passthrough"
	true_address = "This is the 11bit Can address of the Speeduino ECU "
    realtime_base_address = "This is the 11bit CAN address of the realtime data broadcast from the Speeduino ECU. This MUST be at least 0x16 greater than the true address"
	;obd_address = "The 11bit Can address that the Speeduino ECU responds to for OBD2 diagnostic requests"
	AUXin00Alias = "The Ascii alias asigned to Aux input channel 0"
	AUXin01Alias = "The Ascii alias asigned to Aux input channel 1"
	AUXin02Alias = "The Ascii alias asigned to Aux input channel 2"
	AUXin03Alias = "The Ascii alias asigned to Aux input channel 3"
	AUXin04Alias = "The Ascii alias asigned to Aux input channel 4"
	AUXin05Alias = "The Ascii alias asigned to Aux input channel 5"
	AUXin06Alias = "The Ascii alias asigned to Aux input channel 6"
	AUXin07Alias = "The Ascii alias asigned to Aux input channel 7"
	AUXin08Alias = "The Ascii alias asigned to Aux input channel 8"
	AUXin09Alias = "The Ascii alias asigned to Aux input channel 9"
	AUXin10Alias = "The Ascii alias asigned to Aux input channel 10"
	AUXin11Alias = "The Ascii alias asigned to Aux input channel 11"
	AUXin12Alias = "The Ascii alias asigned to Aux input channel 12"
	AUXin13Alias = "The Ascii alias asigned to Aux input channel 13"
	AUXin14Alias = "The Ascii alias asigned to Aux input channel 14"
	AUXin15Alias = "The Ascii alias asigned to Aux input channel 15"
	
	caninput_sel0a = "This Enables local analog/digital on input channel 0 "
	caninput_sel1a = "This Enables local analog/digital on input channel 1 "
	caninput_sel2a = "This Enables local analog/digital on input channel 2 "
	caninput_sel3a = "This Enables local analog/digital on input channel 3 "
	caninput_sel4a = "This Enables local analog/digital on input channel 4 "
	caninput_sel5a = "This Enables local analog/digital on input channel 5 "
	caninput_sel6a = "This Enables local analog/digital on input channel 6 "
	caninput_sel7a = "This Enables local analog/digital on input channel 7 "
    caninput_sel8a = "This Enables local analog/digital on input channel 8 "
 	caninput_sel9a = "This Enables local analog/digital on input channel 9 "
 	caninput_sel10a = "This Enables local analog/digital on input channel 10 "
 	caninput_sel11a = "This Enables local analog/digital on input channel 11 "
 	caninput_sel12a = "This Enables local analog/digital on input channel 12 "
 	caninput_sel13a = "This Enables local analog/digital on input channel 13 "
 	caninput_sel14a = "This Enables local analog/digital on input channel 14 "
 	caninput_sel15a = "This Enables local analog/digital on input channel 15 "
	
    caninput_sel0b = "This Enables External CAN data via the Secondary Serial CANBUS expansion module or local analog/digital on input channel 0 "
	caninput_sel1b = "This Enables External/CAN data via the Secondary Serial CANBUS expansion module or local analog/digital on input channel 1 "
	caninput_sel2b = "This Enables External/CAN data via the Secondary Serial CANBUS expansion module or local analog/digital on input channel 2 "
	caninput_sel3b = "This Enables External/CAN data via the Secondary Serial CANBUS expansion module or local analog/digital on input channel 3 "
	caninput_sel4b = "This Enables External/CAN data via the Secondary Serial CANBUS expansion module or local analog/digital on input channel 4 "
	caninput_sel5b = "This Enables External/CAN data via the Secondary Serial CANBUS expansion module or local analog/digital on input channel 5 "
	caninput_sel6b = "This Enables External/CAN data via the Secondary Serial CANBUS expansion module or local analog/digital on input channel 6 "
	caninput_sel7b = "This Enables External/CAN data via the Secondary Serial CANBUS expansion module or local analog/digital on input channel 7 "
    caninput_sel8b = "This Enables External/CAN data via the Secondary Serial CANBUS expansion module or local analog/digital on input channel 8 "
 	caninput_sel9b = "This Enables External/CAN data via the Secondary Serial CANBUS expansion module or local analog/digital on input channel 9 "
 	caninput_sel10b = "This Enables External/CAN data via the Secondary Serial CANBUS expansion module or local analog/digital on input channel 10 "
 	caninput_sel11b = "This Enables External/CAN data via the Secondary Serial CANBUS expansion module or local analog/digital on input channel 11 "
 	caninput_sel12b = "This Enables External/CAN data via the Secondary Serial CANBUS expansion module or local analog/digital on input channel 12 "
 	caninput_sel13b = "This Enables External/CAN data via the Secondary Serial CANBUS expansion module or local analog/digital on input channel 13 "
 	caninput_sel14b = "This Enables External/CAN data via the Secondary Serial CANBUS expansion module or local analog/digital on input channel 14 "
 	caninput_sel15b = "This Enables External/CAN data via the Secondary Serial CANBUS expansion module or local analog/digital on input channel 15 "
	
 	caninput_source_can_address0 = "The source 11bit CAN address of the data for channel 0"
 	caninput_source_can_address1 = "The source 11bit CAN address of the data for channel 1"
 	caninput_source_can_address2 = "The source 11bit CAN address of the data for channel 2"
 	caninput_source_can_address3 = "The source 11bit CAN address of the data for channel 3"
 	caninput_source_can_address4 = "The source 11bit CAN address of the data for channel 4"
 	caninput_source_can_address5 = "The source 11bit CAN address of the data for channel 5"
 	caninput_source_can_address6 = "The source 11bit CAN address of the data for channel 6"
 	caninput_source_can_address7 = "The source 11bit CAN address of the data for channel 7"
 	caninput_source_can_address8 = "The source 11bit CAN address of the data for channel 8 "
 	caninput_source_can_address9 = "The source 11bit CAN address of the data for channel 9"
 	caninput_source_can_address10 = "The source 11bit CAN address of the data for channel 10"
 	caninput_source_can_address11 = "The source 11bit CAN address of the data for channel 11"
 	caninput_source_can_address12 = "The source 11bit CAN address of the data for channel 12"
 	caninput_source_can_address13 = "The source 11bit CAN address of the data for channel 13"
 	caninput_source_can_address14 = "The source 11bit CAN address of the data for channel 14"
 	caninput_source_can_address15 = "The source 11bit CAN address of the data for channel 15"
 	caninput_source_start_byte0 = "The Starting byte the data begins at for channel 0"
 	caninput_source_start_byte1 = "The Starting byte the data begins at for channel 1"
 	caninput_source_start_byte2 = "The Starting byte the data begins at for channel 2"
 	caninput_source_start_byte3 = "The Starting byte the data begins at for channel 3"
 	caninput_source_start_byte4 = "The Starting byte the data begins at for channel 4"
 	caninput_source_start_byte5 = "The Starting byte the data begins at for channel 5"
 	caninput_source_start_byte6 = "The Starting byte the data begins at for channel 6"
 	caninput_source_start_byte7 = "The Starting byte the data begins at for channel 7"
 	caninput_source_start_byte8 = "The Starting byte the data begins at for channel 8"
 	caninput_source_start_byte9 = "The Starting byte the data begins at for channel 9"
 	caninput_source_start_byte10 = "The Starting byte the data begins at for channel 10"
 	caninput_source_start_byte11 = "The Starting byte the data begins at for channel 11"
 	caninput_source_start_byte12 = "The Starting byte the data begins at for channel 12"
 	caninput_source_start_byte13 = "The Starting byte the data begins at for channel 13"
 	caninput_source_start_byte14 = "The Starting byte the data begins at for channel 14"
 	caninput_source_start_byte15 = "The Starting byte the data begins at for channel 15"
 	caninput_source_num_bytes0 = "The number of bytes the data is made from starting at selected start byte number"
 	caninput_source_num_bytes1 = "The number of bytes the data is made from starting at selected start byte number"
 	caninput_source_num_bytes2 = "The number of bytes the data is made from starting at selected start byte number"
 	caninput_source_num_bytes3 = "The number of bytes the data is made from starting at selected start byte number"
 	caninput_source_num_bytes4 = "The number of bytes the data is made from starting at selected start byte number"
 	caninput_source_num_bytes5 = "The number of bytes the data is made from starting at selected start byte number"
 	caninput_source_num_bytes6 = "The number of bytes the data is made from starting at selected start byte number"
 	caninput_source_num_bytes7 = "The number of bytes the data is made from starting at selected start byte number"
 	caninput_source_num_bytes8 = "The number of bytes the data is made from starting at selected start byte number"
 	caninput_source_num_bytes9 = "The number of bytes the data is made from starting at selected start byte number"
 	caninput_source_num_bytes10 = "The number of bytes the data is made from starting at selected start byte number"
 	caninput_source_num_bytes11 = "The number of bytes the data is made from starting at selected start byte number"
 	caninput_source_num_bytes12 = "The number of bytes the data is made from starting at selected start byte number"
 	caninput_source_num_bytes13 = "The number of bytes the data is made from starting at selected start byte number"
 	caninput_source_num_bytes14 = "The number of bytes the data is made from starting at selected start byte number"
 	caninput_source_num_bytes15 = "The number of bytes the data is made from starting at selected start byte number"

	cmdEnableTestMode = "Click this to enable test mode. This will not be available if the engine is running"
	cmdStopTestMode = "Click this to disable test mode"
;[PJSC v1.01]	cmdtestinj150dc = "this will cycle the output at 50% Duty cycle"
;[PJSC v1.01]	cmdtestinj250dc = "this will cycle the output at 50% Duty cycle"
;[PJSC v1.01]	cmdtestinj350dc = "this will cycle the output at 50% Duty cycle"
;[PJSC v1.01]	cmdtestinj450dc = "this will cycle the output at 50% Duty cycle"
	cmdtestinj150dc = "this will outputs the PWM signal with inputed duty ratio."     ;[PJSC v1.01]
	cmdtestinj250dc = "this will outputs the PWM signal with inputed duty ratio."     ; |
	cmdtestinj350dc = "this will outputs the PWM signal with inputed duty ratio."     ; V
	cmdtestinj450dc = "this will outputs the PWM signal with inputed duty ratio."     ;[PJSC v1.01]
	cmdtestspk150dc = "this will cycle the output at 50% Duty cycle"
	cmdtestspk250dc = "this will cycle the output at 50% Duty cycle"
	cmdtestspk350dc = "this will cycle the output at 50% Duty cycle"
	cmdtestspk450dc = "this will cycle the output at 50% Duty cycle"

    ADCFILTER_TPS   = "Recommended value: 50"
    ADCFILTER_CLT   = "Recommended value: 180"
    ADCFILTER_IAT   = "Recommended value: 180"
    ADCFILTER_O2    = "Recommended value: 128"
    ADCFILTER_BAT   = "Recommended value: 128"
    ADCFILTER_MAP   = "This setting is only available when using the Instantaneious MAP sampling method. Recommended value: 20"
    ADCFILTER_BARO  = "This setting is only available when using an external Baro sensor. Recommended value: 64"

    boostIntv       = "The closed loop control interval will run every this many ms. Generally values between 50% and 100% of the valve frequency work best"
    VVTasOnOff      = "Whether or not the VVT table should be treated as on and off control only. If you are using the VVT map to control a switch, this should be Yes. If you are using the VVT control to drive a PWM signal, this should be No"

    stagedInjSizePri= "Size of the primary injectors. The sum of the Pri and Sec injectors values MUST match the value used in the req_fuel calculation"
    stagedInjSizeSec= "Size of the secondary injectors. The sum of the Pri and Sec injectors values MUST match the value used in the req_fuel calculation"
#if resetcontrol_adv
  resetControl = "How to control the Arduino's automatic reset feature. NOTE: Some of these settings require modifying your hardware and replacing the Arduino bootloader. See the Wiki for more details.\n\nDisabled: Allow the Arduino to reset when a new serial connection is made.\n\nPrevent When Running: Hold the control pin high while the engine is running.\n\nPrevent Always: Always hold the control pin high.\n\nSerial Command: Normally hold the control pin high, but pull it low when the 'U' serial command is issued and reset upon receiving more data."
#else
  resetControl = "If set to Serial Command, normally hold the control pin high but pull it low when the 'U' serial command is issued and reset upon receiving more data. The control pin should be connected to the Arduino's reset pin."
#endif
  resetControlPin       = "The Arduino pin used to control resets."

[UserDefined]

; Enhanced TunerStudio dialogs can be defined here
; MegaTune will over look this section
; These dialogs will over-ride those in the UserDefined Section
; User defined ar loaded first, then if one by the same name is defiend here,
; it will replace the MegaTune definition

; dialog = name,   Title, Layout
;
; valid options for layout are xAxis, yAxis, border
; for an xAxis, each field added will be added from right to left
; A yAxis layout will add fields from top to bottom
; A border layout will expect an additional constraint to determine placement
; valid border constraints are north, South, East, West, Center
; all 5 do not need to be filled.

; The field name can be either a constant reference, or a reference to another
; dialog which will be added.
; dialogs can be nested and can be mixed with fields

    dialog = engine_constants_southwest, "Speeduino Board"
        field = "Stoichiometric ratio", stoich
        field = "Injector Layout",      injLayout,           { nCylinders <= 4 }
        field = "Board Layout",         pinLayout
        field = "MAP Sample method",    mapSample

    dialog = engine_constants_west, ""
        panel = std_injection, North
#if full_option                                                                                                                                     ;[PJSC v1.02] For simple menu
        panel = engine_constants_southwest
#endif                                                                                                                                              ;[PJSC v1.02] For simple menu

    dialog = engine_constants_northeast, "Oddfire Angles"
        field = "Channel 2 angle", oddfire2,                { engineType == 1 }
        field = "Channel 3 angle", oddfire3,                { engineType == 1 && nCylinders >= 3 }
        field = "Channel 4 angle", oddfire4,                { engineType == 1 && nCylinders >= 4 }

    dialog = engine_constants_east, ""
        panel = engine_constants_northeast, North
        field = ""
#if table4_spark                                                            ;[PJSC v1.01] For debug
        field = "Table 4 used for", table4Usage                             ;[PJSC v1.01] For debug
#endif                                                                      ;[PJSC v1.01] For debug

    dialog = engine_constants, "", border
        panel = engine_constants_west, West
#if full_option                                                                                                                                     ;[PJSC v1.02] For simple menu
        panel = engine_constants_east, East
#endif                                                                                                                                              ;[PJSC v1.02] For simple menu

    dialog = muxWarningMessage, ""                                                                              ;[PJSC v1.01]
        field = "Don't select the same function for MUX out1 and MUX out2!"                                     ;  |
                                                                                                                ;  |
    dialog = muxoutSetting, "MUX Output Port Setting"                                                           ;  |
        field = "MUX out1",                        muxout1selection                                             ;  |
        field = "MUX out2",                        muxout2selection                                             ;  |
        field = "MUX out3",                        muxout3selection,  { pinLayout == 64 }                       ;  |
        field = "MUX out4",                        muxout4selection,  { pinLayout == 64 }                       ;  V
        panel = muxWarningMessage,                                                                              ;[PJSC v1.01]

    dialog = captExValveSetting,   "Capture Exhaust Valve Position Control"                                     ;[PJSC]
        field = "Exhaust valve calibration mode",  exValveCalibrationMode                                       ;  |
        field = "Closed exhaust valve ADC count",  exValvePosMin                                                ;  |
        field = "Open exhaust valve ADC count",    exValvePosMax                                                ;  |
                                                                                                                ;  |
    dialog = captSparkSetting,     "Capture External Spark Control"                                             ;  |
        field = "Spark capture trigger edge",      externalTrigEdge                                             ;  |
        field = "Spark capture hysteresis",        exTrigHysteresis                                             ;  |
                                                                                                                ;  |
    dialog = captDutyPulseSetting, "Capture Duty Pulse Control"                                                 ;  |
        field = "Duty pulse ON Level ch1",         dutyPulseOnLevel                                             ;  V
        field = "Duty pulse ON Level ch2",         dutyPulseOnLevel2                                            ;[PJSC]

    dialog = misfireDetectionSetting,     "Misfire Detection Control"                                           ;[PJSC v1.03] For misfire detection
        field = "Spark signal trigger edge",       externalTrigEdge                                             ;  |
        field = "Number of Spark per revolution",  numSparkPerRev                                               ;  V
        field = "Misfire detect threshold",        misfireDetectThresh                                          ;[PJSC v1.03] For misfire detection

    dialog = viecleSpeedCaptureSetting,   "Viecle Speed Capture Control"                                        ;[PJSC v1.03] For capturing viecle speed
        field = "Spark signal trigger edge",             externalTrigEdge                                       ;  |
        field = "Number of Speed pulse per revolution",  numSpeedPulsePerRev                                    ;  V
        field = "Tire circumference",                    tireCircumference                                      ;[PJSC v1.03] For capturing viecle speed

    dialog = calibrateEGTvoltage,  ""                                                                           ;[PJSC v1.03]
        field = "Minimum Point :     Volts",  EGTvoltage1                                                       ;
        field = "Maximum Point :     Volts",  EGTvoltage2                                                       ;
                                                                                                                ;
    dialog = calibrateEGTtemperature,  ""                                                                       ;
        field = "EGT",  EGTtemperature1                                                                         ;
        field = "EGT",  EGTtemperature2                                                                         ;
                                                                                                                ;
    dialog = calibrateEGTsetting,  "Calibrate EGT Table", xAxis                                                 ;
        panel = calibrateEGTvoltage,      West                                                                  ;
        panel = calibrateEGTtemperature,  East                                                                  ;
                                                                                                                ;
    dialog = calibrateBaroSetting,  "Calibrate Baro Sensor"                                                     ;
        field = "Use external Baro sensor", useExtBaro                                                          ;
        field = "Analog pin to use for ext. Baro sensor", baroPin,  { useExtBaro }                              ;
                                                                                                                ;
        settingSelector = "Common Pressure Sensors",  { useExtBaro }                                            ;
           settingOption = "MPX4115",  baroMin=10,   baroMax=118 ; https://www.nxp.com/docs/en/data-sheet/MPX4115.pdf
           settingOption = "MPX4250",  baroMin=10,   baroMax=260 ; https://www.nxp.com/docs/en/data-sheet/MPX4250A.pdf Vout = VCC x (P x 0.004 – 0.04)
           settingOption = "GM 1-BAR", baroMin=10,   baroMax=105 ; https://speeduino.com/wiki/index.php/File:GM_Table.gif
           settingOption = "GM 2-BAR", baroMin=9,  baroMax=208 ; https://speeduino.com/wiki/index.php/File:GM_Table.gif
           settingOption = "GM 3-BAR", baroMin=1,  baroMax=315 ; VOUT = VS*(.00318*P-.00353)
           settingOption = "MPXH6300", baroMin=1,  baroMax=315 ; https://www.nxp.com/docs/en/data-sheet/MPXH6300A.pdf VOUT = VS*(.00318*P-.00353)
           settingOption = "MPX5700", baroMin=-31,  baroMax=746 ; https://www.nxp.com/docs/en/data-sheet/MPX5700.pdf Vout = VS*(0.0012858*P+0.04)
           settingOption = "MPX6400", baroMin=3,  baroMax=416 ; https://www.nxp.com/docs/en/data-sheet/MPXH6400A.pdf VOUT = VS x (0.002421xP–0.00842)
           settingOption = "Denso 079800", baroMin=0,  baroMax=173 ; http://speeduino.com/forum/viewtopic.php?f=18&t=510&p=7023#p7021
           settingOption = "VW/Audi/Porsche 250kPa", baroMin=26,  baroMax=250 ; http://speeduino.com/forum/viewtopic.php?p=17502#p17502
           settingOption = "Bosch 3 Bar TMAP", mapMin=-6,  mapMax=323
                                                                                                                ;
        field =    "kPa At 0.0 Volts",   baroMin,  { useExtBaro }                                               ;
        field =    "kPa At 5.0 Volts",   baroMax,  { useExtBaro }                                               ;[PJSC v1.03]

    dialog = analogInputPort1select, ""                                                                         ;[PJSC v1.01]
        field = "", analogInputPortSelect                                                                       ;[PJSC v1.02]
                                                                                                                ;  |
    dialog = analogInputPort2select, ""                                                                         ;  |[PJSC v1.03]
        field = "", analogInputPortSelect2                                                                      ;  |[PJSC v1.03]
                                                                                                                ;  |
    dialog = digitalInputPort1select, ""                                                                        ;  |
        field = "", exTrigModeSelect                                                                            ;  |
                                                                                                                ;  |
    dialog = digitalInputPort2select, ""                                                                        ;  |
        field = "", dutyPulseCaptureEnabled                                                                     ;  |
                                                                                                                ;  |
    dialog = digitalInputPort3select, ""                                                                        ;  |
        field = "", dutyPulseCaptureEnabled2                                                                    ;  |
                                                                                                                ;  |
    dialog = captDutyPulseSettingCh1, "Capture Duty Pulse Control"                                              ;  |
        field = "Duty pulse ON Level ch1",         dutyPulseOnLevel                                             ;  |
                                                                                                                ;  |
    dialog = captDutyPulseSettingCh2, "Capture Duty Pulse Control"                                              ;  |
        field = "Duty pulse ON Level ch2",         dutyPulseOnLevel2                                            ;  |
                                                                                                                ;  |
    dialog = analogInputPort1_controls, "", border                                                              ;  |
        panel = analogInputPort1select,  West                                                                   ;  |
        field = ""                                                                                              ;  |
        panel = captExValveSetting,      East,                              { analogInputPortSelect == 1 }      ;  |
                                                                                                                ;  |
    dialog = analogInputPort1_r, "Reference ADC Gauge"                                                          ;  |
        gauge = exValveADCGauge                                                                                 ;  |
                                                                                                                ;  |
    dialog = analogInputPort1,"Analog Input Port1", xAxis                                                       ;  |
        panel = analogInputPort1_controls                                                                       ;  |
        panel = analogInputPort1_r                                                                              ;  |
                                                                                                                ;  |
    dialog = analogInputPort2_settings, ""                                                                      ;  |[PJSC v1.03]
        panel = calibrateBaroSetting,                                       { analogInputPortSelect2 == 1 }     ;  |
        panel = calibrateEGTsetting,                                        { analogInputPortSelect2 == 2 }     ;  |
                                                                                                                ;  |
    dialog = analogInputPort2_controls, "", border                                                              ;  |[PJSC v1.03]
        panel = analogInputPort2select,    West                                                                 ;  |  |
        field = ""                                                                                              ;  |  |
        panel = analogInputPort2_settings, East                                                                 ;  |  |
                                                                                                                ;  |  |
    dialog = analogInputPort2_r, "Reference Baro Gauge"                                                         ;  |  |
        gauge = baroGauge                                                                                       ;  |  |
                                                                                                                ;  |  |
    dialog = analogInputPort2,"Analog Input Port2", xAxis                                                       ;  |  |
        panel = analogInputPort2_controls                                                                       ;  |  V
        panel = analogInputPort2_r                                                                              ;  |[PJSC v1.03]
                                                                                                                ;  |
    dialog = digitalInputPort1, "Digital Input Port1", xAxis                                                    ;  |
        panel = digitalInputPort1select                                                                         ;  |
        field = ""                                                                                              ;  |
        panel = captSparkSetting,                                           { exTrigModeSelect == 1 }           ;  |
        panel = misfireDetectionSetting,                                    { exTrigModeSelect == 3 }           ;  |
        panel = viecleSpeedCaptureSetting,                                  { exTrigModeSelect == 4 }           ;  |
                                                                                                                ;  |
    dialog = digitalInputPort2, "Digital Input Port2", border                                                   ;  |
        panel = digitalInputPort2select, West                                                                   ;  |
        field = ""                                                                                              ;  |
        panel = captDutyPulseSettingCh1, East,                              { dutyPulseCaptureEnabled == 1 }    ;  |
                                                                                                                ;  |
    dialog = digitalInputPort3, "Digital Input Port3", border                                                   ;  |
        panel = digitalInputPort3select, West                                                                   ;  |
        field = ""                                                                                              ;  |
        panel = captDutyPulseSettingCh2, East,                              { dutyPulseCaptureEnabled2 == 1 }   ;  |
                                                                                                                ;  |
    dialog = inputPortSetting, "Input Port Setting", yAxis                                                      ;  |
        panel = analogInputPort1                                                                                ;  |
        panel = analogInputPort2                                                                                ;  V [PJC v1.03]
        panel = digitalInputPort1                                                                               ;[PJSC v1.01]
        panel = digitalInputPort2                                                                               ;[PJSC v1.01]
        panel = digitalInputPort3                                                                               ;[PJSC v1.01]

; Flex fuel stuff
    dialog = flexFuelSettings, "", yAxis
        field = "Flex Fuel Sensor ", flexEnabled
        field = "Low (E0) ",         flexFreqLow,  { flexEnabled }
        field = "High (E100) ",      flexFreqHigh, { flexEnabled }

    dialog = flexFuelWest, ""
        panel = flex_fuel_curve,     { flexEnabled }
        panel = flex_adv_curve,      { flexEnabled }

    dialog = flexFuelEast, ""
        panel = flex_boost_curve,    { flexEnabled && boostEnabled }

    ;dialog = flexCurves, "", indexCard
    dialog = flexCurves, "", xAxis
        panel = flexFuelWest, West
        panel = flexFuelEast, East

    dialog = flexFueling, "Fuel Sensor Settings", border
        topicHelp = "http://speeduino.com/wiki/index.php/Flex_Fuel"
        ;panel = flexFuelWest, West
        panel = flexFuelSettings, North
        panel = flexCurves,   South

; Knock control settings
    dialog = knock_windows, "Knock Windows", xAxis
        panel = knock_window_angle_curve, West, { knock_mode }
        panel = knock_window_duration_curve, East, { knock_mode }

    dialog = knock_settings_west, "Settings", yAxis
        field = "Knock Mode",               knock_mode
        field = "Knock Pin",                knock_pin,          { knock_mode }
        field = "Knock active when pin is", knock_trigger,      { knock_mode == 1 }
        field = "Use pullup",               knock_pullup,       { knock_mode == 1 }

    dialog = knock_settings_east, "Detection and Response"
        field = "#Detection"
        field = "Knock count required",     knock_count,        { knock_mode == 1}
        field = "Knock threshold required", knock_threshold,    { knock_mode == 2}
        field = "Maximum MAP",              knock_maxMAP,       { knock_mode }
        field = "Maximum RPM",              knock_maxRPM,       { knock_mode }
        
        ;Retard and recovery
        field = "#Retard"
        field = "Total retard",             knock_maxRetard,    { knock_mode }
        field = "First step size",          knock_firstStep,    { knock_mode }
        field = "Other step size",          knock_stepSize,     { knock_mode }
        field = "Step time",                knock_stepTime,     { knock_mode }
        
        field = "#Recovery"
        field = "Retard duration",          knock_duration,     { knock_mode } ;Time before retard starts ending
        field = "Recovery step time",       knock_recoveryStepTime,     { knock_mode } ;Time between each recovery step
        field = "Recovery step size",       knock_recoveryStep, { knock_mode }

    dialog = knock_settings_top, "", xAxis
        panel = knock_settings_west, West
        panel = knock_settings_east, East

    dialog = knockSettings, "", border
        topicHelp = "http://speeduino.com/wiki/index.php/Knock"
        panel = knock_settings_top, North
        panel = knock_windows, South
        


    dialog = tacho, "Tacho"
        field = "Output pin",           tachoPin
        field = "Output speed",         tachoDiv

    dialog = accelEnrichments_center, ""
      field = "TPSdot Threshold",       tpsThresh
      field = "Accel Time",             taeTime
      field = "Taper Start RPM",        taeTaperMin
      field = "Taper End RPM",          taeTaperMax

    dialog = accelEnrichments_south, "Decelleration Fuel Cutoff (DFCO)"
      field = "Enabled", dfcoEnabled
      field = "TPS Threshold", dfcoTPSThresh,                     { dfcoEnabled }
      field = "Cutoff RPM", dfcoRPM,                           { dfcoEnabled }
      field = "RPM Hysteresis", dfcoHyster,                       { dfcoEnabled }

    dialog = accelEnrichments_north_south, ""
      liveGraph = pump_ae_Graph, "AE Graph"
            graphLine = afr
            graphLine = TPSdot, "%", -2000, 2000, auto, auto

    dialog = accelEnrichments_north, "", xAxis
      panel = time_accel_tpsdot_curve

    dialog = accelEnrichments, "Acceleration Enrichment"
        topicHelp = "http://speeduino.com/wiki/index.php/Acceleration_Wizard"
        panel = accelEnrichments_north, North
        panel = accelEnrichments_north_south, Center
        panel = accelEnrichments_center, Center
        panel = accelEnrichments_south, South

    dialog = correctionSelect, "Fuel correction"                                                               ;[PJSC v1.03]
        field = "Barometric correction",         baroCorr                                                      ; |
        field = "IAT density correction",        swIATcorrection                                               ; |
        field = "Acceleration Enrichment",       swTAE                                                         ; |
        field = "Cranking Enrichment",           swCrankingEnrichment                                          ; |
        field = "Warmup Enrichment",             swWUE                                                         ; |
        field = "After Start Enrichment",        swASE                                                         ; V
        field = "Injector voltage correction",   swBatVCorrection                                              ;[PJSC v1.03]

    dialog = veCorrectionSetting, "VE correction setting"                                                      ;[PJSC v1.01]
        field = "Multiply VE value by MAP:Baro ratio", multiplyMAP                                             ; |
        field = "Multiply by ratio of AFR to Target AFR", includeAFR,         { egoType == 2 }                 ; |
;[PJSC v1.03]        field = "Barometric correction", baroCorr,                            { useExtBaro }                   ; |
                                                                                                               ; |
    dialog = veMapSelectionSet1Pri, "Primary Table"                                                            ; |
        field = "Injector 1", veMapSelection1Pri                                                               ; |
        field = "Injector 2", veMapSelection2Pri,    { multiVEmapEnabled && mapSeparationEnabled }             ; |
        field = "Injector 3", veMapSelection3Pri,    { multiVEmapEnabled && mapSeparationEnabled }             ; |
        field = "Injector 4", veMapSelection4Pri,    { multiVEmapEnabled && mapSeparationEnabled }             ; |
                                                                                                               ; |
    dialog = veMapSelectionSet1Sec, "Secondary Table"                                                          ; |
        field = "", veMapSelection1Sec,    { multiVEmapEnabled && dualFuelEnabled }                            ; |
        field = "", veMapSelection2Sec,    { multiVEmapEnabled && mapSeparationEnabled && dualFuelEnabled }    ; |
        field = "", veMapSelection3Sec,    { multiVEmapEnabled && mapSeparationEnabled && dualFuelEnabled }    ; |
        field = "", veMapSelection4Sec,    { multiVEmapEnabled && mapSeparationEnabled && dualFuelEnabled }    ; |
                                                                                                               ; |
    dialog = veMapSelectionSet1, "VE Table selection1 - SW OFF", xAxis                                         ; |
        panel = veMapSelectionSet1Pri                                                                          ; |
        panel = veMapSelectionSet1Sec,            { multiVEmapEnabled && dualFuelEnabled }                     ; |
                                                                                                               ; |
    dialog = veMapSelectionSet2Pri, "Primary Table"                                                            ; |
        field = "Injector 1", veMapSelection1_2Pri,  { multiVEmapEnabled }                                     ; |
        field = "Injector 2", veMapSelection2_2Pri,  { multiVEmapEnabled && mapSeparationEnabled }             ; |
        field = "Injector 3", veMapSelection3_2Pri,  { multiVEmapEnabled && mapSeparationEnabled }             ; |
        field = "Injector 4", veMapSelection4_2Pri,  { multiVEmapEnabled && mapSeparationEnabled }             ; |
                                                                                                               ; |
    dialog = veMapSelectionSet2Sec, "Secondary Table"                                                          ; |
        field = "", veMapSelection1_2Sec,  { multiVEmapEnabled && dualFuelEnabled }                            ; |
        field = "", veMapSelection2_2Sec,  { multiVEmapEnabled && mapSeparationEnabled && dualFuelEnabled }    ; |
        field = "", veMapSelection3_2Sec,  { multiVEmapEnabled && mapSeparationEnabled && dualFuelEnabled }    ; |
        field = "", veMapSelection4_2Sec,  { multiVEmapEnabled && mapSeparationEnabled && dualFuelEnabled }    ; |
                                                                                                               ; |
    dialog = veMapSelectionSet2, "VE Table selection2 - SW ON", xAxis                                          ; |
        panel = veMapSelectionSet2Pri                                                                          ; |
        panel = veMapSelectionSet2Sec,            { multiVEmapEnabled && dualFuelEnabled }                     ; |
                                                                                                               ; |
    dialog = veMapSelectionDialog, ""                                                                          ; |
        panel = veMapSelectionSet1                                                                             ; |
        panel = veMapSelectionSet2,               { mapSwitchingEnabled }                                      ; |
                                                                                                               ; |
    dialog = veMapSelectOption, "VE Table select settings"                                                     ; |
        field = "Multi VE Table",           multiVEmapEnabled                                                  ; |
        field = "VE Table Separation",      mapSeparationEnabled                                               ; |
        field = "VE Table Switching",       mapSwitchingEnabled                                                ; |
        field = "Dual Fuel Load",           dualFuelEnabled                                                    ; |
        field = "Dual Fuel Load Algorithm", secondaryFuelUsage, { dualFuelEnabled }                            ; |
                                                                                                               ; |
    dialog = veFuelLoadSelection, "Fuel Load Selection"                                                        ; |
        field = "VE Table 1 Fuel Load",     algorithm                                                          ; |
        field = "VE Table 2 Fuel Load",     algorithm2,         { multiVEmapEnabled }                          ; |
        field = "VE Table 3 Fuel Load",     algorithm3,         { multiVEmapEnabled }                          ; |
#if table4_fuel                                                                                                ; |
        field = "VE Table 4 Fuel Load",     ignAlgorithm,       { multiVEmapEnabled }                          ; |
#endif                                                                                                         ; |
                                                                                                               ; |
    dialog = veMapSelectConfig, "", xAxis                                                                      ; |
        panel = veMapSelectOption                                                                              ; |
        panel = veFuelLoadSelection                                                                            ; |
                                                                                                               ; |
    dialog = veMapSelectDialog, "VE Table configration"                                                        ; |
        panel = veCorrectionSetting                                                                            ; |
        panel = veMapSelectConfig                                                                              ; V
        panel = veMapSelectionDialog                                                                           ;[PJSC v1.01]

;[PJSC]    dialog = veTableDialog_north, ""
;[PJSC]        panel = veTable1Tbl

;[PJSC]    dialog = veTableDialog, "VE Table"
;[PJSC]        panel = veTableDialog_north, North
;[PJSC]        panel = veTableDialog_south, South
    dialog = veTable1Dialog, "VE Table 1"                                                                      ;[PJSC v1.01]
        panel = veTable1Tbl                                                                                    ; |
                                                                                                               ; |
    dialog = veTable2Dialog, "VE Table 2"                                                                      ; |
        panel = veTable2Tbl                                                                                    ; |
                                                                                                               ; |
    dialog = veTable3Dialog, "VE Table 3"                                                                      ; |
        panel = veTable3Tbl                                                                                    ; |
                                                                                                               ; |
    dialog = veTable4Dialog, "VE Table 4"                                                                      ; V
        panel = sparkTbl                                                                                       ;[PJSC v1.01]

    dialog = squirtDeviceSelection_west, ""                                                                    ;[PJSC v1.03]
        field = "Channel 1",       squirtDeviceTypeCh1                                                         ; |
        field = "Channel 2",       squirtDeviceTypeCh2                                                         ; |
        field = "Channel 3",       squirtDeviceTypeCh3                                                         ; |
        field = "Channel 4",       squirtDeviceTypeCh4                                                         ; |
                                                                                                               ; |
    dialog = squirtDeviceSelection_east, ""                                                                    ; |
        field = "Valve Mode",      solenoidValveDirectionCh1, { squirtDeviceTypeCh1 == 1 }                     ; |
        field = "Valve Mode",      solenoidValveDirectionCh2, { squirtDeviceTypeCh2 == 1 }                     ; |
        field = "Valve Mode",      solenoidValveDirectionCh3, { squirtDeviceTypeCh3 == 1 }                     ; |
        field = "Valve Mode",      solenoidValveDirectionCh4, { squirtDeviceTypeCh4 == 1 }                     ; |
                                                                                                               ; |
    dialog = squirtDeviceSelection, "Squirt Device selection", xAxis                                           ; |
        panel = squirtDeviceSelection_west                                                                     ; |
        panel = squirtDeviceSelection_east                                                                     ; |
                                                                                                               ; |
    dialog = injCloseAngles_west, ""                                                                           ; |
        field = "Channel 1",       inj1SquirtStartEnd,      { squirtDeviceTypeCh1 == 0 }                       ; |
        field = "Channel 2",       inj2SquirtStartEnd,      { indInjAng && squirtDeviceTypeCh2 == 0 }          ; |
        field = "Channel 3",       inj3SquirtStartEnd,      { indInjAng && squirtDeviceTypeCh3 == 0 }          ; |
        field = "Channel 4",       inj4SquirtStartEnd,      { indInjAng && squirtDeviceTypeCh4 == 0 }          ; |
                                                                                                               ; |
    dialog = injCloseAngles_east, ""                                                                           ; |
        field = "",                inj1Ang,                 { squirtDeviceTypeCh1 == 0 }                       ; |
        field = "",                inj2Ang,                 { indInjAng && squirtDeviceTypeCh2 == 0 }          ; |
        field = "",                inj3Ang,                 { indInjAng && squirtDeviceTypeCh3 == 0 }          ; V
        field = "",                inj4Ang,                 { indInjAng && squirtDeviceTypeCh4 == 0 }          ;[PJSC v1.03]

;[PJSC v1.03]    dialog = injCloseAngles_west, ""                                                                                                                                                                   ;[PJSC v1.01]
;[PJSC v1.03]        field = "Channel 1",       inj1SquirtStartEnd,      { squirtDeviceType == 0 }                                                                                                                  ; |
;[PJSC v1.03]        field = "Channel 2",       inj2SquirtStartEnd,      { (nCylinders > 1 || nInjectors > 1) && indInjAng && squirtDeviceType == 0 }                                                               ; |
;[PJSC v1.03]        field = "Channel 3",       inj3SquirtStartEnd,      { indInjAng && (nCylinders > 2 || nInjectors > 2 && (injLayout > 0)) && squirtDeviceType == 0 }                                            ; V
;[PJSC v1.03]        field = "Channel 4",       inj4SquirtStartEnd,      { indInjAng && (nCylinders > 4 || ((nCylinders == 4 || nInjectors > 3) && (injLayout > 0))) && squirtDeviceType == 0 }                     ;[PJSC v1.01]
;[PJSC v1.03]
;[PJSC v1.03]    dialog = injCloseAngles_east, ""                                                                                                                                                                   ;[PJSC v1.01]
;[PJSC v1.03]        field = "",                inj1Ang,                 { squirtDeviceType == 0 }                                                                                                                  ; |
;[PJSC v1.03]        field = "",                inj2Ang,                 { (nCylinders > 1 || nInjectors > 1) && indInjAng && squirtDeviceType == 0 }                                                               ; |
;[PJSC v1.03]        field = "",                inj3Ang,                 { indInjAng && (nCylinders > 2 || nInjectors > 2 && (injLayout > 0)) && squirtDeviceType == 0 }                                            ; V
;[PJSC v1.03]        field = "",                inj4Ang,                 { indInjAng && (nCylinders > 4 || ((nCylinders == 4 || nInjectors > 3) && (injLayout > 0))) && squirtDeviceType == 0 }                     ;[PJSC v1.01]

    dialog = injCloseAngles, "Injector squirt angle", xAxis                                                                                                                                            ;[PJSC v1.01]
        panel = injCloseAngles_west                                                                                                                                                                    ; V
        panel = injCloseAngles_east                                                                                                                                                                    ;[PJSC v1.01]

    dialog = injChars, "Injector Characteristics"                                                                                                                                      ;[PJSC v1.01]
;[PJSC v1.03]        field = "Squirt Device",              squirtDeviceType                                                                                                                         ; |
;[PJSC v1.03]        field = "Pump Jet solenoid freq.",    pjscFreq,       { squirtDeviceType == 1 }                                                                                                ; |
;[PJSC v1.03]        field = "Injector Open Time",         injOpen,        { squirtDeviceType == 0 }                                                                                                ; |
;[PJSC v1.03]        field = "Injector Duty Limit",        dutyLim,        { squirtDeviceType == 0 }                                                                                                ; |
;[PJSC v1.03]        field = "Individual channel setting", indInjAng,      { squirtDeviceType == 0 }                                                                                                ; |
        field = "Injector Open Time",         injOpen,        { squirtDeviceTypeCh1 == 0 || squirtDeviceTypeCh2 == 0 || squirtDeviceTypeCh3 == 0 || squirtDeviceTypeCh4 == 0 }         ; |[PJSC v1.03]
        field = "Injector Duty Limit",        dutyLim,        { squirtDeviceTypeCh1 == 0 || squirtDeviceTypeCh2 == 0 || squirtDeviceTypeCh3 == 0 || squirtDeviceTypeCh4 == 0 }         ; |[PJSC v1.03]
        field = "Individual channel setting", indInjAng,      { squirtDeviceTypeCh1 == 0 || squirtDeviceTypeCh2 == 0 || squirtDeviceTypeCh3 == 0 || squirtDeviceTypeCh4 == 0 }         ; |[PJSC v1.03]
        field = "Pump Jet solenoid freq.",    pjscFreq,       { squirtDeviceTypeCh1 == 1 || squirtDeviceTypeCh2 == 1 || squirtDeviceTypeCh3 == 1 || squirtDeviceTypeCh4 == 1 }         ; |[PJSC v1.03]
        panel = squirtDeviceSelection                                                                                                                                                  ; |[PJSC v1.03]
        panel = injCloseAngles                                                                                                                                                         ; V
        panel = injector_voltage_curve                                                                                                                                                 ;[PJSC v1.01]

;[PJSC v1.01]    dialog = injChars, "Injector Characteristics"                                                                                                                                    ;[PJSC]
;[PJSC v1.01]      field = "Squirt Device",              squirtDeviceType                                                                                                                         ; |
;[PJSC v1.01]      field = "PJSC solenoid freq.",        pjscFreq,       { squirtDeviceType == 1 }                                                                                                ; |
;[PJSC v1.01]      field = "Injector Open Time",         injOpen,        { squirtDeviceType == 0 }                                                                                                ; |
;[PJSC v1.01]      field = "Injector close angle",                       { squirtDeviceType == 0 }                                                                                                ; |
;[PJSC v1.01]      field = "",                           inj1Ang,        { indInjAng == 0 && squirtDeviceType == 0 }                                                                              ; |
;[PJSC v1.01]      field = "Individual channel setting", indInjAng,      { squirtDeviceType == 0 }                                                                                                ; |
;[PJSC v1.01]      field = "Channel 1",                  inj1Ang,        { indInjAng && squirtDeviceType == 0 }                                                                                   ; |
;[PJSC v1.01]      field = "Channel 2",                  inj2Ang,        { (nCylinders > 1 || nInjectors > 1) && indInjAng && squirtDeviceType == 0 }                                             ; |[PJSC v1.01]
;[PJSC v1.01]      field = "Channel 3",                  inj3Ang,        { indInjAng && (nCylinders > 4 || nCylinders == 3 || nInjectors > 2 || ((nCylinders == 4) && (injLayout == 3))) && squirtDeviceType == 0 } ; |[PJSC v1.01]
;[PJSC v1.01]      field = "Channel 4",                  inj4Ang,        { indInjAng && (nCylinders > 6 || ((nCylinders == 4 || nInjectors > 3) && (injLayout == 3))) && squirtDeviceType == 0 }  ; |[PJSC v1.01]
;[PJSC v1.01]      field = "Injector Duty Limit",        dutyLim,        { squirtDeviceType == 0 }                                                                                                ; V
;[PJSC v1.01]      panel = injector_voltage_curve                                                                                                                                                 ;[PJSC]

;[PJSC]   dialog = injChars, "Injector Characteristics"
;[PJSC]      field = "Injector Open Time",         injOpen
;[PJSC]      field = "Injector close angle"
;[PJSC]      field = "",                           inj1Ang,        { indInjAng == 0 }
;[PJSC]      field = "Individual channel setting", indInjAng
;[PJSC]      field = "Channel 1",                  inj1Ang,        { indInjAng }
;[PJSC]      field = "Channel 2",                  inj2Ang,        { nCylinders > 1 && indInjAng }
;[PJSC]      field = "Channel 3",                  inj3Ang,        { indInjAng && (nCylinders > 4 || nCylinders == 3 || ((nCylinders == 4) && (injLayout == 3))) }
;[PJSC]      field = "Channel 4",                  inj4Ang,        { indInjAng && (nCylinders > 6 || ((nCylinders == 4) && (injLayout == 3))) }
;[PJSC]      field = "Injector Duty Limit",        dutyLim
;[PJSC]      panel = injector_voltage_curve

    dialog = egoControl, ""
        topicHelp = "http://speeduino.com/wiki/index.php/AFR/O2"
        field = "Sensor Type",            egoType
        field = "Algorithm",              egoAlgorithm,       { egoType }
        field = "Ignition Events per Step",  egoCount,        { egoType && (egoAlgorithm < 3) }
        field = "Controller Auth +/-",    egoLimit,           { egoType && (egoAlgorithm < 3) }
        field = "Only correct above:",    ego_min,    { egoType && (egoAlgorithm < 3) }
        field = "and correct below:",     ego_max,    { egoType && (egoAlgorithm < 3) }

        field = "Active Above Coolant", egoTemp,              { egoType && (egoAlgorithm < 3) }
        field = "Active Above RPM",          egoRPM,          { egoType && (egoAlgorithm < 3) }
        field = "Active Below TPS",          egoTPSMax,      { egoType && (egoAlgorithm < 3) }
        field = "EGO delay after start",     ego_sdelay,      { (egoAlgorithm < 3) }
        field = "PID Proportional Gain",  egoKP,              { egoType && (egoAlgorithm == 2) }
        field = "PID Integral",           egoKI,              { egoType && (egoAlgorithm == 2) }
        field = "PID Derivative",         egoKD,              { egoType && (egoAlgorithm == 2) }
        field = ""                                                       ;[PJSC v1.02]For AFR sensor selection
        field = "AFR sensor selection for tune analyze VE"               ;[PJSC v1.02] |
        field = "AFR sensor for VE Table 1",  afr_sensor_selection1      ;[PJSC v1.02] |
        field = "AFR sensor for VE Table 2",  afr_sensor_selection2      ;[PJSC v1.02] |
        field = "AFR sensor for VE Table 3",  afr_sensor_selection3      ;[PJSC v1.02] V
        field = "AFR sensor for VE Table 4",  afr_sensor_selection4      ;[PJSC v1.02]For AFR sensor selection

    dialog = fanSettings,"Fan Settings",7
        field = "Fan Mode",    		 fanEnable
        field = "Fan when off", fanWhenOff, { fanEnable }
        field = "Fan output pin",   fanPin, { fanEnable }
        field = "Fan Output Inverted",    fanInv	, { fanEnable }
        field = "Fan temperature SP",  		 fanSP, { fanEnable }
        field = "Fan hysteresis", 		 fanHyster, { fanEnable }

    dialog = stepper_idle, "Stepper Idle"
        field = "Step time (ms)",       iacStepTime,            { iacAlgorithm == 4 || iacAlgorithm == 5 }
        field = "Home steps",           iacStepHome,            { iacAlgorithm == 4 || iacAlgorithm == 5 }
        field = "Minimum Steps",		iacStepHyster,			{ iacAlgorithm == 4 || iacAlgorithm == 5 }
        field = "Stepper Inverted", iacStepperInv,       { iacAlgorithm == 4 || iacAlgorithm == 5 }

    dialog = pwm_idle, "PWM Idle"
;[PJSC v1.01]        field = "Number of outputs",    iacChannels,            { iacAlgorithm == 2 || iacAlgorithm == 3 }
    	field = "Idle valve frequency",	idleFreq,				{ iacAlgorithm == 2 || iacAlgorithm == 3 }
    	field = "Idle valve direction", iacPWMdir,				{ iacAlgorithm == 2 || iacAlgorithm == 3 }

    dialog = closedloop_idle, "Closed loop Idle"
        field = "P",                    idleKP,                 { iacAlgorithm == 3 || iacAlgorithm == 5 }
        field = "I",                    idleKI,                 { iacAlgorithm == 3 || iacAlgorithm == 5 }
        field = "D",                    idleKD,                 { iacAlgorithm == 3 || iacAlgorithm == 5 }
        field = "Minimum valve duty",   iacCLminDuty,           { iacAlgorithm == 3 }
        field = "Maximum valve duty",   iacCLmaxDuty,           { iacAlgorithm == 3 }

    dialog = idleSettings, "Idle Settings"
	    topicHelp = "http://speeduino.com/wiki/index.php/Idle"
	    field = "Idle control type",    iacAlgorithm
        field = "#Fast Idle"
        field = "Fast idle temp",       iacFastTemp,            { iacAlgorithm == 1 }
        panel = pwm_idle
;[PJSC]        panel = stepper_idle
        panel = closedloop_idle

    dialog = idleUpSettings, "Idle Up Settings"
        field = "Idle Up Enabled",      idleUpEnabled
        field = "Idle Up Pin",          idleUpPin,              { idleUpEnabled }
        field = "Idle Up Pin Polarity", idleUpPolarity,         { idleUpEnabled }
        field = "Idle Up Amount",       idleUpAdder,            { idleUpEnabled }

    dialog = fuelpump, "Fuel pump"
        field = "Fuel pump pin",                    fuelPumpPin
        field = "Fuel pump prime duration",         fpPrime

    dialog = crankingEnrichDialog, "Cranking Enrichment", yAxis
        panel = cranking_enrich_curve
        field = "#Note"
        field = "Values are specified as modifiers to the normal fueling. Eg 100% = No change."

    dialog = crankingIgnOptions, "Cranking Timing", yAxis
        field = "Cranking advance Angle",       CrankAng,       { ignCranklock == 0 }
        field = "Cranking bypass", ignBypassEnable
        field = "Bypass output pin", ignBypassPin               { ignBypassEnable }
        field = "Fix cranking timing with trigger", ignCranklock,   { TrigPattern == 1 || TrigPattern == 4 || TrigPattern == 10 || TrigPattern == 9 }

    dialog = crankingOptions, "", yAxis
        field = "Cranking RPM (Max)", crankRPM
        field = "Flood Clear level", tpsflood
        field = ""
        field = "Fuel pump prime duration", fpPrime
        field = "Priming Pulsewidth", primePulse

    dialog = crankPW, "Cranking Settings", yAxis
        topicHelp = "http://speeduino.com/wiki/index.php/Cranking"
        panel = crankingOptions, North
        panel = crankingEnrichDialog, Center
        panel = crankingIgnOptions, South


    dialog = aseSettings, "Afterstart Enrichment"
        field = "Enrichment %", asePct
        field = "Number of Sec to run", aseCount


    dialog = triggerSettings,"Trigger Settings",4
        topicHelp = "http://speeduino.com/wiki/index.php/Decoders"
        field = "Trigger Pattern",                TrigPattern
        field = "Primary base teeth",             numTeeth,       { TrigPattern == 0 || TrigPattern == 2 || TrigPattern == 11 }
        field = "Primary trigger speed",          TrigSpeed,      { TrigPattern == 0 }
        field = "Missing teeth",                  missingTeeth,   { TrigPattern == 0 }
        field = "Trigger angle multiplier",       TrigAngMul,     { TrigPattern == 11 }
        field = "Trigger Angle ",                 TrigAng
        field = "This number represents the angle ATDC when "
        field = "tooth #1 passes the primary sensor."
#if full_option                                                                                                                                     ;[PJSC v1.02] For simple menu
        field = ""
        field = "Skip Revolutions",              SkipCycles
        field = "Note: This is the number of revolutions that will be skipped during"
        field = "cranking before the injectors and coils are fired"
        field = "Trigger edge",                   TrigEdge      { TrigPattern != 4 } ;4G63 uses both edges
        field = "Secondary trigger edge",         TrigEdgeSec,  { (TrigPattern == 0 && TrigSpeed == 0) || TrigPattern == 2 || TrigPattern == 9 || TrigPattern == 12 } ;Missing tooth, dual wheel and Miata 9905
        field = "Missing Tooth Secondary type"    trigPatternSec,   { (TrigPattern == 0&& TrigSpeed == 0) }
        field = "Trigger Filter",                 TrigFilter,   { TrigPattern != 13 }
        field = "Trigger Filter during cranking", crankingFilter, { TrigPattern != 13 }                                          ;[PJSC v1.02]
        field = "Re-sync every cycle",            useResync,    { TrigPattern == 2 || TrigPattern == 4 || TrigPattern == 7 || TrigPattern == 12 || TrigPattern == 9 || TrigPattern == 13 } ;Dual wheel, 4G63, Audi 135, Nissan 360, Miata 99-05
#endif                                                                                                                                              ;[PJSC v1.02] For simple menu

#if table4_spark                                                         ;[PJSC v1.01] For switching table4
    dialog = sparkSettings,"Spark Settings",4
        field = "Ignition load source",         ignAlgorithm
        field = "Spark output mode",            sparkMode
        field = "Cranking advance Angle",       CrankAng
        field = "Spark Outputs triggers",        IgInv
        field = ""
        field = "Enabled Fixed/Locked timing",  fixAngEnable
        field = "Fixed Angle",                  FixAng,         { fixAngEnable }
        field = "#Note: During cranking the fixed/locked timing angle is overriden by the Cranking advance angle value above"
        field = ""
        field = "#The below option is currently in testing! If unsure what this is, please set to No"
        field = "Use new ignition mode",  perToothIgn,  {TrigPattern == 0 || TrigPattern == 1 || TrigPattern == 2 || TrigPattern == 4 || TrigPattern == 12 || TrigPattern == 13 } ;Only works for missing tooth, distributor, dual wheel, 4g63, nissan 360, Subaru 6/7

    dialog = dwellSettings,                 "Dwell Settings",   4
        topicHelp = "http://speeduino.com/wiki/index.php/Dwell"
        field = "  Cranking dwell",           dwellcrank
        field = "  Running dwell",            dwellrun
        field = "  Spark duration",           sparkDur
        field = ""
        field = "#Note"
        field = "The above times are for 12V. Voltage correction"
        field = "is applied. At higher voltages the time is reduced"
        field = "and when low it is increased"
        field = ""
        field = "Overdwell protection"
        field = "Use Overdwell protection",	useDwellLim
        field = "Max dwell time",             dwellLim,	{ useDwellLim }
        field = "Note: Set the maximum dwell time at least 3ms above"
        field = "your desired dwell time (Including cranking)"

    dialog = rotary_ignition,               "Rotary Ignition",  4
        field = "Ignition Configuration",   rotaryType
        panel = rotaryTrailing_curve
#endif                                                                   ;[PJSC v1.01] For switching table4

    dialog = boostCut, "Boost Cut"
        field = "Boost Cut",                boostCutType
        field = "Boost Limit",              boostLimit,         { boostCutType }

    dialog = boostLoad, ""
        field = "Mode",                     boostType
        field = "In open loop mode, the values in this table are duty cycle %"
        field = "In closed loop mode, the values are boost targets in kPa"
        panel = boostTbl

    dialog = RevLimiterS,                   "Rev Limiter",      4
        topicHelp = "http://speeduino.com/wiki/index.php/Rev_Limits"
        field = "Rev Limiter"
        field = "Soft rev limit",             SoftRevLim
        field = "Soft limit absolute timing", SoftLimRetard
        field = "Soft limit max time",        SoftLimMax
        field = "Hard Rev limit",             HardRevLim
        field = "Hard limiter method",        hardCutType
        panel = boostCut

    dialog = clutchInput,                   "Clutch input"
        field = "Clutch Input Pin",             launchPin,      { launchEnable || flatSEnable }
        field = "Clutch enabled when signal is",launchHiLo,     { launchEnable || flatSEnable }
	      field = "Clutch Pullup Resistor",       lnchPullRes,    { launchEnable || flatSEnable }
	      field = "Launch / Flat Shift switch RPM",flatSArm,      { launchEnable || flatSEnable }

    dialog = LaunchControl,                   "Launch Control / Flat shift",      6
        topicHelp = "http://speeduino.com/wiki/index.php/Launch_Flatshift"
        panel = clutchInput
        ; Launch control
        field = "Launch Control"
        field = "Enable Launch",                launchEnable
        field = "TPS threshold",                lnchCtrlTPS,    { launchEnable }
        field = "Soft rev limit",               lnchSoftLim,    { launchEnable }
        field = "Soft limit absolute timing",   lnchRetard,     { launchEnable }
        field = "Hard rev limit",               lnchHardLim,    { launchEnable }
        field = "Fuel adder during launch",     lnchFuelAdd,    { launchEnable }

        ; Flat shift
        field = "Flat Shift"
        field = "Enable flat shift",            flatSEnable
        field = "Soft rev window",              flatSSoftWin,   { flatSEnable }
        field = "Soft limit absolute timing",   flatSRetard,    { flatSEnable }

    dialog = NitrousStage1,                 "Stage 1"
        field = "Nitrous Output Pin",           n2o_stage1_pin
        field = "Minimum Engage RPM",           n2o_stage1_minRPM
        field = "Maximum Engage RPM",           n2o_stage1_maxRPM
        field = "Fuel adder @ Min RPM",         n2o_stage1_adderMin
        field = "Fuel adder @ Max RPM",         n2o_stage1_adderMax
        field = "Ignition retard when active",  n2o_stage1_retard

    dialog = NitrousStage2,                 "Stage 2"
        field = "Nitrous Output Pin",           n2o_stage2_pin
        field = "Minimum Engage RPM",           n2o_stage2_minRPM
        field = "Maximum Engage RPM",           n2o_stage2_maxRPM
        field = "Fuel adder @ Min RPM",         n2o_stage2_adderMin
        field = "Fuel adder @ Max RPM",         n2o_stage2_adderMax
        field = "Ignition retard when active",  n2o_stage2_retard

    dialog = NitrousMain,                   "Settings"
        field = "Nitrous Mode",                 n2o_enable
        field = "Arming Pin",                   n2o_arming_pin, { n2o_enable > 0 }
        field = "Nitrous is armed when pin is", n2o_pin_polarity,{ n2o_enable > 0 }
        field = "Minimum CLT",                  n2o_minCLT,     { n2o_enable > 0 }
        field = "Minimum TPS",                  n2o_minTPS,     { n2o_enable > 0 }
        field = "Maximum MAP",                  n2o_maxMAP,     { n2o_enable > 0 }
        field = "Leanest AFR",                  n2o_maxAFR,     { n2o_enable > 0 }

    dialog = NitrousControl,                "Nitrous"
        panel = NitrousMain,                North
        panel = NitrousStage1,              West,   { n2o_enable > 0 }
        panel = NitrousStage2,              East,   { n2o_enable > 1 }


    dialog = OLED, "OLED Display", 2
      field = "Display Type",               display
      field = "#Note"
      field = "ECU must be rebooted after changing above value"
      field = "Field 1",                    display1,   { display }
      field = "Field 2",                    display2,   { display }
      field = "Field 3",                    display3,   { display }
      field = "Field 4",                    display4,   { display }
      ;field = "Bar 1",                      displayB1,  { display }
      ;field = "Bar 2",                      displayB2,  { display > 2 }

    dialog = mapCal, "Calibrate MAP"
          field = "#MAP Sensor"
          settingSelector = "Common Pressure Sensors"
             settingOption = "MPX4115",  mapMin=10,   mapMax=118 ; https://www.nxp.com/docs/en/data-sheet/MPX4115.pdf
             settingOption = "MPX4250",  mapMin=10,   mapMax=260 ; https://www.nxp.com/docs/en/data-sheet/MPX4250A.pdf Vout = VCC x (P x 0.004 – 0.04)
             settingOption = "GM 1-BAR", mapMin=10,   mapMax=105 ; https://speeduino.com/wiki/index.php/File:GM_Table.gif
             settingOption = "GM 2-BAR", mapMin=9,  mapMax=208 ; https://speeduino.com/wiki/index.php/File:GM_Table.gif
             settingOption = "GM 3-BAR", mapMin=1,  mapMax=315 ; VOUT = VS*(.00318*P-.00353)
             settingOption = "MPXH6300", mapMin=1,  mapMax=315 ; https://www.nxp.com/docs/en/data-sheet/MPXH6300A.pdf VOUT = VS*(.00318*P-.00353)
             settingOption = "MPX5700", mapMin=-31,  mapMax=746 ; https://www.nxp.com/docs/en/data-sheet/MPX5700.pdf Vout = VS*(0.0012858*P+0.04)
             settingOption = "MPX6400", mapMin=3,  mapMax=416 ; https://www.nxp.com/docs/en/data-sheet/MPXH6400A.pdf VOUT = VS x (0.002421xP–0.00842)
             settingOption = "Denso 079800", mapMin=0,  mapMax=173 ; http://speeduino.com/forum/viewtopic.php?f=18&t=510&p=7023#p7021
             settingOption = "VW/Audi/Porsche 250kPa", mapMin=26,  mapMax=250 ; http://speeduino.com/forum/viewtopic.php?p=17502#p17502
             settingOption = "Bosch 3 Bar TMAP", mapMin=-6,  mapMax=323

          field =    "kPa At 0.0 Volts",   mapMin
          field =    "kPa At 5.0 Volts",   mapMax

          field = "#Baro Sensor"
          field = "Use external Baro sensor", useExtBaro
          field = "Analog pin to use for ext. Baro sensor", baroPin,  { useExtBaro }

          settingSelector = "Common Pressure Sensors",  { useExtBaro }
             settingOption = "MPX4115",  baroMin=10,   baroMax=118 ; https://www.nxp.com/docs/en/data-sheet/MPX4115.pdf
             settingOption = "MPX4250",  baroMin=10,   baroMax=260 ; https://www.nxp.com/docs/en/data-sheet/MPX4250A.pdf Vout = VCC x (P x 0.004 – 0.04)
             settingOption = "GM 1-BAR", baroMin=10,   baroMax=105 ; https://speeduino.com/wiki/index.php/File:GM_Table.gif
             settingOption = "GM 2-BAR", baroMin=9,  baroMax=208 ; https://speeduino.com/wiki/index.php/File:GM_Table.gif
             settingOption = "GM 3-BAR", baroMin=1,  baroMax=315 ; VOUT = VS*(.00318*P-.00353)
             settingOption = "MPXH6300", baroMin=1,  baroMax=315 ; https://www.nxp.com/docs/en/data-sheet/MPXH6300A.pdf VOUT = VS*(.00318*P-.00353)
             settingOption = "MPX5700", baroMin=-31,  baroMax=746 ; https://www.nxp.com/docs/en/data-sheet/MPX5700.pdf Vout = VS*(0.0012858*P+0.04)
             settingOption = "MPX6400", baroMin=3,  baroMax=416 ; https://www.nxp.com/docs/en/data-sheet/MPXH6400A.pdf VOUT = VS x (0.002421xP–0.00842)
             settingOption = "Denso 079800", baroMin=0,  baroMax=173 ; http://speeduino.com/forum/viewtopic.php?f=18&t=510&p=7023#p7021
             settingOption = "VW/Audi/Porsche 250kPa", baroMin=26,  baroMax=250 ; http://speeduino.com/forum/viewtopic.php?p=17502#p17502
             settingOption = "Bosch 3 Bar TMAP", mapMin=-6,  mapMax=323

          field =    "kPa At 0.0 Volts",   baroMin,  { useExtBaro }
          field =    "kPa At 5.0 Volts",   baroMax,  { useExtBaro }

          field = "#EMAP Sensor"
          field = "Use EMAP sensor", useEMAP
          field = "Analog pin to use for ext. Baro sensor", EMAPPin,  { useEMAP }

          settingSelector = "Common Pressure Sensors",  { useEMAP }
             settingOption = "MPX4115",  EMAPMin=10,   EMAPMax=118 ; https://www.nxp.com/docs/en/data-sheet/MPX4115.pdf
             settingOption = "MPX4250",  EMAPMin=10,   EMAPMax=260 ; https://www.nxp.com/docs/en/data-sheet/MPX4250A.pdf Vout = VCC x (P x 0.004 – 0.04)
             settingOption = "GM 1-BAR", EMAPMin=10,   EMAPMax=105 ; https://speeduino.com/wiki/index.php/File:GM_Table.gif
             settingOption = "GM 2-BAR", EMAPMin=9,  EMAPMax=208 ; https://speeduino.com/wiki/index.php/File:GM_Table.gif
             settingOption = "GM 3-BAR", EMAPMin=1,  EMAPMax=315 ; VOUT = VS*(.00318*P-.00353)
             settingOption = "MPXH6300", EMAPMin=1,  EMAPMax=315 ; https://www.nxp.com/docs/en/data-sheet/MPXH6300A.pdf VOUT = VS*(.00318*P-.00353)
             settingOption = "MPX5700", EMAPMin=-31,  EMAPMax=746 ; https://www.nxp.com/docs/en/data-sheet/MPX5700.pdf Vout = VS*(0.0012858*P+0.04)
             settingOption = "MPX6400", EMAPMin=3,  EMAPMax=416 ; https://www.nxp.com/docs/en/data-sheet/MPXH6400A.pdf VOUT = VS x (0.002421xP–0.00842)
             settingOption = "Denso 079800", EMAPMin=0,  EMAPMax=173 ; http://speeduino.com/forum/viewtopic.php?f=18&t=510&p=7023#p7021
             settingOption = "VW/Audi/Porsche 250kPa", EMAPMin=26,  EMAPMax=250 ; http://speeduino.com/forum/viewtopic.php?p=17502#p17502

          field =    "kPa At 0.0 Volts",   EMAPMin,  { useEMAP }
          field =    "kPa At 5.0 Volts",   EMAPMax,  { useEMAP }

    dialog = sensorFilters, "Analog sensor filters"
        field = "The values here set the amount of filtering to apply to each analog input"
        field = "Higher values result in stronger filtering, but slower response times for readings"
        field = "#Most setups will NOT require changes to the default filter values"
        field = ""
        slider = "Throttle Position Sensor",    ADCFILTER_TPS,  horizontal
        slider = "Coolant Sensor",              ADCFILTER_CLT,  horizontal
        slider = "Inlet Air Temp sensor",       ADCFILTER_IAT,  horizontal
        slider = "O2 sensor",                   ADCFILTER_O2,   horizontal
        slider = "Battery voltage",             ADCFILTER_BAT,  horizontal
        slider = "MAP sensor",                  ADCFILTER_MAP,  horizontal
        slider = "Baro sensor",                 ADCFILTER_BARO, horizontal, { useExtBaro > 0 }

    dialog = boostSettings, "Boost Control"
        topicHelp = "http://speeduino.com/wiki/index.php/Boost_Control"
        field = "Boost Control Enabled",    boostEnabled
        field = "Boost control type",       boostType
        field = "Boost output pin",         boostPin,           { boostEnabled }
        field = "Boost solenoid freq.",     boostFreq,          { boostEnabled }

        field = "Valve minimum duty cycle", boostMinDuty,  { boostEnabled && boostType == 1 }
        field = "Valve maximum duty cycle", boostMaxDuty,  { boostEnabled && boostType == 1 }
        panel = boostCut
        field = "Closed Loop settings"
        field = "Control mode",             boostMode,          { boostEnabled && boostType == 1 }
        slider = "Sensitivity",             boostSens,     horizontal, { boostEnabled && boostType == 1 }
        field = "Control interval",         boostIntv,     { boostEnabled && boostType == 1 }
        field = "P",                        boostKP,       { boostEnabled && boostMode && boostType == 1 }
        field = "I",                        boostKI,       { boostEnabled && boostMode && boostType == 1 }
        field = "D",                        boostKD,       { boostEnabled && boostMode && boostType == 1 }


    dialog = vvtSettings, "VVT Control"
        field = "VVT Control Enabled",          vvtEnabled
        field = "Use VVT map as On / Off only", VVTasOnOff,      { vvtEnabled }
        field = "VVT output pin",               vvtPin,          { vvtEnabled }
        field = "VVT solenoid freq.",           vvtFreq,         { vvtEnabled }
        field = "VVT sampling rate",            vvtSamplingRate, { vvtEnabled }          ;[PJSC v1.03]


    dialog = warmup, "Warmup Enrichment (WUE) - Percent Multiplier"
        panel = warmup_curve
        field = "Final enrichment value must be 100%."
        field = ""
        panel = aseSettings

    ;Fuel trim composite dialog
;[PJSC v1.02]    dialog = inj_trim1TblTitle, "Channel #1"
;[PJSC v1.02]        panel = fuelTrimTable1Tbl,      { fuelTrimEnabled }
;[PJSC v1.02]    dialog = inj_trim2TblTitle, "Channel #2"
;[PJSC v1.02]        panel = fuelTrimTable2Tbl,      { fuelTrimEnabled }
;[PJSC v1.02]    dialog = inj_trim3TblTitle, "Channel #3"
;[PJSC v1.02]        panel = fuelTrimTable3Tbl,      { fuelTrimEnabled }
;[PJSC v1.02]    dialog = inj_trim4TblTitle, "Channel #4"
;[PJSC v1.02]        panel = fuelTrimTable4Tbl,      { fuelTrimEnabled }
;[PJSC v1.02]
;[PJSC v1.02]    dialog = inj_trimadt, "", xAxis
;[PJSC v1.02]        panel = inj_trim1TblTitle
;[PJSC v1.02]        panel = inj_trim2TblTitle
;[PJSC v1.02]    dialog = inj_trimadb, "", xAxis
;[PJSC v1.02]        panel = inj_trim3TblTitle
;[PJSC v1.02]        panel = inj_trim4TblTitle
;[PJSC v1.02]
;[PJSC v1.02]    dialog = inj_trim_enable, ""
;[PJSC v1.02]        field = "Individual fuel trim enabled",     fuelTrimEnabled,    { injLayout == 3 }
;[PJSC v1.02]
;[PJSC v1.02]    dialog = inj_trimad,"Injector Cyl 1-4 Trims", yAxis
;[PJSC v1.02]        panel = inj_trim_enable, North
;[PJSC v1.02]        panel = inj_trimadt, Center
;[PJSC v1.02]        panel = inj_trimadb, South

    ;;Injector staging
    dialog = stagingTableDialog_north, ""
        field = "Staging enabled", stagingEnabled
        field = "Staging mode",   stagingMode
        field = "Size of primary injectors",    stagedInjSizePri,             { stagingEnabled }
        field = "Size of secondary injectors",  stagedInjSizeSec,             { stagingEnabled }

    dialog = stagingTableDialog_south, ""
        panel = stagingTbl,     { stagingMode == 0 }

    dialog = stagingTableDialog, "Staged injection"
        topicHelp = "https://speeduino.com/wiki/index.php/Staged_Injection"
        panel = stagingTableDialog_north, North
        panel = stagingTableDialog_south, South

    dialog = outputtest_warningmessage, ""
        field = "WARNING! USE AT YOUR OWN RISK. INCORRECT USE WILL DAMAGE YOUR HARDWARE!"
        field = "Do not attempt to use this page whilst your engine is running!"
        field = "Forcing the Injector or Spark outputs could cause flooding of your engine or permanent damage to ignition coils!"


	dialog = enableoutputtestbuttons, "Enable Test Controls", xAxis
		;commandButton = "Label Text", command, { Enabled Condition }, optionalFlags

		; The rem > 0 expression is just for testing.. It works when the arduino is on the Stim with rpm.
		; a status bit there would be the expected real expression
		commandButton = "Enable Test Mode", cmdEnableTestMode,{!testenabled & !testactive }

		; 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 = "Stop Test Mode", cmdStopTestMode,{testactive}, clickOnCloseIfEnabled

    dialog = enablefuelpumpbuttons, "Fuel pump", xAxis                                     ;[PJSC v1.01]
        commandButton = "Fuel Pump On", cmdfpon,   { muxout1selection == 4 || muxout2selection == 4 }    ;[PJSC v1.01]
        commandButton = "Fuel Pump Off", cmdfpoff, { muxout1selection == 4 || muxout2selection == 4 }    ;[PJSC v1.01]

    dialog = outputtestinj1, "Injector CH1", yAxis
        commandButton = "Off", cmdtestinj1off,{testactive}
;[PJSC v1.01]        commandButton = "50% DC", cmdtestinj150dc,{!testenabled & testactive}
        commandButton = "On", cmdtestinj1on,{!testenabled & testactive}
        commandButton = "PWM", cmdtestinj150dc, {!testenabled & testactive}                ;[PJSC v1.01]
        field = "PWM freq.", dutyFreqTst1,      {!testenabled & testactive}                ;[PJSC v1.01]
        field = "Duty ratio", dutyRatioTst1,    {!testenabled & testactive}                ;[PJSC v1.01]
    dialog = outputtestinj2, "Injector CH2", yAxis
        commandButton = "Off", cmdtestinj2off,{testactive}
;[PJSC v1.01]        commandButton = "50% DC", cmdtestinj250dc,{!testenabled &testactive}
        commandButton = "On", cmdtestinj2on,{!testenabled & testactive}
        commandButton = "PWM", cmdtestinj250dc, {!testenabled & testactive}                ;[PJSC v1.01]
        field = "PWM freq.", dutyFreqTst2,      {!testenabled & testactive}                ;[PJSC v1.01]
        field = "Duty ratio", dutyRatioTst2,    {!testenabled & testactive}                ;[PJSC v1.01]
    dialog = outputtestinj3, "Injector CH3", yAxis
        commandButton = "Off", cmdtestinj3off,{testactive}
;[PJSC v1.01]        commandButton = "50% DC", cmdtestinj350dc,{!testenabled & testactive}
        commandButton = "On", cmdtestinj3on,{!testenabled & testactive}
        commandButton = "PWM", cmdtestinj350dc, {!testenabled & testactive}                ;[PJSC v1.01]
        field = "PWM freq.", dutyFreqTst3,      {!testenabled & testactive}                ;[PJSC v1.01]
        field = "Duty ratio", dutyRatioTst3,    {!testenabled & testactive}                ;[PJSC v1.01]
    dialog = outputtestinj4, "Injector CH4", yAxis
        commandButton = "Off", cmdtestinj4off,{testactive}
;[PJSC v1.01]        commandButton = "50% DC", cmdtestinj450dc,{!testenabled & testactive}
        commandButton = "On", cmdtestinj4on	,{!testenabled & testactive}
        commandButton = "PWM", cmdtestinj450dc, {!testenabled & testactive}                ;[PJSC v1.01]
        field = "PWM freq.", dutyFreqTst4,      {!testenabled & testactive}                ;[PJSC v1.01]
        field = "Duty ratio", dutyRatioTst4,    {!testenabled & testactive}                ;[PJSC v1.01]

    dialog = outputtest_injectors, "Injector Driver Output Test", xAxis
        panel = outputtestinj1
        panel = outputtestinj2
        panel = outputtestinj3
        panel = outputtestinj4

	dialog = outputtestspk1, "Spark CH1 ", yAxis
        commandButton = "Off", cmdtestspk1off,{testactive}
        commandButton = "50% DC", cmdtestspk150dc,{!testenabled & testactive}
        commandButton = "On", cmdtestspk1on,{!testenabled & testactive}
    dialog = outputtestspk2, "Spark CH2", yAxis
        commandButton = "Off", cmdtestspk2off,{testactive}
        commandButton = "50% DC", cmdtestspk250dc,{!testenabled & testactive}
        commandButton = "On", cmdtestspk2on,{!testenabled & testactive}
    dialog = outputtestspk3, "Spark CH3", yAxis
        commandButton = "Off", cmdtestspk3off,{testactive}
        commandButton = "50% DC", cmdtestspk350dc,{!testenabled & testactive}
        commandButton = "On", cmdtestspk3on,{!testenabled & testactive}
    dialog = outputtestspk4, "Spark CH4", yAxis
        commandButton = "Off", cmdtestspk4off,{testactive}
        commandButton = "50% DC", cmdtestspk450dc,{!testenabled & testactive}
        commandButton = "On", cmdtestspk4on,{!testenabled & testactive}

    dialog = outputtest_spark, "Spark Driver Output Test", xAxis
        panel = outputtestspk1
        panel = outputtestspk2
        panel = outputtestspk3
        panel = outputtestspk4

    dialog = outputtestmux1, "MUX1", yAxis                                                                                ;[PJSC v1.01]
        commandButton = "Off", cmdtestmux1off,  {testactive}                                                              ; |
        commandButton = "On",  cmdtestmux1on,   {!testenabled && testactive && muxout1selection == 0 }                    ; |
        commandButton = "PWM", cmdtestmux150dc, {!testenabled && testactive && muxout1selection == 0 }                    ; |
        field = "PWM freq.",   dutyFreqTst9,    {!testenabled && testactive && muxout1selection == 0 }                    ; |
        field = "Duty ratio",  dutyRatioTst9,   {!testenabled && testactive && muxout1selection == 0 }                    ; |
    dialog = outputtestmux2, "MUX2", yAxis                                                                                ; |
        commandButton = "Off", cmdtestmux2off,  {testactive}                                                              ; |
        commandButton = "On",  cmdtestmux2on,   {!testenabled && testactive && muxout2selection == 0 }                    ; |
        commandButton = "PWM", cmdtestmux250dc, {!testenabled && testactive && muxout2selection == 0 }                    ; |
        field = "PWM freq.",   dutyFreqTst10,   {!testenabled && testactive && muxout2selection == 0 }                    ; |
        field = "Duty ratio",  dutyRatioTst10,  {!testenabled && testactive && muxout2selection == 0 }                    ; |
    dialog = outputtestmux3, "MUX3", yAxis                                                                                ; |
        commandButton = "Off", cmdtestmux3off,  {testactive && pinLayout == 64}                                           ; |
        commandButton = "On",  cmdtestmux3on,   {!testenabled && testactive && muxout3selection == 0 && pinLayout == 64}  ; |
;        commandButton = "PWM", cmdtestmux350dc, {!testenabled && testactive && muxout3selection == 0 && pinLayout == 64} ; |
;        field = "PWM freq.",   dutyFreqTst11,   {!testenabled && testactive && muxout3selection == 0 && pinLayout == 64} ; |
;        field = "Duty ratio",  dutyRatioTst11,  {!testenabled && testactive && muxout3selection == 0 && pinLayout == 64} ; |
    dialog = outputtestmux4, "MUX4", yAxis                                                                                ; |
        commandButton = "Off", cmdtestmux4off,  {testactive && pinLayout == 64}                                           ; |
        commandButton = "On",  cmdtestmux4on,   {!testenabled && testactive && muxout4selection == 0 && pinLayout == 64}  ; |
;        commandButton = "PWM", cmdtestmux450dc, {!testenabled && testactive && muxout4selection == 0 && pinLayout == 64} ; |
;        field = "PWM freq.",   dutyFreqTst12,   {!testenabled && testactive && muxout4selection == 0 && pinLayout == 64} ; |
;        field = "Duty ratio",  dutyRatioTst12,  {!testenabled && testactive && muxout4selection == 0 && pinLayout == 64} ; |
                                                                                                                          ; |
    dialog = outputtest_mux, "MUX Output Test", xAxis                                                                     ; |
        panel = outputtestmux1                                                                                            ; |
        panel = outputtestmux2                                                                                            ; |
        panel = outputtestmux3,                 { pinLayout == 64 }                                                       ; V
        panel = outputtestmux4,                 { pinLayout == 64 }                                                       ;[PJSC v1.01]

;[PJSC v1.01]	dialog = outputtest1,"Test Output Hardware"
	dialog = outputtest1,"Output Test Mode - PWM"                                   ;[PJSC v1.01]
        topicHelp = "http://speeduino.com/wiki/index.php/Hardware_testing_page"
        panel = enableoutputtestbuttons
        panel = enablefuelpumpbuttons                                               ;[PJSC v1.01]
        panel = outputtest_injectors
#if table4_spark                                                                    ;[PJSC v1.01] For switching table4
        panel = outputtest_spark
#endif                                                                              ;[PJSC v1.01] For switching table4
        panel = outputtest_mux                                                      ;[PJSC v1.01]
        ;panel = outputtest_io2
        panel = outputtest_warningmessage

;[PJSC v1.01] For test mode - outputs pulse =========================================================================
    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", cmdEnableTestMode,{!testenabled & !testactive }

        ; 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,{testactive}, 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
        commandButton = "Fuel Pump Off", cmdfpoff

    dialog = outputtest_l, "Output Test Modes", yAxis

    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", cmdtestinjstart
        commandButton = "Stop", cmdtestinjstop

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

    dialog = outputtest_controls, "Output Test Modes", yAxis
      topicHelp = "file://$getProjectsDirPath()/docs/Megasquirt2_TunerStudio_MS_Lite_Reference-3.4.pdf#testinjspk"
        panel = outputTestbuttons1
        panel = outputTestbuttons2
        panel = outputtest_inj

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

    dialog = outputtest2,"Output Test Mode - Pulse", xAxis
        panel = outputtest_controls
        panel = outputtest_r

;[PJSC v1.01] For test mode - outputs pulse =========================================================================
		
	dialog = Auxin_north	
        displayOnlyField = #"Secondary Serial ENABLED", blankfield, {enable_secondarySerial},{enable_secondarySerial}    
		displayOnlyField = !"Secondary Serial DISABLED", blankfield, {enable_secondarySerial == 0},{enable_secondarySerial == 0}    
		displayOnlyField = #"Internal CANBUS ENABLED", blankfield, {enable_intcan && intcan_available},{enable_intcan && intcan_available}    
		displayOnlyField = !"Internal CANBUS DISABLED", blankfield, {enable_intcan == 0 && intcan_available},{enable_intcan == 0 && intcan_available}    
		displayOnlyField = !"Internal CANBUS NOT AVAILABLE to MCU", blankfield, {enable_intcan == 1 && intcan_available == 0},{enable_intcan == 1 && intcan_available == 0}    
		displayOnlyField = !"Internal CANBUS NOT AVAILABLE to MCU", blankfield, {enable_intcan == 0 && intcan_available == 0},{enable_intcan == 0 && intcan_available == 0}    
        field = "   If Secondary Serial or Internal CANBUS is DISABLED then any input channel assigned to that external source will NOT function"	
		
	dialog = canAuxinput_alias, "", yAxis
        field = "Input Alias"
        field = "", AUXin00Alias , {(caninput_sel0a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel0b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin01Alias , {(caninput_sel1a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel1b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin02Alias , {(caninput_sel2a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel2b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin03Alias , {(caninput_sel3a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel3b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin04Alias , {(caninput_sel4a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel4b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin05Alias , {(caninput_sel5a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel5b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin06Alias , {(caninput_sel6a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel6b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin07Alias , {(caninput_sel7a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel7b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin08Alias , {(caninput_sel8a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel8b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin09Alias , {(caninput_sel9a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel9b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin10Alias , {(caninput_sel10a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel10b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin11Alias , {(caninput_sel11a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel11b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin12Alias , {(caninput_sel12a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel12b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin13Alias , {(caninput_sel13a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel13b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin14Alias , {(caninput_sel14a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel14b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin15Alias , {(caninput_sel15a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel15b && (enable_secondarySerial || (enable_intcan && intcan_available)))}

	dialog = caninput_sel, ""
		;CAN inputs
        field = "               CAN Input Channel on/off"
        field = "CAN Input 0", caninput_sel0a, {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "CAN Input 0", caninput_sel0b, {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "CAN Input 1", caninput_sel1a, {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "CAN Input 1", caninput_sel1b, {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "CAN Input 2", caninput_sel2a, {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "CAN Input 2", caninput_sel2b, {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "CAN Input 3", caninput_sel3a, {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "CAN Input 3", caninput_sel3b, {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "CAN Input 4", caninput_sel4a, {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "CAN Input 4", caninput_sel4b, {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "CAN Input 5", caninput_sel5a, {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "CAN Input 5", caninput_sel5b, {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
		field = "CAN Input 6", caninput_sel6a, {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "CAN Input 6", caninput_sel6b, {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "CAN Input 7", caninput_sel7a, {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "CAN Input 7", caninput_sel7b, {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "CAN Input 8", caninput_sel8a, {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "CAN Input 8", caninput_sel8b, {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "CAN Input 9", caninput_sel9a, {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "CAN Input 9", caninput_sel9b, {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "CAN Input 10", caninput_sel10a, {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "CAN Input 10", caninput_sel10b, {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "CAN Input 11", caninput_sel11a, {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "CAN Input 11", caninput_sel11b, {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "CAN Input 12", caninput_sel12a, {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "CAN Input 12", caninput_sel12b, {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "CAN Input 13", caninput_sel13a, {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "CAN Input 13", caninput_sel13b, {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
		field = "CAN Input 14", caninput_sel14a, {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "CAN Input 14", caninput_sel14b, {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "CAN Input 15", caninput_sel15a, {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "CAN Input 15", caninput_sel15b, {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
		
    dialog = caninput_parameter_group, "", yAxis
        field = "             Source CAN Address"
        field = "", caninput_source_can_address0, { (caninput_sel0a == 1 || caninput_sel0b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_can_address1, { (caninput_sel1a == 1 || caninput_sel1b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_can_address2, { (caninput_sel2a == 1 || caninput_sel2b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_can_address3, { (caninput_sel3a == 1 || caninput_sel3b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_can_address4, { (caninput_sel4a == 1 || caninput_sel4b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_can_address5, { (caninput_sel5a == 1 || caninput_sel5b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
		field = "", caninput_source_can_address6, { (caninput_sel6a == 1 || caninput_sel6b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_can_address7, { (caninput_sel7a == 1 || caninput_sel7b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_can_address8, { (caninput_sel8a == 1 || caninput_sel8b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_can_address9, { (caninput_sel9a == 1 || caninput_sel9b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_can_address10, { (caninput_sel10a == 1 || caninput_sel10b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_can_address11, { (caninput_sel11a == 1 || caninput_sel11b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_can_address12, { (caninput_sel12a == 1 || caninput_sel12b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_can_address13, { (caninput_sel13a == 1 || caninput_sel13b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
		field = "", caninput_source_can_address14, { (caninput_sel14a == 1 || caninput_sel14b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_can_address15, { (caninput_sel15a == 1 || caninput_sel15b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }

	dialog = caninput_parameter_start_byte, "", yAxis
        field = "        source data start byte"
        field = "", caninput_source_start_byte0, { (caninput_sel0a == 1 || caninput_sel0b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_start_byte1, { (caninput_sel1a == 1 || caninput_sel1b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_start_byte2, { (caninput_sel2a == 1 || caninput_sel2b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_start_byte3, { (caninput_sel3a == 1 || caninput_sel3b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_start_byte4, { (caninput_sel4a == 1 || caninput_sel4b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_start_byte5, { (caninput_sel5a == 1 || caninput_sel5b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
		field = "", caninput_source_start_byte6, { (caninput_sel6a == 1 || caninput_sel6b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_start_byte7, { (caninput_sel7a == 1 || caninput_sel7b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_start_byte8, { (caninput_sel8a == 1 || caninput_sel8b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_start_byte9, { (caninput_sel9a == 1 || caninput_sel9b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_start_byte10, { (caninput_sel10a == 1 || caninput_sel10b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_start_byte11, { (caninput_sel11a == 1 || caninput_sel11b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_start_byte12, { (caninput_sel12a == 1 || caninput_sel12b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_start_byte13, { (caninput_sel13a == 1 || caninput_sel13b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
		field = "", caninput_source_start_byte14, { (caninput_sel14a == 1 || caninput_sel14b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_start_byte15, { (caninput_sel15a == 1 || caninput_sel15b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }

	dialog = caninput_parameter_num_byte, "", yAxis
        field = "Input Parameter Number of Bytes"
        field = "", caninput_source_num_bytes0, { (caninput_sel0a == 1 || caninput_sel0b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_num_bytes1, { (caninput_sel1a == 1 || caninput_sel1b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_num_bytes2, { (caninput_sel2a == 1 || caninput_sel2b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_num_bytes3, { (caninput_sel3a == 1 || caninput_sel3b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_num_bytes4, { (caninput_sel4a == 1 || caninput_sel4b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_num_bytes5, { (caninput_sel5a == 1 || caninput_sel5b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
		field = "", caninput_source_num_bytes6, { (caninput_sel6a == 1 || caninput_sel6b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_num_bytes7, { (caninput_sel7a == 1 || caninput_sel7b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_num_bytes8, { (caninput_sel8a == 1 || caninput_sel8b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_num_bytes9, { (caninput_sel9a == 1 || caninput_sel9b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_num_bytes10, { (caninput_sel10a == 1 || caninput_sel10b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_num_bytes11, { (caninput_sel11a == 1 || caninput_sel11b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_num_bytes12, { (caninput_sel12a == 1 || caninput_sel12b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_num_bytes13, { (caninput_sel13a == 1 || caninput_sel13b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
		field = "", caninput_source_num_bytes14, { (caninput_sel14a == 1 || caninput_sel14b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }
        field = "", caninput_source_num_bytes15, { (caninput_sel15a == 1 || caninput_sel15b == 1) && (enable_secondarySerial || (enable_intcan && intcan_available)) }

		dialog = caninput_serial_can, "", yAxis
		field = "Serial/CAN"
		field = "", caninput_sel0extsourcea, {(caninput_sel0a == 1 || caninput_sel0b == 1) }, {enable_secondarySerial && (!enable_intcan || (enable_intcan && !intcan_available))}
		field = "", caninput_sel0extsourceb, {(caninput_sel0a == 1 || caninput_sel0b == 1) }, {enable_secondarySerial && (enable_intcan && intcan_available)}
		field = "", caninput_sel0extsourcec, {(caninput_sel0a == 1 || caninput_sel0b == 1) }, {!enable_secondarySerial && (enable_intcan && intcan_available)}		
		field = "", caninput_sel1extsourcea, {(caninput_sel1a == 1 || caninput_sel1b == 1) }, {enable_secondarySerial && (!enable_intcan || (enable_intcan && !intcan_available))}
		field = "", caninput_sel1extsourceb, {(caninput_sel1a == 1 || caninput_sel1b == 1) }, {enable_secondarySerial && (enable_intcan && intcan_available)}
		field = "", caninput_sel1extsourcec, {(caninput_sel1a == 1 || caninput_sel1b == 1) }, {!enable_secondarySerial && (enable_intcan && intcan_available)}		
		field = "", caninput_sel2extsourcea, {(caninput_sel2a == 1 || caninput_sel2b == 1) }, {enable_secondarySerial && (!enable_intcan || (enable_intcan && !intcan_available))}
		field = "", caninput_sel2extsourceb, {(caninput_sel2a == 1 || caninput_sel2b == 1) }, {enable_secondarySerial && (enable_intcan && intcan_available)}
		field = "", caninput_sel2extsourcec, {(caninput_sel2a == 1 || caninput_sel2b == 1) }, {!enable_secondarySerial && (enable_intcan && intcan_available)}		
		field = "", caninput_sel3extsourcea, {(caninput_sel3a == 1 || caninput_sel3b == 1) }, {enable_secondarySerial && (!enable_intcan || (enable_intcan && !intcan_available))}
		field = "", caninput_sel3extsourceb, {(caninput_sel3a == 1 || caninput_sel3b == 1) }, {enable_secondarySerial && (enable_intcan && intcan_available)}
		field = "", caninput_sel3extsourcec, {(caninput_sel3a == 1 || caninput_sel3b == 1) }, {!enable_secondarySerial && (enable_intcan && intcan_available)}		
		field = "", caninput_sel4extsourcea, {(caninput_sel4a == 1 || caninput_sel4b == 1) }, {enable_secondarySerial && (!enable_intcan || (enable_intcan && !intcan_available))}
		field = "", caninput_sel4extsourceb, {(caninput_sel4a == 1 || caninput_sel4b == 1) }, {enable_secondarySerial && (enable_intcan && intcan_available)}
		field = "", caninput_sel4extsourcec, {(caninput_sel4a == 1 || caninput_sel4b == 1) }, {!enable_secondarySerial && (enable_intcan && intcan_available)}		
		field = "", caninput_sel5extsourcea, {(caninput_sel5a == 1 || caninput_sel5b == 1) }, {enable_secondarySerial && (!enable_intcan || (enable_intcan && !intcan_available))}
		field = "", caninput_sel5extsourceb, {(caninput_sel5a == 1 || caninput_sel5b == 1) }, {enable_secondarySerial && (enable_intcan && intcan_available)}
		field = "", caninput_sel5extsourcec, {(caninput_sel5a == 1 || caninput_sel5b == 1) }, {!enable_secondarySerial && (enable_intcan && intcan_available)}		
		field = "", caninput_sel6extsourcea, {(caninput_sel6a == 1 || caninput_sel6b == 1) }, {enable_secondarySerial && (!enable_intcan || (enable_intcan && !intcan_available))}
		field = "", caninput_sel6extsourceb, {(caninput_sel6a == 1 || caninput_sel6b == 1) }, {enable_secondarySerial && (enable_intcan && intcan_available)}
		field = "", caninput_sel6extsourcec, {(caninput_sel6a == 1 || caninput_sel6b == 1) }, {!enable_secondarySerial && (enable_intcan && intcan_available)}		
		field = "", caninput_sel7extsourcea, {(caninput_sel7a == 1 || caninput_sel7b == 1) }, {enable_secondarySerial && (!enable_intcan || (enable_intcan && !intcan_available))}
		field = "", caninput_sel7extsourceb, {(caninput_sel7a == 1 || caninput_sel7b == 1) }, {enable_secondarySerial && (enable_intcan && intcan_available)}
		field = "", caninput_sel7extsourcec, {(caninput_sel7a == 1 || caninput_sel7b == 1) }, {!enable_secondarySerial && (enable_intcan && intcan_available)}		
		field = "", caninput_sel8extsourcea, {(caninput_sel8a == 1 || caninput_sel8b == 1) }, {enable_secondarySerial && (!enable_intcan || (enable_intcan && !intcan_available))}
		field = "", caninput_sel8extsourceb, {(caninput_sel8a == 1 || caninput_sel8b == 1) }, {enable_secondarySerial && (enable_intcan && intcan_available)}
		field = "", caninput_sel8extsourcec, {(caninput_sel8a == 1 || caninput_sel8b == 1) }, {!enable_secondarySerial && (enable_intcan && intcan_available)}		
		field = "", caninput_sel9extsourcea, {(caninput_sel9a == 1 || caninput_sel9b == 1) }, {enable_secondarySerial && (!enable_intcan || (enable_intcan && !intcan_available))}
		field = "", caninput_sel9extsourceb, {(caninput_sel9a == 1 || caninput_sel9b == 1) }, {enable_secondarySerial && (enable_intcan && intcan_available)}
		field = "", caninput_sel9extsourcec, {(caninput_sel9a == 1 || caninput_sel9b == 1) }, {!enable_secondarySerial && (enable_intcan && intcan_available)}		
		field = "", caninput_sel10extsourcea, {(caninput_sel10a == 1 || caninput_sel10b == 1) }, {enable_secondarySerial && (!enable_intcan || (enable_intcan && !intcan_available))}
		field = "", caninput_sel10extsourceb, {(caninput_sel10a == 1 || caninput_sel10b == 1) }, {enable_secondarySerial && (enable_intcan && intcan_available)}
		field = "", caninput_sel10extsourcec, {(caninput_sel10a == 1 || caninput_sel10b == 1) }, {!enable_secondarySerial && (enable_intcan && intcan_available)}		
		field = "", caninput_sel11extsourcea, {(caninput_sel11a == 1 || caninput_sel11b == 1) }, {enable_secondarySerial && (!enable_intcan || (enable_intcan && !intcan_available))}
		field = "", caninput_sel11extsourceb, {(caninput_sel11a == 1 || caninput_sel11b == 1) }, {enable_secondarySerial && (enable_intcan && intcan_available)}
		field = "", caninput_sel11extsourcec, {(caninput_sel11a == 1 || caninput_sel11b == 1) }, {!enable_secondarySerial && (enable_intcan && intcan_available)}		
		field = "", caninput_sel12extsourcea, {(caninput_sel12a == 1 || caninput_sel12b == 1) }, {enable_secondarySerial && (!enable_intcan || (enable_intcan && !intcan_available))}}
		field = "", caninput_sel12extsourceb, {(caninput_sel12a == 1 || caninput_sel12b == 1) }, {enable_secondarySerial && (enable_intcan && intcan_available)}
		field = "", caninput_sel12extsourcec, {(caninput_sel12a == 1 || caninput_sel12b == 1) }, {!enable_secondarySerial && (enable_intcan && intcan_available)}		
		field = "", caninput_sel13extsourcea, {(caninput_sel13a == 1 || caninput_sel13b == 1) }, {enable_secondarySerial && (!enable_intcan || (enable_intcan && !intcan_available))}}
		field = "", caninput_sel13extsourceb, {(caninput_sel13a == 1 || caninput_sel13b == 1) }, {enable_secondarySerial && (enable_intcan && intcan_available)}
		field = "", caninput_sel13extsourcec, {(caninput_sel13a == 1 || caninput_sel13b == 1) }, {!enable_secondarySerial && (enable_intcan && intcan_available)}		
		field = "", caninput_sel14extsourcea, {(caninput_sel14a == 1 || caninput_sel14b == 1) }, {enable_secondarySerial && (!enable_intcan || (enable_intcan && !intcan_available))}}
		field = "", caninput_sel14extsourceb, {(caninput_sel14a == 1 || caninput_sel14b == 1) }, {enable_secondarySerial && (enable_intcan && intcan_available)}
		field = "", caninput_sel14extsourcec, {(caninput_sel14a == 1 || caninput_sel14b == 1) }, {!enable_secondarySerial && (enable_intcan && intcan_available)}		
		field = "", caninput_sel15extsourcea, {(caninput_sel15a == 1 || caninput_sel15b == 1) }, {enable_secondarySerial && (!enable_intcan || (enable_intcan && !intcan_available))}}
		field = "", caninput_sel15extsourceb, {(caninput_sel15a == 1 || caninput_sel15b == 1) }, {enable_secondarySerial && (enable_intcan && intcan_available)}
		field = "", caninput_sel15extsourcec, {(caninput_sel15a == 1 || caninput_sel15b == 1) }, {!enable_secondarySerial && (enable_intcan && intcan_available)}
		
		dialog = caninconfig_blank1,""
		field = ""

	dialog = Canin_config1, "", xAxis
        panel = canAuxinput_alias
        panel = caninconfig_blank1
        panel = caninput_sel
		panel = caninconfig_blank1
		panel = caninput_serial_can
        panel = caninconfig_blank1
        panel = caninput_parameter_group
        panel = caninconfig_blank1
        panel = caninput_parameter_start_byte
        panel = caninconfig_blank1
        panel = caninput_parameter_num_byte				

	;dialog = Canin_config2, "External Data Input"
    ;    field = "Enable External data input",		enable_intcandata_in

	dialog = Canin_config, "",yAxis
	topicHelp = "http://speeduino.com/wiki/index.php/Secondary_Serial_IO_interface#Read_external_analog_data"
        panel = Auxin_north
        panel = Canin_config1
    
	dialog = canAuxoutput_alias, "", yAxis
        field = "Input Alias"
        field = "", AUXin00Alias , {canoutput_sel0}
        field = "", AUXin01Alias , {canoutput_sel1}
        field = "", AUXin02Alias , {canoutput_sel2}
        field = "", AUXin03Alias , {canoutput_sel3}
        field = "", AUXin04Alias , {canoutput_sel4}
        field = "", AUXin05Alias , {canoutput_sel5}
        field = "", AUXin06Alias , {canoutput_sel6}
        field = "", AUXin07Alias , {canoutput_sel7}
        ;field = "", AUXin08Alias , {canoutput_sel8}
        ;field = "", AUXin09Alias , {canoutput_sel9}
        ;field = "", AUXin10Alias , {canoutput_sel10}
        ;field = "", AUXin11Alias , {canoutput_sel11}
        ;field = "", AUXin12Alias , {canoutput_sel12}
        ;field = "", AUXin13Alias , {canoutput_sel13}
        ;field = "", AUXin14Alias , {canoutput_sel14}
        ;field = "", AUXin15Alias , {canoutput_sel15}
        
	dialog = canoutput_sel, "", yAxis
		;CAN outputs
        field = "CAN Output Channel on/off"
        field = "CAN Output 0", canoutput_sel0, { enable_intcandata_out}
        field = "CAN Output 1", canoutput_sel1, { enable_intcandata_out }
        field = "CAN Output 2", canoutput_sel2, { enable_intcandata_out }
        field = "CAN Output 3", canoutput_sel3, { enable_intcandata_out }
        field = "CAN Output 4", canoutput_sel4, { enable_intcandata_out }
        field = "CAN Output 5", canoutput_sel5, { enable_intcandata_out }
		field = "CAN Output 6", canoutput_sel6, { enable_intcandata_out }
        field = "CAN Output 7", canoutput_sel7, { enable_intcandata_out }
       ; field = "CAN Output 8", canoutput_sel8, { enable_intcandata_out}
       ; field = "CAN Output 9", canoutput_sel9, { enable_intcandata_out }
       ; field = "CAN Output 10", canoutput_sel10, { enable_intcandata_out }
       ; field = "CAN Output 11", canoutput_sel11, { enable_intcandata_out }
       ; field = "CAN Output 12", canoutput_sel12, { enable_intcandata_out }
       ; field = "CAN Output 13", canoutput_sel13, { enable_intcandata_out }
	;	field = "CAN Output 14", canoutput_sel14, { enable_intcandata_out }
     ;   field = "CAN Output 15", canoutput_sel15, { enable_intcandata_out }

    dialog = canoutput_parameter_group, "", yAxis
        field = "Output Parameter Group"
        field = "", canoutput_param_group[0], { canoutput_sel0 && enable_intcandata_out }
        field = "", canoutput_param_group[1], { canoutput_sel1 && enable_intcandata_out }
        field = "", canoutput_param_group[2], { canoutput_sel3 && enable_intcandata_out }
        field = "", canoutput_param_group[3], { canoutput_sel3 && enable_intcandata_out }
        field = "", canoutput_param_group[4], { canoutput_sel4 && enable_intcandata_out }
        field = "", canoutput_param_group[5], { canoutput_sel5 && enable_intcandata_out }
		field = "", canoutput_param_group[6], { canoutput_sel6 && enable_intcandata_out }
        field = "", canoutput_param_group[7], { canoutput_sel7 && enable_intcandata_out }
      ;  field = "", canoutput_param_group[8], { canoutput_sel9 && enable_intcandata_out }
      ;  field = "", canoutput_param_group[9], { canoutput_sel10 && enable_intcandata_out }
      ;  field = "", canoutput_param_group[10], { canoutput_sel1 && enable_intcandata_out }
      ;  field = "", canoutput_param_group[11], { canoutput_sel2 && enable_intcandata_out }
      ;  field = "", canoutput_param_group[12], { canoutput_sel3 && enable_intcandata_out }
      ;  field = "", canoutput_param_group[13], { canoutput_sel4 && enable_intcandata_out }
	;	field = "", canoutput_param_group[14], { canoutput_sel5 && enable_intcandata_out }
    ;    field = "", canoutput_param_group[15], { canoutput_sel6 && enable_intcandata_out }

	dialog = canoutput_parameter_start_byte, "", yAxis
        field = "Output Parameter Start Byte"
        field = "", canoutput_param_start_byte0, { canoutput_sel0 && enable_intcandata_out }
        field = "", canoutput_param_start_byte1, { canoutput_sel1 && enable_intcandata_out }
        field = "", canoutput_param_start_byte2, { canoutput_sel2 && enable_intcandata_out }
        field = "", canoutput_param_start_byte3, { canoutput_sel3 && enable_intcandata_out }
        field = "", canoutput_param_start_byte4, { canoutput_sel4 && enable_intcandata_out }
        field = "", canoutput_param_start_byte5, { canoutput_sel5 && enable_intcandata_out }
		field = "", canoutput_param_start_byte6, { canoutput_sel6 && enable_intcandata_out }
        field = "", canoutput_param_start_byte7, { canoutput_sel7 && enable_intcandata_out }
    ;    field = "", canoutput_param_start_byte8, { canoutput_sel8 && enable_intcandata_out }
    ;    field = "", canoutput_param_start_byte9, { canoutput_sel9 && enable_intcandata_out }
    ;    field = "", canoutput_param_start_byte10, { canoutput_sel10 && enable_intcandata_out }
    ;    field = "", canoutput_param_start_byte11, { canoutput_sel11 && enable_intcandata_out }
    ;    field = "", canoutput_param_start_byte12, { canoutput_sel12 && enable_intcandata_out }
    ;    field = "", canoutput_param_start_byte13, { canoutput_sel13 && enable_intcandata_out }
;		field = "", canoutput_param_start_byte14, { canoutput_sel14 && enable_intcandata_out }
 ;       field = "", canoutput_param_start_byte15, { canoutput_sel15 && enable_intcandata_out }

	dialog = canoutput_parameter_num_byte, "", yAxis
        field = "Output Parameter Number of Bytes"
        field = "", canoutput_param_num_bytes0, { canoutput_sel0 && enable_intcandata_out }
        field = "", canoutput_param_num_bytes1, { canoutput_sel1 && enable_intcandata_out }
        field = "", canoutput_param_num_bytes2, { canoutput_sel2 && enable_intcandata_out }
        field = "", canoutput_param_num_bytes3, { canoutput_sel3 && enable_intcandata_out }
        field = "", canoutput_param_num_bytes4, { canoutput_sel4 && enable_intcandata_out }
        field = "", canoutput_param_num_bytes5, { canoutput_sel5 && enable_intcandata_out }
		field = "", canoutput_param_num_bytes6, { canoutput_sel6 && enable_intcandata_out }
        field = "", canoutput_param_num_bytes7, { canoutput_sel7 && enable_intcandata_out }
    ;    field = "", canoutput_param_num_bytes8, { canoutput_sel8 && enable_intcandata_out }
    ;    field = "", canoutput_param_num_bytes9, { canoutput_sel9 && enable_intcandata_out }
    ;    field = "", canoutput_param_num_bytes10, { canoutput_sel10 && enable_intcandata_out }
    ;    field = "", canoutput_param_num_bytes11, { canoutput_sel11 && enable_intcandata_out }
    ;    field = "", canoutput_param_num_bytes12, { canoutput_sel12 && enable_intcandata_out }
    ;    field = "", canoutput_param_num_bytes13, { canoutput_sel13 && enable_intcandata_out }
;		field = "", canoutput_param_num_bytes14, { canoutput_sel14 && enable_intcandata_out }
 ;       field = "", canoutput_param_num_bytes15, { canoutput_sel15 && enable_intcandata_out }

		dialog = canoutconfig_blank1,""
		field = ""

	dialog = Canout_config1, "", xAxis
        panel = canAuxoutput_alias
        panel = canoutconfig_blank1
        panel = canoutput_sel
        panel = canoutconfig_blank1
        panel = canoutput_parameter_group
        panel = canoutconfig_blank1
        panel = canoutput_parameter_start_byte
        panel = canoutconfig_blank1
        panel = canoutput_parameter_num_byte

	dialog = Canout_config2, "CAN Data Out"
		field = "Enable CanBus data Output",	enable_intcandata_out

	dialog = Canout_config, "", yAxis
	topicHelp = ""
        panel = Canout_config2
        panel = Canout_config1

    dialog = can_serial3IO, "CanBus/Secondary Serial IO interface"
	    topicHelp = "http://speeduino.com/wiki/index.php/Secondary_Serial_IO_interface"
        field = "Enable Second Serial",       enable_secondarySerial
		field = "Enable Internal Canbus",     enable_intcan
	;	field = "Speeduino TsCanId", speeduino_tsCanId
        field = "True Canbus Address", true_address {enable_secondarySerial||enable_intcan}
 		field = "NOTE! Realtime Data Base Address MUST be at least 0x16 GREATER than the True Address as they are reserved for future expansion"
 		field = "Realtime Data Base Can Address", realtime_base_address {enable_secondarySerial||enable_intcan}
	;	field = "Speeduino OBD address", obd_address

	dialog = serial3IO, "Secondary Serial IO interface"
	    topicHelp = "http://speeduino.com/wiki/index.php/Serial3_IO_interface"
        field = "Enable Second Serial",       enable_secondarySerial
		field = "Enable Internal Canbus",     enable_intcan {intcan_available}
	;	field = "Speeduino TsCanId", speeduino_tsCanId
        field = "True Canbus Address", true_address {enable_secondarySerial||enable_intcan}
 		field = "NOTE! Realtime Data Base Address MUST be at least 0x16 GREATER than the True Address as they are reserved for future expansion"
 		field = "Realtime Data Base Can Address", realtime_base_address {enable_secondarySerial||enable_intcan}
	;	field = "Speeduino OBD address", obd_address
	
    dialog = reset_control, "Reset Control"
        ; Control type options for custom firmware
        field = "Control Type", resetControl
        field = "Control Pin", resetControlPin

    dialog = Auxinput_pin_selection, "", yAxis
        field = "             Source"		   
        displayOnlyField = "Off 0", blankfield, {},{(caninput_sel0a == 0 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel0b == 0 && (enable_secondarySerial && enable_intcan)) || (caninput_sel0b == 0 && (enable_secondarySerial && !enable_intcan)) || (caninput_sel0b == 0 && (!enable_secondarySerial && (enable_intcan && intcan_available == 1)))}
		displayOnlyField = "External Source 0 Via Secondary Serial", blankfield, {},{(caninput_sel0b == 1 && enable_secondarySerial && ((enable_intcan && intcan_available == 0) || !enable_intcan)) || (caninput_sel0b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel0extsourceb == 0)}
        displayOnlyField = "External Source 0 Via Internal CAN", blankfield, {},{(caninput_sel0b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel0extsourceb == 1) ||(caninput_sel0b == 1 && !enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel0extsourcec == 1)}
        field = "Local Analog Source 0                 Pin No:", Auxin0pina , {}, {(caninput_sel0a == 2 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel0b == 2 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}
        field = "Local Digital Source 0                  Pin No:", Auxin0pinb , {}, {(caninput_sel0a == 3 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel0b == 3 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}

        displayOnlyField = "Off 1", blankfield, {},{(caninput_sel1a == 0 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel1b == 0 && ((enable_secondarySerial && enable_intcan) || (enable_secondarySerial && !enable_intcan) || (!enable_secondarySerial && enable_intcan)))}
		displayOnlyField = "External Source 1 Via Secondary Serial", blankfield, {},{(caninput_sel1b == 1 && enable_secondarySerial && ((enable_intcan && intcan_available == 0) || !enable_intcan)) || (caninput_sel1b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel1extsourceb == 0)}
        displayOnlyField = "External Source 1 Via Internal CAN", blankfield, {},{(caninput_sel1b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel1extsourceb == 1) ||(caninput_sel1b == 1 && !enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel1extsourcec == 1)}
        field = "Local Analog Source 1                 Pin No:", Auxin1pina , {}, {(caninput_sel1a == 2 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel1b == 2 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}
        field = "Local Digital Source 1                  Pin No:", Auxin1pinb , {}, {(caninput_sel1a == 3 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel1b == 3 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}
        
		displayOnlyField = "Off 2", blankfield, {},{(caninput_sel2a == 0 && (!enable_secondarySerial && !enable_intcan)) || (caninput_sel2b == 0 && (enable_secondarySerial && enable_intcan)) || (caninput_sel2b == 0 && (enable_secondarySerial && !enable_intcan)) || (caninput_sel2b == 0 && (!enable_secondarySerial && enable_intcan))}
		displayOnlyField = "External Source 2 Via Secondary Serial", blankfield, {},{(caninput_sel2b == 1 && enable_secondarySerial && ((enable_intcan && intcan_available == 0) || !enable_intcan)) || (caninput_sel2b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel2extsourceb == 0)}
        displayOnlyField = "External Source 2 Via Internal CAN", blankfield, {},{(caninput_sel2b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel2extsourceb == 1) ||(caninput_sel2b == 1 && !enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel2extsourcec == 1)}
        field = "Local Analog Source 2                 Pin No:", Auxin2pina , {}, {(caninput_sel2a == 2 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel2b == 2 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}
        field = "Local Digital Source 2                  Pin No:", Auxin2pinb , {}, {(caninput_sel2a == 3 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel2b == 3 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}

        displayOnlyField = "Off 3", blankfield, {},{(caninput_sel3a == 0 && (!enable_secondarySerial && !enable_intcan)) || (caninput_sel3b == 0 && (enable_secondarySerial && enable_intcan)) || (caninput_sel3b == 0 && (enable_secondarySerial && !enable_intcan)) || (caninput_sel3b == 0 && (!enable_secondarySerial && enable_intcan))}
		displayOnlyField = "External Source 3 Via Secondary Serial", blankfield, {},{(caninput_sel3b == 1 && enable_secondarySerial && ((enable_intcan && intcan_available == 0) || !enable_intcan)) || (caninput_sel3b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel3extsourceb == 0)}
        displayOnlyField = "External Source 3 Via Internal CAN", blankfield, {},{(caninput_sel3b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel3extsourceb == 1) ||(caninput_sel3b == 1 && !enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel3extsourcec == 1)}
        field = "Local Analog Source 3                 Pin No:", Auxin3pina , {}, {(caninput_sel3a == 2 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel3b == 2 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}
        field = "Local Digital Source 3                  Pin No:", Auxin3pinb , {}, {(caninput_sel3a == 3 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel3b == 3 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}

        displayOnlyField = "Off 4", blankfield, {},{(caninput_sel4a == 0 && (!enable_secondarySerial && !enable_intcan)) || (caninput_sel4b == 0 && (enable_secondarySerial && enable_intcan)) || (caninput_sel4b == 0 && (enable_secondarySerial && !enable_intcan)) || (caninput_sel4b == 0 && (!enable_secondarySerial && enable_intcan))}
		displayOnlyField = "External Source 4 Via Secondary Serial", blankfield, {},{(caninput_sel4b == 1 && enable_secondarySerial && ((enable_intcan && intcan_available == 0) || !enable_intcan)) || (caninput_sel4b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel4extsourceb == 0)}
        displayOnlyField = "External Source 4 Via Internal CAN", blankfield, {},{(caninput_sel4b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel4extsourceb == 1) ||(caninput_sel4b == 1 && !enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel4extsourcec == 1)}
        field = "Local Analog Source 4                 Pin No:", Auxin4pina , {}, {(caninput_sel4a == 2 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel4b == 2 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}
        field = "Local Digital Source 4                  Pin No:", Auxin4pinb , {}, {(caninput_sel4a == 3 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel4b == 3 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}

        displayOnlyField = "Off 5", blankfield, {},{(caninput_sel5a == 0 && (!enable_secondarySerial && !enable_intcan)) || (caninput_sel5b == 0 && (enable_secondarySerial && enable_intcan)) || (caninput_sel5b == 0 && (enable_secondarySerial && !enable_intcan)) || (caninput_sel5b == 0 && (!enable_secondarySerial && enable_intcan))}
		displayOnlyField = "External Source 5 Via Secondary Serial", blankfield, {},{(caninput_sel5b == 1 && enable_secondarySerial && ((enable_intcan && intcan_available == 0) || !enable_intcan)) || (caninput_sel5b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel5extsourceb == 0)}
        displayOnlyField = "External Source 5 Via Internal CAN", blankfield, {},{(caninput_sel5b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel5extsourceb == 1) ||(caninput_sel5b == 1 && !enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel5extsourcec == 1)}
        field = "Local Analog Source 5                 Pin No:", Auxin5pina , {}, {(caninput_sel5a == 2 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel5b == 2 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}
        field = "Local Digital Source 5                  Pin No:", Auxin5pinb , {}, {(caninput_sel5a == 3 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel5b == 3 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}

        displayOnlyField = "Off 6", blankfield, {},{(caninput_sel6a == 0 && (!enable_secondarySerial && !enable_intcan)) || (caninput_sel6b == 0 && (enable_secondarySerial && enable_intcan)) || (caninput_sel6b == 0 && (enable_secondarySerial && !enable_intcan)) || (caninput_sel6b == 0 && (!enable_secondarySerial && enable_intcan))}
		displayOnlyField = "External Source 6 Via Secondary Serial", blankfield, {},{(caninput_sel6b == 1 && enable_secondarySerial && ((enable_intcan && intcan_available == 0) || !enable_intcan)) || (caninput_sel6b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel6extsourceb == 0)}
        displayOnlyField = "External Source 6 Via Internal CAN", blankfield, {},{(caninput_sel6b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel6extsourceb == 1) ||(caninput_sel6b == 1 && !enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel6extsourcec == 1)}
        field = "Local Analog Source 6                 Pin No:", Auxin6pina , {}, {(caninput_sel6a == 2 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel6b == 2 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}
        field = "Local Digital Source 6                  Pin No:", Auxin6pinb , {}, {(caninput_sel6a == 3 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel6b == 3 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}

        displayOnlyField = "Off 7", blankfield, {},{(caninput_sel7a == 0 && (!enable_secondarySerial && !enable_intcan)) || (caninput_sel7b == 0 && (enable_secondarySerial && enable_intcan)) || (caninput_sel7b == 0 && (enable_secondarySerial && !enable_intcan)) || (caninput_sel7b == 0 && (!enable_secondarySerial && enable_intcan))}
		displayOnlyField = "External Source 7 Via Secondary Serial", blankfield, {},{(caninput_sel7b == 1 && enable_secondarySerial && ((enable_intcan && intcan_available == 0) || !enable_intcan)) || (caninput_sel7b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel7extsourceb == 0)}
        displayOnlyField = "External Source 7 Via Internal CAN", blankfield, {},{(caninput_sel7b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel7extsourceb == 1) ||(caninput_sel7b == 1 && !enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel7extsourcec == 1)}
        field = "Local Analog Source 7                 Pin No:", Auxin7pina , {}, {(caninput_sel7a == 2 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel7b == 2 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}
        field = "Local Digital Source 7                  Pin No:", Auxin7pinb , {}, {(caninput_sel7a == 3 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel7b == 3 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}

        displayOnlyField = "Off 8", blankfield, {},{(caninput_sel8a == 0 && (!enable_secondarySerial && !enable_intcan)) || (caninput_sel8b == 0 && (enable_secondarySerial && enable_intcan)) || (caninput_sel8b == 0 && (enable_secondarySerial && !enable_intcan)) || (caninput_sel8b == 0 && (!enable_secondarySerial && enable_intcan))}
		displayOnlyField = "External Source 8 Via Secondary Serial", blankfield, {},{(caninput_sel8b == 1 && enable_secondarySerial && ((enable_intcan && intcan_available == 0) || !enable_intcan)) || (caninput_sel8b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel8extsourceb == 0)}
        displayOnlyField = "External Source 8 Via Internal CAN", blankfield, {},{(caninput_sel8b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel8extsourceb == 1) ||(caninput_sel8b == 1 && !enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel8extsourcec == 1)}
        field = "Local Analog Source 8                 Pin No:", Auxin8pina , {}, {(caninput_sel8a == 2 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel8b == 2 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}
        field = "Local Digital Source 8                  Pin No:", Auxin8pinb , {}, {(caninput_sel8a == 3 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel8b == 3 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}

        displayOnlyField = "Off 9", blankfield, {},{(caninput_sel9a == 0 && (!enable_secondarySerial && !enable_intcan)) || (caninput_sel9b == 0 && (enable_secondarySerial && enable_intcan)) || (caninput_sel9b == 0 && (enable_secondarySerial && !enable_intcan)) || (caninput_sel9b == 0 && (!enable_secondarySerial && enable_intcan))}
		displayOnlyField = "External Source 9 Via Secondary Serial", blankfield, {},{(caninput_sel9b == 1 && enable_secondarySerial && ((enable_intcan && intcan_available == 0) || !enable_intcan)) || (caninput_sel9b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel9extsourceb == 0)}
        displayOnlyField = "External Source 9 Via Internal CAN", blankfield, {},{(caninput_sel9b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel9extsourceb == 1) ||(caninput_sel9b == 1 && !enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel9extsourcec == 1)}
        field = "Local Analog Source 9                 Pin No:", Auxin9pina , {}, {(caninput_sel9a == 2 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel9b == 2 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}
        field = "Local Digital Source 9                  Pin No:", Auxin9pinb , {}, {(caninput_sel9a == 3 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel9b == 3 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}

        displayOnlyField = "Off 10", blankfield, {},{(caninput_sel10a == 0 && (!enable_secondarySerial && !enable_intcan)) || (caninput_sel10b == 0 && (enable_secondarySerial && enable_intcan)) || (caninput_sel10b == 0 && (enable_secondarySerial && !enable_intcan)) || (caninput_sel10b == 0 && (!enable_secondarySerial && enable_intcan))}
		displayOnlyField = "External Source 10 Via Secondary Serial", blankfield, {},{(caninput_sel10b == 1 && enable_secondarySerial && ((enable_intcan && intcan_available == 0) || !enable_intcan)) || (caninput_sel10b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel10extsourceb == 0)}
        displayOnlyField = "External Source 10 Via Internal CAN", blankfield, {},{(caninput_sel10b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel10extsourceb == 1) ||(caninput_sel10b == 1 && !enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel10extsourcec == 1)}
        field = "Local Analog Source 10                 Pin No:", Auxin10pina , {}, {(caninput_sel10a == 2 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel10b == 2 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}
        field = "Local Digital Source 10                  Pin No:", Auxin10pinb , {}, {(caninput_sel10a == 3 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel10b == 3 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}

        displayOnlyField = "Off 11", blankfield, {},{(caninput_sel11a == 0 && (!enable_secondarySerial && !enable_intcan)) || (caninput_sel11b == 0 && (enable_secondarySerial && enable_intcan)) || (caninput_sel11b == 0 && (enable_secondarySerial && !enable_intcan)) || (caninput_sel11b == 0 && (!enable_secondarySerial && enable_intcan))}
		displayOnlyField = "External Source 11 Via Secondary Serial", blankfield, {},{(caninput_sel11b == 1 && enable_secondarySerial && ((enable_intcan && intcan_available == 0) || !enable_intcan)) || (caninput_sel11b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel11extsourceb == 0)}
        displayOnlyField = "External Source 11 Via Internal CAN", blankfield, {},{(caninput_sel11b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel11extsourceb == 1) ||(caninput_sel11b == 1 && !enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel11extsourcec == 1)}
        field = "Local Analog Source 11                 Pin No:", Auxin11pina , {}, {(caninput_sel11a == 2 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel11b == 2 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}
        field = "Local Digital Source 11                  Pin No:", Auxin11pinb , {}, {(caninput_sel11a == 3 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel11b == 3 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}

        displayOnlyField = "Off 12", blankfield, {},{(caninput_sel12a == 0 && (!enable_secondarySerial && !enable_intcan)) || (caninput_sel12b == 0 && (enable_secondarySerial && enable_intcan)) || (caninput_sel12b == 0 && (enable_secondarySerial && !enable_intcan)) || (caninput_sel12b == 0 && (!enable_secondarySerial && enable_intcan))}
		displayOnlyField = "External Source 12 Via Secondary Serial", blankfield, {},{(caninput_sel12b == 1 && enable_secondarySerial && ((enable_intcan && intcan_available == 0) || !enable_intcan)) || (caninput_sel12b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel12extsourceb == 0)}
        displayOnlyField = "External Source 12 Via Internal CAN", blankfield, {},{(caninput_sel12b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel12extsourceb == 1) ||(caninput_sel12b == 1 && !enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel12extsourcec == 1)}
        field = "Local Analog Source 12                 Pin No:", Auxin12pina , {}, {(caninput_sel12a == 2 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel12b == 2 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}
        field = "Local Digital Source 12                  Pin No:", Auxin12pinb , {}, {(caninput_sel12a == 3 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel12b == 3 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}

        displayOnlyField = "Off 13", blankfield, {},{(caninput_sel13a == 0 && (!enable_secondarySerial && !enable_intcan)) || (caninput_sel13b == 0 && (enable_secondarySerial && enable_intcan)) || (caninput_sel13b == 0 && (enable_secondarySerial && !enable_intcan)) || (caninput_sel13b == 0 && (!enable_secondarySerial && enable_intcan))}
		displayOnlyField = "External Source 13 Via Secondary Serial", blankfield, {},{(caninput_sel13b == 1 && enable_secondarySerial && ((enable_intcan && intcan_available == 0) || !enable_intcan)) || (caninput_sel13b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel13extsourceb == 0)}
        displayOnlyField = "External Source 13 Via Internal CAN", blankfield, {},{(caninput_sel13b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel13extsourceb == 1) ||(caninput_sel13b == 1 && !enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel13extsourcec == 1)}
        field = "Local Analog Source 13                 Pin No:", Auxin13pina , {}, {(caninput_sel13a == 2 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel13b == 2 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}
        field = "Local Digital Source 13                  Pin No:", Auxin13pinb , {}, {(caninput_sel13a == 3 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel13b == 3 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}

        displayOnlyField = "Off 14", blankfield, {},{(caninput_sel14a == 0 && (!enable_secondarySerial && !enable_intcan)) || (caninput_sel14b == 0 && (enable_secondarySerial && enable_intcan)) || (caninput_sel14b == 0 && (enable_secondarySerial && !enable_intcan)) || (caninput_sel14b == 0 && (!enable_secondarySerial && enable_intcan))}
		displayOnlyField = "External Source 14 Via Secondary Serial", blankfield, {},{(caninput_sel14b == 1 && enable_secondarySerial && ((enable_intcan && intcan_available == 0) || !enable_intcan)) || (caninput_sel14b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel14extsourceb == 0)}
        displayOnlyField = "External Source 14 Via Internal CAN", blankfield, {},{(caninput_sel14b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel14extsourceb == 1) ||(caninput_sel14b == 1 && !enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel14extsourcec == 1)}
        field = "Local Analog Source 14                 Pin No:", Auxin14pina , {}, {(caninput_sel14a == 2 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel14b == 2 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}
        field = "Local Digital Source 14                  Pin No:", Auxin14pinb , {}, {(caninput_sel14a == 3 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel14b == 3 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}

        displayOnlyField = "Off 15", blankfield, {},{(caninput_sel15a == 0 && (!enable_secondarySerial && !enable_intcan)) || (caninput_sel15b == 0 && (enable_secondarySerial && enable_intcan)) || (caninput_sel15b == 0 && (enable_secondarySerial && !enable_intcan)) || (caninput_sel15b == 0 && (!enable_secondarySerial && enable_intcan))}
		displayOnlyField = "External Source 15 Via Secondary Serial", blankfield, {},{(caninput_sel15b == 1 && enable_secondarySerial && ((enable_intcan && intcan_available == 0) || !enable_intcan)) || (caninput_sel15b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel15extsourceb == 0)}
        displayOnlyField = "External Source 15 Via Internal CAN", blankfield, {},{(caninput_sel15b == 1 && enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel15extsourceb == 1) ||(caninput_sel15b == 1 && !enable_secondarySerial && (enable_intcan && intcan_available) && caninput_sel15extsourcec == 1)}
        field = "Local Analog Source 15                 Pin No:", Auxin15pina , {}, {(caninput_sel15a == 2 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel15b == 2 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}
        field = "Local Digital Source 15                  Pin No:", Auxin15pinb , {}, {(caninput_sel15a == 3 && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel15b == 3 && (enable_secondarySerial || (enable_intcan && intcan_available == 1 )))}
					
    dialog = Auxinput_alias, "", yAxis
        field = "Input Alias"
        field = "", AUXin00Alias , {(caninput_sel0a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel0b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin01Alias , {(caninput_sel1a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel1b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin02Alias , {(caninput_sel2a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel2b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin03Alias , {(caninput_sel3a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel3b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin04Alias , {(caninput_sel4a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel4b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin05Alias , {(caninput_sel5a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel5b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin06Alias , {(caninput_sel6a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel6b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin07Alias , {(caninput_sel7a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel7b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin08Alias , {(caninput_sel8a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel8b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin09Alias , {(caninput_sel9a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel9b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin10Alias , {(caninput_sel10a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel10b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin11Alias , {(caninput_sel11a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel11b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin12Alias , {(caninput_sel12a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel12b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin13Alias , {(caninput_sel13a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel13b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin14Alias , {(caninput_sel14a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel14b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
        field = "", AUXin15Alias , {(caninput_sel15a && (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0)))) || (caninput_sel15b && (enable_secondarySerial || (enable_intcan && intcan_available)))}
            		
	dialog = Auxinput_channelenable, "", yAxis
	    field = "               Aux Input Channel Enable"
        field = "AUX Input 0", caninput_sel0a {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "AUX Input 0", caninput_sel0b {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "AUX Input 1", caninput_sel1a {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "AUX Input 1", caninput_sel1b {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "AUX Input 2", caninput_sel2a {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
        field = "AUX Input 2", caninput_sel2b {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "AUX Input 3", caninput_sel3a {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
        field = "AUX Input 3", caninput_sel3b {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "AUX Input 4", caninput_sel4a {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
        field = "AUX Input 4", caninput_sel4b {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "AUX Input 5", caninput_sel5a {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
        field = "AUX Input 5", caninput_sel5b {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
		field = "AUX Input 6", caninput_sel6a {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
        field = "AUX Input 6", caninput_sel6b {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "AUX Input 7", caninput_sel7a {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
        field = "AUX Input 7", caninput_sel7b {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "AUX Input 8", caninput_sel8a {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
        field = "AUX Input 8", caninput_sel8b {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "AUX Input 9", caninput_sel9a {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
        field = "AUX Input 9", caninput_sel9b {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "AUX Input 10", caninput_sel10a {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
        field = "AUX Input 10", caninput_sel10b {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "AUX Input 11", caninput_sel11a {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
        field = "AUX Input 11", caninput_sel11b {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "AUX Input 12", caninput_sel12a {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
        field = "AUX Input 12", caninput_sel12b {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "AUX Input 13", caninput_sel13a {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
        field = "AUX Input 13", caninput_sel13b {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
		field = "AUX Input 14", caninput_sel14a {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
        field = "AUX Input 14", caninput_sel14b {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
        field = "AUX Input 15", caninput_sel15a {}, { (!enable_secondarySerial && (!enable_intcan || (enable_intcan && intcan_available == 0))) }
		field = "AUX Input 15", caninput_sel15b {}, { (enable_secondarySerial && enable_intcan) || (!enable_secondarySerial && (enable_intcan && intcan_available)) || (enable_secondarySerial && !enable_intcan) }
	
	dialog = Auxin_south, "Auxillary Input Configuration",xAxis
		panel = Auxinput_alias
		panel = Auxinput_channelenable
		panel = Auxinput_pin_selection 
	
    dialog = Auxin_config, "",yAxis    	
	    panel = Auxin_north
		panel = Auxin_south

    dialog = gaugeLimits, "Gauge Limits"                                        ;[PJSC v1.02] Gause limit
        field = "#RPM"                                                          ; |
        field = "Warning", rpmwarn                                              ; |
        field = "Danger", rpmdang                                               ; |
        field = "High", rpmhigh                                                 ; |
        field = "#MAP"                                                          ; |
        field = "Warning", mapwarn                                              ; |
        field = "Danger", mapdang                                               ; |
        field = "High", maphigh                                                 ; V
        field = !"Reload project to update gauges"                              ;[PJSC v1.02]

    dialog = io_summary, "I/O Summary"
        displayOnlyField = "fuelPumpPin", fuelPumpPin, {fpPrime}                ;[PJSC v1.02]
        displayOnlyField = "fanPin", fanPin, {fanEnable}                        ; |
        displayOnlyField = "tachoPin", tachoPin                                 ; |
        displayOnlyField = "idleUpPin", idleUpPin, {idleUpEnabled}              ; V
        displayOnlyField = "baroPin", baroPin,{useExtBaro}                      ;[PJSC v1.02]

;-------------------------------------------------------------------------------
; General help text

       help = helpGeneral, "Speeduino General Help"
        webHelp = "http://speeduino.com/wiki/index.php/Speeduino"
        text = "For current WIKI documentation, click the Web Help button,"
        text = "or visit http://www.speeduino.com/."
        text = "<br>"
        text = "<br>why not visit our forum http://speeduino.com/forum/"
;------------------------------------------------------------------------------
[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.

cmdStopTestMode = "E\x01\x00"
cmdEnableTestMode = "E\x01\x01"

cmdtestinj1on = "E\x02\x01"
cmdtestinj1off = "E\x02\x02"
cmdtestinj150dc = "E\x02\x03"
cmdtestinj2on = "E\x02\x04"
cmdtestinj2off = "E\x02\x05"
cmdtestinj250dc = "E\x02\x06"
cmdtestinj3on = "E\x02\x07"
cmdtestinj3off = "E\x02\x08"
cmdtestinj350dc = "E\x02\x09"
cmdtestinj4on = "E\x02\x0A"
cmdtestinj4off = "E\x02\x0B"
cmdtestinj450dc = "E\x02\x0C"
cmdfpon = "E\x02\x11"                 ;[PJSC v1.01]
cmdfpoff = "E\x02\x12"                ;[PJSC v1.01]
cmdtestinjstart = "E\x02\x13"         ;[PJSC v1.01]
cmdtestinjstop = "E\x02\x14"          ;[PJSC v1.01]

cmdtestspk1on = "E\x03\x01"
cmdtestspk1off = "E\x03\x02"
cmdtestspk150dc = "E\x03\x03"
cmdtestspk2on = "E\x03\x04"
cmdtestspk2off = "E\x03\x05"
cmdtestspk250dc = "E\x03\x06"
cmdtestspk3on = "E\x03\x07"
cmdtestspk3off = "E\x03\x08"
cmdtestspk350dc = "E\x03\x09"
cmdtestspk4on = "E\x03\x0A"
cmdtestspk4off = "E\x03\x0B"
cmdtestspk450dc = "E\x03\x0C"

cmdtestmux1on = "E\x04\x01"           ;[PJSC v1.01] Test mode command for MUX output
cmdtestmux1off = "E\x04\x02"          ; |
cmdtestmux150dc = "E\x04\x03"         ; |
cmdtestmux2on = "E\x04\x04"           ; |
cmdtestmux2off = "E\x04\x05"          ; |
cmdtestmux250dc = "E\x04\x06"         ; |
cmdtestmux3on = "E\x04\x07"           ; |
cmdtestmux3off = "E\x04\x08"          ; |
cmdtestmux350dc = "E\x04\x09"         ; |
cmdtestmux4on = "E\x04\x0A"           ; |
cmdtestmux4off = "E\x04\x0B"          ; V
cmdtestmux450dc = "E\x04\x0C"         ;[PJSC v1.01]

; -------------------------------------------------------------
; Help down here
[SettingContextHelp]


[CurveEditor]

;time-based accel enrichment
      curve = time_accel_tpsdot_curve, "TPS based AE"
            columnLabel = "TPSdot", "Added"
            xAxis = 0, 1200, 6
            yAxis = 0, 250, 4
            xBins = taeBins, TPSdot
            yBins = taeRates
            ;gauge       = cltGauge

; Correction curve for dwell vs battery voltage
        curve = dwell_correction_curve, "Dwell voltage correction"
            columnLabel = "Voltage", "Dwell"
            xAxis = 6, 22, 6
            yAxis = 0, 255, 6
            xBins = brvBins, batteryVoltage
            yBins = dwellRates

; Correction curve for injectors vs battery voltage
        curve = injector_voltage_curve, "Injector voltage correction"
            columnLabel = "Voltage", "Injector"
            xAxis = 6, 22, 6
            yAxis = 0, 255, 6
            xBins = brvBins, batteryVoltage
            yBins = injBatRates

; Correction curve for Air Density vs temperature
        curve = airdensity_curve, "IAT density correction"
            columnLabel = "Air Temperature", "Fuel Amount"
            xAxis = -40, 160, 6
            yAxis = 0, 255, 6
            xBins = airDenBins, iat
            yBins = airDenRates

; IAT based ignition timing retard
        curve = iat_retard_curve, "IAT timing retard"
            columnLabel =   "Inlet Air Temp", "Retard"
            xAxis = -40, 200, 5
            yAxis = 0, 30, 5
            xBins = iatRetBins, iat
            yBins = iatRetRates

; Curves for idle control
        ; Standard duty table for PWM valves
        curve = iacPwm_curve, "IAC PWM Duty"
            columnLabel = "Coolant Temperature", "Valve"
        #if CELSIUS
            xAxis = -40, 215, 6
        #else
            xAxis = -40, 315, 6
        #endif
            yAxis = 0, 100, 4
            xBins = iacBins, coolant
            yBins = iacOLPWMVal

        ; Cranking duty table for PWM valves
        curve = iacPwmCrank_curve, "IAC PWM Cranking Duty"
            columnLabel = "Coolant Temperature", "Valve"
            xAxis = -40, 215, 6
            yAxis = 0, 100, 4
            xBins = iacCrankBins, coolant
            yBins = iacCrankDuty

        curve = iacStep_curve, "IAC Stepper Motor"
        	columnLabel = "Coolant Temperature", "Motor"
        #if CELSIUS
            xAxis = -40, 215, 6
        #else
            xAxis = -40, 315, 6
        #endif
            yAxis = 0, 850, 4
            xBins = iacBins, coolant
            yBins = iacOLStepVal

        curve = iacStepCrank_curve, "IAC Stepper Motor Cranking"
        	columnLabel = "Coolant Temperature", "Motor"
            xAxis = -40, 120, 6
            yAxis = 0, 850, 4
            xBins = iacCrankBins, coolant
            yBins = iacCrankSteps

        curve = iacClosedLoop_curve, "IAC Closed Loop Targets"
            columnLabel = "Coolant Temperature", "Motor"
            xAxis = -40, 120, 6
            yAxis = 0, 2000, 4
            xBins = iacBins, coolant
            yBins = iacCLValues

        curve = rotaryTrailing_curve, "Rotary Trailing Split"
            columnLabel = "Engine load", "Split"
            yAxis = 0, 40, 4
#if SPEED_DENSITY
            xBins = rotarySplitBins, map
            xAxis = 0, 250, 5
#else
            xBins = rotarySplitBins, throttle
            xAxis = 0, 100, 5
#endif
            yBins = rotarySplitValues

; Warmup enrichment curve
        curve = warmup_curve, "Warmup Enrichment (WUE) Curve"
            columnLabel = "Coolant", "WUE %"
            xAxis       = -40, 210, 9
            yAxis       =   0,  240, 6
            xBins       = wueBins, coolant
            yBins       = wueRates
            gauge       = cltGauge

; Cranking enrichment curve
        curve = cranking_enrich_curve, "Cranking Enrichment Curve"
            columnLabel = "Coolant", "Fuel Modifier"
            xAxis       = -40, 110, 9
            yAxis       =   0,  200, 6
            xBins       = crankingEnrichBins, coolant
            yBins       = crankingEnrichValues
            ;gauge       = cltGau25

; Warmup enrichment VEAL AFR adjustment curve (Not currently working)
        ;curve = warmup_afr_curve, "AFR Target Temperature Adustment"
        ;    columnLabel = "Coolant Temp", "AFR Offset %"
        ;    xAxis       = -40, 210, 9
        ;    yAxis       =   0,  240, 6
        ;    xBins       = wueAFRBins, coolant
        ;    yBins       = wueAFRRates

; Flex fuel correction curves
        curve = flex_fuel_curve, "Flex Fuel Adjustments"
            columnLabel    = "Ethanol", "Fuel"
            xAxis          = 0, 100, 10
            yAxis          = 50, 250, 5
            xBins          = flexFuelBins, flex
            yBins          = flexFuelAdj
            size           = 400, 200

        curve = flex_adv_curve, "Flex Timing Advance"
            columnLabel    = "Ethanol", "Advance"
            xAxis		   = 0, 100, 10
            yAxis          = 0, 50, 5
            xBins          = flexAdvBins, flex
            yBins          = flexAdvAdj
            size           = 400, 200

        curve = flex_boost_curve, "Flex Boost Adjustments"
            columnLabel    = "Ethanol", "Boost"
            xAxis		   = 0, 100, 10
            yAxis          = -100, 200, 5
            xBins          = flexBoostBins, flex
            yBins          = flexBoostAdj
            size           = 400, 200

;Knock sensor windows
        curve = knock_window_angle_curve, "Knock Window"
            columnLabel    = "RPM", "Window Start"
            xAxis		   = 0, 8000, 9
            yAxis          = -100, 100, 11
            xBins          = knock_window_rpms, rpm
            yBins          = knock_window_angle
            size           = 400, 200

        curve = knock_window_duration_curve, "Knock Window Duration"
            columnLabel    = "RPM", "Window Duration"
            xAxis		   = 0, 8000, 9
            yAxis          = 0, 100, 10
            xBins          = knock_window_rpms, rpm
            yBins          = knock_window_dur
            size           = 400, 200

; Correction curve for air Density vs Barometric pressure  [PJSC v1.01]
        curve = barodensity_curve, "Barometric density correction"
            columnLabel = "Barometric pressure", "Fuel Amount"
            xAxis = 0, 110, 9
            yAxis = 0, 255, 9
            xBins = baroDenBins, baro
            yBins = baroDenRates


[TableEditor]
   ;       table_id,    map3d_id,    "title",      page
   table = veTable1Tbl,  veTable1Map,  "VE Table",   1
   topicHelp = "http://speeduino.com/wiki/index.php/Tuning"
   ;       constant, variable
      xBins       = rpmBins,  rpm
      yBins       = fuelLoadBins, fuelLoad
      xyLabels    = "RPM", "Fuel Load: "
      zBins       = veTable

      gridHeight  = 2.0
      gridOrient  = 250,   0, 340
      upDownLabel = "(RICHER)", "(LEANER)"

#if table4_spark                                        ;[PJSC v1.01]
   table = sparkTbl,    sparkMap,    "Ignition Advance Table", 3
      xBins = rpmBins2, rpm
      ;yBins = ignLoadBins, ignLoad
      yBins = mapBins1, ignLoad
      xyLabels    = "RPM", "Ignition Load: "
      zBins = advTable1
      gridHeight  = 3.0
      upDownLabel = "ADVANCING", "RETARDING"
#endif                                                  ;[PJSC v1.01]

    ;table = afrTbl,    afrTableMap,    "AFR Table", 5
    table = afrTable1Tbl, afrTable1Map, "AFR Table", 5
      xBins = rpmBinsAFR, rpm
    #if SPEED_DENSITY
      yBins = mapBinsAFR, map
    #else ALPHA_N
        yBins = tpsBinsAFR, throttle
    #endif
      zBins = afrTable
      gridHeight  = 1.0
      upDownLabel = "RICHER", "LEANER"
      gridOrient  = 250,   0, 340

      ;#if BOOSTPSI
      ;table = boostTbl,    boostMap,    "Boost targets (PSI)", 8
      ;#else
      ;table = boostTbl,    boostMap,    "Boost targets (Absolute kPa)", 8
      ;#endif
    table = boostTbl,    boostMap,  "Boost Duty / Target", 8
      xBins = rpmBinsBoost, rpm
      yBins = tpsBinsBoost, throttle
      zBins = boostTable
      gridHeight  = 3.0
      upDownLabel = "HIGHER", "LOWER"

    table = vvtTbl,    vvtMap,    "VVT control Table", 8
      xBins = rpmBinsVVT, rpm
      yBins = tpsBinsVVT, throttle
      zBins = vvtTable
      gridHeight  = 3.0
      upDownLabel = "HIGHER", "LOWER"

    table = stagingTbl,    stagingMap,    "Fuel Staging Table", 10
      xBins = rpmBinsStaging, rpm
    #if SPEED_DENSITY
      yBins = mapBinsStaging, map
    #else ALPHA_N
      yBins = tpsBinsStaging, throttle
    #endif
      zBins = stagingTable
      gridHeight  = 3.0
      upDownLabel = "HIGHER", "LOWER"

;--------- Sequential fuel trim maps -----------
;[PJSC v1.01]    table = fuelTrimTable1Tbl,  fuelTrimTable1Map,  "Fuel trim Table 1",   9
;[PJSC v1.01]    topicHelp = "http://speeduino.com/wiki/index.php/Tuning"
;[PJSC v1.01]        xBins       = fuelTrim1rpmBins,  rpm
;[PJSC v1.01]    #if SPEED_DENSITY
;[PJSC v1.01]        yBins       = fuelTrim1loadBins,  map
;[PJSC v1.01]    #else
;[PJSC v1.01]        yBins       = fuelTrim1loadBins,  throttle
;[PJSC v1.01]    #endif
;[PJSC v1.01]       zBins       = fuelTrim1Table
;[PJSC v1.01]
;[PJSC v1.01]       gridHeight  = 2.0
;[PJSC v1.01]       gridOrient  = 250,   0, 340
;[PJSC v1.01]       upDownLabel = "(RICHER)", "(LEANER)"
;[PJSC v1.01]
;[PJSC v1.01]    table = fuelTrimTable2Tbl,  fuelTrimTable2Map,  "Fuel trim Table 2",   9
;[PJSC v1.01]    topicHelp = "http://speeduino.com/wiki/index.php/Tuning"
;[PJSC v1.01]        xBins       = fuelTrim2rpmBins,  rpm
;[PJSC v1.01]    #if SPEED_DENSITY
;[PJSC v1.01]        yBins       = fuelTrim2loadBins,  map
;[PJSC v1.01]    #else
;[PJSC v1.01]        yBins       = fuelTrim2loadBins,  throttle
;[PJSC v1.01]    #endif
;[PJSC v1.01]       zBins       = fuelTrim2Table
;[PJSC v1.01]
;[PJSC v1.01]       gridHeight  = 2.0
;[PJSC v1.01]       gridOrient  = 250,   0, 340
;[PJSC v1.01]       upDownLabel = "(RICHER)", "(LEANER)"
;[PJSC v1.01]
;[PJSC v1.01]    table = fuelTrimTable3Tbl,  fuelTrimTable3Map,  "Fuel trim Table 3",   9
;[PJSC v1.01]    topicHelp = "http://speeduino.com/wiki/index.php/Tuning"
;[PJSC v1.01]        xBins       = fuelTrim3rpmBins,  rpm
;[PJSC v1.01]    #if SPEED_DENSITY
;[PJSC v1.01]        yBins       = fuelTrim3loadBins,  map
;[PJSC v1.01]    #else
;[PJSC v1.01]        yBins       = fuelTrim3loadBins,  throttle
;[PJSC v1.01]    #endif
;[PJSC v1.01]       zBins       = fuelTrim3Table
;[PJSC v1.01]
;[PJSC v1.01]       gridHeight  = 2.0
;[PJSC v1.01]       gridOrient  = 250,   0, 340
;[PJSC v1.01]       upDownLabel = "(RICHER)", "(LEANER)"
;[PJSC v1.01]
;[PJSC v1.01]    table = fuelTrimTable4Tbl,  fuelTrimTable4Map,  "Fuel trim Table 4",   9
;[PJSC v1.01]    topicHelp = "http://speeduino.com/wiki/index.php/Tuning"
;[PJSC v1.01]        xBins       = fuelTrim4rpmBins,  rpm
;[PJSC v1.01]    #if SPEED_DENSITY
;[PJSC v1.01]        yBins       = fuelTrim4loadBins,  map
;[PJSC v1.01]    #else
;[PJSC v1.01]        yBins       = fuelTrim4loadBins,  throttle
;[PJSC v1.01]    #endif
;[PJSC v1.01]       zBins       = fuelTrim4Table
;[PJSC v1.01]
;[PJSC v1.01]       gridHeight  = 2.0
;[PJSC v1.01]       gridOrient  = 250,   0, 340
;[PJSC v1.01]       upDownLabel = "(RICHER)", "(LEANER)"

;[PJSC]------------------------------------------------------------------------
   table = veTable2Tbl,  veTable2Map,  "VE Table 2",   10
   topicHelp = "http://speeduino.com/wiki/index.php/Tuning"
   ;       constant, variable
      xBins       = rpmBinsVE2,  rpm
      yBins       = fuelLoadBins2, fuelLoad2
      xyLabels    = "RPM", "Fuel Load: "
      zBins       = veTable2

      gridHeight  = 2.0
      gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.
      upDownLabel = "(RICHER)", "(LEANER)"

;[PJSC]-------------------------------------------------------------------------

;[PJSC v1.01]-------------------------------------------------------------------
   table = veTable3Tbl,  veTable3Map,  "VE Table 3",   11
   topicHelp = "http://speeduino.com/wiki/index.php/Tuning"
   ;       constant, variable
      xBins       = rpmBinsVE3,  rpm
      yBins       = fuelLoadBins3, fuelLoad3
      xyLabels    = "RPM", "Fuel Load: "
      zBins       = veTable3

      gridHeight  = 2.0
      gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.
      upDownLabel = "(RICHER)", "(LEANER)"

#if table4_fuel
   table = sparkTbl,    sparkMap,    "VE Table 4", 3
   topicHelp = "http://speeduino.com/wiki/index.php/Tuning"
   ;       constant, variable
      xBins       = rpmBins2, rpm
      ;yBins       = ignLoadBins, ignLoad
      yBins       = mapBins1, ignLoad
      xyLabels    = "RPM", "Fuel Load: "
      zBins       = advTable1

      gridHeight  = 2.0
      gridOrient  = 250,   0, 340 ; Space 123 rotation of grid in degrees.
      upDownLabel = "(RICHER)", "(LEANER)"
#endif
;[PJSC v1.01]-------------------------------------------------------------------

;-------------------------------------------------------------------------------

[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.

    gaugeCategory = "Main"
    ;Name               Var            Title                 Units     Lo     Hi     LoD    LoW   HiW   HiD vd ld
    accelEnrichGauge  = accelEnrich,   "Accel Enrich",       "%",      50,   150,     -1,    -1,  999,  999, 0, 0
    dutyCycleGauge    = dutyCycle,     "Duty Cycle",         "%",       0,   100,     -1,    -1,   70,   80, 1, 1
    dutyCycleGauge2   = dutyCycle2,    "Duty Cycle2",        "%",       0,   100,     -1,    -1,   70,   80, 1, 1
    dutyCycleGauge3   = dutyCycle3,    "Duty Cycle3",        "%",       0,   100,     -1,    -1,   70,   80, 1, 1
    dutyCycleGauge4   = dutyCycle4,    "Duty Cycle4",        "%",       0,   100,     -1,    -1,   70,   80, 1, 1
    stgDutyCycleGauge = stgDutyCycle,  "Staging Duty Cycle", "%",       0,   100,     -1,    -1,   70,   80, 1, 1
    egoCorrGauge      = egoCorrection, "EGO Correction",     "%",      50,   150,     90,    99,  101,  110, 0, 0

    gammaEnrichGauge  = gammaEnrich,   "Gamma Enrichment",   "%",      50,   150,     -1,    -1,  151,  151, 0, 0
    pulseWidthGauge   = pulseWidth,    "Pulse Width",        "mSec",    0,    10,      0,     0,    8,    9, 2, 2
    pulseWidthGauge2  = pulseWidth2,   "Pulse Width2",       "mSec",    0,    10,      0,     0,    8,    9, 2, 2                      ;[PJSC v1.03]
    pulseWidthGauge3  = pulseWidth3,   "Pulse Width3",       "mSec",    0,    10,      0,     0,    8,    9, 2, 2                      ;[PJSC v1.03]
    pulseWidthGauge4  = pulseWidth4,   "Pulse Width4",       "mSec",    0,    10,      0,     0,    8,    9, 2, 2                      ;[PJSC v1.03]
;[PJSC v1.01]    tachometer        = rpm,           "Engine Speed",       "RPM",     0,  8000,    300,   600, 3000, 5000, 0, 0
    tachometer        = rpm,           "Engine Speed",       "RPM",     0, {rpmhigh},600,  1000,{rpmwarn},{rpmdang}, 0, 0              ;[PJSC v1.02]
    veGauge           = veCurr,        "VE Current",         "%",       0,   120,     -1,    -1,  999,  999, 0, 0
    veGauge2          = veCurr2,       "VE2 Current",        "%",       0,   120,     -1,    -1,  999,  999, 0, 0                      ;[PJSC]
    veGauge3          = veCurr3,       "VE3 Current",        "%",       0,   120,     -1,    -1,  999,  999, 0, 0                      ;[PJSC v1.01]
    veGauge4          = veCurr4,       "VE4 Current",        "%",       0,   120,     -1,    -1,  999,  999, 0, 0                      ;[PJSC v1.01]
    dualVEGauge1      = dualVE1,       "Dual VE1",           "%",       0,   120,     -1,    -1,  999,  999, 0, 0                      ;[PJSC v1.03]
    dualVEGauge2      = dualVE2,       "Dual VE2",           "%",       0,   120,     -1,    -1,  999,  999, 0, 0                      ;[PJSC v1.03]
    dualVEGauge3      = dualVE3,       "Dual VE3",           "%",       0,   120,     -1,    -1,  999,  999, 0, 0                      ;[PJSC v1.03]
    dualVEGauge4      = dualVE4,       "Dual VE4",           "%",       0,   120,     -1,    -1,  999,  999, 0, 0                      ;[PJSC v1.03]
    warmupEnrichGauge = warmupEnrich,  "Warmup Enrichment",  "%",     100,   200,    130,   140,  140,  150, 0, 0
    aseEnrichGauge    = ase_enrich,    "Afterstart Enrichment","%",     0,   200,    130,   140,  140,  150, 0, 0
    batCorrectGauge   = batCorrection, "Voltage Correction", "%",       0,   200,    130,   140,  140,  150, 0, 0
    iatCorrectGauge   = airCorrection, "IAT Correction",     "%",       0,   200,    130,   140,  140,  150, 0, 0
    flexEnrich,       = flexFuelCor,   "Flex Correction",    "%",       0,   200,    130,   140,  140,  150, 0, 0
    advanceGauge      = advance,       "Spark Advance",      "deg BTDC", 50, -10,      0,     0,    35,    45, 0, 0
    dwellGauge        = dwell,         "Ign Dwell",          "mSec",    0,  35.0,    1.0,   1.2,   20,   25, 3, 3
    boostTargetGauge  = boostTarget,   "Target Boost",       "kPa",     0,   {maphigh},      0,    20,  {mapwarn},  {mapdang}, 0, 0    ;[PJSC v1.02]
    boostDutyGauge    = boostDuty,     "Boost Duty Cycle",   "%",       0,   100,     -1,    -1,  101,  110, 1, 1                      ;[PJSC v1.02]
    afrTargetGauge    = afrTarget,     "Target AFR",         "",        7,    25,     12,    13,   15,   16, 2, 2                      ;[PJSC v1.02]
    idleLoadGauge     = idleLoad,      "Idle Load",          "%",       0,   100,     -1,    -1,   80,   90, 0, 0                      ;[PJSC v1.03]

    gaugeCategory = "Sensor inputs"
    mapGauge          = map,           "Engine MAP",             "kPa",           40,{maphigh},  50,     60,{mapwarn},{mapdang}, 0, 0  ;[PJSC v1.02]
    mapGauge_psi      = map_psi,       "Engine MAP (PSI)",       "PSI",          -15,    100,     0,     20,  200,  245, 0, 0
    mapGauge_bar      = map_bar,       "Engine MAP (BAR)",       "Bar",          -1,     3,      -1,     -1,    5,  5,  2, 2
    mapGauge_vacBoost = map_vacboost,  "Engine MAP (in-Hg/PSI)", "in-Hg/PSI",    -30,    30,     -30,    -30, 30, 30, 1, 1
    baroGauge         = baro,          "Baro Pressure",          "kPa",            0,{maphigh},  50,   20,{mapwarn},{mapdang}, 0, 0    ;[PJSC v1.02]
    batteryVoltage    = batteryVoltage,"Battery Voltage",        "volts",   8,    17,      9,    10,   15,   16, 2, 2

    tpsADCGauge       = tpsADC,        "TPS ADC",            "",        0,   255,     -1,    -1,  256,  256, 0, 0
    throttleGauge     = throttle,      "Throttle Position",  "%TPS",    0,   100,     -1,     1,   90,  100, 0, 0

    afrGauge          = afr,           "Air:Fuel Ratio",     "",       10,    18,     11,    12,   16,   17, 2, 2
    afrGauge2         = afr2,          "Air:Fuel Ratio 2",   "",       10,    18,     11,    12,   16,   17, 2, 2
    lambdaGauge       = lambda,        "Lambda",             "",      0.5,   1.5,    0.5,   0.7,    2,  1.1, 2, 2
    exValvePosGauge   = valvePosition,    "Exhaust Valve Position",      "%open",        0,   100,     -1,     1,   90,  100, 0, 0          ;[PJSC]For External Trigger
    exValveADCGauge   = valvePositionADC, "Exhaust Valve ADC",           "",             0,   255,     -1,    -1,  256,  256, 0, 0          ;[PJSC]For External Trigger
    exSparkGauge      = sparkedAngle,     "Sparked Angle",               "deg BTDC",   -20,    60,    -10,     0,   45,   50, 0, 0          ;[PJSC]For External Trigger
    dutyFreqGauge     = dutyFreq,         "Duty Pulse Frequency",        "Hz",           0,   100,      5,    10,   90,   95, 0, 0          ;[PJSC]For capturing duty pulse
    dutyRatioGauge    = dutyRatio,        "Duty Ratio",                  "%",            0,   100,     -1,    -1,   90,   95, 1, 1          ;[PJSC]For capturing duty pulse
    dutyFreqGauge2    = dutyFreq2,        "Duty Pulse Frequency 2",      "Hz",           0,   100,      5,    10,   90,   95, 0, 0          ;[PJSC]For capturing duty pulse
    dutyRatioGauge2   = dutyRatio2,       "Duty Ratio 2",                "%",            0,   100,     -1,    -1,   90,   95, 1, 1          ;[PJSC]For capturing duty pulse
    baroGauge         = baro,             "Barometric Pressure",         "kPa",          0,   200,     20,    60,  140,  180, 1, 0          ;[PJSC]Add the gage for barometric sensor
    afrAnalyzeGauge1  = afr_analyze1,     "Air:Fuel Ratio for VE1",      "",             7,    25,     12,    13,   15,   16, 2, 2          ;[PJSC v1.02] For AFR sensor selection
    afrAnalyzeGauge2  = afr_analyze2,     "Air:Fuel Ratio for VE2",      "",             7,    25,     12,    13,   15,   16, 2, 2          ;[PJSC v1.02] For AFR sensor selection
    afrAnalyzeGauge3  = afr_analyze3,     "Air:Fuel Ratio for VE3",      "",             7,    25,     12,    13,   15,   16, 2, 2          ;[PJSC v1.02] For AFR sensor selection
    afrAnalyzeGauge4  = afr_analyze4,     "Air:Fuel Ratio for VE4",      "",             7,    25,     12,    13,   15,   16, 2, 2          ;[PJSC v1.02] For AFR sensor selection
    EGTADCGauge       = EGTADC,           "Exhaust Gas Temperature ADC", "",             0,  1024,     -1,    -1, 1024, 1024, 0, 0          ;[PJSC v1.03] For Exhaust gas temperature input
    EGTGauge          = EGT,              "Exhaust Gas Temperature",     "TEMP",      -100,  1000,     -1,    -1,  600,  800, 0, 0          ;[PJSC v1.03] For Exhaust gas temperature input
    ignGapGauge       = ignGap,           "Ignition Gap tTime",          "mSec",         0,    10,      0,     0,    8,    9, 2, 2          ;[PJSC v1.03] For misfire detection
    sparkRPMGauge     = sparkRPM,         "External Spark RPM",          "RPM",          0, {rpmhigh},600,  1000,{rpmwarn},{rpmdang}, 0, 0  ;[PJSC v1.03] For misfire detection
    viecleSpeedGauge  = viecleSpeed,      "Viecle Speed",                "km/h",         0,   300,      0,     0,  300,  300, 1, 1          ;[PJSC v1.03] For capturing viecle speed
    dutyPulseOnTGauge = dutyPulseOn_T,    "Pulse ON Time",               "mSec",         0,    10,      0,     0,    8,    9, 2, 2          ;[PJSC v1.03] For capturing duty pulse
    dutyPulseOnTGauge2= dutyPulseOn_T2,   "Pulse ON Time2",              "mSec",         0,    10,      0,     0,    8,    9, 2, 2          ;[PJSC v1.03] For capturing duty pulse
   
    #if CELSIUS
    cltGauge          = coolant,       "Coolant Temp",       "TEMP", -10,   120,      0,    10,   95,  110, 0, 0
    iatGauge          = iat,           "Inlet Air Temp",     "TEMP", -10,    80,      0,     5,   55,   70, 0, 0
    #else
    cltGauge          = coolant,       "Coolant Temp",       "TEMP", -40,   215,      0,    30,  200,  220, 0, 0
    iatGauge          = iat,           "Inlet Air Temp",     "TEMP", -40,   215,      0,    30,  200,  210, 0, 0
    #endif
    flexGauge         = flex,          "Flex sensor",        "%",       0,   100,     -1,    -1,  999,  999, 0, 0

    gaugeCategory = "Auxillary Input Channels"
    AuxInGauge0     = auxin_gauge0,		{ stringValue(AUXin00Alias) },				"",             0,		1024,	-1,		-1,	1025,		1025,	0,	0
    AuxInGauge1		= auxin_gauge1,		{ stringValue(AUXin01Alias) },				"",				0,		1024,	-1,		-1,	1025,		1025,	0,	0
    AuxInGauge2		= auxin_gauge2,		{ stringValue(AUXin02Alias) },				"",				0,		1024,	-1,		-1,	1025,		1025,	0,	0
    AuxInGauge3		= auxin_gauge3,		{ stringValue(AUXin03Alias) },				"",				0,		1024,	-1,		-1,	1025,		1025,	0,	0
    AuxInGauge4		= auxin_gauge4,		{ stringValue(AUXin04Alias) },				"",				0,		1024,	-1,		-1,	1025,		1025,	0,	0
    AuxInGauge5		= auxin_gauge5,		{ stringValue(AUXin05Alias) },				"",				0,		1024,	-1,		-1,	1025,		1025,	0,	0
    AuxInGauge6		= auxin_gauge6,		{ stringValue(AUXin06Alias) },				"",				0,		1024,	-1,		-1,	1025,		1025,	0,	0
    AuxInGauge7		= auxin_gauge7,		{ stringValue(AUXin07Alias) },				"",				0,		1024,	-1,		-1,	1025,		1025,	0,	0
    AuxInGauge8		= auxin_gauge8,		{ stringValue(AUXin08Alias) },				"",				0,		1024,	-1,		-1,	1025,		1025,	0,	0
    AuxInGauge9		= auxin_gauge9,		{ stringValue(AUXin09Alias) },				"",				0,		1024,	-1,		-1,	1025,		1025,	0,	0
    AuxInGauge10		= auxin_gauge10,		{ stringValue(AUXin10Alias) },				"",				0,		1024,	-1,		-1,	1025,		1025,	0,	0
    AuxInGauge11		= auxin_gauge11,		{ stringValue(AUXin11Alias) },				"",				0,		1024,	-1,		-1,	1025,		1025,	0,	0
    AuxInGauge12		= auxin_gauge12,		{ stringValue(AUXin12Alias) },  			"",				0,		1024,	-1,		-1,	1025,		1025,	0,	0
    AuxInGauge13		= auxin_gauge13,		{ stringValue(AUXin13Alias) },				"",				0,		1024,	-1,		-1,	1025,		1025,	0,	0
    AuxInGauge14		= auxin_gauge14,		{ stringValue(AUXin14Alias) },				"",				0,		1024,	-1,		-1,	1025,		1025,	0,	0
    AuxInGauge15		= auxin_gauge15,		{ stringValue(AUXin15Alias) },				"",				0,		1024,	-1,		-1,	1025,		1025,	0,	0

    gaugeCategory = "System Data"
    clockGauge        = secl,          "Clock",              "Seconds",  0,   255,     10,    10,  245,  245, 0, 0
    loopGauge         = loopsPerSecond,"Main loop speed",    "Loops/S" , 0,  70000,    -1,   500, 1800, 4000, 0, 0
    memoryGauge       = freeRAM,       "Free memory",        "bytes" ,   0,  8000,     -1,  1000, 8000, 1000, 0, 0
    reqFuelGauge      = req_fuel,       "Req. Fuel",          "ms",      0,  35.0,    1.0,   1.2,   20,   25, 2, 2
    injOpenGauge      = inj_open,       "Injector Open Time", "ms",      0,  35.0,    1.0,   1.2,   20,   25, 1, 1
    mapMultiplyGauge  = map_multiply_amt, "MAP Multiply",     "%",       0,   200,    130,   140,  140,  150, 0, 0
    nSquirtsGauge     = nSquirts,       "# Squirts",          "",        0,    10,    130,   140,  140,  150, 0, 0
    injcountGauge     = testCnt,       "Injection Count", "pulses",      0,  1000,  65535, 65535,65535, 65535,0, 0                     ;[PJSC v1.01] For test mode
    syncLossGauge     = syncLossCounter,  "Sync Loss Count",  "",        0,   120,     -1,    -1,  999,  999, 0, 0                     ;[PJSC v1.02]
;-------------------------------------------------------------------------------

[FrontPage]


   ; Gauges are numbered left to right, top to bottom.
   ;
   ;    1  2  3  4
   ;    5  6  7  8

;[PJSC v1.01]   gauge1 = tachometer
;[PJSC v1.01]   gauge2 = throttleGauge
;[PJSC v1.01]   gauge3 = pulseWidthGauge
;[PJSC v1.01]   gauge4 = dutyCycleGauge
;[PJSC v1.01]   gauge5 = mapGauge
;[PJSC v1.01]   gauge6 = iatGauge
;[PJSC v1.01]   gauge7 = cltGauge
;[PJSC v1.01]   gauge8 = gammaEnrichGauge

   gauge1 = tachometer                 ;[PJSC v1.01]
   gauge2 = throttleGauge              ;[PJSC v1.01]
   gauge3 = pulseWidthGauge            ;[PJSC v1.01]
   gauge4 = afrGauge                   ;[PJSC v1.01]
   gauge5 = mapGauge                   ;[PJSC v1.01]
   gauge6 = iatGauge                   ;[PJSC v1.01]
   gauge7 = cltGauge                   ;[PJSC v1.01]
   gauge8 = batteryVoltage             ;[PJSC v1.01]

   ;----------------------------------------------------------------------------
   ; Indicators
   ;             expr                   off-label       on-label,       off-bg, off-fg, on-bg,  on-fg
   indicator = { running            }, "Not Running",   "Running"       white, black, green,    black
   indicator = { crank              }, "Not Cranking",  "Cranking",     white, black, green,    black
   indicator = { ase                }, "ASE OFF",       "ASE ON",       white, black, green,    black
   indicator = { warmup             }, "WUE OFF",       "WUE ON",       white, black, green,    black
   indicator = { tpsaccaen          }, "Accel",         "Accel",        white, black, green,    black
   indicator = { tpsaccden          }, "Decel",         "Decel",        white, black, green,    black
   indicator = { mapaccaen          }, "MAP Accel",     "MAP Accel",    white, black, green,    black
   indicator = { mapaccden          }, "MAP Decel",     "MAP Decel",    white, black, green,    black
   indicator = { error              }, "No Errors",     "ERROR",        white, black, green,    black
   indicator = { (tps > tpsflood) && (rpm < crankRPM) }, "FLOOD OFF", "FLOOD CLEAR",      white, black, red,   black
   indicator = { DFCOOn             }, "DFCO OFF",      "DFCO On",      white, black, red,      black
   indicator = { launchHard         }, "Launch Hard",   "Launch Hard",  white, black, green,    black
   indicator = { launchSoft         }, "Launch Soft",   "Launch Soft",  white, black, green,    black
   indicator = { softlimitOn        }, "Soft Limit OFF","Soft Limiter", white, black, red,      black
   indicator = { hardLimitOn        }, "Hard Limit OFF","Hard Limiter", white, black, red,      black
   indicator = { boostCutOut        }, "Ign Cut OFF",   "Ign Cut (Boost)",    white, black, red,      black
   indicator = { sync               }, "No Sync",       "Sync",         white, black, green,    black
   indicator = { resetLockOn        }, "Reset Lock OFF","Reset Lock ON",     red, black, green,    black
   indicator = { bootloaderCaps > 0 }, "Std. Boot",     "Custom Boot",  white, black, white,    black
   indicator = { nitrousOn          }, "Nitrous Off",   "Nitrous On",   white, black, red,      black

;-------------------------------------------------------------------------------

[OutputChannels]
   ; The number of bytes MegaTune or TunerStudio should expect as a result
   ; of sending the "A" command to Speeduino is determined
   ; by the value of ochBlockSize, so be very careful when
   ; you change it.

   ochGetCommand    = "r\$tsCanId\x30%2o%2c"
;[PJSC]   ochBlockSize     =  90
;[PJSC v1.03]   ochBlockSize     =  116          ;[PJSC v1.02] Extend block size
   ochBlockSize     =  132          ;[PJSC v1.03] Extend block size

   secl             = scalar, U08,  0, "sec",    1.000, 0.000
   status1          = scalar, U08,  1, "bits",   1.000, 0.000
    inj1Status       = bits,    U08,    1, [0:0]
    inj2Status       = bits,    U08,    1, [1:1]
    inj3Status       = bits,    U08,    1, [2:2]
    inj4Status       = bits,    U08,    1, [3:3]
    DFCOOn           = bits,    U08,    1, [4:4]
    boostCutFuel     = bits,    U08,    1, [5:5]
    toothLog1Ready   = bits,    U08,    1, [6:6]
    toothLog2Ready   = bits,    U08,    1, [7:7]
   engine           = scalar, U08,  2, "bits",   1.000, 0.000
    running          = bits,    U08,    2, [0:0]
    crank            = bits,    U08,    2, [1:1]
    ase              = bits,    U08,    2, [2:2]
    warmup           = bits,    U08,    2, [3:3]
    tpsaccaen        = bits,    U08,    2, [4:4]
    tpsaccden        = bits,    U08,    2, [5:5]
    mapaccaen        = bits,    U08,    2, [6:6]
    mapaccden        = bits,    U08,    2, [7:7]
   dwell	        = scalar,   U08,    3, "ms",     0.100, 0.000
   map              = scalar,   U16,    4, "kpa",    1.000, 0.000
   iatRaw           = scalar,   U08,    6, "°C",    1.000, 0.000
   coolantRaw       = scalar,   U08,    7, "°C",    1.000, 0.000
   batCorrection    = scalar,   U08,    8, "%",      1.000, 0.000
   batteryVoltage   = scalar,   U08,    9, "V",      0.100, 0.000
   afr              = scalar,   U08,    10, "O2",     0.100, 0.000
   egoCorrection    = scalar,   U08,    11, "%",      1.000, 0.000
   airCorrection    = scalar,   U08,    12, "%",      1.000, 0.000
   warmupEnrich     = scalar,   U08,    13, "%",      1.000, 0.000
   rpm              = scalar,   U16,    14, "rpm",    1.000, 0.000
   accelEnrich      = scalar,   U08,    16, "%",      2.000, 0.000
   gammaEnrich      = scalar,   U08,    17, "%",      1.000, 0.000
   veCurr           = scalar,   U08,    18, "%",      1.000, 0.000
   afrTarget        = scalar,   U08,    19, "O2",     0.100, 0.000
   pulseWidth       = scalar,   U16,    20, "ms",     0.001, 0.000
   TPSdot           = scalar,   U08,    22, "%/s",    10.00, 0.000
   advance          = scalar,   S08,    23, "deg",    1.000, 0.000
   tps              = scalar,   U08,    24, "%",      1.000, 0.000
   loopsPerSecond   = scalar,   U16,    25, "loops",  1.000, 0.000
   freeRAM          = scalar,   U16,    27, "bytes",  1.000, 0.000
   boostTarget      = scalar,   U08,    29, "kPa",    2.000, 0.000
   boostDuty        = scalar,   U08,    30, "%",      1.000, 0.000
   status2          = scalar,   U08,    31, "bits",   1.000, 0.000
    launchHard       = bits,    U08,    31, [0:0]
    launchSoft       = bits,    U08,    31, [1:1]
    hardLimitOn      = bits,    U08,    31, [2:2]
    softlimitOn      = bits,    U08,    31, [3:3]
    boostCutSpark    = bits,    U08,    31, [4:4]
    error            = bits,    U08,    31, [5:5]
    idleControlOn    = bits,    U08,    31, [6:6]
    sync             = bits,    U08,    31, [7:7]
   rpmDOT           = scalar,   S16,    32, "rpm/s",  1.000, 0.000
   flex             = scalar,   U08,    34, "%",      1.000, 0.000
   flexFuelCor      = scalar,   U08,    35, "%",      1.000, 0.000
   flexIgnCor       = scalar,   U08,    36, "deg",    1.000, 0.000

   idleLoad         = scalar,   U08,    37, { bitStringValue( idleUnits , iacAlgorithm  ) },    2.000, 0.000 ; This is a combined variable covering both PWM and stepper IACs. The units used depend on which idle algorithm is chosen
   testoutputs      = scalar,   U08,    38, "bits",   1.000, 0.000
   testenabled       = bits,    U08,	  38, [0:0]
   testactive        = bits,    U08,	  38, [1:1]
;[PJSC v1.01]   afr2             = scalar,   U08,    39, "O2",     0.100, 0.000
;[PJSC v1.01]   baro             = scalar,   U08,    40, "kpa",      1.000, 0.000
   baro             = scalar,   U16,    39, "kpa",      1.000, 0.000     ;[PJSC v1.01]
   auxin_gauge0	    = scalar,   U16,	41,	"",		1.000, 0.000
   auxin_gauge1	    = scalar,   U16,	43,	"",		1.000, 0.000
   auxin_gauge2	    = scalar,   U16,	45,	"",		1.000, 0.000
   auxin_gauge3	    = scalar,   U16,	47,	"",		1.000, 0.000
   auxin_gauge4	    = scalar,   U16,	49,	"",		1.000, 0.000
   auxin_gauge5	    = scalar,   U16,	51,	"",		1.000, 0.000
   auxin_gauge6	    = scalar,   U16,	53,	"",		1.000, 0.000
   auxin_gauge7	    = scalar,   U16,	55,	"",		1.000, 0.000
   auxin_gauge8	    = scalar,   U16,	57,	"",		1.000, 0.000
   auxin_gauge9 	= scalar,   U16,	59,	"",		1.000, 0.000
   auxin_gauge10    = scalar,   U16,	61,	"",		1.000, 0.000
   auxin_gauge11    = scalar,   U16,	63,	"",		1.000, 0.000
   auxin_gauge12    = scalar,   U16,	65,	"",		1.000, 0.000
   auxin_gauge13    = scalar,   U16,	67,	"",		1.000, 0.000
   auxin_gauge14    = scalar,   U16,	69,	"",		1.000, 0.000
   auxin_gauge15    = scalar,   U16,	71,	"",		1.000, 0.000
   tpsADC           = scalar,   U08,    73, "ADC",1.000, 0.000
   errors           = scalar,   U08,    74, "bits",   1.000, 0.000
    errorNum        = bits,     U08,      74, [0:1]
    currentError    = bits,     U08,      74, [2:7]
   pulseWidth2      = scalar,   U16,    75, "ms",     0.001, 0.000
   pulseWidth3      = scalar,   U16,    77, "ms",     0.001, 0.000
   pulseWidth4      = scalar,   U16,    79, "ms",     0.001, 0.000
   status3          = scalar,   U08,    81, "bits", 1.000, 0.000
    resetLockOn      = bits,     U08,     81, [0:0]
    nitrousOn        = bits,     U08,     81, [1:1]
    unused81_2-4     = bits,     U08,     81, [2:4]
    nSquirts         = bits,     U08,     81, [5:7]
   flexBoostCor     = scalar,   S16,    82, "kPa",  1.000, 0.000
   nChannels        = scalar,   U08,    84, "bits",   1.000, 0.000
     nIgnChannels     = bits,   U08,      84, [0:3]
     nFuelChannels    = bits,   U08,      84, [4:7]
   fuelLoad          = scalar,  S16,    85, { bitStringValue( algorithmUnits , algorithm  ) }, 1.000, 0.000
   ignLoad           = scalar,  S16,    87, { bitStringValue( algorithmUnits , ignAlgorithm  ) }, 1.000, 0.000
   syncLossCounter   = scalar,  U08,    89, "",       1.000, 0.000
   veCurr2          = scalar,   U08,    90, "%",      1.000, 0.000                                             ;[PJSC]Multi VE Map support
   veCurr3          = scalar,   U08,    91, "%",      1.000, 0.000                                             ;[PJSC]Multi VE Map support
   veCurr4          = scalar,   U08,    92, "%",      1.000, 0.000                                             ;[PJSC]Multi VE Map support
   valvePosition    = scalar,   U08,    93, "%",      1.000, 0.000                                             ;[PJSC]Extend output channel for External Trigger
   valvePositionADC = scalar,   U08,    94, "ADC",    1.000, 0.000                                             ;[PJSC]Extend output channel for External Trigger
   sparkedAngle     = scalar,   S16,    95, "deg",    1.000, 0.000                                             ;[PJSC]Extend output channel for External Trigger
   dutyFreq         = scalar,   U16,    97, "Hz",     1.000, 0.000                                             ;[PJSC]For capturing duty pulse
   dutyRatio        = scalar,   U16,    99, "%",      0.100, 0.000                                             ;[PJSC]For capturing duty pulse
   dutyFreq2        = scalar,   U16,   101, "Hz",     1.000, 0.000                                             ;[PJSC]For capturing duty pulse
   dutyRatio2       = scalar,   U16,   103, "%",      0.100, 0.000                                             ;[PJSC]For capturing duty pulse
   testCnt          = scalar,   U16,   105, "",       1.000, 0.000                                             ;[PJSC v1.01]For test mode
   afr2             = scalar,   U08,   107, "O2",     0.100, 0.000                                             ;[PJSC v1.01]
   fuelLoad2        = scalar,   S16,   108, { bitStringValue( algorithmUnits2 , algorithm2  ) }, 1.000, 0.000  ;[PJSC v1.01]For dual fuel load
   fuelLoad3        = scalar,   S16,   110, { bitStringValue( algorithmUnits2 , algorithm3  ) }, 1.000, 0.000  ;[PJSC v1.01]For dual fuel load
   afr_analyze1     = scalar,   U08,   112, "O2 for VE Table 1",     0.100, 0.000                              ;[PJSC v1.02]For AFR sensor selection
   afr_analyze2     = scalar,   U08,   113, "O2 for VE Table 2",     0.100, 0.000                              ;[PJSC v1.02]For AFR sensor selection
   afr_analyze3     = scalar,   U08,   114, "O2 for VE Table 3",     0.100, 0.000                              ;[PJSC v1.02]For AFR sensor selection
   afr_analyze4     = scalar,   U08,   115, "O2 for VE Table 4",     0.100, 0.000                              ;[PJSC v1.02]For AFR sensor selection
   dualVE1          = scalar,   U08,   116, "%",      1.000, 0.000                                             ;[PJSC v1.03]For Dual Fuel Load
   dualVE2          = scalar,   U08,   117, "%",      1.000, 0.000                                             ;[PJSC v1.03]For Dual Fuel Load
   dualVE3          = scalar,   U08,   118, "%",      1.000, 0.000                                             ;[PJSC v1.03]For Dual Fuel Load
   dualVE4          = scalar,   U08,   119, "%",      1.000, 0.000                                             ;[PJSC v1.03]For Dual Fuel Load
   EGTADC           = scalar,   U16,   120, "ADC",    1.000, 0.000                                             ;[PJSC v1.03]For Exhaust gas temperature input
   ignGap           = scalar,   U16,   122, "ms",     0.001, 0.000                                             ;[PJSC v1.03]For misfire detection
   sparkRPM         = scalar,   U16,   124, "rpm",    1.000, 0.000                                             ;[PJSC v1.03]For misfire detection
   viecleSpeed      = scalar,   U16,   126, "km/h",   0.100, 0.000                                             ;[PJSC v1.03]For capturing viecle speed
   dutyPulseOn_T    = scalar,   U16,   128, "ms",     0.001, 0.000                                             ;[PJSC v1.03]For capturing duty pulse
   dutyPulseOn_T2   = scalar,   U16,   130, "ms",     0.001, 0.000                                             ;[PJSC v1.03]For capturing duty pulse


#if CELSIUS
   coolant          = { coolantRaw - 40                               } ; Temperature readings are offset by 40 to allow for negatives
   iat              = { iatRaw - 40                                   } ; Temperature readings are offset by 40 to allow for negatives
#else
   coolant          = { (coolantRaw - 40) * 1.8 + 32                  } ;Convert C to F (Offset by 40)
   iat              = { (iatRaw - 40) * 1.8 + 32                      } ;Convert C to F (Offset by 40)
#endif
   time             = { timeNow                                       }
   seconds          = { secl                                          }

   throttle         = { tps }, "%"

   cycleTime        = { rpm ? ( 60000.0 / rpm ) : 0                   }
   cycleMultiplier  = { injLayout == 3 ? 2 : 1                        }
   strokeMultipler  = { twoStroke == 1 ? 2 : 1                        }
   dutyCycle        = { rpm ? ( 100.0*pulseWidth/(cycleTime * cycleMultiplier) * strokeMultipler ) : 0      }
   stgDutyCycle     = { rpm && stagingEnabled ? ( 100.0*pulseWidth3/(cycleTime * cycleMultiplier) * strokeMultipler ) : 0      }
   dutyCycle2       = { rpm ? ( 100.0*pulseWidth2/(cycleTime * cycleMultiplier) * strokeMultipler ) : 0      } ;[PJSC v1.03]
   dutyCycle3       = { rpm ? ( 100.0*pulseWidth3/(cycleTime * cycleMultiplier) * strokeMultipler ) : 0      } ;[PJSC v1.03]
   dutyCycle4       = { rpm ? ( 100.0*pulseWidth4/(cycleTime * cycleMultiplier) * strokeMultipler ) : 0      } ;[PJSC v1.03]

   boostCutOut      = { boostCutFuel || boostCutSpark }
   lambda           = { afr / stoich }
   MAPxRPM          = { rpm * map }
   loopsPerRev      = { loopsPerSecond / (rpm / 60) }
   req_fuel         = { reqFuel }
   inj_open         = { injOpen }
   ase_enrich       = { ase ? (100 + asePct ) : 100 } ; If ASE is active then equal the ASE + 100
   map_multiply_amt = { multiplyMAP ? map : 100 } ; If multiply MAP is enabled, use the current MAP value, otherwise 100%
   ;nSquirts         = { nCylinders / divider }

   ;Manifold pressure in weirdo units
   map_bar      = { (map - baro) / 101.33 }
   map_psi      = { (map - baro) * 0.145038 }
   map_inhg     = { (baro - map) * 0.2953007 } ;in-Hg
   map_vacboost = { map < baro ? -map_inhg : map_psi }

   ;fuelLoadMax = { arrayValue(algorithmLimits , algorithm) } ;Doesn't work, no idea why.
;[PJSC vv1.01]   fuelLoadMax  = { (algorithm == 0 || algorithm == 2) ? 511 : 100 }
;[PJSC vv1.01]   ignLoadMax  = { (ignAlgorithm == 0 || ignAlgorithm == 2) ? 511 : 100 }
;[PJSC v1.03]   fuelLoadMax      = { (algorithm == 0 || algorithm == 2) ? 255 : 100 }
   fuelLoadMax      = { (algorithm == 0 || algorithm == 2) ? 255 : 255 }
   ignLoadMax       = { (ignAlgorithm == 0 || ignAlgorithm == 2) ? 255 : 255 }

   boostTableLimit = { boostType == 0 ? 100 : 511 } ;The maximum value allowed in the boost table. 100 is used for duty cycle, 511 for kpa

   EGT              = { EGTtemperature1 + ((EGTtemperature2 - EGTtemperature1) * ((5 * EGTADC / 511) - EGTvoltage1) / (EGTvoltage2 - EGTvoltage1)) }   ;[PJSC v1.03] For Exhaust gas temperature input

;-------------------------------------------------------------------------------

[Datalog]
   ; Full datalog.
   ;
   ; Default user-defined log emulates the full datalog.
   ;
   ; 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.  Be careful
   ;             about changing these, as programs like MSLVV and
   ;             MSTweak key off specific column names.
   ;   Type    - Data type of output, converted before writing.
   ;   Format  - C-style output format of data.
   ;
   ;       Channel          Label           Type    Format
   ;       --------------   ----------      -----   ------
   entry = time,            "Time",         float,  "%.3f"
   entry = secl,            "SecL",         int,    "%d"
   entry = rpm,             "RPM",          int,    "%d"
   entry = map,             "MAP",          int,    "%d"
   entry = MAPxRPM,         "MAPxRPM",      int,    "%d"
   entry = tps,             "TPS",          int,    "%d"
   entry = afr,             "O2",           float,  "%.3f"
   entry = afr2,            "O2_2",         float,  "%.3f",      { analogInputPortSelect == 2 }  ;[PJSC v1.02]
   entry = lambda,          "Lambda",       float,  "%.3f"
   entry = iat,             "IAT",          int,    "%d"
   entry = coolant,         "CLT",          int,    "%d"
   entry = engine,          "Engine",       int,    "%d"
   entry = DFCOOn,          "DFCO",         int,    "%d"
   entry = egoCorrection,   "Gego",         int,    "%d"
   entry = airCorrection,   "Gair",         int,    "%d"
   entry = batCorrection,   "Gbattery",     int,    "%d"
   entry = warmupEnrich,    "Gwarm",        int,    "%d"
   ;entry = baroCorrection,  "Gbaro",       int,    "%d"
   entry = gammaEnrich,     "Gammae",       int,     "%d"
   entry = accelEnrich,     "Accel Enrich", int,     "%d"
   entry = veCurr,          "VE",           int,     "%d"
   entry = veCurr2,         "VE2",          int,     "%d",       { multiVEmapEnabled }           ;[PJSC]
   entry = veCurr3,         "VE3",          int,     "%d",       { multiVEmapEnabled }           ;[PJSC v1.01]
   entry = veCurr4,         "VE4",          int,     "%d",       { multiVEmapEnabled }           ;[PJSC v1.01]
   entry = pulseWidth,      "PW",           float,   "%.1f"
   entry = pulseWidth2,     "PW2",          float,   "%.1f"                                      ;[PJSC v1.03]
   entry = pulseWidth3,     "PW3",          float,   "%.1f"                                      ;[PJSC v1.03]
   entry = pulseWidth4,     "PW4",          float,   "%.1f"                                      ;[PJSC v1.03]
   entry = afrTarget,       "AFR Target",   float,   "%.3f"
   entry = dutyCycle,       "DutyCycle1",   float,   "%.1f"
   entry = dutyCycle2       "DutyCycle2",   float,   "%.1f"                                      ;[PJSC v1.03]
   entry = dutyCycle3       "DutyCycle3",   float,   "%.1f"                                      ;[PJSC v1.03]
   entry = dutyCycle4       "DutyCycle4",   float,   "%.1f"                                      ;[PJSC v1.03]
   entry = TPSdot,          "TPS DOT",      int,     "%d"
   entry = advance,         "Advance",      int,     "%d"
   entry = dwell,           "Dwell",        float,   "%.1f"
   entry = batteryVoltage,  "Battery V",    float,   "%.1f"
   entry = rpmDOT,          "rpm/s",        int,     "%d"
   entry = flex,            "Eth %",        int,     "%d",       { flexEnabled }
   entry = errorNum,        "Error #",      int,     "%d"
   entry = currentError,    "Error ID",     int,     "%d"
   entry = map_psi,         "Boost PSI",    float,   "%.1f"
   entry = boostTarget,     "Boost Target", int,     "%d",       { boostEnabled }
   entry = boostDuty,       "Boost Duty",   int,     "%d",       { boostEnabled }
   entry = boostCutOut ,    "Boost cut",    int,     "%d"
   entry = launchHard ,     "Launch Hard",  int,     "%d"
   entry = hardLimitOn ,    "Hard Limiter", int,     "%d"
   entry = idleLoad,        "IAC value",    int,     "%d"
   entry = baro,            "Baro Pressure",int,     "%d",       { analogInputPortSelect2 == 1 } ;[PJSC v1.03]
   entry = nitrousOn,       "Nitrous On",   int,     "%d",       { n2o_enable > 0 }
   entry = syncLossCounter, "Sync Loss #",  int,     "%d"
   entry = valvePosition,   "ExValve Pos",  int,     "%d",       { analogInputPortSelect == 1 }  ;[PJSC v1.02]
   entry = sparkedAngle,    "Spark Angle",  int,     "%d",       { exTrigModeSelect == 1 }       ;[PJSC]
   entry = dutyFreq,        "Duty Frequency", int,   "%d",       { dutyPulseCaptureEnabled }     ;[PJSC]
   entry = dutyRatio,       "Duty Ratio",   int,     "%d",       { dutyPulseCaptureEnabled }     ;[PJSC]
   entry = dutyFreq2,       "Duty Frequency2", int,  "%d",       { dutyPulseCaptureEnabled2 }    ;[PJSC]
   entry = dutyRatio2,      "Duty Ratio2",  int,     "%d",       { dutyPulseCaptureEnabled2 }    ;[PJSC]
   entry = fuelLoad,        "Load",         int,     "%d",                                       ;[PJSC v1.03]
   entry = dualVE1,         "Dual VE1",     int,     "%d",       { dualFuelEnabled }             ;[PJSC v1.03]
   entry = dualVE2,         "Dual VE2",     int,     "%d",       { dualFuelEnabled }             ;[PJSC v1.03]
   entry = dualVE3,         "Dual VE3",     int,     "%d",       { dualFuelEnabled }             ;[PJSC v1.03]
   entry = dualVE4,         "Dual VE4",     int,     "%d",       { dualFuelEnabled }             ;[PJSC v1.03]
   entry = EGT,             "EGT",          int,     "%d",       { analogInputPortSelect2 == 2 } ;[PJSC v1.03] For Exhaust gas temperature input
   entry = ignGap,          "Ign Gap Time", float,   "%.1f",     { exTrigModeSelect == 3 }       ;[PJSC v1.03] For misfire detection
   entry = sparkRPM,        "External Spark RPM", int, "%d",     { exTrigModeSelect == 3 }       ;[PJSC v1.03] For misfire detection
   entry = viecleSpeed,     "Viecle Speed", int,     "%d",       { exTrigModeSelect == 4 }       ;[PJSC v1.03] For capturing viecle speed
   entry = dutyPulseOn_T,   "Pulse ON Time",float,   "%.1f",     { dutyPulseCaptureEnabled }     ;[PJSC v1.03] For capturing duty pulse
   entry = dutyPulseOn_T2,  "Pulse ON Time2",float,  "%.1f",     { dutyPulseCaptureEnabled2 }    ;[PJSC v1.03] For capturing duty pulse


   entry = auxin_gauge0,    "AuxIn CH0",    int,     "%d"
   entry = auxin_gauge1,    "AuxIn CH1",    int,     "%d"
   entry = auxin_gauge2,    "AuxIn CH2",    int,     "%d"
   entry = auxin_gauge3,    "AuxIn CH3",    int,     "%d"
   entry = auxin_gauge4,    "AuxIn CH4",    int,     "%d"
   entry = auxin_gauge5,    "AuxIn CH5",    int,     "%d"
   entry = auxin_gauge6,    "AuxIn CH6",    int,     "%d"
   entry = auxin_gauge7,    "AuxIn CH7",    int,     "%d"


[LoggerDefinition]
    ; valid logger types: composite, tooth, trigger, csv

    ;loggerDef = uniqueName, Display Name, type
    loggerDef = tooth, "Tooth Logger", tooth
       ;dataReadCommand = "r\\x00\\xf4\\x00\\x00\\x04\\x00" ; standard TS command format
       startCommand = "H"
       stopCommand = "h"
       dataReadCommand = "T" ; Basic TS command format
       dataReadTimeout = 5000 ; time in ms
       dataReadyCondition = { toothLog1Ready == 1 }
       ;dataLength = 256 ; in bytes, including headers, footers and data (not used)
       ;dataLength = 128 ; 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 = toothTime,         "ToothTime",     0,          32,       1.0,    "uS"

    loggerDef = compositeLogger, "Composite Logger", composite
        startCommand = "J"
        stopCommand = "j"
        dataReadCommand = "T" ; Basic TS command format. Note that this is shared with the composite logger. Firmware detects which log is currently running
        dataReadTimeout = 5000 ; time in ms
        dataReadyCondition = { toothLog1Ready == 1 }
        ;dataLength = 256 ; in bytes, including headers, footers and data (not used)
        ;dataLength = 320 ; in bytes, including headers, footers and data (not used)

        ;recordDef = headerLen. footerLen, recordLen
        recordDef =   0,   0,   5; in bytes, the recordLen is for each record, currently limited to 4 bytes

        ;recordField = Name,          HeaderName,      startBit,   bitCount,   scale,  units, updateCondition
        recordField = priLevel,          "PriLevel",     0,          1,          1.0,    "Flag"
        recordField = secLevel,          "SecLevel",     1,          1,          1.0,    "Flag"
        recordField = trigger,           "Trigger",      2,          1,          1.0,    "Flag"
        recordField = sync,              "Sync",         3,          1,          1.0,    "Flag"
        recordField = refTime,           "RefTime",      8,          32,         0.001,  "ms"

        ; hidden calcField serves as intermediate variable
        calcField = maxTime,               "MaxTime",   "ms",  { maxValue(refTime) }

        calcField = toothTime,           "ToothTime",    "ms",       { refTime - pastValue(refTime, 1) }
        ;recordField = time,                "Time",       24,         16,         1.0,    "ms"
        calcField = time,                "Time",   "ms",  { refTime }


[Tools]
	;addTool = toolName, PanelName
	addTool = veTableGenerator, "VE Table Generator", veTable1Tbl
	addTool = veTableGenerator, "VE Table Generator", veTable2Tbl       ;[PJSC v1.01]
	addTool = veTableGenerator, "VE Table Generator", veTable3Tbl       ;[PJSC v1.01]
	addTool = afrTableGenerator, "AFR Table Generator", afrTable1Tbl


[VeAnalyze]
	         ;    tableName,  lambdaTargetTableName, lambdaChannel, egoCorrectionChannel, activeCondition
;[PJSC v1.02]     veAnalyzeMap = veTable1Tbl, afrTable1Tbl, afr, egoCorrection
     veAnalyzeMap = veTable1Tbl, afrTable1Tbl, afr_analyze1, egoCorrection            ;[PJSC v1.02]
     lambdaTargetTables = afrTable1Tbl, afrTSCustom,
         filter = std_xAxisMin ; Auto build with appropriate axis channels
         ;filter = minRPMFilter, "Minimum RPM", rpm,           <       , 500,      , true
         filter = std_xAxisMax ; Auto build with appropriate axis channels
         filter = std_yAxisMin ; Auto build with appropriate axis channels
         filter = std_yAxisMax ; Auto build with appropriate axis channels
         filter = std_DeadLambda ; Auto build

#if CELSIUS
         filter = minCltFilter, "Minimum CLT", coolant,       <       , 71,       , true
#else
         filter = minCltFilter, "Minimum CLT", coolant,       <       , 160,      , true
#endif
         filter = accelFilter, "Accel Flag" , engine,         &       , 16,       , false
         filter = aseFilter,   "ASE Flag"   , engine,         &       , 4,        , false
         filter = overrunFilter, "Overrun"    , pulseWidth,  =       , 0,        , false
         filter = std_Custom ; Standard Custom Expression Filter.

;------------- WUE VEAL not currently working ----------------
;[WueAnalyze]
        ;    tableName,  lambdaTargetTableName, lambdaChannel, egoCorrectionChannel, activeCondition
        ; wueAnalyzeMap = veTable1Tbl, afrTable1Tbl, afr, egoCorrection
;        wueAnalyzeMap = afrTable1Tbl, warmup_afr_curve, warmup_curve, afr, coolant, warmupEnrich ;warmup_afr_curve,
;             lambdaTargetTables = afrTable1Tbl, afrTSCustom,
                 ;filter = std_xAxisMin ; Auto build with appropriate axis channels
                 ;filter = minRPMFilter, "Minimum RPM", rpm,           <       , 500,      , true
                 ;filter = std_xAxisMax ; Auto build with appropriate axis channels
                 ;filter = std_yAxisMin ; Auto build with appropriate axis channels
                 ;filter = std_yAxisMax ; Auto build with appropriate axis channels
                 ;filter = std_DeadLambda ; Auto build

;                 filter = maxTPSFilter, "High Throttle", tps,       <       , 15,       , true
;------------- WUE VEAL not currently working ----------------

;[PJSC v1.01]------------------------------------------------------------------------
	         ;    tableName,  lambdaTargetTableName, lambdaChannel, egoCorrectionChannel, activeCondition
;[PJSC v1.02]     veAnalyzeMap = veTable2Tbl, afrTable1Tbl, afr, egoCorrection
     veAnalyzeMap = veTable2Tbl, afrTable1Tbl, afr_analyze2, egoCorrection            ;[PJSC v1.02]
     lambdaTargetTables = afrTable1Tbl, afrTSCustom,
         filter = std_xAxisMin ; Auto build with appropriate axis channels
         ;filter = minRPMFilter, "Minimum RPM", rpm,           <       , 500,      , true
         filter = std_xAxisMax ; Auto build with appropriate axis channels
         filter = std_yAxisMin ; Auto build with appropriate axis channels
         filter = std_yAxisMax ; Auto build with appropriate axis channels
         filter = std_DeadLambda ; Auto build

#if CELSIUS
         filter = minCltFilter,  "Minimum CLT", coolant,     <       , 71,       , true
#else
         filter = minCltFilter,  "Minimum CLT", coolant,     <       , 160,      , true
#endif
         filter = accelFilter,   "Accel Flag" , engine,      &       , 16,       , false
         filter = aseFilter,     "ASE Flag"   , engine,      &       , 4,        , false
         filter = overrunFilter, "Overrun"    , pulseWidth,  =       , 0,        , false
         filter = std_Custom ; Standard Custom Expression Filter.

	         ;    tableName,  lambdaTargetTableName, lambdaChannel, egoCorrectionChannel, activeCondition
;[PJSC v1.02]     veAnalyzeMap = veTable3Tbl, afrTable1Tbl, afr, egoCorrection
     veAnalyzeMap = veTable3Tbl, afrTable1Tbl, afr_analyze3, egoCorrection            ;[PJSC v1.02]
     lambdaTargetTables = afrTable1Tbl, afrTSCustom,
         filter = std_xAxisMin ; Auto build with appropriate axis channels
         ;filter = minRPMFilter, "Minimum RPM", rpm,           <       , 500,      , true
         filter = std_xAxisMax ; Auto build with appropriate axis channels
         filter = std_yAxisMin ; Auto build with appropriate axis channels
         filter = std_yAxisMax ; Auto build with appropriate axis channels
         filter = std_DeadLambda ; Auto build

#if CELSIUS
         filter = minCltFilter,  "Minimum CLT", coolant,     <       , 71,       , true
#else
         filter = minCltFilter,  "Minimum CLT", coolant,     <       , 160,      , true
#endif
         filter = accelFilter,   "Accel Flag" , engine,      &       , 16,       , false
         filter = aseFilter,     "ASE Flag"   , engine,      &       , 4,        , false
         filter = overrunFilter, "Overrun"    , pulseWidth,  =       , 0,        , false
         filter = std_Custom ; Standard Custom Expression Filter.

#if table4_fuel
	         ;    tableName,  lambdaTargetTableName, lambdaChannel, egoCorrectionChannel, activeCondition
;[PJSC v1.02]     veAnalyzeMap = sparkTbl, afrTable1Tbl, afr, egoCorrection
     veAnalyzeMap = sparkTbl, afrTable1Tbl, afr_analyze4, egoCorrection               ;[PJSC v1.02]
     lambdaTargetTables = afrTable1Tbl, afrTSCustom,
         filter = std_xAxisMin ; Auto build with appropriate axis channels
         ;filter = minRPMFilter, "Minimum RPM", rpm,           <       , 500,      , true
         filter = std_xAxisMax ; Auto build with appropriate axis channels
         filter = std_yAxisMin ; Auto build with appropriate axis channels
         filter = std_yAxisMax ; Auto build with appropriate axis channels
         filter = std_DeadLambda ; Auto build

 #if CELSIUS
         filter = minCltFilter,  "Minimum CLT", coolant,     <       , 71,       , true
 #else
         filter = minCltFilter,  "Minimum CLT", coolant,     <       , 160,      , true
 #endif
         filter = accelFilter,   "Accel Flag" , engine,      &       , 16,       , false
         filter = aseFilter,     "ASE Flag"   , engine,      &       , 4,        , false
         filter = overrunFilter, "Overrun"    , pulseWidth,  =       , 0,        , false
         filter = std_Custom ; Standard Custom Expression Filter.
#endif
;[PJSC v1.01]-------------------------------------------------------------------------
