EvoX CAN: Difference between revisions
(Created page with "CAN Pids (requires Mode 23 ECU modification or RAX Patch v2): https://docs.google.com/spreadsheets/d/1yqwaUIeylzGy0uVFBd-uCyEtLr8FW2B52HV4m_EkDrM/edit#gid=2012713014") |
No edit summary |
||
Line 1: | Line 1: | ||
=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 | |||
==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. | |||
<pre> | |||
--======================== 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 | |||
</pre> |
Revision as of 22:34, 27 October 2017
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
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.
--======================== 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