Jump to: navigation, search

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