mirror of https://github.com/ArduPilot/ardupilot
76 lines
1.9 KiB
Lua
76 lines
1.9 KiB
Lua
-- This script is an example of writing to CAN bus
|
|
---@diagnostic disable: need-check-nil
|
|
|
|
-- Load CAN driver, using the scripting protocol and with a buffer size of 5
|
|
local driver = CAN:get_device(5)
|
|
|
|
-- transfer ID of the message were sending
|
|
local Transfer_ID = 0
|
|
|
|
-- RGB colours in 0 - 255 range, and RGB fade speed
|
|
local red = 255
|
|
local green = 0
|
|
local blue = 0
|
|
local fade_speed = 5
|
|
|
|
|
|
function update()
|
|
|
|
-- send UAVCAN Light command
|
|
-- uavcan.equipment.indication.LightsCommand
|
|
-- note that as we don't do dynamic node allocation, the target light device must have a static node ID
|
|
|
|
msg = CANFrame()
|
|
|
|
-- extended frame, priority 30, message ID 1081 and node ID 11
|
|
-- lua cannot handle numbers so large, so we have to use uint32_t userdata
|
|
msg:id( (uint32_t(1) << 31) | (uint32_t(30) << 24) | (uint32_t(1081) << 8) | uint32_t(11) )
|
|
|
|
msg:data(0,0) -- set light_id = 0
|
|
|
|
-- convert colors to 565 rgb
|
|
local red_5bit = red >> 3
|
|
local green_6bit = green >> 2
|
|
local blue_5bit = blue >> 3
|
|
|
|
-- first is made up of 5 bits red and 3 bits of green
|
|
msg:data(1, (red_5bit << 3) | (green_6bit >> 3))
|
|
|
|
-- remaining 3 bits of green and 5 of blue
|
|
msg:data(2, ((green_6bit << 5) | blue_5bit) & 0xFF)
|
|
|
|
-- Tail includes, start of transfer, end of transfer, toggle and transfer ID bits.
|
|
msg:data(3, (1 << 7) | (1 << 6) | Transfer_ID)
|
|
|
|
Transfer_ID = Transfer_ID + 1
|
|
-- transfer ID is 5 bits
|
|
if Transfer_ID > 31 then
|
|
Transfer_ID = 0
|
|
end
|
|
|
|
-- sending 4 bytes of data
|
|
msg:dlc(4)
|
|
|
|
-- write the frame with a 10000us timeout
|
|
driver:write_frame(msg, 10000)
|
|
|
|
-- basic RGB fade
|
|
if red > 0 and blue == 0 then
|
|
red = red - fade_speed
|
|
green = green + fade_speed
|
|
end
|
|
if green > 0 and red == 0 then
|
|
green = green - fade_speed
|
|
blue = blue + fade_speed
|
|
end
|
|
if blue > 0 and green == 0 then
|
|
red = red + fade_speed
|
|
blue = blue - fade_speed
|
|
end
|
|
|
|
return update, 100
|
|
|
|
end
|
|
|
|
return update()
|