diff --git a/general/package/Config.in b/general/package/Config.in index 1703eaeb90..13e8ebbd88 100644 --- a/general/package/Config.in +++ b/general/package/Config.in @@ -62,6 +62,12 @@ source "$BR2_EXTERNAL_GENERAL_PATH/package/mavfwd/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/mbedtls-openipc/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/mini/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/motors/Config.in" +source "$BR2_EXTERNAL_GENERAL_PATH/package/aalink/Config.in" +source "$BR2_EXTERNAL_GENERAL_PATH/package/aalink-idr5/Config.in" +source "$BR2_EXTERNAL_GENERAL_PATH/package/air-man-ap/Config.in" +source "$BR2_EXTERNAL_GENERAL_PATH/package/apfpv-greg-msposd/Config.in" +source "$BR2_EXTERNAL_GENERAL_PATH/package/apfpv-greg-payload/Config.in" +source "$BR2_EXTERNAL_GENERAL_PATH/package/apfpv-greg/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/msposd/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/mt7601u-openipc/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/nabto/Config.in" diff --git a/general/package/aalink-idr5/Config.in b/general/package/aalink-idr5/Config.in new file mode 100644 index 0000000000..0d76670bd8 --- /dev/null +++ b/general/package/aalink-idr5/Config.in @@ -0,0 +1,6 @@ +config BR2_PACKAGE_AALINK_IDR5 + bool "aalink-idr5" + default n + help + Builds the aalink IDR helper from the public sickgreg/aalink_idr5 + repo and installs the helper binary and service script. diff --git a/general/package/aalink-idr5/aalink-idr5.mk b/general/package/aalink-idr5/aalink-idr5.mk new file mode 100644 index 0000000000..93c96c5aca --- /dev/null +++ b/general/package/aalink-idr5/aalink-idr5.mk @@ -0,0 +1,39 @@ +################################################################################ +# +# aalink-idr5 +# +################################################################################ + +AALINK_IDR5_SITE = $(patsubst %/,%,$(AALINK_IDR5_PKGDIR)) +AALINK_IDR5_SITE_METHOD = local +AALINK_IDR5_LICENSE = Mixed +AALINK_IDR5_GIT = $(shell command -v git 2>/dev/null) +AALINK_IDR5_REPO_BRANCH = main +AALINK_IDR5_REPO = https://github.com/sickgreg/aalink_idr5.git + +define AALINK_IDR5_FETCH_REPO + test -n "$(AALINK_IDR5_GIT)" || { \ + echo "git is required to build aalink-idr5"; \ + exit 1; \ + } + rm -rf $(@D)/src + $(AALINK_IDR5_GIT) clone --depth 1 --branch $(AALINK_IDR5_REPO_BRANCH) $(AALINK_IDR5_REPO) $(@D)/src +endef + +AALINK_IDR5_PRE_CONFIGURE_HOOKS += AALINK_IDR5_FETCH_REPO + +define AALINK_IDR5_BUILD_CMDS + $(TARGET_CC) $(TARGET_CFLAGS) -O2 -Wall -Wextra \ + -o $(@D)/aalink_idr5 \ + $(@D)/src/aalink_idr5.c \ + $(TARGET_LDFLAGS) +endef + +define AALINK_IDR5_INSTALL_TARGET_CMDS + $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d + $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(AALINK_IDR5_PKGDIR)/files/S94idr + $(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin + $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/aalink_idr5 +endef + +$(eval $(generic-package)) diff --git a/general/package/aalink-idr5/files/S94idr b/general/package/aalink-idr5/files/S94idr new file mode 100644 index 0000000000..1047bb0580 --- /dev/null +++ b/general/package/aalink-idr5/files/S94idr @@ -0,0 +1,18 @@ +#!/bin/sh + +case "$1" in + start) + echo "Starting idr requester..." + aalink_idr5 & + ;; + + stop) + echo "Stopping aalink..." + killall -q aalink_idr5 + ;; + + *) + echo "Usage: $0 {start|stop}" + exit 1 + ;; +esac diff --git a/general/package/aalink/Config.in b/general/package/aalink/Config.in new file mode 100644 index 0000000000..46225c460f --- /dev/null +++ b/general/package/aalink/Config.in @@ -0,0 +1,6 @@ +config BR2_PACKAGE_AALINK + bool "aalink" + default n + help + Builds the aalink daemon from the public sickgreg/aalink repo and + installs the aalink binary, config, and service script. diff --git a/general/package/aalink/aalink.mk b/general/package/aalink/aalink.mk new file mode 100644 index 0000000000..e9cec4ec7f --- /dev/null +++ b/general/package/aalink/aalink.mk @@ -0,0 +1,41 @@ +################################################################################ +# +# aalink +# +################################################################################ + +AALINK_SITE = $(patsubst %/,%,$(AALINK_PKGDIR)) +AALINK_SITE_METHOD = local +AALINK_LICENSE = Mixed +AALINK_GIT = $(shell command -v git 2>/dev/null) +AALINK_REPO_BRANCH = main +AALINK_REPO = https://github.com/sickgreg/aalink.git + +define AALINK_FETCH_REPO + test -n "$(AALINK_GIT)" || { \ + echo "git is required to build aalink"; \ + exit 1; \ + } + rm -rf $(@D)/src + $(AALINK_GIT) clone --depth 1 --branch $(AALINK_REPO_BRANCH) $(AALINK_REPO) $(@D)/src +endef + +AALINK_PRE_CONFIGURE_HOOKS += AALINK_FETCH_REPO + +define AALINK_BUILD_CMDS + $(TARGET_CC) $(TARGET_CFLAGS) -O2 -Wall -Wextra \ + -o $(@D)/aalink \ + $(@D)/src/aalink.c \ + $(TARGET_LDFLAGS) -lpthread -lm +endef + +define AALINK_INSTALL_TARGET_CMDS + $(INSTALL) -m 755 -d $(TARGET_DIR)/etc + $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(@D)/src/aalink.conf + $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d + $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(AALINK_PKGDIR)/files/S991aalink + $(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin + $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/aalink +endef + +$(eval $(generic-package)) diff --git a/general/package/aalink/files/S991aalink b/general/package/aalink/files/S991aalink new file mode 100644 index 0000000000..9480392155 --- /dev/null +++ b/general/package/aalink/files/S991aalink @@ -0,0 +1,52 @@ +#!/bin/sh + +. /etc/init.d/libmedia.sh + +DAEMON="aalink" +PIDFILE="/var/run/$DAEMON.pid" + +start() { + echo "Starting $DAEMON..." + start_service "$DAEMON" "$PIDFILE" || return 1 + echo "$DAEMON started" +} + +stop() { + echo "Stopping $DAEMON..." + stop_service "$DAEMON" "$PIDFILE" 12 || return 1 + echo "$DAEMON stopped" +} + +status() { + if ensure_pidfile "$DAEMON" "$PIDFILE"; then + echo "$DAEMON running pid=$(cat "$PIDFILE")" + return 0 + fi + echo "$DAEMON stopped" + return 1 +} + +reload() { + pids="$(pidof "$DAEMON" 2>/dev/null || true)" + [ -n "$pids" ] || { + echo "$DAEMON not running" + return 1 + } + echo "Sending SIGHUP to $DAEMON: $pids" + kill -HUP $pids +} + +restart() { + stop + start +} + +case "$1" in + start|stop|restart|reload|status) + "$1" + ;; + *) + echo "Usage: $0 {start|stop|restart|reload|status}" + exit 1 + ;; +esac diff --git a/general/package/air-man-ap/Config.in b/general/package/air-man-ap/Config.in new file mode 100644 index 0000000000..06052968f0 --- /dev/null +++ b/general/package/air-man-ap/Config.in @@ -0,0 +1,6 @@ +config BR2_PACKAGE_AIR_MAN_AP + bool "air-man-ap" + default n + help + Builds the air_man_ap daemon from the public sickgreg/air_man_ap + repo and installs its binary, sensor mode files, and service script. diff --git a/general/package/air-man-ap/air-man-ap.mk b/general/package/air-man-ap/air-man-ap.mk new file mode 100644 index 0000000000..ee73c77d0f --- /dev/null +++ b/general/package/air-man-ap/air-man-ap.mk @@ -0,0 +1,42 @@ +################################################################################ +# +# air-man-ap +# +################################################################################ + +AIR_MAN_AP_SITE = $(patsubst %/,%,$(AIR_MAN_AP_PKGDIR)) +AIR_MAN_AP_SITE_METHOD = local +AIR_MAN_AP_LICENSE = Mixed +AIR_MAN_AP_GIT = $(shell command -v git 2>/dev/null) +AIR_MAN_AP_REPO_BRANCH = main +AIR_MAN_AP_REPO = https://github.com/sickgreg/air_man_ap.git + +define AIR_MAN_AP_FETCH_REPO + test -n "$(AIR_MAN_AP_GIT)" || { \ + echo "git is required to build air-man-ap"; \ + exit 1; \ + } + rm -rf $(@D)/src + $(AIR_MAN_AP_GIT) clone --depth 1 --branch $(AIR_MAN_AP_REPO_BRANCH) $(AIR_MAN_AP_REPO) $(@D)/src +endef + +AIR_MAN_AP_PRE_CONFIGURE_HOOKS += AIR_MAN_AP_FETCH_REPO + +define AIR_MAN_AP_BUILD_CMDS + $(TARGET_CC) $(TARGET_CFLAGS) -O2 -Wall -Wextra -pthread \ + -o $(@D)/air_man_ap \ + $(@D)/src/air_man_ap.c \ + $(TARGET_LDFLAGS) +endef + +define AIR_MAN_AP_INSTALL_TARGET_CMDS + $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d + $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(AIR_MAN_AP_PKGDIR)/files/S992air_man + $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/sensors + $(INSTALL) -m 644 -t $(TARGET_DIR)/etc/sensors $(@D)/src/modes_imx335.ini + $(INSTALL) -m 644 -t $(TARGET_DIR)/etc/sensors $(@D)/src/modes_imx415.ini + $(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin + $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/air_man_ap +endef + +$(eval $(generic-package)) diff --git a/general/package/air-man-ap/files/S992air_man b/general/package/air-man-ap/files/S992air_man new file mode 100644 index 0000000000..e0fa8086f3 --- /dev/null +++ b/general/package/air-man-ap/files/S992air_man @@ -0,0 +1,19 @@ +#!/bin/sh + +case "$1" in + start) + echo "Starting air_man..." + sleep 2 + air_man_ap > /dev/null & + ;; + + stop) + echo "Stopping air_man..." + killall -q air_man_ap + ;; + + *) + echo "Usage: $0 {start|stop}" + exit 1 + ;; +esac diff --git a/general/package/apfpv-greg-msposd/Config.in b/general/package/apfpv-greg-msposd/Config.in new file mode 100644 index 0000000000..1a675311e0 --- /dev/null +++ b/general/package/apfpv-greg-msposd/Config.in @@ -0,0 +1,8 @@ +config BR2_PACKAGE_APFPV_GREG_MSPOSD + bool "apfpv-greg-msposd" + default n + select BR2_PACKAGE_LIBEVENT_OPENIPC + help + Builds the custom APFPV Greg msposd binary from the public + sickgreg/msposd repo and installs it as /usr/bin/msposd together + with its fonts, config, runtime libraries, and service script. diff --git a/general/package/apfpv-greg-msposd/apfpv-greg-msposd.mk b/general/package/apfpv-greg-msposd/apfpv-greg-msposd.mk new file mode 100644 index 0000000000..baff31f303 --- /dev/null +++ b/general/package/apfpv-greg-msposd/apfpv-greg-msposd.mk @@ -0,0 +1,78 @@ +################################################################################ +# +# apfpv-greg-msposd +# +################################################################################ + +APFPV_GREG_MSPOSD_SITE = $(patsubst %/,%,$(APFPV_GREG_MSPOSD_PKGDIR)) +APFPV_GREG_MSPOSD_SITE_METHOD = local +APFPV_GREG_MSPOSD_LICENSE = Mixed +APFPV_GREG_MSPOSD_GIT = $(shell command -v git 2>/dev/null) +APFPV_GREG_MSPOSD_REPO_BRANCH = main +APFPV_GREG_MSPOSD_REPO = https://github.com/sickgreg/msposd.git + +ifeq ($(OPENIPC_SOC_FAMILY),infinity6b0) + APFPV_GREG_MSPOSD_FAMILY = star6b0 + APFPV_GREG_MSPOSD_OSDRV = $(SIGMASTAR_OSDRV_INFINITY6B0_PKGDIR) + APFPV_GREG_MSPOSD_OSDRV_PKG = sigmastar-osdrv-infinity6b0 +else ifeq ($(OPENIPC_SOC_FAMILY),infinity6c) + APFPV_GREG_MSPOSD_FAMILY = star6c + APFPV_GREG_MSPOSD_OSDRV = $(SIGMASTAR_OSDRV_INFINITY6C_PKGDIR) + APFPV_GREG_MSPOSD_OSDRV_PKG = sigmastar-osdrv-infinity6c +else + APFPV_GREG_MSPOSD_FAMILY = star6e + APFPV_GREG_MSPOSD_OSDRV = $(SIGMASTAR_OSDRV_INFINITY6E_PKGDIR) + APFPV_GREG_MSPOSD_OSDRV_PKG = sigmastar-osdrv-infinity6e +endif + +APFPV_GREG_MSPOSD_DEPENDENCIES = libevent-openipc $(APFPV_GREG_MSPOSD_OSDRV_PKG) + +define APFPV_GREG_MSPOSD_FETCH_REPO + test -n "$(APFPV_GREG_MSPOSD_GIT)" || { \ + echo "git is required to build apfpv-greg-msposd"; \ + exit 1; \ + } + rm -rf $(@D)/src + $(APFPV_GREG_MSPOSD_GIT) clone --depth 1 --branch $(APFPV_GREG_MSPOSD_REPO_BRANCH) $(APFPV_GREG_MSPOSD_REPO) $(@D)/src +endef + +APFPV_GREG_MSPOSD_PRE_CONFIGURE_HOOKS += APFPV_GREG_MSPOSD_FETCH_REPO + +define APFPV_GREG_MSPOSD_BUILD_CMDS + $(MAKE) \ + CC="$(TARGET_CC)" \ + TOOLCHAIN="$(STAGING_DIR)" \ + DRV="$(APFPV_GREG_MSPOSD_OSDRV)/files/lib" \ + $(APFPV_GREG_MSPOSD_FAMILY) \ + OUTPUT="$(@D)/msposd" \ + -C $(@D)/src +endef + +define APFPV_GREG_MSPOSD_INSTALL_TARGET_CMDS + $(INSTALL) -m 755 -d $(TARGET_DIR)/etc + $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(@D)/src/vtxmenu.ini + $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d + $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(APFPV_GREG_MSPOSD_PKGDIR)/files/S99msposd + $(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin + $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/msposd + $(INSTALL) -m 755 -d $(TARGET_DIR)/usr/share/fonts + $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/share/fonts $(@D)/src/fonts/font_inav.png + $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/share/fonts $(@D)/src/fonts/font_inav_hd.png + $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/share/fonts $(@D)/src/fonts/font_btfl.png + $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/share/fonts $(@D)/src/fonts/font_btfl_hd.png + $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/share/fonts $(@D)/src/fonts/font_ardu.png + $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/share/fonts $(@D)/src/fonts/font_ardu_hd.png +endef + +define APFPV_GREG_MSPOSD_INSTALL_SIGMASTAR_LIBRARIES + $(INSTALL) -m 755 -d $(TARGET_DIR)/usr/lib + $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/lib $(APFPV_GREG_MSPOSD_OSDRV)/files/lib/libcam_os_wrapper.so + $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/lib $(APFPV_GREG_MSPOSD_OSDRV)/files/lib/libmi_rgn.so + $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/lib $(APFPV_GREG_MSPOSD_OSDRV)/files/lib/libmi_sys.so +endef + +ifeq ($(OPENIPC_SOC_VENDOR),sigmastar) +APFPV_GREG_MSPOSD_POST_INSTALL_TARGET_HOOKS += APFPV_GREG_MSPOSD_INSTALL_SIGMASTAR_LIBRARIES +endif + +$(eval $(generic-package)) diff --git a/general/package/apfpv-greg-msposd/files/S99msposd b/general/package/apfpv-greg-msposd/files/S99msposd new file mode 100644 index 0000000000..bf654011f6 --- /dev/null +++ b/general/package/apfpv-greg-msposd/files/S99msposd @@ -0,0 +1,66 @@ +#!/bin/sh + +. /etc/init.d/libmedia.sh + +DAEMON="msposd" +PIDFILE="/var/run/$DAEMON.pid" +MAJESTIC_API="http://localhost/api/v1/config.json" + +build_args() { + msposd_tty="$(fw_printenv -n msposd_tty 2>/dev/null || echo /dev/ttyS2)" + size="$(curl -s "$MAJESTIC_API" | jsonfilter -qe "@.video0.size" 2>/dev/null)" + [ -n "$size" ] || size="1920x1080" + + if [ "$msposd_tty" = "standalone" ]; then + vert="$(echo "$size" | cut -d'x' -f2)" + [ -n "$vert" ] || vert=1080 + [ "$vert" -lt 720 ] && size="1280x720" + echo "-b 115200 -x 99 -r 1010 --msp-hz 3 --render-hz 3 --msg-hz 3 -m /dev/ttyS2 -z $size" + else + echo "-b 115200 -r 1010 --msp-hz 3 --render-hz 3 --msg-hz 3 -m $msposd_tty -z $size" + fi +} + +start() { + echo "Starting $DAEMON..." + wait_for_http_ready "$MAJESTIC_API" 20 || { + echo "majestic API not ready; refusing to start $DAEMON" + return 1 + } + + devmem 0x1F207890 16 0x8 >/dev/null 2>&1 || true + sleep 1 + + args="$(build_args)" + start_service "$DAEMON" "$PIDFILE" $args || return 1 + echo "$DAEMON started with args: $args" +} + +stop() { + echo "Stopping $DAEMON..." + stop_service "$DAEMON" "$PIDFILE" 12 +} + +status() { + if ensure_pidfile "$DAEMON" "$PIDFILE"; then + echo "$DAEMON running pid=$(cat "$PIDFILE")" + return 0 + fi + echo "$DAEMON stopped" + return 1 +} + +restart() { + stop + start +} + +case "$1" in + start|stop|restart|status) + "$1" + ;; + *) + echo "Usage: $0 {start|stop|restart|status}" + exit 1 + ;; +esac diff --git a/general/package/apfpv-greg-payload/Config.in b/general/package/apfpv-greg-payload/Config.in new file mode 100644 index 0000000000..06d1b75308 --- /dev/null +++ b/general/package/apfpv-greg-payload/Config.in @@ -0,0 +1,8 @@ +config BR2_PACKAGE_APFPV_GREG_PAYLOAD + bool "apfpv-greg-payload" + default n + help + Installs the shared APFPV Greg payload from the public payload repo. + This package provides APFPV-specific files that are not owned by a + single source repo, including CGI glue, helper scripts, shared + assets, modules, and sensor blobs. diff --git a/general/package/apfpv-greg-payload/apfpv-greg-payload.mk b/general/package/apfpv-greg-payload/apfpv-greg-payload.mk new file mode 100644 index 0000000000..a8ef9c793d --- /dev/null +++ b/general/package/apfpv-greg-payload/apfpv-greg-payload.mk @@ -0,0 +1,54 @@ +################################################################################ +# +# apfpv-greg-payload +# +################################################################################ + +APFPV_GREG_PAYLOAD_SITE = $(patsubst %/,%,$(APFPV_GREG_PAYLOAD_PKGDIR)) +APFPV_GREG_PAYLOAD_SITE_METHOD = local +APFPV_GREG_PAYLOAD_LICENSE = Mixed +APFPV_GREG_PAYLOAD_GIT = $(shell command -v git 2>/dev/null) +APFPV_GREG_PAYLOAD_REPO_BRANCH = main +APFPV_GREG_PAYLOAD_REPO = https://github.com/sickgreg/apfpv-greg-package.git + +ifeq ($(OPENIPC_SOC_VENDOR),sigmastar) +APFPV_GREG_PAYLOAD_PLATFORM_PAYLOAD = sigmastar-4.9.84 +endif + +define APFPV_GREG_PAYLOAD_FETCH_REPO + test -n "$(APFPV_GREG_PAYLOAD_GIT)" || { \ + echo "git is required to build apfpv-greg-payload"; \ + exit 1; \ + } + rm -rf $(@D)/payload-src + $(APFPV_GREG_PAYLOAD_GIT) clone --depth 1 --branch $(APFPV_GREG_PAYLOAD_REPO_BRANCH) $(APFPV_GREG_PAYLOAD_REPO) $(@D)/payload-src +endef + +APFPV_GREG_PAYLOAD_PRE_CONFIGURE_HOOKS += APFPV_GREG_PAYLOAD_FETCH_REPO + +define APFPV_GREG_PAYLOAD_INSTALL_TARGET_CMDS + cp -a $(@D)/payload-src/payload/common/. $(TARGET_DIR)/ + rm -f \ + $(TARGET_DIR)/etc/init.d/S40network \ + $(TARGET_DIR)/etc/init.d/S95majestic \ + $(TARGET_DIR)/etc/init.d/S99rc.local \ + $(TARGET_DIR)/etc/network/interfaces.d/wlan0 \ + $(TARGET_DIR)/usr/share/udhcpc/default.script \ + $(TARGET_DIR)/var/www/cgi-bin/p/header.cgi + $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d + $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(APFPV_GREG_PAYLOAD_PKGDIR)/files/libmedia.sh + chmod 755 \ + $(TARGET_DIR)/etc/init.d/S993video_settings \ + $(TARGET_DIR)/etc/init.d/media_stack \ + $(TARGET_DIR)/usr/bin/adapter \ + $(TARGET_DIR)/usr/share/openipc/customizer.sh + if [ -d $(TARGET_DIR)/var/www/cgi-bin ]; then \ + find $(TARGET_DIR)/var/www/cgi-bin -type f -name '*.cgi' -exec chmod 755 {} +; \ + fi + if [ -n "$(APFPV_GREG_PAYLOAD_PLATFORM_PAYLOAD)" ] && [ -d $(@D)/payload-src/payload/$(APFPV_GREG_PAYLOAD_PLATFORM_PAYLOAD) ]; then \ + cp -a $(@D)/payload-src/payload/$(APFPV_GREG_PAYLOAD_PLATFORM_PAYLOAD)/. $(TARGET_DIR)/; \ + fi + rm -f $(TARGET_DIR)/lib/modules/4.9.84/sigmastar/sensor_imx415_mipi.ko +endef + +$(eval $(generic-package)) diff --git a/general/package/apfpv-greg-payload/files/libmedia.sh b/general/package/apfpv-greg-payload/files/libmedia.sh new file mode 100644 index 0000000000..7c6e11e2a7 --- /dev/null +++ b/general/package/apfpv-greg-payload/files/libmedia.sh @@ -0,0 +1,137 @@ +#!/bin/sh + +wait_for_pid_exit() { + pid="$1" + timeout="${2:-15}" + i=0 + while [ "$i" -lt "$timeout" ]; do + [ -z "$pid" ] && return 0 + kill -0 "$pid" 2>/dev/null || return 0 + sleep 1 + i=$((i + 1)) + done + return 1 +} + +wait_for_name_exit() { + name="$1" + timeout="${2:-15}" + i=0 + while [ "$i" -lt "$timeout" ]; do + pidof "$name" >/dev/null 2>&1 || return 0 + sleep 1 + i=$((i + 1)) + done + return 1 +} + +read_pidfile() { + pidfile="$1" + [ -f "$pidfile" ] || return 1 + pid="$(cat "$pidfile" 2>/dev/null)" + [ -n "$pid" ] || return 1 + echo "$pid" +} + +is_running_pidfile() { + name="$1" + pidfile="$2" + pid="$(read_pidfile "$pidfile" 2>/dev/null)" || return 1 + kill -0 "$pid" 2>/dev/null || return 1 + cmdline="$(tr '\0' ' ' < /proc/$pid/cmdline 2>/dev/null)" + echo "$cmdline" | grep -q "$name" || return 1 + return 0 +} + +ensure_pidfile() { + name="$1" + pidfile="$2" + if is_running_pidfile "$name" "$pidfile"; then + return 0 + fi + rm -f "$pidfile" + for pid in $(pidof "$name" 2>/dev/null); do + cmdline="$(tr '\0' ' ' < /proc/$pid/cmdline 2>/dev/null)" + echo "$cmdline" | grep -q "$name" || continue + echo "$pid" > "$pidfile" + return 0 + done + return 1 +} + +start_service() { + name="$1" + pidfile="$2" + shift 2 + + pids="$(pidof "$name" 2>/dev/null)" + if [ -n "$pids" ]; then + count="$(echo "$pids" | wc -w)" + if [ "$count" -gt 1 ]; then + echo "$name has $count instances; forcing clean restart" + stop_service "$name" "$pidfile" 12 || return 1 + elif ensure_pidfile "$name" "$pidfile"; then + echo "$name is already running" + return 0 + fi + fi + + rm -f "$pidfile" + start-stop-daemon -b -m -S -q -p "$pidfile" -x "$name" -- "$@" + if [ $? -ne 0 ]; then + echo "Failed to launch $name" + return 1 + fi + + i=0 + while [ "$i" -lt 8 ]; do + if ensure_pidfile "$name" "$pidfile"; then + return 0 + fi + sleep 1 + i=$((i + 1)) + done + echo "$name did not stay running" + return 1 +} + +stop_service() { + name="$1" + pidfile="$2" + grace="${3:-12}" + + pid="$(read_pidfile "$pidfile" 2>/dev/null)" + + if [ -n "$pid" ]; then + kill -TERM "$pid" 2>/dev/null || true + fi + killall -q -TERM "$name" 2>/dev/null || true + + if [ -n "$pid" ]; then + wait_for_pid_exit "$pid" "$grace" || true + fi + wait_for_name_exit "$name" "$grace" || true + + if pidof "$name" >/dev/null 2>&1; then + killall -q -KILL "$name" 2>/dev/null || true + wait_for_name_exit "$name" 5 || { + echo "Failed to stop $name" + return 1 + } + fi + + rm -f "$pidfile" + return 0 +} + +wait_for_http_ready() { + url="$1" + timeout="${2:-20}" + i=0 + while [ "$i" -lt "$timeout" ]; do + curl -sf --connect-timeout 1 --max-time 2 "$url" >/dev/null 2>&1 && return 0 + sleep 1 + i=$((i + 1)) + done + return 1 +} diff --git a/general/package/apfpv-greg/Config.in b/general/package/apfpv-greg/Config.in new file mode 100644 index 0000000000..cf7a3b536a --- /dev/null +++ b/general/package/apfpv-greg/Config.in @@ -0,0 +1,13 @@ +config BR2_PACKAGE_APFPV_GREG + bool "apfpv-greg" + default n + select BR2_PACKAGE_AALINK + select BR2_PACKAGE_AALINK_IDR5 + select BR2_PACKAGE_AIR_MAN_AP + select BR2_PACKAGE_APFPV_GREG_MSPOSD + select BR2_PACKAGE_APFPV_GREG_PAYLOAD + help + Meta-package for the APFPV Greg firmware stack. Selecting this + package enables the APFPV Greg userspace components and shared + payload while keeping the final-override files in the device + overlays. diff --git a/general/package/apfpv-greg/apfpv-greg.mk b/general/package/apfpv-greg/apfpv-greg.mk new file mode 100644 index 0000000000..c3083662f5 --- /dev/null +++ b/general/package/apfpv-greg/apfpv-greg.mk @@ -0,0 +1,15 @@ +################################################################################ +# +# apfpv-greg +# +################################################################################ + +APFPV_GREG_SITE = $(patsubst %/,%,$(APFPV_GREG_PKGDIR)) +APFPV_GREG_SITE_METHOD = local +APFPV_GREG_LICENSE = Mixed + +define APFPV_GREG_INSTALL_TARGET_CMDS + true +endef + +$(eval $(generic-package))