; This is a TunerStudio project for the rusEFI.com engine management system ; this should stop TS from looking for the CAN ID in the 2nd byte location and allow the page reads to work correctly. enable2ndByteCanID = false [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 [MegaTune] ; https://rusefi.com/forum/viewtopic.php?p=36201#p36201 signature = "rusEFI 2023.05.10.wideband_dual" [TunerStudio] queryCommand = "S" versionInfo = "V" ; firmware version for title bar. signature = "rusEFI 2023.05.10.wideband_dual" ; signature is expected to be 7 or more characters. ; TS will try to use legacy temp units in some cases, showing "deg F" on a CLT gauge that's actually deg C useLegacyFTempUnits = false ignoreMissingBitOptions = true defaultRuntimeRecordPerSec = 50; [Constants] ; new packet serial format with CRC messageEnvelopeFormat = msEnvelope_1.0 endianness = little nPages = 2 pageSize = 256, 64 pageIdentifier = "\x00\x00", "\x00\x01" pageReadCommand = "R%2i%2o%2c", "R%2i%2o%2c" burnCommand = "B%2i" pageChunkWrite = "C%2i%2o%2c%v", "C%2i%2o%2c%v" crc32CheckCommand = "k%2i%2o%2c", "k%2i%2o%2c" retrieveConfigError = "e" ; communication settings pageActivationDelay = 500 ; Milliseconds delay after burn command. See https://sourceforge.net/p/rusefi/tickets/77/ ; e.g. put writeblocks off and add an interwrite delay writeBlocks = on interWriteDelay = 10 blockReadTimeout = 3000; Milliseconds general timeout ; delayAfterPortOpen = 500 blockingFactor = 256 ; max chunk size ; end communication settings ; 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 ; CONFIG_DEFINITION_START page = 1 ; name = class, type, offset, [shape], units, scale, translate, min, max, digits ; First four bytes are used for internal tag. Should not be accessable from TS CanIndexOffset = scalar, U08, 4, "", 1, 0, 0, 255, 0 Aux0OutBins = array, F32, 5, [8], "", 1, 0, 0, 1500, 2 Aux1OutBins = array, F32, 37, [8], "", 1, 0, 0, 1500, 2 Aux0Out = array, F32, 69, [8], "V", 1, 0, 0, 5.0, 2 Aux1Out = array, F32, 101, [8], "V", 1, 0, 0, 5.0, 2 Aux0InputSel = bits, U08, 133, [0:3], "AFR 0", "AFR 1", "Lambda 0", "Lambda 1", "EGT 0", "EGT 1" Aux1InputSel = bits, U08, 134, [0:3], "AFR 0", "AFR 1", "Lambda 0", "Lambda 1", "EGT 0", "EGT 1" LsuSensorType = bits, U08, 135, [0:2], "LSU 4.9", "LSU 4.2", "LSU ADV", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" page = 2 ; this is a RAM only page with no burnable flash ; name = class, type, offset, [shape], units, scale, translate, min, max, digits highSpeedOffsets = array, U16, 0, [32], "", 1, 0, 0, 65535, 0, noMsqSave [SettingContextHelp] [Tuning] [LoggerDefinition] [OutputChannels] ; two zero bytes added after cmd byte to align with page read/write format ochGetCommand = "O\x00\x00%2o%2c" ; see TS_OUTPUT_SIZE in console source code ochBlockSize = 256 ; 11.2.3 Full Optimized – High Speed scatteredOchGetCommand = "9" scatteredOffsetArray = highSpeedOffsets scatteredGetEnabled = { 1 } ; Common VBatt = scalar, F32, 0, "V", 1, 0 ; AFR0 AFR0_lambda = scalar, F32, 32, "", 1, 0 AFR0_afr = scalar, F32, 32, "", 14.7, 0 AFR0_temp = scalar, U16, 36, "C", 0.1, 0 AFR0_NernstDc = scalar, U16, 40, "V", 0.001, 0 AFR0_NernstAc = scalar, U16, 42, "V", 0.001, 0 AFR0_PumpITarget = scalar, F32, 44, "mA", 1, 0 AFR0_PumpIMeasure = scalar, F32, 48, "mA", 1, 0 AFR0_HeaterDuty = scalar, U16, 52, "%", 0.1, 0 AFR0_HeaterEffV = scalar, U16, 54, "V", 0.01, 0 AFR0_esr = scalar, F32, 56, "ohms", 1, 0 AFR0_fault = scalar, U08, 60, "", 1, 0 AFR0_heater = scalar, U08, 61, "", 1, 0 ; AFR1 AFR1_lambda = scalar, F32, 64, "", 1, 0 AFR1_afr = scalar, F32, 64, "", 14.7, 0 AFR1_temp = scalar, U16, 68, "C", 0.1, 0 AFR1_NernstDc = scalar, U16, 72, "V", 0.001, 0 AFR1_NernstAc = scalar, U16, 74, "V", 0.001, 0 AFR1_PumpITarget = scalar, F32, 76, "mA", 1, 0 AFR1_PumpIMeasure = scalar, F32, 80, "mA", 1, 0 AFR1_HeaterDuty = scalar, U16, 84, "%", 0.1, 0 AFR1_HeaterEffV = scalar, U16, 86, "V", 0.01, 0 AFR1_esr = scalar, F32, 88, "ohms", 1, 0 AFR1_fault = scalar, U08, 92, "", 1, 0 AFR1_heater = scalar, U08, 93, "", 1, 0 ; EGT0 EGT0_temp = scalar, F32, 96, "C", 1, 0 EGT0_coldJunction = scalar, F32, 100, "C", 1, 0 EGT0_state = scalar, U08, 104, "", 1, 0 ; EGT1 EGT1_temp = scalar, F32, 112, "C", 1, 0 EGT1_coldJunction = scalar, F32, 116, "C", 1, 0 EGT1_state = scalar, U08, 120, "", 1, 0 ; TODO: something is wrong with these Aux0InputSig = { (Aux0InputSel == 0) ? AFR0_lambda : ((Aux0InputSel == 1) ? AFR1_lambda : ((Aux0InputSel == 2) ? EGT0_temp : EGT1_temp)) } Aux1InputSig = { (Aux1InputSel == 0) ? AFR0_lambda : ((Aux1InputSel == 1) ? AFR1_lambda : ((Aux1InputSel == 2) ? EGT0_temp : EGT1_temp)) } ;Aux0InputSigMax = { (Aux0InputSel == 0) ? 25 : ((Aux0InputSel == 1) ? 25 : 1500 } ;Aux1InputSigMax = { (Aux1InputSel == 0) ? 25 : ((Aux1InputSel == 1) ? 25 : 1500 } [PcVariables] ; Keep in sync with Max31855State enum from max31855.h EgtStatesList = bits, U08, [0:7], "Ok", "Open Circuit", "Short to GND", "Short to VCC", "No reply" ; Keep in sync with WBO::Fault from ../for_rusefi/wideband_can.h AfrFaultList = bits, U08, [0:7], "Ok", "Unk", "Unk", "Failed to heat", "Overheat", "Underheat", "No supply" ; Keep in sync with HeaterState from heater_control.h HeaterStatesList = bits, U08, [0:7], "Preheat", "Warmup", "Close loop", "Stopped", "No supply" [CurveEditor] curve = auxOut0Curve, "AUX output 0 voltage" columnLabel = "Input", "Output" xAxis = { (Aux0InputSel < 2) ? 7 : 300 }, { (Aux0InputSel < 2) ? 25 : 1500 }, 13 yAxis = 0, 5, 6 xBins = Aux0OutBins, Aux0InputSig yBins = Aux0Out showTextValues = true curve = auxOut1Curve, "AUX output 1 voltage" columnLabel = "Input", "Output" xAxis = { (Aux1InputSel < 2) ? 7 : 300 }, { (Aux1InputSel < 2) ? 19 : 1500 }, 13 yAxis = 0, 5, 6 xBins = Aux1OutBins, Aux1InputSig yBins = Aux1Out showTextValues = true [TableEditor] [GaugeConfigurations] gaugeCategory = Common ; Name = Channel, Title, Units, Lo, Hi, LoD, LoW, HiW, HiD, vd, ld, Active VBattGauge = VBatt, "Battery", "V", 3.0, 24.0, 9.0, 11.0, 15.0, 16.0, 1, 1 ; AFR0 gaugeCategory = AFR channel 0 ; Name = Channel, Title, Units, Lo, Hi, LoD, LoW, HiW, HiD, vd, ld, Active AFR0_LambdaGauge = AFR0_lambda, "0: lambda", "", 0.5, 1.3, 0.5, 0.6, 1.05, 1.2, 3, 3 AFR0_AfrGauge = AFR0_afr, "0: AFR", "", 6.5, 20.0, 9.0, 10.0, 16.0, 17.0, 2, 2 AFR0_TempGauge = AFR0_temp, "0: AFR t", "C", 500, 1050, 500, 650, 800, 950, 0, 0 AFR0_NernstDcGauge = AFR0_NernstDc, "0: nernst DC", "V", 0.0, 1.0, 0.0, 0.0, 0.9, 0.95, 3, 3 AFR0_NernstAcGauge = AFR0_NernstAc, "0: nernst AC", "V", 0.0, 1.0, 0.0, 0.0, 0.9, 0.95, 3, 3 AFR0_HeaterDutyGauge = AFR0_HeaterDuty, "0: Heater Duty", "%", 0.0, 100.0, 1.0, 3.0, 90, 95, 1, 1 AFR0_HeaterEffVGauge = AFR0_HeaterEffV, "0: Heater Voltage", "V", 0.0, 18.0, 1.5, 6.0, 9, 16, 1, 1 AFR0_PumpITargetGauge = AFR0_PumpITarget, "0: Ipump Target", "mA", -5.0, 5.0, -4.0, -3.0, 3.0, 4.0, 2, 2 AFR0_PumpIMeasureGauge = AFR0_PumpIMeasure, "0: Ipump Actual", "mA", -5.0, 5.0, -4.0, -3.0, 3.0, 4.0, 2, 2 AFR0_EsrGauge = AFR0_esr, "0: ESR", "ohms", 0, 600, 200, 200, 350, 400, 0, 0 ; AFR1 gaugeCategory = AFR channel 1 ; Name = Channel, Title, Units, Lo, Hi, LoD, LoW, HiW, HiD, vd, ld, Active AFR1_LambdaGauge = AFR1_lambda, "1: lambda", "", 0.5, 1.3, 0.5, 0.6, 1.05, 1.2, 3, 3 AFR1_AfrGauge = AFR1_afr, "1: AFR", "", 6.5, 20.0, 9.0, 10.0, 16.0, 17.0, 2, 2 AFR1_TempGauge = AFR1_temp, "1: AFR t", "C", 500, 1050, 500, 650, 800, 950, 0, 0 AFR1_NernstDcGauge = AFR1_NernstDc, "1: nernst DC", "V", 0.0, 1.0, 0.0, 0.0, 0.9, 0.95, 3, 3 AFR1_NernstAcGauge = AFR1_NernstAc, "1: nernst AC", "V", 0.0, 1.0, 0.0, 0.0, 0.9, 0.95, 3, 3 AFR1_HeaterDutyGauge = AFR1_HeaterDuty, "1: Heater Duty", "%", 0.0, 100.0, 1.0, 3.0, 90, 95, 1, 1 AFR1_HeaterEffVGauge = AFR1_HeaterEffV, "1: Heater Voltage", "V", 0.0, 18.0, 1.5, 6.0, 9, 16, 1, 1 AFR1_PumpITargetGauge = AFR1_PumpITarget, "1: Ipump Target", "mA", -5.0, 5.0, -4.0, -3.0, 3.0, 4.0, 2, 2 AFR1_PumpIMeasureGauge = AFR1_PumpIMeasure, "1: Ipump Actual", "mA", -5.0, 5.0, -4.0, -3.0, 3.0, 4.0, 2, 2 AFR1_EsrGauge = AFR1_esr, "1: ESR", "ohms", 0, 600, 200, 200, 350, 400, 0, 0 ; EGT0 gaugeCategory = EGT channel 0 ; Name = Channel, Title, Units, Lo, Hi, LoD, LoW, HiW, HiD, vd, ld, Active EGT0_Gauge = EGT0_temp, "0: EGT", "C", 0.0, 1600.0, 100.0, 250.0, 900.0, 1000.0, 0, 0 EGT0_ColdJunctionGauge = EGT0_coldJunction, "0: EGT CJ", "C", 0.0, 130.0, -55.0, -20.0, 95.0, 105.0, 1, 1 EGT0_StateGauge = EGT0_state, "0: EGT state", "", 0.0, 5.0, 0.0, 0.0, 0.5, 0.5, 0, 0 ; EGT1 gaugeCategory = EGT channel 1 ; Name = Channel, Title, Units, Lo, Hi, LoD, LoW, HiW, HiD, vd, ld, Active EGT1_Gauge = EGT1_temp, "1: EGT", "C", 0.0, 1600.0, 100.0, 250.0, 900.0, 1000.0, 0, 0 EGT1_ColdJunctionGauge = EGT1_coldJunction, "1: EGT CJ", "C", 0.0, 130.0, -55.0, -20.0, 95.0, 105.0, 1, 1 EGT1_StateGauge = EGT1_state, "1: EGT state", "", 0.0, 5.0, 0.0, 0.0, 0.5, 0.5, 0, 0 ; AUX outputs Aux0InputGauge = { (Aux0InputSel == 0) ? AFR0_AfrGauge : ((Aux0InputSel == 1) ? AFR1_AfrGauge : ((Aux0InputSel == 2) ? EGT0_Gauge : EGT1_Gauge)) } Aux1InputGauge = { (Aux1InputSel == 0) ? AFR0_AfrGauge : ((Aux1InputSel == 1) ? AFR1_AfrGauge : ((Aux1InputSel == 2) ? EGT0_Gauge : EGT1_Gauge)) } [FrontPage] ; Gauges are numbered left to right, top to bottom. ; ; 1 2 3 4 ; 5 6 7 8 gauge1 = AFR0_TempGauge gauge2 = AFR0_AfrGauge gauge3 = AFR1_AfrGauge gauge4 = AFR1_TempGauge gauge5 = VBattGauge gauge6 = VBattGauge gauge7 = EGT0_Gauge gauge8 = EGT1_Gauge indicator = { EGT0_state }, "EGT0 ok", { EGT0: bitStringValue(EgtStatesList, EGT0_state)}, green, black, red, black indicator = { AFR0_fault }, "AFR0 ok", { AFR0: bitStringValue(AfrFaultList, AFR0_fault)}, green, black, red, black indicator = { (AFR0_heater != 2) }, "AFR0 Heater CL", { AFR0 heater: bitStringValue(HeaterStatesList, AFR0_heater)}, green, black, red, black indicator = { (AFR1_heater != 2) }, "AFR1 Heater CL", { AFR1 heater: bitStringValue(HeaterStatesList, AFR1_heater)}, green, black, red, black indicator = { AFR1_fault }, "AFR1 ok", { AFR1: bitStringValue(AfrFaultList, AFR1_fault)}, green, black, red, black indicator = { EGT1_state }, "EGT1 ok", { EGT1: bitStringValue(EgtStatesList, EGT1_state)}, green, black, red, black [KeyActions] [Datalog] ; Channel Label Type Format entry = time, "Time", float, "%.3f" entry = VBatt, "Battery", float, "%.2f" ; AFR0 entry = AFR0_lambda, "0: Lambda", float, "%.3f" entry = AFR0_afr, "0: AFR", float, "%.2f" entry = AFR0_temp, "0: Temp C", int, "%d" entry = AFR0_NernstDc, "0: Nernst DC", float, "%.3f" entry = AFR0_NernstAc, "0: Nernst AC", float, "%.3f" entry = AFR0_PumpITarget, "0: Ipump target", float, "%.2f" entry = AFR0_PumpIMeasure, "0: Ipump actual", float, "%.2f" entry = AFR0_HeaterDuty, "0: Heater duty", float, "%.1f" entry = AFR0_HeaterEffV, "0: Heater voltage", float, "%.1f" entry = AFR0_fault, "0: Fault code", int, "%d" entry = AFR0_heater, "0: Heater status code", int, "%d" entry = AFR0_esr, "0: ESR", float, "%.1f" ; AFR1 entry = AFR1_lambda, "1: Lambda", float, "%.3f" entry = AFR1_afr, "1: AFR", float, "%.2f" entry = AFR1_temp, "1: Temp C", int, "%d" entry = AFR1_NernstDc, "1: Nernst DC", float, "%.3f" entry = AFR1_NernstAc, "1: Nernst AC", float, "%.3f" entry = AFR1_PumpITarget, "1: Ipump target", float, "%.2f" entry = AFR1_PumpIMeasure, "1: Ipump actual", float, "%.2f" entry = AFR1_HeaterDuty, "1: Heater duty", float, "%.1f" entry = AFR1_HeaterEffV, "1: Heater voltage", float, "%.1f" entry = AFR1_fault, "1: Fault code", int, "%d" entry = AFR1_heater, "1: Heater status code", int, "%d" entry = AFR1_esr, "1: ESR", float, "%.1f" ; EGT0 entry = EGT0_temp, "EGT 0: EGT", int, "%d" entry = EGT0_coldJunction, "EGT 0: CJ", int, "%d" entry = EGT0_state, "EGT 0: State", int, "%d" ; EGT1 entry = EGT1_temp, "EGT 1: EGT", int, "%d" entry = EGT1_coldJunction, "EGT 1: CJ", int, "%d" entry = EGT1_state, "EGT 1: State", int, "%d" [Menu] menuDialog = main menu = "&Settings" subMenu = sensor_settings, "Sensor settings" subMenu = can_settings, "CAN settings" menu = "Outputs" subMenu = auxOut0, "AUX analog output 0" subMenu = auxOut1, "AUX analog output 1" menu = "&Controller" subMenu = ecuTools, "ECU tools" [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. ; reboot ECU cmd_reset_controller = "Z\x00\xbb\x00\x00" ; jump to DFU mode cmd_dfu = "Z\x00\xba\x00\x00" ; restart to OpenBlt cmd_openblt = "Z\x00\xbc\x00\x00" [UserDefined] dialog = sensor_settings, "Sensor Settings" field = "Sensor Type", LsuSensorType dialog = can_settings, "CAN Settings" field = "CAN message ID offset", CanIndexOffset dialog = auxOut0, "AUX analog out 0 Settings" field = "Signal", Aux0InputSel panel = auxOut0Curve dialog = auxOut1, "AUX analog out 1 Settings" field = "Signal", Aux1InputSel panel = auxOut1Curve dialog = ecuReset, "Reset" commandButton = "Reset ECU", cmd_reset_controller commandButton = "Reset to DFU", cmd_dfu commandButton = "Reset to OpenBLT", cmd_openblt dialog = ecuTools, "ECU tools and Commands", xAxis panel = ecuReset [Tools]