Hondata KPro4: Difference between revisions
updated with latest. |
updated script |
||
| Line 12: | Line 12: | ||
--CAN channel to listen on. 0=first CAN channel, 1=second | --CAN channel to listen on. 0=first CAN channel, 1=second | ||
CAN_chan = 0 | CAN_chan = 0 | ||
--1 | |||
--add your virtual channels here | |||
rpmId = addChannel("RPM", 25, 0, 0, 9000, "RPM") | |||
vltId = addChannel("EcuVolts", 10, 1, 0, 20, "volts") | |||
iatId = addChannel("IAT", 1, 0, 0, 100, "C") | |||
ectId = addChannel("EngineTemp", 1, 0, 0, 150, "C") | |||
tpsId = addChannel("TPS", 10, 0, 0, 100, "%") | |||
mapId = addChannel("MAP", 10, 1, 0, 15, "PSI") | |||
injId = addChannel("InjectorPW", 10, 3, 0, 100, "ms") | |||
ignId = addChannel("Ignition", 10, 0, -20, 20, "D") | |||
lmdId = addChannel("AFR", 10, 3, 0, 2, "lambda") | |||
knkId = addChannel("Knock", 1, 0, 0, 15, "count") | |||
camId = addChannel("CamTiming", 10, 0, -20, 20, "D") | |||
function toF(value) | function toF(value) | ||
| Line 23: | Line 34: | ||
end | end | ||
--customize here for CAN channel mapping | |||
--offset/length in bytes? | |||
--format is: [CAN Id] = function(data) map_chan(<channel id>, data, <CAN offset>, <CAN length>, <multiplier>, <adder>) | |||
CAN_map = { | CAN_map = { | ||
[1632] = function(data) | --did not bother logging gear speed and target cam angle | ||
[1632] = function(data) map_chan(rpmId, data, 0, 2, 1, 0) map_chan(vltId, data, 5, 1, 0.1, 0) end, | |||
[1633] = function(data) map_chan(iatId, data, 0, 2, 1, 0, toF) map_chan(ectId, data, 2, 2, 1, 0, toF) end, | |||
[1634] = function(data) map_chan(tpsId, data, 0, 2, 1, 0) map_chan(mapId, data, 2, 2, 0.0145037738, 0) end, | |||
end, | [1635] = function(data) map_chan(injId, data, 0, 2, 0.001, 0) map_chan(ignId, data, 2, 2, 1, 0) end, | ||
[1633] = function(data) | [1636] = function(data) map_chan(lmdId, data, 0, 2, 0.00003051757, 0, toAFR) end, | ||
[1637] = function(data) map_chan(knkId, data, 0, 2, 1, 0) end, | |||
[1638] = function(data) map_chan(camId, data, 2, 2, 1, 0) end | |||
end, | |||
[1634] = function(data) | |||
end, | |||
[1635] = function(data) | |||
end, | |||
[1636] = function(data) | |||
end, | |||
[1637] = function(data) | |||
end, | |||
[1638] = function(data) | |||
end | |||
} | } | ||
function onTick() | |||
processCAN(CAN_chan) | |||
--processLogging() | |||
end | |||
function processLogging() | |||
if getGpio(1) < 1 then | |||
startLogging() | |||
else | |||
stopLogging() | |||
end | |||
end | end | ||
function processCAN(chan) | --===========do not edit below=========== | ||
repeat | function processCAN(chan) | ||
local id, e, data = rxCAN(chan) | repeat | ||
if id ~= nil then | local id, e, data = rxCAN(chan) | ||
local map = CAN_map[id] | if id ~= nil then | ||
if map ~= nil then | local map = CAN_map[id] | ||
map(data) | if map ~= nil then | ||
end | map(data) | ||
end | end | ||
until id == nil | end | ||
end | until id == nil | ||
end | |||
--Map CAN channel, | --Map CAN channel, big endian format | ||
function | function map_chan(cid, data, offset, len, mult, add, filter) | ||
offset = offset + 1 | offset = offset + 1 | ||
local value = 0 | local value = 0 | ||
while len > 0 do | |||
while len > 0 do | value = (value * 256) + data[offset] | ||
value = value + | offset = offset + 1 | ||
len = len - 1 | |||
offset = offset + 1 | end | ||
len = len - 1 | local cv = value * mult + add | ||
end | if filter ~= nil then cv = filter(cv) end | ||
setChannel(cid, cv) | setChannel(cid, cv) | ||
end | end | ||
initCAN(CAN_chan, CAN_baud) | |||
setTickRate(tickRate) | |||
</pre> | </pre> | ||
Revision as of 16:24, 29 April 2016
The following script adapts the Hondata KPro4 CAN to RaceCapture/Pro
--This example adopted to Hondata KPro4 CAN output
--how frequently we poll for CAN messages, 30Hz is the max
tickRate = 30
--the CAN baud rate
CAN_baud = 250000
--CAN channel to listen on. 0=first CAN channel, 1=second
CAN_chan = 0
--add your virtual channels here
rpmId = addChannel("RPM", 25, 0, 0, 9000, "RPM")
vltId = addChannel("EcuVolts", 10, 1, 0, 20, "volts")
iatId = addChannel("IAT", 1, 0, 0, 100, "C")
ectId = addChannel("EngineTemp", 1, 0, 0, 150, "C")
tpsId = addChannel("TPS", 10, 0, 0, 100, "%")
mapId = addChannel("MAP", 10, 1, 0, 15, "PSI")
injId = addChannel("InjectorPW", 10, 3, 0, 100, "ms")
ignId = addChannel("Ignition", 10, 0, -20, 20, "D")
lmdId = addChannel("AFR", 10, 3, 0, 2, "lambda")
knkId = addChannel("Knock", 1, 0, 0, 15, "count")
camId = addChannel("CamTiming", 10, 0, -20, 20, "D")
function toF(value)
return value * 1.8 + 32
end
function toAFR(value)
return value * 14.7
end
--customize here for CAN channel mapping
--offset/length in bytes?
--format is: [CAN Id] = function(data) map_chan(<channel id>, data, <CAN offset>, <CAN length>, <multiplier>, <adder>)
CAN_map = {
--did not bother logging gear speed and target cam angle
[1632] = function(data) map_chan(rpmId, data, 0, 2, 1, 0) map_chan(vltId, data, 5, 1, 0.1, 0) end,
[1633] = function(data) map_chan(iatId, data, 0, 2, 1, 0, toF) map_chan(ectId, data, 2, 2, 1, 0, toF) end,
[1634] = function(data) map_chan(tpsId, data, 0, 2, 1, 0) map_chan(mapId, data, 2, 2, 0.0145037738, 0) end,
[1635] = function(data) map_chan(injId, data, 0, 2, 0.001, 0) map_chan(ignId, data, 2, 2, 1, 0) end,
[1636] = function(data) map_chan(lmdId, data, 0, 2, 0.00003051757, 0, toAFR) end,
[1637] = function(data) map_chan(knkId, data, 0, 2, 1, 0) end,
[1638] = function(data) map_chan(camId, data, 2, 2, 1, 0) end
}
function onTick()
processCAN(CAN_chan)
--processLogging()
end
function processLogging()
if getGpio(1) < 1 then
startLogging()
else
stopLogging()
end
end
--===========do not edit below===========
function processCAN(chan)
repeat
local id, e, data = rxCAN(chan)
if id ~= nil then
local map = CAN_map[id]
if map ~= nil then
map(data)
end
end
until id == nil
end
--Map CAN channel, big endian format
function map_chan(cid, data, offset, len, mult, add, filter)
offset = offset + 1
local value = 0
while len > 0 do
value = (value * 256) + data[offset]
offset = offset + 1
len = len - 1
end
local cv = value * mult + add
if filter ~= nil then cv = filter(cv) end
setChannel(cid, cv)
end
initCAN(CAN_chan, CAN_baud)
setTickRate(tickRate)

