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