# Makefile for installation of echomav_deploy on EchoPilot AI hardware # This is installation of mavlink-router, cockpit, and network setup # Spiri modified to install additional features .DEFAULT_GOAL := default SHELL := /bin/bash SUDO := $(shell test $${EUID} -ne 0 && echo "sudo") .EXPORT_ALL_VARIABLES: CURDIR := $(shell pwd) SYSCFG = /etc/mavlink-router CONFIG ?= /var/local LIBSYSTEMD=/lib/systemd/system SERVICES=mavlink-router.service temperature.service wifibroadcast@drone fpv-camera.service DRY_RUN=false LOCAL=/usr/local LOCAL_SCRIPTS=temperature.sh cockpitScript.sh .PHONY: enable install see uninstall static default no-static verify_spir0 interactive set_network_manager_config configure_wifibroadcast default: interactive install static set_network_manager_config configure_wifibroadcast interactive: @clear @echo " " @echo " _____ _____ _____ _____ _____ " @echo " / ____|| __ \|_ _|| __ \ |_ _| " @echo " | (___ | |__) | | | | |__) | | | " @echo " \___ \ | ___/ | | | _ / | | " @echo " ____) || | _| |_ | | \ \ _| |_ " @echo " |_____/ |_| __|_____||_|__\_\|_____| " @echo " | \/ || | | ||__ \ " @echo " | \ / || | | | ) | " @echo " | |\/| || | | | / / " @echo " | | | || |__| | / /_ " @echo " |_| |_| \____/ |____| " @echo " " @echo "Installing Mu2 Default Settings/Programs " @echo "" @read -p "Do you want to set a static IP address? (Y/N): " set_ip; \ if [ "$$set_ip" = "Y" ] || [ "$$set_ip" = "y" ]; then \ echo ""; \ echo "Please enter the last segment of the IP address for this setup (between 15-250)"; \ read -p "IP Address: 192.168.10. " ip_address; \ $(MAKE) explicit-ip ip=192.168.10.$$ip_address; \ else \ echo "Proceeding without setting a static IP address."; \ fi explicit-ip: @$(MAKE) --no-print-directory install $(SUDO) chmod +x $(CURDIR)/static-network.sh @$(SUDO) ./static-network.sh -i eth0 -a $(ip) # New target to configure NetworkManager to ignore spir0 set_network_manager_config: @echo "" @echo "Configuring NetworkManager to ignore SpiriLink interface (spir0)..." @echo "" @$(SUDO) mkdir -p /etc/NetworkManager @$(SUDO) touch /etc/NetworkManager/NetworkManager.conf @if ! grep -q "\[keyfile\]" /etc/NetworkManager/NetworkManager.conf; then \ echo "[keyfile]" | $(SUDO) tee -a /etc/NetworkManager/NetworkManager.conf > /dev/null; \ fi @if ! grep -q "unmanaged-devices=interface-name:spir0" /etc/NetworkManager/NetworkManager.conf; then \ echo "unmanaged-devices=interface-name:spir0" | $(SUDO) tee -a /etc/NetworkManager/NetworkManager.conf > /dev/null; \ fi @$(SUDO) systemctl restart NetworkManager @echo "NetworkManager has been configured to ignore spir0." # New target to configure wifibroadcast settings configure_wifibroadcast: @echo "" @echo "Configuring /etc/default/wifibroadcast with interface spir0..." @echo "" @$(SUDO) bash -c "echo 'WFB_NICS=\"spir0\"' > /etc/default/wifibroadcast" @echo "Configuration updated: /etc/default/wifibroadcast has been set with WFB_NICS=\"spir0\"." @echo "Reboot Mu2 to get new wireless settings" no-static: @$(MAKE) --no-print-directory install disable: @( for c in stop disable ; do $(SUDO) systemctl $${c} $(SERVICES) ; done ; true ) enable: @( for c in stop disable ; do $(SUDO) systemctl $${c} $(SERVICES) ; done ; true ) @( for s in $(SERVICES) ; do $(SUDO) install -Dm644 $${s%.*}.service $(LIBSYSTEMD)/$${s%.*}.service ; done ; true ) @if [ ! -z "$(SERVICES)" ]; then $(SUDO) systemctl daemon-reload; fi @( for s in $(SERVICES) ; do $(SUDO) systemctl enable $${s%.*}; done; true ) @echo "" @echo "Service is installed. To run now use sudo systemctl start mavlink-router and sudo systemctl start cockpit.socket" @echo "Inspect output with sudo journalctl -fu mavlink-router" @echo "" static: # set up static ip address on eth0 $(SUDO) chmod +x $(CURDIR)/static-network.sh @$(SUDO) ./static-network.sh -i eth0 -a auto install: verify_spir0 # install helper apps $(SUDO) apt update $(SUDO) apt install -y nano nload htop picocom sshpass python3-msgpack # install mavlink-router if not already installed @if [ -d ~/tmp/mavlink-router-source ]; then \ read -p "Mavlink-router source already exists. Do you want to reinstall? (Y/N): " reinstall; \ if [ "$$reinstall" = "Y" ] || [ "$$reinstall" = "y" ]; then \ echo "Reinstalling Mavlink-router..."; \ cd ~/tmp/mavlink-router-source && git submodule update --init --recursive && \ $(SUDO) apt -y install git ninja-build pkg-config gcc g++ systemd && \ $(SUDO) apt -y install python3-pip && \ $(SUDO) pip3 install meson smbus && \ meson setup build . && $(SUDO) ninja -C build install; \ else \ echo "Skipping Mavlink-router installation."; \ fi; \ else \ rm -rf ~/tmp/mavlink-router-source && \ git clone https://github.com/EchoMAV/mavlink-router-src ~/tmp/mavlink-router-source && \ cd ~/tmp/mavlink-router-source && git submodule update --init --recursive && \ $(SUDO) apt -y install git ninja-build pkg-config gcc g++ systemd && \ $(SUDO) apt -y install python3-pip && \ $(SUDO) pip3 install meson smbus && \ meson setup build . && $(SUDO) ninja -C build install; \ fi # install the config file $(SUDO) mkdir -p $(SYSCFG) $(SUDO) cp main.conf $(SYSCFG)/. # make ensure-cockpit.sh executable and run it $(SUDO) chmod +x $(CURDIR)/ensure-cockpit.sh if [ -x "$(CURDIR)/ensure-cockpit.sh" ]; then \ $(SUDO) $(CURDIR)/ensure-cockpit.sh; \ else \ echo "Error: ensure-cockpit.sh not found or not executable"; \ exit 1; \ fi # set up cockpit files if not already done @if [ ! -d /usr/share/cockpit/general ]; then \ $(SUDO) mkdir -p /usr/share/cockpit/general/ && \ $(SUDO) cp -rf ui/general/* /usr/share/cockpit/general/; \ fi @if [ ! -d /usr/share/cockpit/branding/ubuntu ]; then \ $(SUDO) mkdir -p /usr/share/cockpit/branding/ubuntu && \ $(SUDO) cp -rf ui/branding-ubuntu/* /usr/share/cockpit/branding/ubuntu/; \ fi $(SUDO) cp -rf ui/static/* /usr/share/cockpit/static/ $(SUDO) cp -rf ui/base1/* /usr/share/cockpit/base1/ @[ -d $(LOCAL)/echopilot ] || $(SUDO) mkdir $(LOCAL)/echopilot @for s in $(LOCAL_SCRIPTS); do $(SUDO) install -Dm755 $${s} $(LOCAL)/echopilot/$${s}; done # install modified 8812EU drivers if not already installed @if [ -d ~/tmp/rtl88x2eu ]; then \ read -p "8812EU drivers source already exists. Do you want to reinstall? (Y/N): " reinstall; \ if [ "$$reinstall" = "Y" ] || [ "$$reinstall" = "y" ]; then \ echo "Reinstalling 8812EU drivers..."; \ cd ~/tmp/rtl88x2eu && git submodule update --init --recursive && \ $(SUDO) sed -i 's/CONFIG_PLATFORM_I386_PC = y/CONFIG_PLATFORM_I386_PC = n/g' Makefile && \ $(SUDO) sed -i 's/CONFIG_PLATFORM_ARM64_RPI = n/CONFIG_PLATFORM_ARM64_RPI = y/g' Makefile && \ $(SUDO) apt -y install dkms && \ $(SUDO) chmod +x ./dkms-install.sh && \ $(SUDO) ./dkms-install.sh; \ else \ echo "Skipping 8812EU drivers installation."; \ fi; \ else \ git clone https://github.com/libc0607/rtl88x2eu-20230815 ~/tmp/rtl88x2eu && \ cd ~/tmp/rtl88x2eu && git submodule update --init --recursive && \ $(SUDO) sed -i 's/CONFIG_PLATFORM_I386_PC = y/CONFIG_PLATFORM_I386_PC = n/g' Makefile && \ $(SUDO) sed -i 's/CONFIG_PLATFORM_ARM64_RPI = n/CONFIG_PLATFORM_ARM64_RPI = y/g' Makefile && \ $(SUDO) apt -y install dkms && \ $(SUDO) chmod +x ./dkms-install.sh && \ $(SUDO) ./dkms-install.sh; \ fi # Install WFB-NG dependencies and compile deb if not already installed @if [ -d ~/tmp/wfb-ng ]; then \ read -p "WFB-NG source already exists. Do you want to reinstall? (Y/N): " reinstall; \ if [ "$$reinstall" = "Y" ] || [ "$$reinstall" = "y" ]; then \ echo "Reinstalling WFB-NG..."; \ cd ~/tmp/wfb-ng && \ $(SUDO) apt -y install python3-all libpcap-dev libsodium-dev python3-pip python3-pyroute2 python3-future python3-twisted python3-serial python3-all-dev iw virtualenv debhelper dh-python build-essential && \ $(SUDO) make deb && \ $(SUDO) dpkg -i ~/tmp/wfb-ng/deb_dist/wfb*.deb; \ else \ echo "Skipping WFB-NG installation."; \ fi; \ else \ git clone -b stable https://github.com/svpcom/wfb-ng.git ~/tmp/wfb-ng && \ cd ~/tmp/wfb-ng && \ $(SUDO) apt -y install python3-all libpcap-dev libsodium-dev python3-pip python3-pyroute2 python3-future python3-twisted python3-serial python3-all-dev iw virtualenv debhelper dh-python build-essential && \ $(SUDO) make deb && \ $(SUDO) dpkg -i ~/tmp/wfb-ng/deb_dist/wfb*.deb; \ fi # create initial WFB-NG config file if not already exists @if [ ! -f /etc/wifibroadcast.cfg ]; then \ $(SUDO) cp wifibroadcast.cfg /etc/; \ else \ echo "WFB-NG configuration already exists, skipping creation."; \ fi # move drone encryption key to /etc/ @$(SUDO) cp drone.key /etc/ # stop any running services we care about @for c in stop disable; do $(SUDO) systemctl $${c} $(SERVICES); done; true # install and enable services @for s in $(SERVICES); do $(SUDO) install -Dm644 $${s%.*}.service $(LIBSYSTEMD)/$${s%.*}.service; done @if [ ! -z "$(SERVICES)" ]; then $(SUDO) systemctl daemon-reload; fi @for s in $(SERVICES); do $(SUDO) systemctl enable $${s%.*}; done # set up the system permissions, stop/disable nvgetty etc @$(SUDO) systemctl stop nvgetty @$(SUDO) systemctl disable nvgetty @$(SUDO) usermod -aG dialout $${USER} @$(SUDO) usermod -aG tty $${USER} @echo "" see: $(SUDO) cat $(SYSCFG)/main.conf serial: -@$(SUDO) python3 serial_number.py 0 || true -@$(SUDO) python3 serial_number.py 1 || true uninstall: @$(MAKE) --no-print-directory disable @for s in $(SERVICES); do $(SUDO) rm $(LIBSYSTEMD)/$${s%.*}.service; done; true @if [ ! -z "$(SERVICES)" ]; then $(SUDO) systemctl daemon-reload; fi