Haltech PS1000 - PS2000

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.

Haltech PS2000.png

The following script will map the common Haltech CAN bus channels to RaceCapture/Pro:

--Designed for Haltech PS1000/PS2000 CAN Logging
--HALTECH CAN V2 Broadcast Protocol

--============================== Set Variables =================================

setTickRate(30)
initCAN(0, 1000000)
CAN_chan = 0 -- 0=first CAN channel, 1=second

--comment out channels if reqd
--note Haltech quotes IDs in HEX and must be converted to Decimal
--usage: map_chan(var, data, starting byte, byte length, Unit, Offset)
CAN_map = { 
  [864] = function(data) 
    map_chan(rpmId, data, 0, 2, 1, 0)
    map_chan(mapId, data, 2, 2, 0.1, -101.3)
    map_chan(tpsId, data, 4, 2, 0.1, 0)
    end,
  [865] = function(data)
    map_chan(fpsId, data, 0, 2, 0.1, 0) 
    map_chan(opsId, data, 2, 2, 0.1, 0)
    end,
  [866] = function(data)
    map_chan(idcId, data, 0, 2, 0.1, 0)
    end,
  [872] = function(data)
    map_chan(afrId, data, 0, 2, 0.001, 0)
    end,
  [992] = function(data)
    map_chan(ctsId, data, 0, 2, 0.1, -273.1)
    map_chan(atsId, data, 2, 2, 0.1, -273.1)
    map_chan(ftsId, data, 4, 2, 0.1, -273.1)
    map_chan(otsId, data, 6, 2, 0.1, -273.1)
    end,
  [993] = function(data)
    map_chan(flxId, data, 4, 2, 0.1, 0) end
} 
	
--=============================== Add Virtual Channels ==========================

--usage: addChannel("Name",samplerate{1,10,25,50,100,200},precision(2),min(0),max(1000),units)
rpmId = addChannel("RPM", 25, 0, 0, 10000, 'RPM')
mapId = addChannel("MAP", 10, 1, 0, 100, 'kPa')
tpsId = addChannel("TPS", 10, 1, 0, 100, '%')
fpsId = addChannel("FPS", 10, 1, 0, 100, 'kPa')
opsId = addChannel("OPS", 10, 1, 0, 100, 'kPa')
idcId = addChannel("IDC", 10, 0, 0, 100, '%')
afrId = addChannel("AFR", 10, 2, 0, 5, 'Lambda')
ctsId = addChannel("CTS", 10, 1, 0, 200, 'C')
atsId = addChannel("IAT", 10, 1, 0, 200, 'C')
ftsId = addChannel("FTS", 10, 1, 0, 200, 'C')
otsId = addChannel("OTS", 10, 1, 0, 200, 'C')
flxId = addChannel("FLX", 10, 0, 0, 100, '%')

--========================== Init ===================================

function onTick()
  processCAN()
end

--========================== CAN =============================

function processCAN() --finds an id that exists then passes it to 
  repeat
    local id, e, data = rxCAN(0)
    if id ~= nil then  -- step through CAN data until you get a value
      local map = CAN_map[id]
      if map ~= nil then
        map(data) --this runs map_chan function with the CAN 'data'
			end
    end
  until id == nil
end

function map_chan(cid, data, offset, len, mult, add) --eg (rpmId, data, 0, 2, 1, 0)
  offset = offset + 1
  local value = 0
  while len > 0 do
    value = (value * 256) + data[offset]
    offset = offset + 1
    len = len - 1
  end
  setChannel(cid, (value * mult) + add)
end