--==============================================RaceCapture - Lua Script - RAX Channels============================================== --==Initialize CAN and define TickRate== collectgarbage() initCAN(0, 500000) setTickRate(50) --==Global variables declaration== local vIPW,vBaro = 0,0 --==RAX and Tephra Flex Channels declarations== local cSTFT, cLTFTcurrent, cLTFTidle, cLTFTcruise, cLoad, cRearO2, cIPW, cAFRMAP, cLoadTiming, cTiming, cKnock, cRPM, cIDC, cBaro, cMAP, cBoost, cWGDC, cMAF, cInVVTtarget, cInVVTcurr, cExVVTtarget, cExVVTcurr, cTPS, cAPP, cIAT, cWGDCcorr, cSpeed, cBattery, cCoolant, cMAT, cMAPcalc, cIMAPcalc, cMAFcalc, cChosenCalc, cEthanol, c5barBoost, c5barVcvr --==Create virtual channels for RAX== --==RAX A== cSTFT = addChannel("STFT", 50, 2, -25, 25, "%") cLTFTcurrent = addChannel("LTFTcurrent", 50, 2, -12.5, 12.5, "%") cLTFTidle = addChannel("LTFTidle", 50, 2, -12.5, 12.5, "%") cLTFTcruise = addChannel("LTFTcruise", 50, 2, -12.5, 12.5, "%") --==RAX B== cLoad = addChannel("Load", 50, 0, 0, 398, "Load") cRearO2 = addChannel("RearO2", 50, 2, 8, 20, "AFR") cIPW = addChannel("IPW", 50, 1, 0, 25.5, "ms") cAFRMAP = addChannel("AFRMAP", 50, 2, 8, 20, "AFR") --==RAX C== cLoadTiming = addChannel("LoadTiming", 50, 0, 0, 398, "Load") cTiming = addChannel("Timing", 50, 0, -20, 50, "Deg") cKnock = addChannel("Knock", 50, 0, 0, 50, "unit") cRPM = addChannel("RPM", 50, 0, 0, 8500, "RPM") cIDC = addChannel("IDC", 50, 2, 0, 120, "%") --==RAX D== cBaro = addChannel("Baro", 50, 2, 11.7, 17.7, "PSIA") cMAP = addChannel("MAP", 50, 2, 0, 50, "PSIA") cBoost = addChannel("Boost", 50, 2, -20, 35, "PSIG") cWGDC = addChannel("WGDC", 50, 1, 0, 100, "%") cMAF = addChannel("MAF", 50, 2, 0, 5, "V") --==RAX E== cInVVTtarget = addChannel("InVVTtarget", 50, 1, -2.5, 37.5, "Deg") cInVVTcurr = addChannel("InVVTcurr", 50, 1, -2.5, 37.5, "Deg") cExVVTtarget = addChannel("ExVVTtarget", 50, 1, -37.5, 2.5, "Deg") cExVVTcurr = addChannel("ExVVcurr", 50, 1, -37.5, 2.5, "Deg") --==RAX F== cTPS = addChannel("TPS", 50, 1, 0, 100, "%") cAPP = addChannel("APP", 50, 1, 0, 100, "%") cIAT = addChannel("IAT", 50, 0, 0, 212, "F") cWGDCcorr = addChannel("WGDCcorr", 50, 1, -64, 64, "%") --==RAX G== cSpeed = addChannel("SpeedECU", 50, 0, 0, 180, "MPH") cBattery = addChannel("BatteryECU", 50, 2, 0, 18.6, "V") cCoolant = addChannel("Coolant", 50, 0, 0, 300, "F") cMAT = addChannel("MAT", 50, 0, 0, 212, "F") --==RAX H== cMAPcalc = addChannel("MAPcalc", 50, 2, 0, 398, "Load") cIMAPcalc = addChannel("IMAPcalc", 50, 2, 0, 398, "Load") cMAFcalc = addChannel("MAFcalc", 50, 2, 0, 398, "Load") cChosenCalc = addChannel("ChosenCalc", 50, 2, 0, 398, "Load") --==Tephra Flex== cEthanol = addChannel("Ethanol", 50, 1, 0, 100, "%") --==FiveBarSensors== c5barBoost = addChannel("5barBoost", 50, 2, -20, 75, "PSIG") c5barVcvr = addChannel("5barVcvr", 50, 2, -20, 75, "PSIG") --==Function to request and receive RAX and Tephra Flex data from ECU== local function getCAN(add1,add2,nBytes) local res, id, ext, data res = txCAN(0,2016,0,{5,35,128,add1,add2,nBytes,0,0},300) if res == 1 then id,ext,data = rxCAN(0,300) if id ~= 2024 then data = nil end else data = nil end return data end --==Function to update RAX and Tephra Flex virtual channels values== local function getRAX() local data,vRPM,vMAP,vBoost --==RAX B,A== data = getCAN(81,168,6) if data ~= nil then vIPW = data[4]/10 setChannel(cLoad,data[3]*25/16) setChannel(cRearO2,(data[6]+9.6) * 0.0392) setChannel(cIPW,vIPW) setChannel(cAFRMAP,(14.7*128)/data[5]) setChannel(cSTFT,(data[7]* 25/128)-25) setChannel(cLTFTcurrent,(data[8]* 25/128)-25) vBaro = (data[4]+90) * 0.07251887 end --==RAX A,C== data = getCAN(81,174,6) if data ~= nil then data[8] = data[8]+((data[7]%8)*256) data[7] = math.floor(data[7]/8) + ((data[6]%2)*32) data[6] = math.floor(data[6]/2) vRPM = data[8]*125/16 setChannel(cLTFTidle,(data[3]* 25/128)-25) setChannel(cLTFTcruise,(data[4]* 25/128)-25) setChannel(cLoadTiming,data[5]* 25/16) setChannel(cTiming,data[6] - 20) setChannel(cKnock,data[7]) setChannel(cRPM,vRPM) setChannel(cIDC,vIPW*vRPM/1200) end --==RAX D,E== data = getCAN(81,180,6) if data ~= nil then data[3] = (data[3]*2) + math.floor(data[4]/128) if data[4] > 128 then data[4] = data[4] - 128 end vMAP = data[3]* 0.096487 vBaro = (data[4]+90) * 0.07251887 vBoost = vMAP - vBaro setChannel(cBaro,vBaro) setChannel(cMAP,vMAP) setChannel(cBoost,vBoost) setChannel(cWGDC,data[5]/2) setChannel(cMAF,data[6]*5/255) setChannel(cInVVTtarget,(data[7]-16)*5/32) setChannel(cExVVTtarget,(16-data[8])*5/32) end --==RAX E,F== data = getCAN(81,186,6) if data ~= nil then setChannel(cInVVTcurr,(data[3]-16)*5/32) setChannel(cExVVTcurr,(16-data[4])*5/32) setChannel(cTPS,data[5]*100/255) setChannel(cAPP,(data[6]-32)*129/255) setChannel(cIAT,(data[7]*9/5)-40) setChannel(cWGDCcorr,(data[8]/2)-64) end --==RAX G== data = getCAN(81,192,4) if data ~= nil then setChannel(cSpeed,data[3]*5/4) setChannel(cBattery,data[4]*18.7/255) setChannel(cCoolant,(data[5]*9/5)-40) setChannel(cMAT,(data[6]*9/5)-40) end --==RAX H== data = getCAN(81,196,4) if data ~= nil then setChannel(cMAPcalc,data[3]*25/16) setChannel(cIMAPcalc,data[4]*25/16) setChannel(cMAFcalc,data[5]*25/16) setChannel(cChosenCalc,data[6]*25/16) end --==Tephra Flex== data = getCAN(80,131,1) if data ~= nil then setChannel(cEthanol,data[3]*100/255) end end --==Function onTick== function onTick() getRAX() --==Update channels== setChannel(c5barBoost,getAnalog(5)-vBaro) setChannel(c5barVcvr,getAnalog(6)-vBaro) --==SDCardLogging== if getAnalog(7) > 13 then startLogging() else stopLogging() end end