146 lines
3.6 KiB
Lua

package.loaded["draw"] = nil
require("draw")
CamShader = nil
UIState = {
showUI = true,
}
BotState = {
lastMessage = 0,
cpuBattery = nil,
cpuBatteryCorrected = nil,
servoBattery = nil,
servoBatteryCorrected = nil,
camfeed = nil,
viewX = 0,
viewY = 0,
viewXSent = 0,
viewYSent = 0,
viewLastUpdate = 0,
}
Ping = {
timeSent = 0,
latency = "unknown",
payload = nil,
}
ControllerState = {
rightX = 0,
rightY = 0
}
function love.update2()
local now = love.timer.getTime()
if now - Ping.timeSent > 5 then
Ping.payload = ""
for i = 0, 10 do
Ping.payload = Ping.payload .. string.char(love.math.random(65, 91))
end
Ping.timeSent = now
love.mqtt.send("command/ping", Ping.payload)
print("Sending ping")
end
BotState.viewX = BotState.viewX + ControllerState.rightX * 0.02
BotState.viewY = BotState.viewY + ControllerState.rightY * 0.02
local viewDX, viewDY = math.abs(BotState.viewX - BotState.viewXSent), math.abs(BotState.viewY - BotState.viewYSent)
if viewDX > 0.01 or viewDY > 0.01 and (now - BotState.viewLastUpdated) >= 0.05 then
love.mqtt.send("command/set_camera_xy", toJSON({
x = -BotState.viewX * 0.3 + 0.5,
y = -BotState.viewY * 0.3 + 0.5
}))
BotState.viewXSent = BotState.viewX
BotState.viewYSent = BotState.viewY
BotState.viewLastUpdated = now
end
end
function love.joystickaxis2(joystick, axis, value)
if axis == 3 then
ControllerState.rightX = value
elseif axis == 4 then
ControllerState.rightY = value
end
end
-- function love.joystickaxis2(joystick, axis, value)
-- if axis == 3 and value ~= ControllerState.viewX then
-- ControllerState.viewX = value
-- ControllerState.viewChanged = true
-- elseif axis == 4 and value ~= ControllerState.viewY then
-- ControllerState.viewY = value
-- ControllerState.viewChanged = true
-- end
-- end
function formatSafe(format, value, ...)
if value == nil then
return "unknown"
end
return string.format(format, value, ...)
end
function love.load()
CamShader = love.graphics.newShader("client/camshader.glsl")
love.graphics.setFont(love.graphics.newFont(20))
love.window.setFullscreen(true)
love.mqtt.subscribe("telemetry/#")
end
function love.mqtt.message(topic, payload)
local oldTime = BotState.lastMessage
BotState.lastMessage = love.timer.getTime()
if topic == "telemetry/cpu_battery" then
BotState.cpuBattery = tonumber(payload)
BotState.cpuBatteryCorrected = BotState.cpuBattery / 2
elseif topic == "telemetry/servo_battery" then
BotState.servoBattery = tonumber(payload)
BotState.servoBatteryCorrected = BotState.servoBattery / 2
elseif topic == "telemetry/camfeed" then
fileData = love.filesystem.newFileData(payload, "camfeed")
BotState.camfeed = love.graphics.newImage(fileData)
elseif topic == "telemetry/pong" then
if payload == Ping.payload then
local timeReceived = love.timer.getTime()
Ping.latency = math.floor((timeReceived - Ping.timeSent) * 1000) .. "ms"
end
else
print("Got unknown telemetry at " .. topic)
BotState.lastMessage = oldTime
end
end
function love.gamepadpressed2(joystick, button)
print("Pressed gamepad button " .. button .. " on joystick " .. joystick:getName())
if button == "back" then
UIState.showUI = not UIState.showUI
end
end
function toJSON(arg)
local t = type(arg)
if t == "number" then
return tostring(arg)
elseif t == "nil" then
return "null"
elseif t == "string" then
return '"' .. arg .. '"'
elseif t == "boolean" then
return tostring(arg)
elseif t == "table" then
local fields = {}
for key, value in pairs(arg) do
fields[#fields+1] = string.format('"%s":%s', key, toJSON(value))
end
return '{' .. table.concat(fields, ',') .. '}'
end
end