mavkit 0.1.0

Async MAVLink SDK for vehicle control, missions, and parameters
Documentation
.PHONY: bridge-up bridge-down test-sitl test-sitl-strict

SITL_NAME := ardupilot-sitl
SITL_IMAGE := radarku/ardupilot-sitl:eff32c1f98152ac3d1dc09a1e475733b73ce569f
MAVPROXY_LOG := /tmp/mavkit-mavproxy.log
MAVPROXY_PID := /tmp/mavkit-mavproxy.pid
MAVKIT_SITL_UDP_BIND ?= 0.0.0.0:14550

bridge-up:
	docker rm -f $(SITL_NAME) >/dev/null 2>&1 || true
	docker pull $(SITL_IMAGE)
	docker run -d --rm --name $(SITL_NAME) -p 5760:5760 \
		--entrypoint /ardupilot/build/sitl/bin/arducopter \
		$(SITL_IMAGE) \
		--model + --speedup 1 --defaults /ardupilot/Tools/autotest/default_params/copter.parm \
		--home 42.3898,-71.1476,14.0,270.0 -w
	python -c 'import socket,time,sys; deadline=time.time()+120; ok=False;\
while time.time()<deadline:\
 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.settimeout(1);\
 ok2=False;\
 try:\
  s.connect(("127.0.0.1",5760)); ok2=True\
 except OSError:\
  time.sleep(1)\
 finally:\
  s.close();\
 if ok2:\
  ok=True; break\
print("SITL TCP ready" if ok else "Timed out waiting for SITL TCP"); sys.exit(0 if ok else 1)'
	nohup uvx --from mavproxy --with future --python 3.11 mavproxy.py \
		--master=tcp:127.0.0.1:5760 \
		--out=udp:127.0.0.1:14550 \
		--daemon --non-interactive \
		--default-modules=link,signing,log,wp,rally,fence,param,relay,tuneopt,arm,mode,calibration,rc,auxopt,misc,cmdlong,battery,terrain,output,layout \
		>$(MAVPROXY_LOG) 2>&1 < /dev/null &
	printf "%s" $$! > $(MAVPROXY_PID)
	python -c 'import socket,time,sys; sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM); sock.bind(("0.0.0.0",14550)); sock.settimeout(1); deadline=time.time()+180; ok=False;\
while time.time()<deadline:\
 try:\
  data,_=sock.recvfrom(4096);\
  if data:\
   ok=True; break\
 except TimeoutError:\
  pass\
sock.close(); print("UDP telemetry ready" if ok else "Timed out waiting for UDP telemetry"); sys.exit(0 if ok else 1)'

test-sitl:
	MAVKIT_SITL_UDP_BIND=$(MAVKIT_SITL_UDP_BIND) cargo test --test sitl_roundtrip -- --ignored --nocapture --test-threads=1

test-sitl-strict:
	MAVKIT_SITL_UDP_BIND=$(MAVKIT_SITL_UDP_BIND) MAVKIT_SITL_STRICT=1 cargo test --test sitl_roundtrip -- --ignored --nocapture --test-threads=1

bridge-down:
	if [ -f $(MAVPROXY_PID) ]; then kill "$$(cat $(MAVPROXY_PID))" >/dev/null 2>&1 || true; fi
	pkill -f "[m]avproxy.py --master=tcp:127.0.0.1:5760" >/dev/null 2>&1 || true
	docker rm -f $(SITL_NAME) >/dev/null 2>&1 || true
	rm -f $(MAVPROXY_PID)