EvoX CAN

The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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