Compare commits
2 Commits
264df430ad
...
7811684bad
Author | SHA1 | Date | |
---|---|---|---|
7811684bad | |||
a6a2d19ff8 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
|||||||
*.zip
|
*.zip
|
||||||
.vscode
|
.vscode
|
||||||
.idea
|
.idea
|
||||||
|
*.bin
|
||||||
|
@ -4,12 +4,29 @@ local function getTextY(line)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function love.draw2()
|
function love.draw2()
|
||||||
|
local width, height = love.graphics.getDimensions()
|
||||||
|
|
||||||
-- Set background
|
-- Set background
|
||||||
love.graphics.setBackgroundColor(0, 0, 0)
|
love.graphics.setBackgroundColor(0, 0, 0)
|
||||||
love.graphics.setColor(1, 1, 1)
|
love.graphics.setColor(1, 1, 1)
|
||||||
|
|
||||||
|
-- Draw camera feed
|
||||||
if BotState.camfeed then
|
if BotState.camfeed then
|
||||||
love.graphics.draw(BotState.camfeed)
|
local imageWidth = BotState.camfeed:getWidth()
|
||||||
|
local imageHeight = BotState.camfeed:getHeight()
|
||||||
|
|
||||||
|
local scaleWidth = width / imageWidth
|
||||||
|
local scaleHeight = height / imageHeight
|
||||||
|
local scale = math.min(scaleWidth, scaleHeight)
|
||||||
|
|
||||||
|
local scaledWidth = imageWidth * scale
|
||||||
|
local scaledHeight = imageHeight * scale
|
||||||
|
|
||||||
|
love.graphics.draw(BotState.camfeed,
|
||||||
|
(width - scaledWidth) / 2, (height - scaledHeight) / 2,
|
||||||
|
0,
|
||||||
|
scale, scale
|
||||||
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Draw time
|
-- Draw time
|
||||||
|
@ -1074,7 +1074,6 @@ function client_mt:_apply_network_timeout()
|
|||||||
-- replace connection recv_func with coroutine-based version
|
-- replace connection recv_func with coroutine-based version
|
||||||
local sync_recv_func = conn.recv_func
|
local sync_recv_func = conn.recv_func
|
||||||
conn.recv_func = function(totalSize, ...)
|
conn.recv_func = function(totalSize, ...)
|
||||||
print("Args: ("..(1+#{...})..")", totalSize, ...)
|
|
||||||
while true do
|
while true do
|
||||||
local allData = ""
|
local allData = ""
|
||||||
while true do
|
while true do
|
||||||
@ -1178,7 +1177,6 @@ function client_mt:_receive_packet()
|
|||||||
return false, "network connection is not opened"
|
return false, "network connection is not opened"
|
||||||
end
|
end
|
||||||
-- parse packet
|
-- parse packet
|
||||||
print("Calling ", conn.recv_func)
|
|
||||||
local packet, err = self._parse_packet(conn.recv_func)
|
local packet, err = self._parse_packet(conn.recv_func)
|
||||||
if not packet then
|
if not packet then
|
||||||
return false, err
|
return false, err
|
||||||
|
@ -25,12 +25,7 @@ end
|
|||||||
-- Send data to network connection
|
-- Send data to network connection
|
||||||
function luasocket.send(conn, data, i, j)
|
function luasocket.send(conn, data, i, j)
|
||||||
conn.sock:settimeout(nil, "t")
|
conn.sock:settimeout(nil, "t")
|
||||||
print("Sending bytes ", #data, i, j)
|
|
||||||
local ok, err = conn.sock:send(data, i, j)
|
local ok, err = conn.sock:send(data, i, j)
|
||||||
if err == "timeout" then
|
|
||||||
print("Oops, got timeout")
|
|
||||||
print(debug.traceback())
|
|
||||||
end
|
|
||||||
conn.sock:settimeout(conn.timeout, "t")
|
conn.sock:settimeout(conn.timeout, "t")
|
||||||
-- print(" luasocket.send:", ok, err, require("mqtt.tools").hex(data))
|
-- print(" luasocket.send:", ok, err, require("mqtt.tools").hex(data))
|
||||||
return ok, err
|
return ok, err
|
||||||
@ -39,25 +34,16 @@ end
|
|||||||
-- Receive given amount of data from network connection
|
-- Receive given amount of data from network connection
|
||||||
function luasocket.receive(conn, size)
|
function luasocket.receive(conn, size)
|
||||||
local ok, err = conn.sock:receive(size)
|
local ok, err = conn.sock:receive(size)
|
||||||
if ok then
|
--if ok then
|
||||||
if #ok ~= size then
|
-- print(" luasocket.receive good:", size, #ok, require("mqtt.tools").hex(ok))
|
||||||
assert(false, "bad size")
|
--elseif err ~= "timeout" then
|
||||||
end
|
-- print(" luasocket.receive fail:", ok, err)
|
||||||
if #ok > 100 then
|
--end
|
||||||
print(" luasocket.receive good:", size, #ok, "(long)")
|
|
||||||
else
|
|
||||||
--print(debug.traceback())
|
|
||||||
print(" luasocket.receive good:", size, #ok, require("mqtt.tools").hex(ok))
|
|
||||||
end
|
|
||||||
elseif err ~= "timeout" then
|
|
||||||
print(" luasocket.receive fail:", ok, err)
|
|
||||||
end
|
|
||||||
return ok, err
|
return ok, err
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Set connection's socket to non-blocking mode and set a timeout for it
|
-- Set connection's socket to non-blocking mode and set a timeout for it
|
||||||
function luasocket.settimeout(conn, timeout)
|
function luasocket.settimeout(conn, timeout)
|
||||||
print("Setting timeout to " .. timeout)
|
|
||||||
conn.timeout = timeout
|
conn.timeout = timeout
|
||||||
conn.sock:settimeout(timeout, "t")
|
conn.sock:settimeout(timeout, "t")
|
||||||
end
|
end
|
||||||
|
@ -490,16 +490,12 @@ function protocol.start_parse_packet(read_func)
|
|||||||
len, err = parse_var_length(read_func)
|
len, err = parse_var_length(read_func)
|
||||||
if not len then
|
if not len then
|
||||||
return false, "failed to parse remaining length: "..err
|
return false, "failed to parse remaining length: "..err
|
||||||
else
|
|
||||||
print("Variable length is: " .. len)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- create packet parser instance (aka input)
|
-- create packet parser instance (aka input)
|
||||||
local input = {1, available = 0} -- input data offset and available size
|
local input = {1, available = 0} -- input data offset and available size
|
||||||
if len > 0 then
|
if len > 0 then
|
||||||
print("Reading payload body")
|
|
||||||
data, err = read_func(len)
|
data, err = read_func(len)
|
||||||
print("Reading payload body done")
|
|
||||||
else
|
else
|
||||||
data = ""
|
data = ""
|
||||||
end
|
end
|
||||||
@ -520,7 +516,6 @@ function protocol.start_parse_packet(read_func)
|
|||||||
return res
|
return res
|
||||||
end
|
end
|
||||||
|
|
||||||
print("Available data is: " .. input.available)
|
|
||||||
return ptype, flags, input
|
return ptype, flags, input
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -2,13 +2,13 @@ FROM alpine:3.20.1
|
|||||||
|
|
||||||
RUN apk add --no-cache git meson alpine-sdk cmake linux-headers python3 python3-dev \
|
RUN apk add --no-cache git meson alpine-sdk cmake linux-headers python3 python3-dev \
|
||||||
py3-yaml py3-jinja2 py3-ply py3-pybind11 py3-pybind11-dev py3-paho-mqtt
|
py3-yaml py3-jinja2 py3-ply py3-pybind11 py3-pybind11-dev py3-paho-mqtt
|
||||||
#RUN apk add --no-cache libcamera libcamera-tools libcamera-v4l2 python3 python3-dev \
|
|
||||||
# cython py3-setuptools alpine-sdk ffmpeg ffmpeg-dev
|
|
||||||
|
|
||||||
WORKDIR /libcamera
|
WORKDIR /libcamera
|
||||||
ADD libcamera /libcamera
|
ADD libcamera /libcamera
|
||||||
RUN meson setup --prefix /usr build && ninja -C build install
|
RUN meson setup --prefix /usr build && ninja -C build install
|
||||||
|
|
||||||
|
RUN apk add --no-cache py3-pillow
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY mfb.py /app
|
COPY mfb.py /app
|
||||||
COPY spider-cam.py /app
|
COPY spider-cam.py /app
|
||||||
|
@ -3,10 +3,12 @@ import paho.mqtt.client as mqtt
|
|||||||
import selectors
|
import selectors
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
|
import io
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
import mfb
|
import mfb
|
||||||
|
|
||||||
image_count = 0
|
image_count = 9999
|
||||||
|
|
||||||
def camera_name(camera):
|
def camera_name(camera):
|
||||||
return camera.id
|
return camera.id
|
||||||
@ -16,12 +18,18 @@ def handle_camera_event(cm):
|
|||||||
for req in reqs:
|
for req in reqs:
|
||||||
process_request(req)
|
process_request(req)
|
||||||
|
|
||||||
|
def sendImage(plane):
|
||||||
|
image = Image.frombytes("RGBA", (800, 600), plane.tobytes())
|
||||||
|
pngBytes = io.BytesIO()
|
||||||
|
image.save(pngBytes, "png")
|
||||||
|
mqttc.publish("spider/telemetry/camfeed", pngBytes.getvalue())
|
||||||
|
|
||||||
def process_request(request):
|
def process_request(request):
|
||||||
global camera, image_count
|
global camera, image_count
|
||||||
global mqttc
|
global mqttc
|
||||||
|
|
||||||
image_count += 1
|
image_count += 1
|
||||||
if image_count > 50:
|
if image_count > 30:
|
||||||
image_count = 0
|
image_count = 0
|
||||||
print(f'Request completed: {request}')
|
print(f'Request completed: {request}')
|
||||||
|
|
||||||
@ -37,7 +45,7 @@ def process_request(request):
|
|||||||
'/'.join([str(p.bytes_used) for p in metadata.planes]))
|
'/'.join([str(p.bytes_used) for p in metadata.planes]))
|
||||||
with mfb.MappedFrameBuffer(buffer) as mappedBuffer:
|
with mfb.MappedFrameBuffer(buffer) as mappedBuffer:
|
||||||
for plane in mappedBuffer.planes:
|
for plane in mappedBuffer.planes:
|
||||||
mqttc.publish("spider/telemetry/camfeed", plane[0:256000].tobytes())
|
sendImage(plane)
|
||||||
|
|
||||||
request.reuse()
|
request.reuse()
|
||||||
camera.queue_request(request)
|
camera.queue_request(request)
|
||||||
|
File diff suppressed because one or more lines are too long
Loading…
x
Reference in New Issue
Block a user