EvoX CAN
Introduction
The EvoX integration requires requires Mode 23 ECU modification or RAX Patch v2): https://docs.google.com/spreadsheets/d/1yqwaUIeylzGy0uVFBd-uCyEtLr8FW2B52HV4m_EkDrM/edit#gid=2012713014
Mitsubishi forums discussion
See this thread for extensive information and discussion on the EvoX integration.
Channels Supported
The script provides the following channels:
- Load
- Timing
- KnockSum
- RPM
- Boost
- WGDC
- APP
- IAT
- ECT
- MAT
Script
Copy and paste this into the RaceCapture scripting window - ensure you erase any existing script before writing.
After updating the script, press 'Write' to write the script to your RaceCapture system.
--======================== STEERING AND BRAKES ================================
local chBrakeMC = 0
function getBrakes()
if chBrakeMC == 0 then
chBrakeMC = addChannel("BrakeMC", 100, 2, 0, 120, "Bar")
end
d1,d2 = requestCAN(1924,2)
if d1==nil or d2==nil then return end
setChannel(chBrakeMC, mBytes(d1[8],d2[2]) / 100.0 )
end
--======================== RAX MAIN DATA =====================================
local chLoad,chTiming,chKnockSum,chRPM = 0,0,0,0
local chBarometer,chMAP,chBoost,chWGDC = 0,0,0,0
local chAPP,chIAT,chECT,chMAT = 0,0,0,0
d1,d2,d3,res,id,ext = 0,0,0,0,0
function getRAX()
if chLoad == 0 then
chLoad = addChannel("Load", 100, 0, 0, 500, "Load")
chTiming = addChannel("Timing", 100, 0, -20, 50, "deg")
chKnockSum = addChannel("KnockSum", 100, 0, 0, 50, "counts")
chRPM = addChannel("RPM", 100, 0, 0, 8500)
chBoost = addChannel("Boost", 100, 1, -14.5, 43.5, "PSI")
chWGDC = addChannel("WGDC", 100, 1, 0, 100, "%")
chAPP = addChannel("APP", 100, 0, 0, 100, "%")
chIAT = addChannel("IAT", 100, 0, 0, 200, "F")
chECT = addChannel("ECT", 100, 0, 0, 300, "F")
chMAT = addChannel("MAT", 100, 0, 0, 200, "F")
end
d1 = requestCAN(2016,0x8051A8,6)
if d1 ~= nil then
local load = m23Bits(d1,1,8)
setChannel(chLoad,load)
end
d1 = requestCAN(2016,0x8051AE,6)
if d1 ~= nil then
local timing = m23Bits(d1,25,7)-20
setChannel(chTiming,timing)
local knocksum = m23Bits(d1,32,6)
setChannel(chKnockSum,knocksum)
local rpm = m23Bits(d1,38,11)*7.8125
setChannel(chRPM,rpm)
end
d1 = requestCAN(2016,0x8051B4,6)
if d1 ~= nil then
local map = m23Bits(d1,1,9)*0.0964869
local baro = (m23Bits(d1,10,7)+90)*0.07251887
setChannel(chBoost,map-baro)
local wgdc = m23Bits(d1,17,8)*0.5
setChannel(chWGDC,wgdc)
end
d1 = requestCAN(2016,0x8051BA,6)
if d1 ~= nil then
local app = ((m23Bits(d1,25,8)-32)*129)/255
setChannel(chAPP,app)
local iat = (m23Bits(d1,33,8)*1.8)-40
setChannel(chIAT,iat)
end
d1 = requestCAN(2016,0x8051C0,6)
if d1 ~= nil then
local ect = (m23Bits(d1,17,8)*1.8)-40
setChannel(chECT,ect)
local mat = (m23Bits(d1,25,8)*1.8)-40
setChannel(chMAT,mat)
end
end
-- =========== Byte xtraction from Mode23 CAN =================================
local bits = {0x1,0x3,0x7,0xF,0x1F,0x3F,0x7F,
0xFF,0x1FF,0x3FF,0x7FF,0xFFF,0x1FFF,
0x3FFF,0x7FFF,0xFFFF,0x1FFFF,0x3FFFF,0x7FFFF,
0xFFFFF,0x1FFFFF,0x3FFFFF,0x7FFFFF,0xFFFFFF}
local band, bxor, bnot = bit.band, bit.bxor, bit.bnot
local lshift, rshift = bit.lshift, bit.rshift
function m23Bits(d,startBit,length)
local shift = (8 - ((startBit+length-1) % 8)) % 8
local startByte = 3 + (startBit - 1 - ((startBit-1) % 8)) / 8
local bnumb = d[startByte]
if (length+shift) > 8 and startByte < 8 then
bnumb = d[startByte+1] + lshift(bnumb,8)
if (length+shift) > 16 and startByte < 7 then
bnumb = d[startByte+2] + lshift(bnumb,8)
end
end
bnumb = rshift(bnumb,shift)
bnumb = band(bnumb,bits[length])
return bnumb
end
--============================ 2 BYTES SIGNED CONVERSION ======================
function mBytes(byte1,byte2)
if byte1 > 127 then
return 0 - lshift(band(-bnot(0x1000+byte1),0x00FF),8) - band(-bxor(0x1000+byte2,0x0000),0x00FF) - 1
end
return lshift(byte1,8) + byte2
end
--============================ CAN MESSAGING ==================================
function requestCAN(address, pid, bytes)
local reqStandard = {2,33,0,255,255,255,255,255}
local reqContinue = {48,8,0,255,255,255,255,255}
local reqMode23 = {5,35,0,0,0,0,255,255}
local to = 100
if pid>255 then
reqMode23[3]=rshift(pid,16)
reqMode23[4]=band(rshift(pid,8),bits[8])
reqMode23[5]=band(pid,bits[8])
reqMode23[6]=bytes
res = txCAN(0, address, 0, reqMode23,to)
if res ~= 1 then return nil end
else
reqStandard[3] = pid
res = txCAN(0, address, 0, reqStandard,to)
if res ~= 1 then return nil end
end
id, ext, d1 = rxCAN(0,to)
if id == nil then return nil end
if d1[1] < 16 then return d1,nil,nil end
res = txCAN(0, address, 0, reqContinue,to)
if res ~= 1 then return nil end
id, ext, d2 = rxCAN(0,to)
if id == nil then return nil end
if(d1[2]<14) then return d1, d2, nil end
id, ext, d3 = rxCAN(0,to)
if id == nil then return nil end
return d1, d2, d3
end
-- ========================= MAIN CYCLE =======================================
local tickRate = 30
local chCANHz = addChannel("CANSpeed", 1, 0, 0, 300, "Hz")
initCAN(0, 500000)
setTickRate(tickRate)
function onTick()
local started = getUptime()
local mc = 0
repeat
getBrakes()
getRAX()
mc = mc + 1
until getUptime() > started + 1000
setChannel(chCANHz, mc)
end
