Big endian txCAN
Big endian txCAN
Hi all,
How do you send CAN messages that are more than 8 bit long in Big endian format?
I am trying to send can message to my AEM Infinity ECU and can send 8 bit messages but I'm struggling with 16bit. I want to do this to allow for AEM native logging which allows me to create math channels in AEM data
Also any idea of how to send signed messages?
How do you send CAN messages that are more than 8 bit long in Big endian format?
I am trying to send can message to my AEM Infinity ECU and can send 8 bit messages but I'm struggling with 16bit. I want to do this to allow for AEM native logging which allows me to create math channels in AEM data
Also any idea of how to send signed messages?
You can extract the high and low bytes with some bitwise operations:
and the output:
Hope that helps!
Code: Select all
x = 0x0102 --(257 in decimal)
low = bit.band(x, 0xFF) -- mask out high byte
high = bit.rshift(x, 8) -- shift high byte to the right
println('x = ' ..x)
println('low = ' ..low)
println('high = ' ..high)
Code: Select all
[lua] Gracefully stopping Lua Task
[lua] Destroying Lua State
[lua] Initializing Lua state
[lua] memory usage: 16KB
[lua] Starting Lua Task
[lua] Loading script. Length: 206
x = 258.0
low = 2.0
high = 1.0
[lua] Successfully loaded script.
Excellent thank you Brent,
I'm trying to emulate AEM's vehicle dynamics module using the RCP. So far my code looks like this but I'm still unsure of how I would create a 32bit message using bitwise. See attachment for description of message.
initCAN(0, 500000)
tickRate = 10
function onTick()
lat,lon = getGpsPos()
speedmph = getGpsSpeed()
--speedmph = 1.00
--altitude = getGpsAltitude()
quality = getGpsQuality()
sats = getGpsSats()
year,month,day,hour,minute,second = getDateTime()
xg = getImu(0)
yg = getImu(1)
zg = getImu(2)
xy = getImu(3) --yaw
yy = getImu(4) --pitch
zy = getImu(5) --roll
--lowlat = bit.band(lat.0xffffffff)
--midlat = bit.rshift(lat.
lowspeed = bit.band(speedmph,0xFF)
highspeed = bit.rshift(speedmph,8)
lowalt = bit.band(altitude,0xff)
highalt = bit.rshift(altitude,8)
lowxg = bit.band(xg,0xFF)
highxg = bit.rshift(xg,8)
lowyg = bit.band(yg,0xFF)
highyg = bit.rshift(yg,8)
lowzg = bit.band(zg,0xFF)
highzg = bit.rshift(zg,8)
lowxy = bit.band(xy,0xFF)
highxy = bit.rshift(xy,8)
lowyy = bit.band(yy,0xFF)
highyy = bit.rshift(yy,8)
lowzy = bit.band(zy,0xFF)
highzy = bit.rshift(zy,8)
--msg0 = {lat%256,lat/256,lon}
msg1 = {lowspeed,highspeed,lowalt,highalt}
msg2 = {sats,year-208,month,day,0,hour,minute,second}
msg3 = {lowxg,highxg,lowyg,highyg,lowzg,highzg}
msg4 = {lowxy,highxy,lowyy,highyy,lowzy,highzy}
--txCAN(0, 655360, 1, msg0)
txCAN(0, 655361, 1, msg1)
txCAN(0, 655362, 1, msg2)
txCAN(0, 655363, 1, msg3)
txCAN(0, 655364, 1, msg4)
end
I'm trying to emulate AEM's vehicle dynamics module using the RCP. So far my code looks like this but I'm still unsure of how I would create a 32bit message using bitwise. See attachment for description of message.
initCAN(0, 500000)
tickRate = 10
function onTick()
lat,lon = getGpsPos()
speedmph = getGpsSpeed()
--speedmph = 1.00
--altitude = getGpsAltitude()
quality = getGpsQuality()
sats = getGpsSats()
year,month,day,hour,minute,second = getDateTime()
xg = getImu(0)
yg = getImu(1)
zg = getImu(2)
xy = getImu(3) --yaw
yy = getImu(4) --pitch
zy = getImu(5) --roll
--lowlat = bit.band(lat.0xffffffff)
--midlat = bit.rshift(lat.
lowspeed = bit.band(speedmph,0xFF)
highspeed = bit.rshift(speedmph,8)
lowalt = bit.band(altitude,0xff)
highalt = bit.rshift(altitude,8)
lowxg = bit.band(xg,0xFF)
highxg = bit.rshift(xg,8)
lowyg = bit.band(yg,0xFF)
highyg = bit.rshift(yg,8)
lowzg = bit.band(zg,0xFF)
highzg = bit.rshift(zg,8)
lowxy = bit.band(xy,0xFF)
highxy = bit.rshift(xy,8)
lowyy = bit.band(yy,0xFF)
highyy = bit.rshift(yy,8)
lowzy = bit.band(zy,0xFF)
highzy = bit.rshift(zy,8)
--msg0 = {lat%256,lat/256,lon}
msg1 = {lowspeed,highspeed,lowalt,highalt}
msg2 = {sats,year-208,month,day,0,hour,minute,second}
msg3 = {lowxg,highxg,lowyg,highyg,lowzg,highzg}
msg4 = {lowxy,highxy,lowyy,highyy,lowzy,highzy}
--txCAN(0, 655360, 1, msg0)
txCAN(0, 655361, 1, msg1)
txCAN(0, 655362, 1, msg2)
txCAN(0, 655363, 1, msg3)
txCAN(0, 655364, 1, msg4)
end
- Attachments
-
- Capture.JPG (52.28 KiB) Viewed 6620 times
The script below is verified to send Racecapture Pro2 Canbus data to an AEM Infinity 506 to simulate an AEM Vehicle Dynamics Module. The only channels that are not transmitted are:
latitude (unsure how to send a 32 bit message)
longitude (again unsure how to send a 32 bit message)
GPSTrueCouse (don't believe RCP has this channel to send)
With all the other data logged by the AEM Infinity I can now create Maths Channels with AEM data!!
initCAN(0, 500000)
tickRate = 100
function onTick()
lat,lon = getGpsPos()
speedmph = getGpsSpeed()/0.01
altitude = getGpsAltitude()
quality = getGpsQuality()
sats = getGpsSats()
course = 20/0.01
year,month,day,hour,minute,second = getDateTime()
xg = getImu(0)/0.000244141
yg = getImu(1)/0.000244141
zg = getImu(2)/0.000244141
yaw = getImu(3)/0.015258789 --yaw
pitch = getImu(4)/0.015258789 --pitch
roll = getImu(5)/0.015258789 --roll
lowlat = bit.band(lat,0xFFFF)
midlat = bit.rshift(lat,8)
highlat = bit.rshift(lat,16)
higherlat = bit.rshift(lat,32)
lowspeed = bit.band(speedmph, 0xFF)
highspeed = bit.rshift(speedmph,8)
lowcourse = bit.band(course, 0xFF)
highcourse = bit.rshift(course,8)
lowalt = bit.band(altitude,0xff)
highalt = bit.rshift(altitude,8)
lowxg = bit.band(xg,0xFF)
highxg = bit.rshift(xg,8)
lowyg = bit.band(yg,0xFF)
highyg = bit.rshift(yg,8)
lowzg = bit.band(zg,0xFF)
highzg = bit.rshift(zg,8)
lowyaw = bit.band(yaw,0xFF)
highyaw = bit.rshift(yaw,8)
lowpitch = bit.band(pitch,0xFF)
highpitch = bit.rshift(pitch,8)
lowroll = bit.band(roll,0xFF)
highroll = bit.rshift(roll,8)
steering = 50
msg0 = {higherlat,highlat,midlat,lowlat,lon}
msg1 = {highspeed,lowspeed,highalt,lowalt,highcourse,lowcourse,sats,quality}
msg2 = {quality,year-208,month,day,0,hour,minute,second}
msg3 = {highxg,lowxg,highyg,lowyg, highzg,lowzg}
msg4 = {highyaw,lowyaw,highpitch,lowpitch,highroll,lowroll}
txCAN(0, 655360, 1, msg0)
txCAN(0, 655361, 1, msg1)
txCAN(0, 655362, 1, msg2)
txCAN(0, 655363, 1, msg3)
txCAN(0, 655364, 1, msg4)
end
latitude (unsure how to send a 32 bit message)
longitude (again unsure how to send a 32 bit message)
GPSTrueCouse (don't believe RCP has this channel to send)
With all the other data logged by the AEM Infinity I can now create Maths Channels with AEM data!!
initCAN(0, 500000)
tickRate = 100
function onTick()
lat,lon = getGpsPos()
speedmph = getGpsSpeed()/0.01
altitude = getGpsAltitude()
quality = getGpsQuality()
sats = getGpsSats()
course = 20/0.01
year,month,day,hour,minute,second = getDateTime()
xg = getImu(0)/0.000244141
yg = getImu(1)/0.000244141
zg = getImu(2)/0.000244141
yaw = getImu(3)/0.015258789 --yaw
pitch = getImu(4)/0.015258789 --pitch
roll = getImu(5)/0.015258789 --roll
lowlat = bit.band(lat,0xFFFF)
midlat = bit.rshift(lat,8)
highlat = bit.rshift(lat,16)
higherlat = bit.rshift(lat,32)
lowspeed = bit.band(speedmph, 0xFF)
highspeed = bit.rshift(speedmph,8)
lowcourse = bit.band(course, 0xFF)
highcourse = bit.rshift(course,8)
lowalt = bit.band(altitude,0xff)
highalt = bit.rshift(altitude,8)
lowxg = bit.band(xg,0xFF)
highxg = bit.rshift(xg,8)
lowyg = bit.band(yg,0xFF)
highyg = bit.rshift(yg,8)
lowzg = bit.band(zg,0xFF)
highzg = bit.rshift(zg,8)
lowyaw = bit.band(yaw,0xFF)
highyaw = bit.rshift(yaw,8)
lowpitch = bit.band(pitch,0xFF)
highpitch = bit.rshift(pitch,8)
lowroll = bit.band(roll,0xFF)
highroll = bit.rshift(roll,8)
steering = 50
msg0 = {higherlat,highlat,midlat,lowlat,lon}
msg1 = {highspeed,lowspeed,highalt,lowalt,highcourse,lowcourse,sats,quality}
msg2 = {quality,year-208,month,day,0,hour,minute,second}
msg3 = {highxg,lowxg,highyg,lowyg, highzg,lowzg}
msg4 = {highyaw,lowyaw,highpitch,lowpitch,highroll,lowroll}
txCAN(0, 655360, 1, msg0)
txCAN(0, 655361, 1, msg1)
txCAN(0, 655362, 1, msg2)
txCAN(0, 655363, 1, msg3)
txCAN(0, 655364, 1, msg4)
end
Didn't verify it but can you try the following:
lowlat = bit.band(lat,0xFF)
midlat = bit.band(bit.rshift(lat,8),0xFF)
highlat = bit.band(bit.rshift(lat,16),0xFF)
higherlat = bit.rshift(lat,24)
Please come back with the outcome of this!
www.facebook.com/RaceElectronic
lowlat = bit.band(lat,0xFF)
midlat = bit.band(bit.rshift(lat,8),0xFF)
highlat = bit.band(bit.rshift(lat,16),0xFF)
higherlat = bit.rshift(lat,24)
Please come back with the outcome of this!
www.facebook.com/RaceElectronic
Hi Des,
what do you mean when you say that you tried but no luck?
Tested what I suggested with some generic numbers and it gave me correct results...so the cascaded commands as well as the bitwise operators seem to work correctly as they should and splitted a bigger number into single bytes.and the results...
Can you post some numbers/results/screenshots of whatever you think doesn't work on your end?
what do you mean when you say that you tried but no luck?
Tested what I suggested with some generic numbers and it gave me correct results...so the cascaded commands as well as the bitwise operators seem to work correctly as they should and splitted a bigger number into single bytes.
Code: Select all
tickRate = 30
lat = 0xFDFCFBFA -- (results in 2147483647 decimal)
lowlat = 0
midlat = 0
highlat = 0
higherlat = 0
function onTick()
lowlat = bit.band(lat,0xFF)
midlat = bit.band(bit.rshift(lat,8),0xFF)
highlat = bit.band(bit.rshift(lat,16),0xFF)
higherlat = bit.rshift(lat,24)
println("lat "..lat)
println("lowlat "..lowlat)
println("midlat "..midlat)
println("highlat "..highlat)
println("higherlat "..higherlat)
end
setTickRate(tickRate)
Code: Select all
lat 2147483647.0
lowlat 250.0
midlat 251.0
highlat 252.0
higherlat 253.0
initCAN(0, 500000)
tickRate = 1000
function onTick()
function splitWord16(value)
return bit.band(value, 0xFF), bit.rshift(bit.band(value, 0xFF),8)
end
function splitWord32(value)
return bit.band(value, 0xFF), bit.rshift(bit.band(value, 0xFFFF),8), bit.rshift(bit.band(value, 0xFFFFFF),16), bit.rshift(bit.band(value, 0xFFFFFFFF),24)
end
--function onTick()
lat,lon = getGpsPos()
--lat,lon = 16777217,68500
speedmph = getGpsSpeed()/0.01
altitude = getGpsAltitude()
quality = getGpsQuality()
sats = getGpsSats()
year,month,day,hour,minute,second = getDateTime()
xg = getImu(0)/0.000244141
yg = getImu(1)/0.000244141
zg = getImu(2)/0.000244141
yaw = getImu(3)/0.015258789 --yaw
pitch = getImu(4)/0.015258789 --pitch
roll = getImu(5)/0.015258789 --roll
lowlat, midlat, highlat, higherlat = splitWord32(lat)
lowlon, midlon, highlon, higherlon = splitWord32(lon)
lowspeed, highspeed = splitWord16(speedmph)
lowalt, highalt = splitWord16(altitude)
lowxg, highxg = splitWord16(xg)
lowyg, highyg = splitWord16(yg)
lowzg, highzg = splitWord16(zg)
lowyaw, highyaw = splitWord16(yaw)
lowpitch, highpitch = splitWord16(pitch)
lowroll, highroll = splitWord16(roll)
msg1 = {higherlat,highlat,midlat,lowlat,higherlon,highlon,midlon,lowlon}
msg2 = {highspeed,lowspeed,highalt,lowalt,highcourse,lowcourse,sats,quality}
msg3 = {quality,year-208,month,day,0,hour,minute,second}
msg4 = {highxg,lowxg,highyg,lowyg, highzg,lowzg}
msg5 = {highyaw,lowyaw,highpitch,lowpitch,highroll,lowroll}
txCAN(0, 655360, 1, msg1)
txCAN(0, 655361, 1, msg2)
txCAN(0, 655362, 1, msg3)
txCAN(0, 655363, 1, msg4)
txCAN(0, 655364, 1, msg5)
println("lat "..lat)
println("lowlat "..lowlat)
println("midlat "..midlat)
println("highlat "..highlat)
println("higherlat "..higherlat)
println("latcalc "..(higherlat*16777216)+(highlat*65536)+(midlat*256)+lowlat)
println("xg "..xg*0.000244141)
println("lowxg "..lowxg)
println("highxg "..highxg)
println("xgcalc "..((highxg*256)+lowxg)*0.000244141)
end
tickRate = 1000
function onTick()
function splitWord16(value)
return bit.band(value, 0xFF), bit.rshift(bit.band(value, 0xFF),8)
end
function splitWord32(value)
return bit.band(value, 0xFF), bit.rshift(bit.band(value, 0xFFFF),8), bit.rshift(bit.band(value, 0xFFFFFF),16), bit.rshift(bit.band(value, 0xFFFFFFFF),24)
end
--function onTick()
lat,lon = getGpsPos()
--lat,lon = 16777217,68500
speedmph = getGpsSpeed()/0.01
altitude = getGpsAltitude()
quality = getGpsQuality()
sats = getGpsSats()
year,month,day,hour,minute,second = getDateTime()
xg = getImu(0)/0.000244141
yg = getImu(1)/0.000244141
zg = getImu(2)/0.000244141
yaw = getImu(3)/0.015258789 --yaw
pitch = getImu(4)/0.015258789 --pitch
roll = getImu(5)/0.015258789 --roll
lowlat, midlat, highlat, higherlat = splitWord32(lat)
lowlon, midlon, highlon, higherlon = splitWord32(lon)
lowspeed, highspeed = splitWord16(speedmph)
lowalt, highalt = splitWord16(altitude)
lowxg, highxg = splitWord16(xg)
lowyg, highyg = splitWord16(yg)
lowzg, highzg = splitWord16(zg)
lowyaw, highyaw = splitWord16(yaw)
lowpitch, highpitch = splitWord16(pitch)
lowroll, highroll = splitWord16(roll)
msg1 = {higherlat,highlat,midlat,lowlat,higherlon,highlon,midlon,lowlon}
msg2 = {highspeed,lowspeed,highalt,lowalt,highcourse,lowcourse,sats,quality}
msg3 = {quality,year-208,month,day,0,hour,minute,second}
msg4 = {highxg,lowxg,highyg,lowyg, highzg,lowzg}
msg5 = {highyaw,lowyaw,highpitch,lowpitch,highroll,lowroll}
txCAN(0, 655360, 1, msg1)
txCAN(0, 655361, 1, msg2)
txCAN(0, 655362, 1, msg3)
txCAN(0, 655363, 1, msg4)
txCAN(0, 655364, 1, msg5)
println("lat "..lat)
println("lowlat "..lowlat)
println("midlat "..midlat)
println("highlat "..highlat)
println("higherlat "..higherlat)
println("latcalc "..(higherlat*16777216)+(highlat*65536)+(midlat*256)+lowlat)
println("xg "..xg*0.000244141)
println("lowxg "..lowxg)
println("highxg "..highxg)
println("xgcalc "..((highxg*256)+lowxg)*0.000244141)
end
Made some more progress on splitting Longitude into individual bytes by using code above. This data is to be transmitted to my AEM Infinity ECU. I think my issue is I don't know how to create the conversion to 32 bit float with degree referencing. Please see extract from AEMnet pdf. Anyone got any ideas?
- Attachments
-
- Capture.JPG (42.49 KiB) Viewed 6565 times
I realize this is an ancient thread -- did you ever figure this out?fitdes wrote:Made some more progress on splitting Longitude into individual bytes by using code above. This data is to be transmitted to my AEM Infinity ECU. I think my issue is I don't know how to create the conversion to 32 bit float with degree referencing. Please see extract from AEMnet pdf. Anyone got any ideas?
I'm trying to transmit GPS data to an AEM CD7 dash, although I don't need to adhere to their (AEM) protocol.
I will need to send signed values, though.
Hi,
It should work fine. Here's a script we have used to simulate SmartyCam data from our early testing, should get you started: https://gist.github.com/brentpicasso/0c ... e80c86694c
It should work fine. Here's a script we have used to simulate SmartyCam data from our early testing, should get you started: https://gist.github.com/brentpicasso/0c ... e80c86694c