AIM SmartyCam CAN: Difference between revisions

No edit summary
Line 11: Line 11:


<pre>
<pre>
--AIM Smarty Cam Stream For Race Capture


--how frequently we poll for CAN messages
tickRate = 30
--the CAN baud rate
CAN_baud = 1000000
--CAN channel to listen on. 0=first CAN channel, 1=second
CAN_chan = 0
--1 for Big Endian (MSB) mode; 0 for Little Endian mode (LSB)
be_mode = 0


--add your virtual channels here
tpsId = addChannel("TPS", 10, 0, 0, 100, "%")
tempId = addChannel("EngineTemp", 1, 0, 0, 200, 'C')
oilTempId = addChannel("OilTemp", 1, 0, 0, 200, 'C')
rpmId = addChannel("RPM", 10, 0, 0, 10000, 'RPM')
fuelId = addChannel("Fuel", 1, 0, 0, 60, "L")
oilPresId = addChannel("OilPressure", 10, 0, 0, 10, 'Bar')
--customize here for CAN channel mapping
--format is: [CAN Id] = function(data) map_chan(<channel id>, data, <CAN offset>, <CAN length>, <multiplier>, <adder>)
CAN_map = {
[1056] = function(data) map_chan(rpmId, data, 0, 2, 1, 0) map_chan(tempId, data, 6, 2, 0.1, 0) end,
[1057] = function(data) map_chan(oilTempId, data, 4, 2, 0.1, 0) map_chan(OilPresId, data, 6, 2, 0.01, 0) end,
[1058] = function(data) map_chan(tpsId, data, 2, 1, 1, 0) end ,
[1070] = function(data) map_chan(fuelId, data, 0, 1, 1, 0) end
}
function onTick()
processCAN(CAN_chan)
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, little endian format
function map_chan_le(cid, data, offset, len, mult, add)
    offset = offset + 1
    local value = 0
    local shift = 1
    while len > 0 do
        value = value + (data[offset] * shift)
        shift = shift * 256
        offset = offset + 1
        len = len - 1
    end
    setChannel(cid, (value * mult) + add)
end
--Map CAN channel, big endian format
function map_chan_be(cid, data, offset, len, mult, add)
    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
map_chan = (be_mode == 1) and map_chan_be or map_chan_le
initCAN(CAN_chan, CAN_baud)
setTickRate(tickRate)
</pre>
</pre>

Revision as of 19:07, 9 March 2015

Introduction

Under Development

Pictures

Connections

CAN database

Integration Script

--AIM Smarty Cam Stream For Race Capture

--how frequently we poll for CAN messages 
tickRate = 30 
--the CAN baud rate 
CAN_baud = 1000000 
--CAN channel to listen on. 0=first CAN channel, 1=second 
CAN_chan = 0 
--1 for Big Endian (MSB) mode; 0 for Little Endian mode (LSB) 
be_mode = 0

--add your virtual channels here 
tpsId = addChannel("TPS", 10, 0, 0, 100, "%") 
tempId = addChannel("EngineTemp", 1, 0, 0, 200, 'C') 
oilTempId = addChannel("OilTemp", 1, 0, 0, 200, 'C') 
rpmId = addChannel("RPM", 10, 0, 0, 10000, 'RPM') 
fuelId = addChannel("Fuel", 1, 0, 0, 60, "L") 
oilPresId = addChannel("OilPressure", 10, 0, 0, 10, 'Bar')

--customize here for CAN channel mapping 
--format is: [CAN Id] = function(data) map_chan(<channel id>, data, <CAN offset>, <CAN length>, <multiplier>, <adder>) 
CAN_map = {
[1056] = function(data) map_chan(rpmId, data, 0, 2, 1, 0) map_chan(tempId, data, 6, 2, 0.1, 0) end, 
[1057] = function(data) map_chan(oilTempId, data, 4, 2, 0.1, 0) map_chan(OilPresId, data, 6, 2, 0.01, 0) end, 
[1058] = function(data) map_chan(tpsId, data, 2, 1, 1, 0) end , 
[1070] = function(data) map_chan(fuelId, data, 0, 1, 1, 0) end 
}

function onTick() 
processCAN(CAN_chan) 
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, little endian format
function map_chan_le(cid, data, offset, len, mult, add)
    offset = offset + 1
    local value = 0
    local shift = 1
    while len > 0 do
        value = value + (data[offset] * shift)
        shift = shift * 256
        offset = offset + 1
        len = len - 1
    end
    setChannel(cid, (value * mult) + add)
end

--Map CAN channel, big endian format
function map_chan_be(cid, data, offset, len, mult, add)
    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

map_chan = (be_mode == 1) and map_chan_be or map_chan_le
initCAN(CAN_chan, CAN_baud)
setTickRate(tickRate)