From 2ce447a0b475170f22687a87b6e730852d9ec12c Mon Sep 17 00:00:00 2001 From: sickgreg <55742743+sickgreg@users.noreply.github.com> Date: Thu, 3 Jul 2025 12:37:55 +1000 Subject: [PATCH 01/14] Add files via upload --- .../wifibroadcast-ng/sensor/modes_imx335.ini | 81 ++++++++++++++ .../wifibroadcast-ng/sensor/modes_imx415.ini | 102 ++++++++++++++++++ 2 files changed, 183 insertions(+) create mode 100644 general/package/wifibroadcast-ng/sensor/modes_imx335.ini create mode 100644 general/package/wifibroadcast-ng/sensor/modes_imx415.ini diff --git a/general/package/wifibroadcast-ng/sensor/modes_imx335.ini b/general/package/wifibroadcast-ng/sensor/modes_imx335.ini new file mode 100644 index 0000000000..ab06eef216 --- /dev/null +++ b/general/package/wifibroadcast-ng/sensor/modes_imx335.ini @@ -0,0 +1,81 @@ +;imx335 +[MODES] +; 4:3 +; 60fps + +"4:3 720p 60" = "960x720 60 16 'nocrop'" +"4:3 720p 60 50HzAC" = "960x720 60 10 'nocrop'" + +"4:3 960p 60" = "1280x960 60 16 'nocrop'" +"4:3 960p 60 50HzAC" = "1280x960 60 10 'nocrop'" + +"4:3 1080p 60" = "1440x1080 60 16 'nocrop'" +"4:3 1080p 60 50HzAC" = "1440x1080 60 10 'nocrop'" + +"4:3 1440p 60" = "1920x1440 60 16 'nocrop'" +"4:3 1440p 60 50HzAC" = "1920x1440 60 10 'nocrop'" + +"4:3 1920p 60" = "2560x1920 60 16 'nocrop'" +"4:3 1920p 60 50HzAC" = "2560x1920 60 10 'nocrop'" + + +; 4:3 +; 90fps +"4:3 720p 90" = "960x720 90 11 '0 0 320 0 1920 1440'" +"4:3 720p 90 50HzAC" = "960x720 90 10 '0 0 320 0 1920 1440'" + +"4:3 960p 90" = "1280x960 90 11 '0 0 320 0 1920 1440'" +"4:3 960p 90 50HzAC" = "1280x960 90 10 '0 0 320 0 1920 1440'" + +"4:3 1080p 90" = "1440x1080 90 11 '0 0 320 0 1920 1440'" +"4:3 1080p 90 50HzAC" = "1440x1080 90 10 '0 0 320 0 1920 1440'" + +"4:3 1440p 90" = "1920x1440 90 11 '0 0 320 0 1920 1440'" +"4:3 1440p 90 50HzAC" = "1920x1440 90 10 '0 0 320 0 1920 1440'" + +; 4:3 +; 120fps super crop +"4:3 540p 120" = "720x540 120 8 '0 0 240 0 1440 1080'" +"4:3 720p 120" = "960x720 120 8 '0 0 240 0 1440 1080'" +"4:3 960p 120" = "1280x960 120 8 '0 0 240 0 1440 1080'" +"4:3 1080p 120" = "1440x1080 120 8 '0 0 240 0 1440 1080'" + + +; 16:9 modes +; 60fps +"16:9 540p 60" = "960x540 60 16 '0 0 0 240 2560 1440'" +"16:9 540p 60 50HzAC" = "960x540 60 10 '0 0 0 240 2560 1440'" + +"16:9 720p 60" = "1280x720 60 16 '0 0 0 240 2560 1440'" +"16:9 720p 60 50HzAC" = "1280x720 60 10 '0 0 0 240 2560 1440'" + +"16:9 1080p 60" = "1920x1080 60 16 '0 0 0 240 2560 1440'" +"16:9 1080p 60 50HzAC" = "1920x1080 60 10 '0 0 0 240 2560 1440'" + +"16:9 1440p 60" = "2560x1440 60 16 '0 0 0 240 2560 1440'" +"16:9 1440p 60 50HzAC" = "2560x1440 60 10 '0 0 0 240 2560 1440'" + + +; 16:9 +; 90fps +"16:9 540p 90" = "960x540 90 11 'nocrop'" +"16:9 540p 90 50HzAC" = "960x540 90 10 'nocrop'" + + +"16:9 720p 90" = "1280x720 90 11 'nocrop'" +"16:9 720p 90 50HzAC" = "1280x720 90 10 'nocrop'" + + +"16:9 1080p 90" = "1920x1080 90 11 'nocrop'" +"16:9 1080p 90 50HzAC" = "1920x1080 90 10 'nocrop'" + + +"16:9 1344p 90" = "2400x1344 90 11 'nocrop'" +"16:9 1344p 90 50HzAC" = "2400x1344 90 10 'nocrop'" + + +; 16:9 +; 120fps +"16:9 540p 120" = "960x540 120 8 'nocrop'" +"16:9 720p 120" = "1280x720 120 8 'nocrop'" +"16:9 1080p 120" = "1920x1080 120 8 'nocrop'" diff --git a/general/package/wifibroadcast-ng/sensor/modes_imx415.ini b/general/package/wifibroadcast-ng/sensor/modes_imx415.ini new file mode 100644 index 0000000000..b107d39c7b --- /dev/null +++ b/general/package/wifibroadcast-ng/sensor/modes_imx415.ini @@ -0,0 +1,102 @@ +[MODES] +; imx415 + +; 16:9 modes +"16:9 720p 30" = "1280x720 30 33 'nocrop'" +"16:9 720p 30 50HzAC" = "1280x720 30 10 'nocrop'" + +"16:9 1080p 30" = "1920x1080 30 33 'nocrop'" +"16:9 1080p 30 50HzAC" = "1920x1080 30 10 'nocrop'" + +"16:9 1440p 30" = "2560x1440 30 33 'nocrop'" +"16:9 1440p 30 50HzAC" = "2560x1440 30 10 'nocrop'" + +"16:9 4k 2160p 30" = "3840x2160 30 33 'nocrop'" +"16:9 4k 2160p 30 50HzAC" = "3840x2160 30 10 'nocrop'" + + +"16:9 540p 60" = "960x540 60 16 'nocrop'" +"16:9 540p 60 50HzAC" = "960x540 60 10 'nocrop'" + +"16:9 720p 60" = "1280x720 60 16 'nocrop'" +"16:9 720p 60 50HzAC" = "1280x720 60 10 'nocrop'" + +"16:9 1080p 60" = "1920x1080 60 16 'nocrop'" +"16:9 1080p 60 50HzAC" = "1920x1080 60 10 'nocrop'" + +"16:9 1440p 60" = "2560x1440 60 16 'nocrop'" +"16:9 1440p 60 50HzAC" = "2560x1440 60 10 'nocrop'" + +"16:9 1688p 60" = "3000x1688 60 16 'nocrop'" +"16:9 1688p 60 50HzAC" = "3000x1688 60 10 'nocrop'" + +"16:9 540p 90" = "960x540 90 11 'nocrop'" +"16:9 540p 90 50HzAC" = "960x540 90 10 'nocrop'" + + +"16:9 720p 90" = "1280x720 90 11 'nocrop'" +"16:9 720p 90 50HzAC" = "1280x720 90 10 'nocrop'" + + +"16:9 1080p 90" = "1920x1080 90 11 'nocrop'" +"16:9 1080p 90 50HzAC" = "1920x1080 90 10 'nocrop'" + + +"16:9 540p 120" = "960x540 120 8 'nocrop'" +"16:9 720p 120" = "1280x720 120 8 'nocrop'" +"16:9 816p 120" = "1472x816 120 8 'nocrop'" + + +; 4:3 modes (60fps — crop from 3000x1688 → 2248x1688)(30fps 3840x2160 -> 2880x2160) + + +"4:3 720p 30" = "960x720 30 33 '0 0 480 0 2880 2160'" +"4:3 720p 30 50HzAC" = "960x720 30 10 '0 0 480 0 2880 2160'" + +"4:3 960p 30" = "1280x960 30 33 '0 0 480 0 2880 2160'" +"4:3 960p 30 50HzAC" = "1280x960 30 10 '0 0 480 0 2880 2160'" + +"4:3 1080p 30" = "1440x1080 30 33 '0 0 480 0 2880 2160'" +"4:3 1080p 30 50HzAC" = "1440x1080 30 10 '0 0 480 0 2880 2160'" + +"4:3 1440p 30" = "1920x1440 30 33 '0 0 480 0 2880 2160'" +"4:3 1440p 30 50HzAC" = "1920x1440 30 10 '0 0 480 0 2880 2160'" + +"4:3 2160p 30" = "2880x2160 30 33 '0 0 480 0 2880 2160'" +"4:3 2160p 30 50HzAC" = "2880x2160 30 10 '0 0 480 0 2880 2160'" + + + +"4:3 720p 60" = "960x720 60 16 '0 0 376 0 2248 1688'" +"4:3 720p 60 50HzAC" = "960x720 60 10 '0 0 376 0 2248 1688'" + +"4:3 960p 60" = "1280x960 60 16 '0 0 376 0 2248 1688'" +"4:3 960p 60 50HzAC" = "1280x960 60 10 '0 0 376 0 2248 1688'" + +"4:3 1080p 60" = "1440x1080 60 16 '0 0 376 0 2248 1688'" +"4:3 1080p 60 50HzAC" = "1440x1080 60 10 '0 0 376 0 2248 1688'" + +"4:3 1440p 60" = "1920x1440 60 16 '0 0 376 0 2248 1688'" +"4:3 1440p 60 50HzAC" = "1920x1440 60 10 '0 0 376 0 2248 1688'" + +"4:3 1688p 60" = "2248x1688 60 16 '0 0 376 0 2248 1688'" +"4:3 1688p 60 50HzAC" = "2248x1688 60 10 '0 0 376 0 2248 1688'" + + +; 4:3 modes (90fps crop) +"4:3 720p 90" = "960x720 90 11 '0 0 240 0 1440 1080'" +"4:3 720p 90 50HzAC" = "960x720 90 10 '0 0 240 0 1440 1080'" + + +"4:3 960p 90" = "1280x960 90 11 '0 0 240 0 1440 1080'" +"4:3 960p 90 50HzAC" = "1280x960 90 10 '0 0 240 0 1440 1080'" + + +"4:3 1080p 90" = "1440x1080 90 11 '0 0 240 0 1440 1080'" +"4:3 1080p 90 50HzAC" = "1440x1080 90 10 '0 0 240 0 1440 1080'" + +; 4:3 120 super cropped + +"4:3 540p 120" = "720x540 120 8 '0 0 184 0 1104 816'" +"4:3 720p 120" = "960x720 120 8 '0 0 184 0 1104 816'" +"4:3 816p 120" = "1104x816 120 8 '0 0 184 0 1104 816'" From ba887287e5ad1fbd0371f5b0287ee4dc6cb7fc93 Mon Sep 17 00:00:00 2001 From: sickgreg <55742743+sickgreg@users.noreply.github.com> Date: Thu, 3 Jul 2025 12:40:56 +1000 Subject: [PATCH 02/14] Add files via upload --- .../package/wifibroadcast-ng/files/S99air_man | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 general/package/wifibroadcast-ng/files/S99air_man diff --git a/general/package/wifibroadcast-ng/files/S99air_man b/general/package/wifibroadcast-ng/files/S99air_man new file mode 100644 index 0000000000..4f28714759 --- /dev/null +++ b/general/package/wifibroadcast-ng/files/S99air_man @@ -0,0 +1,47 @@ +#!/bin/sh + +DAEMON="air_man" +PIDFILE="/var/run/$DAEMON.pid" +DAEMON_ARGS="" + +start() { + echo -n "Starting $DAEMON: " + start-stop-daemon -b -m -S -q -p "$PIDFILE" -x "$DAEMON" -- $DAEMON_ARGS + if [ $? -eq 0 ]; then + echo "OK" + else + echo "FAIL" + fi +} + +stop() { + echo -n "Stopping $DAEMON: " + start-stop-daemon -K -q -p "$PIDFILE" + if [ $? -eq 0 ]; then + rm -f "$PIDFILE" + echo "OK" + else + echo "FAIL" + fi +} + +case "$1" in + start|stop) + $1 + ;; + + restart) + stop + sleep 3 + start + ;; + + reload) + killall -1 "$DAEMON" + ;; + + *) + echo "Usage: $0 {start|stop|restart|reload}" + exit 1 + ;; +esac From b6f99fb453ee73072c400389c89900f877d57d66 Mon Sep 17 00:00:00 2001 From: sickgreg <55742743+sickgreg@users.noreply.github.com> Date: Thu, 3 Jul 2025 12:44:01 +1000 Subject: [PATCH 03/14] osd_fps better performance mode, add wlan_adapter and link_control keys --- general/package/wifibroadcast-ng/files/wfb.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/general/package/wifibroadcast-ng/files/wfb.yaml b/general/package/wifibroadcast-ng/files/wfb.yaml index a92b1b6bf2..cc2ba3b363 100644 --- a/general/package/wifibroadcast-ng/files/wfb.yaml +++ b/general/package/wifibroadcast-ng/files/wfb.yaml @@ -3,6 +3,8 @@ wireless: channel: 161 width: 20 mlink: 1500 + wlan_adapter: default + link_control: alink broadcast: mcs_index: 2 tun_index: 1 @@ -14,4 +16,4 @@ broadcast: telemetry: router: msposd serial: ttyS2 - osd_fps: 20 + osd_fps: 1006 From 6ee9fa1f202e3835820f5e14f028bfb13752f0e4 Mon Sep 17 00:00:00 2001 From: sickgreg <55742743+sickgreg@users.noreply.github.com> Date: Thu, 3 Jul 2025 12:45:29 +1000 Subject: [PATCH 04/14] Update wfb.yaml --- general/package/wifibroadcast-ng/files/wfb.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/general/package/wifibroadcast-ng/files/wfb.yaml b/general/package/wifibroadcast-ng/files/wfb.yaml index cc2ba3b363..3b5dbcc18c 100644 --- a/general/package/wifibroadcast-ng/files/wfb.yaml +++ b/general/package/wifibroadcast-ng/files/wfb.yaml @@ -15,5 +15,8 @@ broadcast: link_id: 7669206 telemetry: router: msposd + downlink: tunnel + port_rx: 14550 + port_tx: 14551 serial: ttyS2 osd_fps: 1006 From e7bda8ffac7e06126e8150f75cfdb3c9989fdd74 Mon Sep 17 00:00:00 2001 From: sickgreg <55742743+sickgreg@users.noreply.github.com> Date: Thu, 3 Jul 2025 12:46:35 +1000 Subject: [PATCH 05/14] Update wifibroadcast-ng.mk --- general/package/wifibroadcast-ng/wifibroadcast-ng.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk index e646700748..6b01ecc867 100644 --- a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk +++ b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk @@ -21,6 +21,7 @@ define WIFIBROADCAST_NG_INSTALL_TARGET_CMDS $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(WIFIBROADCAST_NG_PKGDIR)/files/S98wifibroadcast + $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(WIFIBROADCAST_NG_PKGDIR)/files/S99air_man $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/sensors $(INSTALL) -m 644 -t $(TARGET_DIR)/etc/sensors $(WIFIBROADCAST_NG_PKGDIR)/sensor/* From 6972097d363c83a4c247ecb23742c246e0f0c78a Mon Sep 17 00:00:00 2001 From: sickgreg <55742743+sickgreg@users.noreply.github.com> Date: Thu, 3 Jul 2025 12:52:19 +1000 Subject: [PATCH 06/14] Add files via upload --- .../wifibroadcast-ng/files/wlan_adapters.yaml | 151 ++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 general/package/wifibroadcast-ng/files/wlan_adapters.yaml diff --git a/general/package/wifibroadcast-ng/files/wlan_adapters.yaml b/general/package/wifibroadcast-ng/files/wlan_adapters.yaml new file mode 100644 index 0000000000..a07ceb23e3 --- /dev/null +++ b/general/package/wifibroadcast-ng/files/wlan_adapters.yaml @@ -0,0 +1,151 @@ +all_profiles: [bl-r8812af1,bl-m8812eu2,bl-m8731bu4,default] +profiles: + bl-r8812af1: + description: "Not tested with instruments yet." + bw: [20,40] + stbc: [0,1] + ldpc_rx: [0,1] + ldpc_tx: [0,1] + guard: [long,short] + mcs: [0,1,2,3,4,5,6,7] + max_mtu: 3993 + tx_power: + mcs0: [-1000,-2500,-3750,-4000,-4500] + mcs1: [-1000,-2500,-3500,-4000,-4400] + mcs2: [-1000,-2500,-3000,-4000,-4300] + mcs3: [-1000,-2500,-3000,-3500,-4000] + mcs4: [-1000,-2000,-2750,-3000,-3500] + mcs5: [-1000,-2000,-2750,-2750,-3000] + mcs6: [-1000,-2000,-2500,-2750,-3000] + mcs7: [-1000,-2000,-2500,-2750,-3000] + pwr_mw: + 0: [1mW,1mW,1mW,1mW,1mW,1mW,1mW,1mW] + 1: [25mW,25mW,25mW,25mW,25mW,25mW,25mW,25mW] + 2: [40W,40mW,40mW,30mW,30mW,30mW,30mW,30mW] + 3: [70mW,70mW,70mW,60mW,60mW,60mW,50mW,50mW] + 4: [100mW,100mW,100mW,90mW,90mW,80mW,80mW,70mW] + link_modes: + 20mhz: [mcs0_20mhz_lgi, mcs1_20mhz_lgi, mcs2_20mhz_lgi, mcs3_20mhz_lgi, mcs4_20mhz_sgi, mcs5_20mhz_sgi] + 40mhz: [mcs1_40mhz_lgi, mcs2_40mhz_lgi, mcs3_40mhz_lgi, mcs4_40mhz_sgi, mcs5_40mhz_sgi] + bl-m8812eu2: + description: "Not tested with instruments yet." + bw: [10,20] + stbc: [0,1] + ldpc_rx: [0,1] + ldpc_tx: [0,1] + guard: [long,short] + mcs: [0,1,2,3,4,5,6,7] + max_mtu: 3993 + tx_power: + mcs0: [5,1200,1600,2500,2900] + mcs1: [5,1200,1600,2500,2800] + mcs2: [5,1200,1700,2250,2250] + mcs3: [5,1200,1800,2000,2000] + mcs4: [5,1200,1750,1750,1800] + mcs5: [5,1200,1750,1750,1700] + mcs6: [5,1200,1500,1500,1600] + mcs7: [5,1200,1450,1500,1600] + pwr_mw: + 0: [1mW,1mW,1mW,1mW,1mW,1mW,1mW,1mW] + 1: [25mW, 25mW,25mW,25mW,25mW,25mW,25mW,25mW] + 2: [400mW,400mW,400mW,400mW,400mW,400mW,400mW,350mW] + 3: [600mW,600mW,600mW,600mW,500mW,400mW,400mW,350mW] + 4: [800mW,800mW,700mW,700mW,550mW,425mW,425mW,375mW] + link_modes: + 10mhz: [mcs0_10mhz_lgi, mcs1_10mhz_lgi, mcs2_10mhz_lgi, mcs2_10mhz_sgi, mcs3_10mhz_lgi, mcs3_10mhz_sgi] + 20mhz: [mcs0_20mhz_lgi, mcs1_20mhz_lgi, mcs2_20mhz_lgi, mcs3_20mhz_lgi, mcs4_20mhz_sgi, mcs5_20mhz_sgi] + channels: + 10: + dfs: [100,104,108,112,116,120,124,128,132,136,140,144] + non-dfs: [36,40,44,48,149,153,157,161,165] + 20: + dfs: [100,104,108,112,116,120,124,128,132,136,140,144] + non-dfs: [36,40,44,48,149,153,157,161,165] + presets: + all_presets: [long_range, medium_range,short_range,cinematic] + long_range: + description: "Long range datalink profile with low bitrate and high resilience. Recommended for 30-60fps video or for challenging enviroments." + video_bitrate: 4096 + link_mode: mcs1_20mhz_lgi + fec_k: 4 + fec_n: 6 + mlink: 1200 + recommended_diversity: [1,2,3,4] + medium_range: + description: "Medium range datalink profile with medium bitrate and medium resilience." + video_bitrate: 8192 + link_mode: mcs2_20mhz_lgi + fec_k: 8 + fec_n: 12 + mlink: 2000 + recommended_diversity: [1,2,3,4] + short_range: + description: "Short range datalink profile with medium-high bitrate and medium resilience." + video_bitrate: 12288 + link_mode: mcs3_20mhz_lgi + fec_k: 8 + fec_n: 12 + mlink: 2400 + recommended_diversity: [2,3,4] + cinematic: + description: "Very short range datalink profile with high bitrate and low resilience." + video_bitrate: 22600 + link_mode: mcs5_20mhz_sgi + fec_k: 4 + fec_n: 6 + mlink: 3200 + recommended_diversity: [3,4] + bl-m8731bu4: + description: "Tested with real instruments and mapped." + bw: [10,20,40] + stbc: [0] + ldpc_rx: [0] + ldpc_tx: [0,1] + guard: [long,short] + mcs: [0,1,2,3,4,5,6,7] + max_mtu: 3993 + tx_power: + mcs0: [50, 1300, 1800, 2250, 2500] + mcs1: [50, 1400, 1800, 2250, 2500] + mcs2: [50, 1600, 1800, 2250, 2250] + mcs3: [50, 1750, 1750, 1750, 1750] + mcs4: [50, 1750, 1750, 1750, 1750] + mcs5: [50, 1750, 1750, 1750, 1750] + mcs6: [50, 1750, 1750, 1750, 1750] + mcs7: [50, 1500, 1500, 1500, 1500] + pwr_mw: + 0: [1mW, 1mW, 1mW, 1mW, 1mW, 1mW, 1mW, 1mW] + 1: [25mW, 25mW, 25mW, 25mW, 25mW, 16mW, 13mW, 8mW] + 2: [80mW, 66mW, 58mW, 25mW, 25mW, 16mW, 13mW, 8mW] + 3: [158mW, 148mW, 79mW, 25mW, 25mW, 16mW, 13mW, 8mW] + 4: [213mW, 200mW, 79mW, 25mW, 25mW, 16mW, 13mW, 8mW] + link_modes: + 10mhz: [mcs0_10mhz_lgi, mcs1_10mhz_lgi, mcs2_10mhz_lgi, mcs2_10mhz_sgi, mcs3_10mhz_lgi, mcs3_10mhz_sgi] + 20mhz: [mcs0_20mhz_lgi, mcs1_20mhz_lgi, mcs2_20mhz_lgi, mcs3_20mhz_lgi, mcs4_20mhz_sgi, mcs5_20mhz_sgi] + 40mhz: [mcs1_40mhz_lgi, mcs2_40mhz_lgi, mcs3_40mhz_lgi, mcs4_40mhz_sgi, mcs5_40mhz_sgi] + default: + description: "Default burnproof profile. Change to your correct profile." + bw: [20] + stbc: [0] + ldpc_rx: [0] + ldpc_tx: [0] + guard: [long] + mcs: [0,1,2] + max_mtu: 1500 + tx_power: + mcs0: [50] + mcs1: [50] + mcs2: [50] + mcs3: [50] + mcs4: [50] + mcs5: [50] + mcs6: [50] + mcs7: [50] + pwr_mw: + 0: 1mW + 1: 1mW + 2: 1mW + 3: 1mW + 4: 1mW + link_modes: + 20mhz: [mcs0_20mhz_lgi, mcs1_20mhz_lgi, mcs2_20mhz_lgi, mcs3_20mhz_lgi, mcs4_20mhz_sgi, mcs5_20mhz_sgi] From 6f674ed22b47ed094c23496efce307dcf0543fb7 Mon Sep 17 00:00:00 2001 From: sickgreg <55742743+sickgreg@users.noreply.github.com> Date: Thu, 3 Jul 2025 12:54:51 +1000 Subject: [PATCH 07/14] Update wifibroadcast-ng.mk --- general/package/wifibroadcast-ng/wifibroadcast-ng.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk index 6b01ecc867..d43b789b94 100644 --- a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk +++ b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk @@ -18,6 +18,7 @@ define WIFIBROADCAST_NG_INSTALL_TARGET_CMDS $(INSTALL) -m 755 -d $(TARGET_DIR)/etc $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(WIFIBROADCAST_NG_PKGDIR)/files/drone.key $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(WIFIBROADCAST_NG_PKGDIR)/files/wfb.yaml + $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(WIFIBROADCAST_NG_PKGDIR)/files/wlan_adapters.yaml $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(WIFIBROADCAST_NG_PKGDIR)/files/S98wifibroadcast From 2e88f63cad5b05ece0bb24324b90a9dbb1dac4ee Mon Sep 17 00:00:00 2001 From: sickgreg <55742743+sickgreg@users.noreply.github.com> Date: Thu, 3 Jul 2025 12:59:19 +1000 Subject: [PATCH 08/14] Add files via upload --- .../package/wifibroadcast-ng/files/air_man | Bin 0 -> 27588 bytes .../wifibroadcast-ng/files/air_man_cmd.sh | 348 ++++++++++++++++++ .../wifibroadcast-ng/files/yaml-cli-multi | Bin 0 -> 18464 bytes 3 files changed, 348 insertions(+) create mode 100644 general/package/wifibroadcast-ng/files/air_man create mode 100644 general/package/wifibroadcast-ng/files/air_man_cmd.sh create mode 100644 general/package/wifibroadcast-ng/files/yaml-cli-multi diff --git a/general/package/wifibroadcast-ng/files/air_man b/general/package/wifibroadcast-ng/files/air_man new file mode 100644 index 0000000000000000000000000000000000000000..071c09df1e114ffe2e706d7f10ddbc0e0ca30e36 GIT binary patch literal 27588 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/dev/null 2>&1 & + ;; + "set air telemetry router"*) + wifibroadcast cli -s .telemetry.router "$5" + (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & + ;; + "set air telemetry osd_fps"*) + wifibroadcast cli -s .telemetry.osd_fps "$5" + (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & + ;; + "set air telemetry gs_rendering"*) + if [ "$5" = "on" ]; then + sed -i 's/-o 127\.0\.0\.1:\"\$port_tx\" -z \"\$size\"/-o 10\.5\.0\.1:\"\$port_tx\"/' /usr/bin/wifibroadcast + else + sed -i 's/-o 10\.5\.0\.1:\"\$port_tx\"/-o 127\.0\.0\.1:\"\$port_tx\" -z \"\$size\"/' /usr/bin/wifibroadcast + fi + (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & + ;; + + "get air wfbng power") + wifibroadcast cli -g .wireless.txpower + ;; + "get air wfbng air_channel") + channel=$(wifibroadcast cli -g .wireless.channel | tr -d '\n') + iw list | grep "\[$channel\]" | tr -d '[]' | awk '{print $4 " (" $2 " " $3 ")"}' | sort -n | uniq | tr -d '\n' + ;; + "get air wfbng width") + wifibroadcast cli -g .wireless.width + ;; + "get air wfbng mcs_index") + wifibroadcast cli -g .broadcast.mcs_index + ;; + "get air wfbng stbc") + wifibroadcast cli -g .broadcast.stbc + ;; + "get air wfbng ldpc") + wifibroadcast cli -g .broadcast.ldpc + ;; + "get air wfbng fec_k") + wifibroadcast cli -g .broadcast.fec_k + ;; + "get air wfbng fec_n") + wifibroadcast cli -g .broadcast.fec_n + ;; + "get air wfbng adaptivelink") + grep ^alink_drone /etc/rc.local | grep -q 'alink_drone' && echo 1 || echo 0 + ;; + + "set air wfbng power"*) + wifibroadcast cli -s .wireless.txpower "$5" + (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & + ;; + "set air wfbng air_channel"*) + channel=$(echo "$5" | awk '{print $1}') + wifibroadcast cli -s .wireless.channel "$channel" + (wifibroadcast stop; sleep 1; wifibroadcast start) >/dev/null 2>&1 & + sed -i "s/^wifi_channel =.*/wifi_channel = $channel/" /etc/wifibroadcast.cfg + systemctl restart wifibroadcast.service + ;; + "set air wfbng width"*) + wifibroadcast cli -s .wireless.width "$5" + (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & + ;; + "set air wfbng mcs_index"*) + wifibroadcast cli -s .broadcast.mcs_index "$5" + (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & + ;; + "set air wfbng stbc"*) + if [ "$5" = "on" ]; then + wifibroadcast cli -s .broadcast.stbc 1 + else + wifibroadcast cli -s .broadcast.stbc 0 + fi + (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & + ;; + "set air wfbng ldpc"*) + if [ "$5" = "on" ]; then + wifibroadcast cli -s .broadcast.ldpc 1 + else + wifibroadcast cli -s .broadcast.ldpc 0 + fi + (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & + ;; + "set air wfbng fec_k"*) + wifibroadcast cli -s .broadcast.fec_k "$5" + (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & + ;; + "set air wfbng fec_n"*) + wifibroadcast cli -s .broadcast.fec_n "$5" + (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & + ;; + "set air wfbng adaptivelink"*) + if [ "$5" = "on" ]; then + sed -i "/alink_drone &/d" /etc/rc.local + sed -i -e "\$i alink_drone &" /etc/rc.local + cli -s .video0.qpDelta -12 && killall -1 majestic + nohup alink_drone >/dev/null 2>&1 & + else + killall -q -9 alink_drone + sed -i "/alink_drone &/d" /etc/rc.local + cli -d .video0.qpDelta && killall -1 majestic + fi + ;; + *) + echo "Unknown $@" + exit 1 + ;; +esac + +case $? in + 0) ;; + 1) exit 0 ;; + *) exit $? ;; +esac diff --git a/general/package/wifibroadcast-ng/files/yaml-cli-multi b/general/package/wifibroadcast-ng/files/yaml-cli-multi new file mode 100644 index 0000000000000000000000000000000000000000..3e813c2ece936bd13b242c742df49b281a6045e0 GIT binary patch literal 18464 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 QG@Wl>18mtMf@Wp^H%yDxVE_OC literal 0 HcmV?d00001 From fb3f04f1b617bad6078fc40e71554c87f69389f5 Mon Sep 17 00:00:00 2001 From: sickgreg <55742743+sickgreg@users.noreply.github.com> Date: Thu, 3 Jul 2025 13:01:23 +1000 Subject: [PATCH 09/14] Update wifibroadcast-ng.mk --- general/package/wifibroadcast-ng/wifibroadcast-ng.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk index d43b789b94..c9f0feb333 100644 --- a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk +++ b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk @@ -33,6 +33,10 @@ define WIFIBROADCAST_NG_INSTALL_TARGET_CMDS $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/wfb_tx_cmd $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/wfb_tun $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/wifibroadcast + $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/air_man + $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/air_man_cmd.sh + $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/yaml-cli-multi + endef $(eval $(generic-package)) From e1efc31bfecf1a943cfc896b94ad43e7674502f7 Mon Sep 17 00:00:00 2001 From: sickgreg Date: Wed, 4 Mar 2026 00:12:27 +1100 Subject: [PATCH 10/14] Add APFPV Greg10 package --- general/package/Config.in | 1 + general/package/apfpv-greg10/Config.in | 8 + general/package/apfpv-greg10/apfpv-greg10.mk | 130 +++++++++++++++++ general/package/apfpv-greg10/files/S94idr | 18 +++ general/package/apfpv-greg10/files/S991aalink | 52 +++++++ .../package/apfpv-greg10/files/S992air_man | 19 +++ general/package/apfpv-greg10/files/S99msposd | 66 +++++++++ .../package/apfpv-greg10/files/libmedia.sh | 137 ++++++++++++++++++ 8 files changed, 431 insertions(+) create mode 100644 general/package/apfpv-greg10/Config.in create mode 100644 general/package/apfpv-greg10/apfpv-greg10.mk create mode 100644 general/package/apfpv-greg10/files/S94idr create mode 100644 general/package/apfpv-greg10/files/S991aalink create mode 100644 general/package/apfpv-greg10/files/S992air_man create mode 100644 general/package/apfpv-greg10/files/S99msposd create mode 100644 general/package/apfpv-greg10/files/libmedia.sh diff --git a/general/package/Config.in b/general/package/Config.in index 1703eaeb90..201152ac69 100644 --- a/general/package/Config.in +++ b/general/package/Config.in @@ -62,6 +62,7 @@ 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/apfpv-greg10/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/apfpv-greg10/Config.in b/general/package/apfpv-greg10/Config.in new file mode 100644 index 0000000000..4b1d541064 --- /dev/null +++ b/general/package/apfpv-greg10/Config.in @@ -0,0 +1,8 @@ +config BR2_PACKAGE_APFPV_GREG10 + bool "apfpv-greg10" + default n + select BR2_PACKAGE_LIBEVENT_OPENIPC + help + Builds the custom APFPV Greg10 user-space stack from the configured + GitHub repos and installs the matching init scripts. + Local testing with private repos uses the authenticated gh CLI. diff --git a/general/package/apfpv-greg10/apfpv-greg10.mk b/general/package/apfpv-greg10/apfpv-greg10.mk new file mode 100644 index 0000000000..b0058b3bc6 --- /dev/null +++ b/general/package/apfpv-greg10/apfpv-greg10.mk @@ -0,0 +1,130 @@ +################################################################################ +# +# apfpv-greg10 +# +################################################################################ + +APFPV_GREG10_SITE = $(patsubst %/,%,$(APFPV_GREG10_PKGDIR)) +APFPV_GREG10_SITE_METHOD = local +APFPV_GREG10_LICENSE = Mixed +APFPV_GREG10_GIT = $(shell command -v git 2>/dev/null) +APFPV_GREG10_REPO_BRANCH = main +APFPV_GREG10_AALINK_REPO = https://github.com/sickgreg/aalink.git +APFPV_GREG10_AALINK_IDR5_REPO = https://github.com/sickgreg/aalink_idr5.git +APFPV_GREG10_AIR_MAN_REPO = https://github.com/sickgreg/air_man_ap.git +APFPV_GREG10_MSPOSD_REPO = https://github.com/sickgreg/msposd.git +APFPV_GREG10_PAYLOAD_REPO = https://github.com/sickgreg/apfpv-greg10-package.git + +ifeq ($(OPENIPC_SOC_FAMILY),infinity6b0) + APFPV_GREG10_MSPOSD_FAMILY = star6b0 + APFPV_GREG10_MSPOSD_OSDRV = $(SIGMASTAR_OSDRV_INFINITY6B0_PKGDIR) +else ifeq ($(OPENIPC_SOC_FAMILY),infinity6c) + APFPV_GREG10_MSPOSD_FAMILY = star6c + APFPV_GREG10_MSPOSD_OSDRV = $(SIGMASTAR_OSDRV_INFINITY6C_PKGDIR) +else + APFPV_GREG10_MSPOSD_FAMILY = star6e + APFPV_GREG10_MSPOSD_OSDRV = $(SIGMASTAR_OSDRV_INFINITY6E_PKGDIR) +endif + +ifeq ($(OPENIPC_SOC_VENDOR),sigmastar) +APFPV_GREG10_PLATFORM_PAYLOAD = sigmastar-4.9.84 +endif + +define APFPV_GREG10_FETCH_REPOS + test -n "$(APFPV_GREG10_GIT)" || { \ + echo "git is required to build apfpv-greg10"; \ + exit 1; \ + } + rm -rf $(@D)/aalink-src $(@D)/aalink-idr5-src $(@D)/air-man-src $(@D)/msposd-src $(@D)/payload-src + $(APFPV_GREG10_GIT) clone --depth 1 --branch $(APFPV_GREG10_REPO_BRANCH) $(APFPV_GREG10_AALINK_REPO) $(@D)/aalink-src + $(APFPV_GREG10_GIT) clone --depth 1 --branch $(APFPV_GREG10_REPO_BRANCH) $(APFPV_GREG10_AALINK_IDR5_REPO) $(@D)/aalink-idr5-src + $(APFPV_GREG10_GIT) clone --depth 1 --branch $(APFPV_GREG10_REPO_BRANCH) $(APFPV_GREG10_AIR_MAN_REPO) $(@D)/air-man-src + $(APFPV_GREG10_GIT) clone --depth 1 --branch $(APFPV_GREG10_REPO_BRANCH) $(APFPV_GREG10_MSPOSD_REPO) $(@D)/msposd-src + $(APFPV_GREG10_GIT) clone --depth 1 --branch $(APFPV_GREG10_REPO_BRANCH) $(APFPV_GREG10_PAYLOAD_REPO) $(@D)/payload-src +endef + +APFPV_GREG10_PRE_CONFIGURE_HOOKS += APFPV_GREG10_FETCH_REPOS + +define APFPV_GREG10_BUILD_CMDS + $(TARGET_CC) $(TARGET_CFLAGS) -O2 -Wall -Wextra \ + -o $(@D)/aalink \ + $(@D)/aalink-src/aalink.c \ + $(TARGET_LDFLAGS) -lpthread -lm + $(TARGET_CC) $(TARGET_CFLAGS) -O2 -Wall -Wextra \ + -o $(@D)/aalink_idr5 \ + $(@D)/aalink-idr5-src/aalink_idr5.c \ + $(TARGET_LDFLAGS) + $(TARGET_CC) $(TARGET_CFLAGS) -O2 -Wall -Wextra -pthread \ + -o $(@D)/air_man_ap \ + $(@D)/air-man-src/air_man_ap.c \ + $(TARGET_LDFLAGS) + $(MAKE) \ + CC="$(TARGET_CC)" \ + TOOLCHAIN="$(STAGING_DIR)" \ + DRV="$(APFPV_GREG10_MSPOSD_OSDRV)/files/lib" \ + $(APFPV_GREG10_MSPOSD_FAMILY) \ + OUTPUT="$(@D)/msposd" \ + -C $(@D)/msposd-src +endef + +define APFPV_GREG10_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 + 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 + + $(INSTALL) -m 755 -d $(TARGET_DIR)/etc + $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(@D)/aalink-src/aalink.conf + $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(@D)/msposd-src/vtxmenu.ini + + $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d + $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(APFPV_GREG10_PKGDIR)/files/libmedia.sh + $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(APFPV_GREG10_PKGDIR)/files/S94idr + $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(APFPV_GREG10_PKGDIR)/files/S991aalink + $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(APFPV_GREG10_PKGDIR)/files/S992air_man + $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(APFPV_GREG10_PKGDIR)/files/S99msposd + + $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/sensors + $(INSTALL) -m 644 -t $(TARGET_DIR)/etc/sensors $(@D)/air-man-src/modes_imx335.ini + $(INSTALL) -m 644 -t $(TARGET_DIR)/etc/sensors $(@D)/air-man-src/modes_imx415.ini + + $(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin + $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/aalink + $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/aalink_idr5 + $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/air_man_ap + $(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)/msposd-src/fonts/font_inav.png + $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/share/fonts $(@D)/msposd-src/fonts/font_inav_hd.png + $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/share/fonts $(@D)/msposd-src/fonts/font_btfl.png + $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/share/fonts $(@D)/msposd-src/fonts/font_btfl_hd.png + $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/share/fonts $(@D)/msposd-src/fonts/font_ardu.png + $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/share/fonts $(@D)/msposd-src/fonts/font_ardu_hd.png + if [ -n "$(APFPV_GREG10_PLATFORM_PAYLOAD)" ] && [ -d $(@D)/payload-src/payload/$(APFPV_GREG10_PLATFORM_PAYLOAD) ]; then \ + cp -a $(@D)/payload-src/payload/$(APFPV_GREG10_PLATFORM_PAYLOAD)/. $(TARGET_DIR)/; \ + fi + rm -f $(TARGET_DIR)/lib/modules/4.9.84/sigmastar/sensor_imx415_mipi.ko +endef + +define APFPV_GREG10_INSTALL_SIGMASTAR_LIBRARIES + $(INSTALL) -m 755 -d $(TARGET_DIR)/usr/lib + $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/lib $(APFPV_GREG10_MSPOSD_OSDRV)/files/lib/libcam_os_wrapper.so + $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/lib $(APFPV_GREG10_MSPOSD_OSDRV)/files/lib/libmi_rgn.so + $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/lib $(APFPV_GREG10_MSPOSD_OSDRV)/files/lib/libmi_sys.so +endef + +ifeq ($(OPENIPC_SOC_VENDOR),sigmastar) +APFPV_GREG10_POST_INSTALL_TARGET_HOOKS += APFPV_GREG10_INSTALL_SIGMASTAR_LIBRARIES +endif + +$(eval $(generic-package)) diff --git a/general/package/apfpv-greg10/files/S94idr b/general/package/apfpv-greg10/files/S94idr new file mode 100644 index 0000000000..1047bb0580 --- /dev/null +++ b/general/package/apfpv-greg10/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/apfpv-greg10/files/S991aalink b/general/package/apfpv-greg10/files/S991aalink new file mode 100644 index 0000000000..9480392155 --- /dev/null +++ b/general/package/apfpv-greg10/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/apfpv-greg10/files/S992air_man b/general/package/apfpv-greg10/files/S992air_man new file mode 100644 index 0000000000..e0fa8086f3 --- /dev/null +++ b/general/package/apfpv-greg10/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-greg10/files/S99msposd b/general/package/apfpv-greg10/files/S99msposd new file mode 100644 index 0000000000..bf654011f6 --- /dev/null +++ b/general/package/apfpv-greg10/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-greg10/files/libmedia.sh b/general/package/apfpv-greg10/files/libmedia.sh new file mode 100644 index 0000000000..7c6e11e2a7 --- /dev/null +++ b/general/package/apfpv-greg10/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 +} From 494ad1e20afe0a632c1a1cd86a08adb9e3b94787 Mon Sep 17 00:00:00 2001 From: sickgreg Date: Wed, 4 Mar 2026 09:42:14 +1100 Subject: [PATCH 11/14] Split APFPV Greg into component packages --- general/package/Config.in | 7 +- general/package/aalink-idr5/Config.in | 6 + general/package/aalink-idr5/aalink-idr5.mk | 39 ++++++ .../files/S94idr | 0 general/package/aalink/Config.in | 6 + general/package/aalink/aalink.mk | 41 ++++++ .../{apfpv-greg10 => aalink}/files/S991aalink | 0 general/package/air-man-ap/Config.in | 6 + general/package/air-man-ap/air-man-ap.mk | 42 ++++++ .../files/S992air_man | 0 general/package/apfpv-greg-msposd/Config.in | 8 ++ .../apfpv-greg-msposd/apfpv-greg-msposd.mk | 78 +++++++++++ .../files/S99msposd | 0 general/package/apfpv-greg-payload/Config.in | 8 ++ .../apfpv-greg-payload/apfpv-greg-payload.mk | 54 ++++++++ .../files/libmedia.sh | 0 general/package/apfpv-greg/Config.in | 13 ++ general/package/apfpv-greg/apfpv-greg.mk | 15 ++ general/package/apfpv-greg10/Config.in | 8 -- general/package/apfpv-greg10/apfpv-greg10.mk | 130 ------------------ 20 files changed, 322 insertions(+), 139 deletions(-) create mode 100644 general/package/aalink-idr5/Config.in create mode 100644 general/package/aalink-idr5/aalink-idr5.mk rename general/package/{apfpv-greg10 => aalink-idr5}/files/S94idr (100%) create mode 100644 general/package/aalink/Config.in create mode 100644 general/package/aalink/aalink.mk rename general/package/{apfpv-greg10 => aalink}/files/S991aalink (100%) create mode 100644 general/package/air-man-ap/Config.in create mode 100644 general/package/air-man-ap/air-man-ap.mk rename general/package/{apfpv-greg10 => air-man-ap}/files/S992air_man (100%) create mode 100644 general/package/apfpv-greg-msposd/Config.in create mode 100644 general/package/apfpv-greg-msposd/apfpv-greg-msposd.mk rename general/package/{apfpv-greg10 => apfpv-greg-msposd}/files/S99msposd (100%) create mode 100644 general/package/apfpv-greg-payload/Config.in create mode 100644 general/package/apfpv-greg-payload/apfpv-greg-payload.mk rename general/package/{apfpv-greg10 => apfpv-greg-payload}/files/libmedia.sh (100%) create mode 100644 general/package/apfpv-greg/Config.in create mode 100644 general/package/apfpv-greg/apfpv-greg.mk delete mode 100644 general/package/apfpv-greg10/Config.in delete mode 100644 general/package/apfpv-greg10/apfpv-greg10.mk diff --git a/general/package/Config.in b/general/package/Config.in index 201152ac69..13e8ebbd88 100644 --- a/general/package/Config.in +++ b/general/package/Config.in @@ -62,7 +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/apfpv-greg10/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/apfpv-greg10/files/S94idr b/general/package/aalink-idr5/files/S94idr similarity index 100% rename from general/package/apfpv-greg10/files/S94idr rename to general/package/aalink-idr5/files/S94idr 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/apfpv-greg10/files/S991aalink b/general/package/aalink/files/S991aalink similarity index 100% rename from general/package/apfpv-greg10/files/S991aalink rename to general/package/aalink/files/S991aalink 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/apfpv-greg10/files/S992air_man b/general/package/air-man-ap/files/S992air_man similarity index 100% rename from general/package/apfpv-greg10/files/S992air_man rename to general/package/air-man-ap/files/S992air_man 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-greg10/files/S99msposd b/general/package/apfpv-greg-msposd/files/S99msposd similarity index 100% rename from general/package/apfpv-greg10/files/S99msposd rename to general/package/apfpv-greg-msposd/files/S99msposd 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..6cd8a74f44 --- /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-greg10-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-greg10/files/libmedia.sh b/general/package/apfpv-greg-payload/files/libmedia.sh similarity index 100% rename from general/package/apfpv-greg10/files/libmedia.sh rename to general/package/apfpv-greg-payload/files/libmedia.sh 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)) diff --git a/general/package/apfpv-greg10/Config.in b/general/package/apfpv-greg10/Config.in deleted file mode 100644 index 4b1d541064..0000000000 --- a/general/package/apfpv-greg10/Config.in +++ /dev/null @@ -1,8 +0,0 @@ -config BR2_PACKAGE_APFPV_GREG10 - bool "apfpv-greg10" - default n - select BR2_PACKAGE_LIBEVENT_OPENIPC - help - Builds the custom APFPV Greg10 user-space stack from the configured - GitHub repos and installs the matching init scripts. - Local testing with private repos uses the authenticated gh CLI. diff --git a/general/package/apfpv-greg10/apfpv-greg10.mk b/general/package/apfpv-greg10/apfpv-greg10.mk deleted file mode 100644 index b0058b3bc6..0000000000 --- a/general/package/apfpv-greg10/apfpv-greg10.mk +++ /dev/null @@ -1,130 +0,0 @@ -################################################################################ -# -# apfpv-greg10 -# -################################################################################ - -APFPV_GREG10_SITE = $(patsubst %/,%,$(APFPV_GREG10_PKGDIR)) -APFPV_GREG10_SITE_METHOD = local -APFPV_GREG10_LICENSE = Mixed -APFPV_GREG10_GIT = $(shell command -v git 2>/dev/null) -APFPV_GREG10_REPO_BRANCH = main -APFPV_GREG10_AALINK_REPO = https://github.com/sickgreg/aalink.git -APFPV_GREG10_AALINK_IDR5_REPO = https://github.com/sickgreg/aalink_idr5.git -APFPV_GREG10_AIR_MAN_REPO = https://github.com/sickgreg/air_man_ap.git -APFPV_GREG10_MSPOSD_REPO = https://github.com/sickgreg/msposd.git -APFPV_GREG10_PAYLOAD_REPO = https://github.com/sickgreg/apfpv-greg10-package.git - -ifeq ($(OPENIPC_SOC_FAMILY),infinity6b0) - APFPV_GREG10_MSPOSD_FAMILY = star6b0 - APFPV_GREG10_MSPOSD_OSDRV = $(SIGMASTAR_OSDRV_INFINITY6B0_PKGDIR) -else ifeq ($(OPENIPC_SOC_FAMILY),infinity6c) - APFPV_GREG10_MSPOSD_FAMILY = star6c - APFPV_GREG10_MSPOSD_OSDRV = $(SIGMASTAR_OSDRV_INFINITY6C_PKGDIR) -else - APFPV_GREG10_MSPOSD_FAMILY = star6e - APFPV_GREG10_MSPOSD_OSDRV = $(SIGMASTAR_OSDRV_INFINITY6E_PKGDIR) -endif - -ifeq ($(OPENIPC_SOC_VENDOR),sigmastar) -APFPV_GREG10_PLATFORM_PAYLOAD = sigmastar-4.9.84 -endif - -define APFPV_GREG10_FETCH_REPOS - test -n "$(APFPV_GREG10_GIT)" || { \ - echo "git is required to build apfpv-greg10"; \ - exit 1; \ - } - rm -rf $(@D)/aalink-src $(@D)/aalink-idr5-src $(@D)/air-man-src $(@D)/msposd-src $(@D)/payload-src - $(APFPV_GREG10_GIT) clone --depth 1 --branch $(APFPV_GREG10_REPO_BRANCH) $(APFPV_GREG10_AALINK_REPO) $(@D)/aalink-src - $(APFPV_GREG10_GIT) clone --depth 1 --branch $(APFPV_GREG10_REPO_BRANCH) $(APFPV_GREG10_AALINK_IDR5_REPO) $(@D)/aalink-idr5-src - $(APFPV_GREG10_GIT) clone --depth 1 --branch $(APFPV_GREG10_REPO_BRANCH) $(APFPV_GREG10_AIR_MAN_REPO) $(@D)/air-man-src - $(APFPV_GREG10_GIT) clone --depth 1 --branch $(APFPV_GREG10_REPO_BRANCH) $(APFPV_GREG10_MSPOSD_REPO) $(@D)/msposd-src - $(APFPV_GREG10_GIT) clone --depth 1 --branch $(APFPV_GREG10_REPO_BRANCH) $(APFPV_GREG10_PAYLOAD_REPO) $(@D)/payload-src -endef - -APFPV_GREG10_PRE_CONFIGURE_HOOKS += APFPV_GREG10_FETCH_REPOS - -define APFPV_GREG10_BUILD_CMDS - $(TARGET_CC) $(TARGET_CFLAGS) -O2 -Wall -Wextra \ - -o $(@D)/aalink \ - $(@D)/aalink-src/aalink.c \ - $(TARGET_LDFLAGS) -lpthread -lm - $(TARGET_CC) $(TARGET_CFLAGS) -O2 -Wall -Wextra \ - -o $(@D)/aalink_idr5 \ - $(@D)/aalink-idr5-src/aalink_idr5.c \ - $(TARGET_LDFLAGS) - $(TARGET_CC) $(TARGET_CFLAGS) -O2 -Wall -Wextra -pthread \ - -o $(@D)/air_man_ap \ - $(@D)/air-man-src/air_man_ap.c \ - $(TARGET_LDFLAGS) - $(MAKE) \ - CC="$(TARGET_CC)" \ - TOOLCHAIN="$(STAGING_DIR)" \ - DRV="$(APFPV_GREG10_MSPOSD_OSDRV)/files/lib" \ - $(APFPV_GREG10_MSPOSD_FAMILY) \ - OUTPUT="$(@D)/msposd" \ - -C $(@D)/msposd-src -endef - -define APFPV_GREG10_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 - 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 - - $(INSTALL) -m 755 -d $(TARGET_DIR)/etc - $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(@D)/aalink-src/aalink.conf - $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(@D)/msposd-src/vtxmenu.ini - - $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d - $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(APFPV_GREG10_PKGDIR)/files/libmedia.sh - $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(APFPV_GREG10_PKGDIR)/files/S94idr - $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(APFPV_GREG10_PKGDIR)/files/S991aalink - $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(APFPV_GREG10_PKGDIR)/files/S992air_man - $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(APFPV_GREG10_PKGDIR)/files/S99msposd - - $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/sensors - $(INSTALL) -m 644 -t $(TARGET_DIR)/etc/sensors $(@D)/air-man-src/modes_imx335.ini - $(INSTALL) -m 644 -t $(TARGET_DIR)/etc/sensors $(@D)/air-man-src/modes_imx415.ini - - $(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin - $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/aalink - $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/aalink_idr5 - $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/air_man_ap - $(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)/msposd-src/fonts/font_inav.png - $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/share/fonts $(@D)/msposd-src/fonts/font_inav_hd.png - $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/share/fonts $(@D)/msposd-src/fonts/font_btfl.png - $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/share/fonts $(@D)/msposd-src/fonts/font_btfl_hd.png - $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/share/fonts $(@D)/msposd-src/fonts/font_ardu.png - $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/share/fonts $(@D)/msposd-src/fonts/font_ardu_hd.png - if [ -n "$(APFPV_GREG10_PLATFORM_PAYLOAD)" ] && [ -d $(@D)/payload-src/payload/$(APFPV_GREG10_PLATFORM_PAYLOAD) ]; then \ - cp -a $(@D)/payload-src/payload/$(APFPV_GREG10_PLATFORM_PAYLOAD)/. $(TARGET_DIR)/; \ - fi - rm -f $(TARGET_DIR)/lib/modules/4.9.84/sigmastar/sensor_imx415_mipi.ko -endef - -define APFPV_GREG10_INSTALL_SIGMASTAR_LIBRARIES - $(INSTALL) -m 755 -d $(TARGET_DIR)/usr/lib - $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/lib $(APFPV_GREG10_MSPOSD_OSDRV)/files/lib/libcam_os_wrapper.so - $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/lib $(APFPV_GREG10_MSPOSD_OSDRV)/files/lib/libmi_rgn.so - $(INSTALL) -m 644 -t $(TARGET_DIR)/usr/lib $(APFPV_GREG10_MSPOSD_OSDRV)/files/lib/libmi_sys.so -endef - -ifeq ($(OPENIPC_SOC_VENDOR),sigmastar) -APFPV_GREG10_POST_INSTALL_TARGET_HOOKS += APFPV_GREG10_INSTALL_SIGMASTAR_LIBRARIES -endif - -$(eval $(generic-package)) From 55eaf0d041935fdef48afbd8017749145b8be564 Mon Sep 17 00:00:00 2001 From: sickgreg Date: Wed, 4 Mar 2026 09:49:34 +1100 Subject: [PATCH 12/14] Restore wifibroadcast-ng to upstream state --- .../package/wifibroadcast-ng/files/S99air_man | 47 --- .../package/wifibroadcast-ng/files/air_man | Bin 27588 -> 0 bytes .../wifibroadcast-ng/files/air_man_cmd.sh | 348 ------------------ .../package/wifibroadcast-ng/files/wfb.yaml | 7 +- .../wifibroadcast-ng/files/wifibroadcast | 66 +++- .../wifibroadcast-ng/files/wlan_adapters.yaml | 151 -------- .../wifibroadcast-ng/files/yaml-cli-multi | Bin 18464 -> 0 bytes .../sensor/imx335_infinity6c.bin | Bin 0 -> 137832 bytes .../{imx335_fpv.bin => imx335_infinity6e.bin} | Bin .../sensor/imx415_infinity6c.bin | Bin 0 -> 143490 bytes .../{imx415_fpv.bin => imx415_infinity6e.bin} | Bin .../wifibroadcast-ng/sensor/modes_imx335.ini | 81 ---- .../wifibroadcast-ng/sensor/modes_imx415.ini | 102 ----- .../wifibroadcast-ng/wifibroadcast-ng.mk | 8 +- 14 files changed, 61 insertions(+), 749 deletions(-) delete mode 100644 general/package/wifibroadcast-ng/files/S99air_man delete mode 100644 general/package/wifibroadcast-ng/files/air_man delete mode 100644 general/package/wifibroadcast-ng/files/air_man_cmd.sh delete mode 100644 general/package/wifibroadcast-ng/files/wlan_adapters.yaml delete mode 100644 general/package/wifibroadcast-ng/files/yaml-cli-multi create mode 100644 general/package/wifibroadcast-ng/sensor/imx335_infinity6c.bin rename general/package/wifibroadcast-ng/sensor/{imx335_fpv.bin => imx335_infinity6e.bin} (100%) create mode 100644 general/package/wifibroadcast-ng/sensor/imx415_infinity6c.bin rename general/package/wifibroadcast-ng/sensor/{imx415_fpv.bin => imx415_infinity6e.bin} (100%) delete mode 100644 general/package/wifibroadcast-ng/sensor/modes_imx335.ini delete mode 100644 general/package/wifibroadcast-ng/sensor/modes_imx415.ini diff --git a/general/package/wifibroadcast-ng/files/S99air_man b/general/package/wifibroadcast-ng/files/S99air_man deleted file mode 100644 index 4f28714759..0000000000 --- a/general/package/wifibroadcast-ng/files/S99air_man +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh - -DAEMON="air_man" -PIDFILE="/var/run/$DAEMON.pid" -DAEMON_ARGS="" - -start() { - echo -n "Starting $DAEMON: " - start-stop-daemon -b -m -S -q -p "$PIDFILE" -x "$DAEMON" -- $DAEMON_ARGS - if [ $? -eq 0 ]; then - echo "OK" - else - echo "FAIL" - fi -} - -stop() { - echo -n "Stopping $DAEMON: " - start-stop-daemon -K -q -p "$PIDFILE" - if [ $? -eq 0 ]; then - rm -f "$PIDFILE" - echo "OK" - else - echo "FAIL" - fi -} - -case "$1" in - start|stop) - $1 - ;; - - restart) - stop - sleep 3 - start - ;; - - reload) - killall -1 "$DAEMON" - ;; - - *) - echo "Usage: $0 {start|stop|restart|reload}" - exit 1 - ;; -esac diff --git a/general/package/wifibroadcast-ng/files/air_man b/general/package/wifibroadcast-ng/files/air_man deleted file mode 100644 index 071c09df1e114ffe2e706d7f10ddbc0e0ca30e36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27588 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/dev/null 2>&1 & - ;; - "set air telemetry router"*) - wifibroadcast cli -s .telemetry.router "$5" - (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & - ;; - "set air telemetry osd_fps"*) - wifibroadcast cli -s .telemetry.osd_fps "$5" - (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & - ;; - "set air telemetry gs_rendering"*) - if [ "$5" = "on" ]; then - sed -i 's/-o 127\.0\.0\.1:\"\$port_tx\" -z \"\$size\"/-o 10\.5\.0\.1:\"\$port_tx\"/' /usr/bin/wifibroadcast - else - sed -i 's/-o 10\.5\.0\.1:\"\$port_tx\"/-o 127\.0\.0\.1:\"\$port_tx\" -z \"\$size\"/' /usr/bin/wifibroadcast - fi - (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & - ;; - - "get air wfbng power") - wifibroadcast cli -g .wireless.txpower - ;; - "get air wfbng air_channel") - channel=$(wifibroadcast cli -g .wireless.channel | tr -d '\n') - iw list | grep "\[$channel\]" | tr -d '[]' | awk '{print $4 " (" $2 " " $3 ")"}' | sort -n | uniq | tr -d '\n' - ;; - "get air wfbng width") - wifibroadcast cli -g .wireless.width - ;; - "get air wfbng mcs_index") - wifibroadcast cli -g .broadcast.mcs_index - ;; - "get air wfbng stbc") - wifibroadcast cli -g .broadcast.stbc - ;; - "get air wfbng ldpc") - wifibroadcast cli -g .broadcast.ldpc - ;; - "get air wfbng fec_k") - wifibroadcast cli -g .broadcast.fec_k - ;; - "get air wfbng fec_n") - wifibroadcast cli -g .broadcast.fec_n - ;; - "get air wfbng adaptivelink") - grep ^alink_drone /etc/rc.local | grep -q 'alink_drone' && echo 1 || echo 0 - ;; - - "set air wfbng power"*) - wifibroadcast cli -s .wireless.txpower "$5" - (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & - ;; - "set air wfbng air_channel"*) - channel=$(echo "$5" | awk '{print $1}') - wifibroadcast cli -s .wireless.channel "$channel" - (wifibroadcast stop; sleep 1; wifibroadcast start) >/dev/null 2>&1 & - sed -i "s/^wifi_channel =.*/wifi_channel = $channel/" /etc/wifibroadcast.cfg - systemctl restart wifibroadcast.service - ;; - "set air wfbng width"*) - wifibroadcast cli -s .wireless.width "$5" - (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & - ;; - "set air wfbng mcs_index"*) - wifibroadcast cli -s .broadcast.mcs_index "$5" - (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & - ;; - "set air wfbng stbc"*) - if [ "$5" = "on" ]; then - wifibroadcast cli -s .broadcast.stbc 1 - else - wifibroadcast cli -s .broadcast.stbc 0 - fi - (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & - ;; - "set air wfbng ldpc"*) - if [ "$5" = "on" ]; then - wifibroadcast cli -s .broadcast.ldpc 1 - else - wifibroadcast cli -s .broadcast.ldpc 0 - fi - (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & - ;; - "set air wfbng fec_k"*) - wifibroadcast cli -s .broadcast.fec_k "$5" - (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & - ;; - "set air wfbng fec_n"*) - wifibroadcast cli -s .broadcast.fec_n "$5" - (wifibroadcast stop; wifibroadcast start) >/dev/null 2>&1 & - ;; - "set air wfbng adaptivelink"*) - if [ "$5" = "on" ]; then - sed -i "/alink_drone &/d" /etc/rc.local - sed -i -e "\$i alink_drone &" /etc/rc.local - cli -s .video0.qpDelta -12 && killall -1 majestic - nohup alink_drone >/dev/null 2>&1 & - else - killall -q -9 alink_drone - sed -i "/alink_drone &/d" /etc/rc.local - cli -d .video0.qpDelta && killall -1 majestic - fi - ;; - *) - echo "Unknown $@" - exit 1 - ;; -esac - -case $? in - 0) ;; - 1) exit 0 ;; - *) exit $? ;; -esac diff --git a/general/package/wifibroadcast-ng/files/wfb.yaml b/general/package/wifibroadcast-ng/files/wfb.yaml index 3b5dbcc18c..a92b1b6bf2 100644 --- a/general/package/wifibroadcast-ng/files/wfb.yaml +++ b/general/package/wifibroadcast-ng/files/wfb.yaml @@ -3,8 +3,6 @@ wireless: channel: 161 width: 20 mlink: 1500 - wlan_adapter: default - link_control: alink broadcast: mcs_index: 2 tun_index: 1 @@ -15,8 +13,5 @@ broadcast: link_id: 7669206 telemetry: router: msposd - downlink: tunnel - port_rx: 14550 - port_tx: 14551 serial: ttyS2 - osd_fps: 1006 + osd_fps: 20 diff --git a/general/package/wifibroadcast-ng/files/wifibroadcast b/general/package/wifibroadcast-ng/files/wifibroadcast index c12b9e6cf1..5165961763 100755 --- a/general/package/wifibroadcast-ng/files/wifibroadcast +++ b/general/package/wifibroadcast-ng/files/wifibroadcast @@ -24,6 +24,7 @@ load_config() { } load_modules() { + adapter_id="" for card in $(lsusb | awk '{print $6}' | uniq); do case "$card" in "0bda:8812" | "0bda:881a" | "0b05:17d2" | "2357:0101" | "2604:0012") @@ -32,10 +33,12 @@ load_modules() { "0bda:a81a") driver=8812eu + adapter_id="bl-m8812eu2" ;; "0bda:f72b" | "0bda:b733") driver=8733bu + adapter_id="bl-m8731bu4" ;; esac done @@ -54,13 +57,19 @@ load_modules() { opt2="rtw_tx_pwr_lmt_enable=0" fi - modprobe "$driver" "$opt1" "$opt2" + + modprobe "$driver" "$opt1" "$opt2" MaxTxBufLen=32 sleep 3 if ! ifconfig "$wfb_dev" up; then echo_log "Wireless driver not found!" exit 1 fi + + # Set .wireless.wlan_adapter in /etc/wfb.yaml if adapter_id is set + if [ -n "$adapter_id" ]; then + yaml-cli-multi -i /etc/wfb.yaml -s .wireless.wlan_adapter "$adapter_id" + fi } load_mlink() { @@ -93,7 +102,7 @@ load_wfb() { start_broadcast() { echo_log "Starting wfb_tx" wfb_tx -K "$wfb_key" -M "$mcs_index" -B "$width" -k "$fec_k" -n "$fec_n" -U rtp_local \ - -S "$stbc" -L "$ldpc" -i "$link_id" -C 8000 "$wfb_dev" &> /dev/null & + -S "$stbc" -L "$ldpc" -i "$link_id" -C 8000 -J 10 -E 5000 "$wfb_dev" &> /dev/null & } start_tunnel() { @@ -121,23 +130,66 @@ start_telemetry() { fi msposd -b 115200 -c 8 -r "$osd_fps" -m /dev/"$serial" \ -o 127.0.0.1:"$port_tx" -z "$size" > /dev/null & + + sleep 5 + echo "&L70&F28&G8CPU:&C TEMP:&T\n&B" >/tmp/MSPOSD.msg fi } video_settings() { + for card in $(lsusb | awk '{print $6}' | uniq); do + case "$card" in + "0bda:8812" | "0bda:881a" | "0b05:17d2" | "2357:0101" | "2604:0012") + driver=88XXau + wifibroadcast cli -s .wireless.txpower 20 + wifibroadcast cli -s .wireless.wlan_adapter bl-r8812af1 + wifibroadcast cli -s .broadcast.stbc 1 + wifibroadcast cli -s .broadcast.ldpc 1 + ;; + + "0bda:a81a") + driver=8812eu + wifibroadcast cli -s .wireless.txpower 40 + wifibroadcast cli -s .wireless.wlan_adapter bl-m8812eu2 + wifibroadcast cli -s .broadcast.stbc 1 + wifibroadcast cli -s .broadcast.ldpc 1 + ;; + + "0bda:f72b" | "0bda:b733") + driver=8733bu + wifibroadcast cli -s .wireless.txpower 20 + wifibroadcast cli -s .wireless.wlan_adapter bl-m8731bu4 + wifibroadcast cli -s .broadcast.stbc 0 + wifibroadcast cli -s .broadcast.ldpc 0 + ;; + esac + done + sensor=$(ipcinfo -s) - cli -s .isp.sensorConfig /etc/sensors/"$sensor"_fpv.bin - cli -s .isp.exposure 5 + family=$(ipcinfo -f) + + cli -s .isp.sensorConfig /etc/sensors/"$sensor"_"$family".bin + cli -s .isp.exposure 16 cli -s .video0.fps 60 - cli -s .video0.bitrate 8192 + cli -s .video0.bitrate 8000 cli -s .video0.codec h265 cli -s .video0.rcMode cbr cli -s .outgoing.enabled true cli -s .outgoing.wfb true - cli -s .fpv.enabled true - cli -s .fpv.noiseLevel 1 cli -s .records.split 1 cli -s .records.notime true + cli -s .fpv.enabled true + cli -s .fpv.noiseLevel 0 + + wifibroadcast cli -s .wireless.mlink 3994 + wifibroadcast cli -s .wireless.link_control alink + sed -i '/alink_drone &/d' /etc/rc.local && sed -i -e '$i alink_drone &' /etc/rc.local + + if [ "$sensor" = "imx335" ]; then + cli -s .video0.size 1920x1440 + else + cli -s .video0.size 1920x1080 + fi } start() { diff --git a/general/package/wifibroadcast-ng/files/wlan_adapters.yaml b/general/package/wifibroadcast-ng/files/wlan_adapters.yaml deleted file mode 100644 index a07ceb23e3..0000000000 --- a/general/package/wifibroadcast-ng/files/wlan_adapters.yaml +++ /dev/null @@ -1,151 +0,0 @@ -all_profiles: [bl-r8812af1,bl-m8812eu2,bl-m8731bu4,default] -profiles: - bl-r8812af1: - description: "Not tested with instruments yet." - bw: [20,40] - stbc: [0,1] - ldpc_rx: [0,1] - ldpc_tx: [0,1] - guard: [long,short] - mcs: [0,1,2,3,4,5,6,7] - max_mtu: 3993 - tx_power: - mcs0: [-1000,-2500,-3750,-4000,-4500] - mcs1: [-1000,-2500,-3500,-4000,-4400] - mcs2: [-1000,-2500,-3000,-4000,-4300] - mcs3: [-1000,-2500,-3000,-3500,-4000] - mcs4: [-1000,-2000,-2750,-3000,-3500] - mcs5: [-1000,-2000,-2750,-2750,-3000] - mcs6: [-1000,-2000,-2500,-2750,-3000] - mcs7: [-1000,-2000,-2500,-2750,-3000] - pwr_mw: - 0: [1mW,1mW,1mW,1mW,1mW,1mW,1mW,1mW] - 1: [25mW,25mW,25mW,25mW,25mW,25mW,25mW,25mW] - 2: [40W,40mW,40mW,30mW,30mW,30mW,30mW,30mW] - 3: [70mW,70mW,70mW,60mW,60mW,60mW,50mW,50mW] - 4: [100mW,100mW,100mW,90mW,90mW,80mW,80mW,70mW] - link_modes: - 20mhz: [mcs0_20mhz_lgi, mcs1_20mhz_lgi, mcs2_20mhz_lgi, mcs3_20mhz_lgi, mcs4_20mhz_sgi, mcs5_20mhz_sgi] - 40mhz: [mcs1_40mhz_lgi, mcs2_40mhz_lgi, mcs3_40mhz_lgi, mcs4_40mhz_sgi, mcs5_40mhz_sgi] - bl-m8812eu2: - description: "Not tested with instruments yet." - bw: [10,20] - stbc: [0,1] - ldpc_rx: [0,1] - ldpc_tx: [0,1] - guard: [long,short] - mcs: [0,1,2,3,4,5,6,7] - max_mtu: 3993 - tx_power: - mcs0: [5,1200,1600,2500,2900] - mcs1: [5,1200,1600,2500,2800] - mcs2: [5,1200,1700,2250,2250] - mcs3: [5,1200,1800,2000,2000] - mcs4: [5,1200,1750,1750,1800] - mcs5: [5,1200,1750,1750,1700] - mcs6: [5,1200,1500,1500,1600] - mcs7: [5,1200,1450,1500,1600] - pwr_mw: - 0: [1mW,1mW,1mW,1mW,1mW,1mW,1mW,1mW] - 1: [25mW, 25mW,25mW,25mW,25mW,25mW,25mW,25mW] - 2: [400mW,400mW,400mW,400mW,400mW,400mW,400mW,350mW] - 3: [600mW,600mW,600mW,600mW,500mW,400mW,400mW,350mW] - 4: [800mW,800mW,700mW,700mW,550mW,425mW,425mW,375mW] - link_modes: - 10mhz: [mcs0_10mhz_lgi, mcs1_10mhz_lgi, mcs2_10mhz_lgi, mcs2_10mhz_sgi, mcs3_10mhz_lgi, mcs3_10mhz_sgi] - 20mhz: [mcs0_20mhz_lgi, mcs1_20mhz_lgi, mcs2_20mhz_lgi, mcs3_20mhz_lgi, mcs4_20mhz_sgi, mcs5_20mhz_sgi] - channels: - 10: - dfs: [100,104,108,112,116,120,124,128,132,136,140,144] - non-dfs: [36,40,44,48,149,153,157,161,165] - 20: - dfs: [100,104,108,112,116,120,124,128,132,136,140,144] - non-dfs: [36,40,44,48,149,153,157,161,165] - presets: - all_presets: [long_range, medium_range,short_range,cinematic] - long_range: - description: "Long range datalink profile with low bitrate and high resilience. Recommended for 30-60fps video or for challenging enviroments." - video_bitrate: 4096 - link_mode: mcs1_20mhz_lgi - fec_k: 4 - fec_n: 6 - mlink: 1200 - recommended_diversity: [1,2,3,4] - medium_range: - description: "Medium range datalink profile with medium bitrate and medium resilience." - video_bitrate: 8192 - link_mode: mcs2_20mhz_lgi - fec_k: 8 - fec_n: 12 - mlink: 2000 - recommended_diversity: [1,2,3,4] - short_range: - description: "Short range datalink profile with medium-high bitrate and medium resilience." - video_bitrate: 12288 - link_mode: mcs3_20mhz_lgi - fec_k: 8 - fec_n: 12 - mlink: 2400 - recommended_diversity: [2,3,4] - cinematic: - description: "Very short range datalink profile with high bitrate and low resilience." - video_bitrate: 22600 - link_mode: mcs5_20mhz_sgi - fec_k: 4 - fec_n: 6 - mlink: 3200 - recommended_diversity: [3,4] - bl-m8731bu4: - description: "Tested with real instruments and mapped." - bw: [10,20,40] - stbc: [0] - ldpc_rx: [0] - ldpc_tx: [0,1] - guard: [long,short] - mcs: [0,1,2,3,4,5,6,7] - max_mtu: 3993 - tx_power: - mcs0: [50, 1300, 1800, 2250, 2500] - mcs1: [50, 1400, 1800, 2250, 2500] - mcs2: [50, 1600, 1800, 2250, 2250] - mcs3: [50, 1750, 1750, 1750, 1750] - mcs4: [50, 1750, 1750, 1750, 1750] - mcs5: [50, 1750, 1750, 1750, 1750] - mcs6: [50, 1750, 1750, 1750, 1750] - mcs7: [50, 1500, 1500, 1500, 1500] - pwr_mw: - 0: [1mW, 1mW, 1mW, 1mW, 1mW, 1mW, 1mW, 1mW] - 1: [25mW, 25mW, 25mW, 25mW, 25mW, 16mW, 13mW, 8mW] - 2: [80mW, 66mW, 58mW, 25mW, 25mW, 16mW, 13mW, 8mW] - 3: [158mW, 148mW, 79mW, 25mW, 25mW, 16mW, 13mW, 8mW] - 4: [213mW, 200mW, 79mW, 25mW, 25mW, 16mW, 13mW, 8mW] - link_modes: - 10mhz: [mcs0_10mhz_lgi, mcs1_10mhz_lgi, mcs2_10mhz_lgi, mcs2_10mhz_sgi, mcs3_10mhz_lgi, mcs3_10mhz_sgi] - 20mhz: [mcs0_20mhz_lgi, mcs1_20mhz_lgi, mcs2_20mhz_lgi, mcs3_20mhz_lgi, mcs4_20mhz_sgi, mcs5_20mhz_sgi] - 40mhz: [mcs1_40mhz_lgi, mcs2_40mhz_lgi, mcs3_40mhz_lgi, mcs4_40mhz_sgi, mcs5_40mhz_sgi] - default: - description: "Default burnproof profile. Change to your correct profile." - bw: [20] - stbc: [0] - ldpc_rx: [0] - ldpc_tx: [0] - guard: [long] - mcs: [0,1,2] - max_mtu: 1500 - tx_power: - mcs0: [50] - mcs1: [50] - mcs2: [50] - mcs3: [50] - mcs4: [50] - mcs5: [50] - mcs6: [50] - mcs7: [50] - pwr_mw: - 0: 1mW - 1: 1mW - 2: 1mW - 3: 1mW - 4: 1mW - link_modes: - 20mhz: [mcs0_20mhz_lgi, mcs1_20mhz_lgi, mcs2_20mhz_lgi, mcs3_20mhz_lgi, mcs4_20mhz_sgi, mcs5_20mhz_sgi] diff --git a/general/package/wifibroadcast-ng/files/yaml-cli-multi b/general/package/wifibroadcast-ng/files/yaml-cli-multi deleted file mode 100644 index 3e813c2ece936bd13b242c742df49b281a6045e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18464 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 QG@Wl>18mtMf@Wp^H%yDxVE_OC diff --git a/general/package/wifibroadcast-ng/sensor/imx335_infinity6c.bin b/general/package/wifibroadcast-ng/sensor/imx335_infinity6c.bin new file mode 100644 index 0000000000000000000000000000000000000000..57220303362c265f973c15ed9a20af06cb775290 GIT binary patch literal 137832 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 HB;@}AHKBdP literal 0 HcmV?d00001 diff --git a/general/package/wifibroadcast-ng/sensor/imx335_fpv.bin b/general/package/wifibroadcast-ng/sensor/imx335_infinity6e.bin similarity index 100% rename from general/package/wifibroadcast-ng/sensor/imx335_fpv.bin rename to general/package/wifibroadcast-ng/sensor/imx335_infinity6e.bin diff --git a/general/package/wifibroadcast-ng/sensor/imx415_infinity6c.bin b/general/package/wifibroadcast-ng/sensor/imx415_infinity6c.bin new file mode 100644 index 0000000000000000000000000000000000000000..a54e1a7be5bea95a7fa42a90d4412bc6603890be GIT binary patch literal 143490 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 literal 0 HcmV?d00001 diff --git a/general/package/wifibroadcast-ng/sensor/imx415_fpv.bin b/general/package/wifibroadcast-ng/sensor/imx415_infinity6e.bin similarity index 100% rename from general/package/wifibroadcast-ng/sensor/imx415_fpv.bin rename to general/package/wifibroadcast-ng/sensor/imx415_infinity6e.bin diff --git a/general/package/wifibroadcast-ng/sensor/modes_imx335.ini b/general/package/wifibroadcast-ng/sensor/modes_imx335.ini deleted file mode 100644 index ab06eef216..0000000000 --- a/general/package/wifibroadcast-ng/sensor/modes_imx335.ini +++ /dev/null @@ -1,81 +0,0 @@ -;imx335 -[MODES] -; 4:3 -; 60fps - -"4:3 720p 60" = "960x720 60 16 'nocrop'" -"4:3 720p 60 50HzAC" = "960x720 60 10 'nocrop'" - -"4:3 960p 60" = "1280x960 60 16 'nocrop'" -"4:3 960p 60 50HzAC" = "1280x960 60 10 'nocrop'" - -"4:3 1080p 60" = "1440x1080 60 16 'nocrop'" -"4:3 1080p 60 50HzAC" = "1440x1080 60 10 'nocrop'" - -"4:3 1440p 60" = "1920x1440 60 16 'nocrop'" -"4:3 1440p 60 50HzAC" = "1920x1440 60 10 'nocrop'" - -"4:3 1920p 60" = "2560x1920 60 16 'nocrop'" -"4:3 1920p 60 50HzAC" = "2560x1920 60 10 'nocrop'" - - -; 4:3 -; 90fps -"4:3 720p 90" = "960x720 90 11 '0 0 320 0 1920 1440'" -"4:3 720p 90 50HzAC" = "960x720 90 10 '0 0 320 0 1920 1440'" - -"4:3 960p 90" = "1280x960 90 11 '0 0 320 0 1920 1440'" -"4:3 960p 90 50HzAC" = "1280x960 90 10 '0 0 320 0 1920 1440'" - -"4:3 1080p 90" = "1440x1080 90 11 '0 0 320 0 1920 1440'" -"4:3 1080p 90 50HzAC" = "1440x1080 90 10 '0 0 320 0 1920 1440'" - -"4:3 1440p 90" = "1920x1440 90 11 '0 0 320 0 1920 1440'" -"4:3 1440p 90 50HzAC" = "1920x1440 90 10 '0 0 320 0 1920 1440'" - -; 4:3 -; 120fps super crop -"4:3 540p 120" = "720x540 120 8 '0 0 240 0 1440 1080'" -"4:3 720p 120" = "960x720 120 8 '0 0 240 0 1440 1080'" -"4:3 960p 120" = "1280x960 120 8 '0 0 240 0 1440 1080'" -"4:3 1080p 120" = "1440x1080 120 8 '0 0 240 0 1440 1080'" - - -; 16:9 modes -; 60fps -"16:9 540p 60" = "960x540 60 16 '0 0 0 240 2560 1440'" -"16:9 540p 60 50HzAC" = "960x540 60 10 '0 0 0 240 2560 1440'" - -"16:9 720p 60" = "1280x720 60 16 '0 0 0 240 2560 1440'" -"16:9 720p 60 50HzAC" = "1280x720 60 10 '0 0 0 240 2560 1440'" - -"16:9 1080p 60" = "1920x1080 60 16 '0 0 0 240 2560 1440'" -"16:9 1080p 60 50HzAC" = "1920x1080 60 10 '0 0 0 240 2560 1440'" - -"16:9 1440p 60" = "2560x1440 60 16 '0 0 0 240 2560 1440'" -"16:9 1440p 60 50HzAC" = "2560x1440 60 10 '0 0 0 240 2560 1440'" - - -; 16:9 -; 90fps -"16:9 540p 90" = "960x540 90 11 'nocrop'" -"16:9 540p 90 50HzAC" = "960x540 90 10 'nocrop'" - - -"16:9 720p 90" = "1280x720 90 11 'nocrop'" -"16:9 720p 90 50HzAC" = "1280x720 90 10 'nocrop'" - - -"16:9 1080p 90" = "1920x1080 90 11 'nocrop'" -"16:9 1080p 90 50HzAC" = "1920x1080 90 10 'nocrop'" - - -"16:9 1344p 90" = "2400x1344 90 11 'nocrop'" -"16:9 1344p 90 50HzAC" = "2400x1344 90 10 'nocrop'" - - -; 16:9 -; 120fps -"16:9 540p 120" = "960x540 120 8 'nocrop'" -"16:9 720p 120" = "1280x720 120 8 'nocrop'" -"16:9 1080p 120" = "1920x1080 120 8 'nocrop'" diff --git a/general/package/wifibroadcast-ng/sensor/modes_imx415.ini b/general/package/wifibroadcast-ng/sensor/modes_imx415.ini deleted file mode 100644 index b107d39c7b..0000000000 --- a/general/package/wifibroadcast-ng/sensor/modes_imx415.ini +++ /dev/null @@ -1,102 +0,0 @@ -[MODES] -; imx415 - -; 16:9 modes -"16:9 720p 30" = "1280x720 30 33 'nocrop'" -"16:9 720p 30 50HzAC" = "1280x720 30 10 'nocrop'" - -"16:9 1080p 30" = "1920x1080 30 33 'nocrop'" -"16:9 1080p 30 50HzAC" = "1920x1080 30 10 'nocrop'" - -"16:9 1440p 30" = "2560x1440 30 33 'nocrop'" -"16:9 1440p 30 50HzAC" = "2560x1440 30 10 'nocrop'" - -"16:9 4k 2160p 30" = "3840x2160 30 33 'nocrop'" -"16:9 4k 2160p 30 50HzAC" = "3840x2160 30 10 'nocrop'" - - -"16:9 540p 60" = "960x540 60 16 'nocrop'" -"16:9 540p 60 50HzAC" = "960x540 60 10 'nocrop'" - -"16:9 720p 60" = "1280x720 60 16 'nocrop'" -"16:9 720p 60 50HzAC" = "1280x720 60 10 'nocrop'" - -"16:9 1080p 60" = "1920x1080 60 16 'nocrop'" -"16:9 1080p 60 50HzAC" = "1920x1080 60 10 'nocrop'" - -"16:9 1440p 60" = "2560x1440 60 16 'nocrop'" -"16:9 1440p 60 50HzAC" = "2560x1440 60 10 'nocrop'" - -"16:9 1688p 60" = "3000x1688 60 16 'nocrop'" -"16:9 1688p 60 50HzAC" = "3000x1688 60 10 'nocrop'" - -"16:9 540p 90" = "960x540 90 11 'nocrop'" -"16:9 540p 90 50HzAC" = "960x540 90 10 'nocrop'" - - -"16:9 720p 90" = "1280x720 90 11 'nocrop'" -"16:9 720p 90 50HzAC" = "1280x720 90 10 'nocrop'" - - -"16:9 1080p 90" = "1920x1080 90 11 'nocrop'" -"16:9 1080p 90 50HzAC" = "1920x1080 90 10 'nocrop'" - - -"16:9 540p 120" = "960x540 120 8 'nocrop'" -"16:9 720p 120" = "1280x720 120 8 'nocrop'" -"16:9 816p 120" = "1472x816 120 8 'nocrop'" - - -; 4:3 modes (60fps — crop from 3000x1688 → 2248x1688)(30fps 3840x2160 -> 2880x2160) - - -"4:3 720p 30" = "960x720 30 33 '0 0 480 0 2880 2160'" -"4:3 720p 30 50HzAC" = "960x720 30 10 '0 0 480 0 2880 2160'" - -"4:3 960p 30" = "1280x960 30 33 '0 0 480 0 2880 2160'" -"4:3 960p 30 50HzAC" = "1280x960 30 10 '0 0 480 0 2880 2160'" - -"4:3 1080p 30" = "1440x1080 30 33 '0 0 480 0 2880 2160'" -"4:3 1080p 30 50HzAC" = "1440x1080 30 10 '0 0 480 0 2880 2160'" - -"4:3 1440p 30" = "1920x1440 30 33 '0 0 480 0 2880 2160'" -"4:3 1440p 30 50HzAC" = "1920x1440 30 10 '0 0 480 0 2880 2160'" - -"4:3 2160p 30" = "2880x2160 30 33 '0 0 480 0 2880 2160'" -"4:3 2160p 30 50HzAC" = "2880x2160 30 10 '0 0 480 0 2880 2160'" - - - -"4:3 720p 60" = "960x720 60 16 '0 0 376 0 2248 1688'" -"4:3 720p 60 50HzAC" = "960x720 60 10 '0 0 376 0 2248 1688'" - -"4:3 960p 60" = "1280x960 60 16 '0 0 376 0 2248 1688'" -"4:3 960p 60 50HzAC" = "1280x960 60 10 '0 0 376 0 2248 1688'" - -"4:3 1080p 60" = "1440x1080 60 16 '0 0 376 0 2248 1688'" -"4:3 1080p 60 50HzAC" = "1440x1080 60 10 '0 0 376 0 2248 1688'" - -"4:3 1440p 60" = "1920x1440 60 16 '0 0 376 0 2248 1688'" -"4:3 1440p 60 50HzAC" = "1920x1440 60 10 '0 0 376 0 2248 1688'" - -"4:3 1688p 60" = "2248x1688 60 16 '0 0 376 0 2248 1688'" -"4:3 1688p 60 50HzAC" = "2248x1688 60 10 '0 0 376 0 2248 1688'" - - -; 4:3 modes (90fps crop) -"4:3 720p 90" = "960x720 90 11 '0 0 240 0 1440 1080'" -"4:3 720p 90 50HzAC" = "960x720 90 10 '0 0 240 0 1440 1080'" - - -"4:3 960p 90" = "1280x960 90 11 '0 0 240 0 1440 1080'" -"4:3 960p 90 50HzAC" = "1280x960 90 10 '0 0 240 0 1440 1080'" - - -"4:3 1080p 90" = "1440x1080 90 11 '0 0 240 0 1440 1080'" -"4:3 1080p 90 50HzAC" = "1440x1080 90 10 '0 0 240 0 1440 1080'" - -; 4:3 120 super cropped - -"4:3 540p 120" = "720x540 120 8 '0 0 184 0 1104 816'" -"4:3 720p 120" = "960x720 120 8 '0 0 184 0 1104 816'" -"4:3 816p 120" = "1104x816 120 8 '0 0 184 0 1104 816'" diff --git a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk index c9f0feb333..382a1b5b09 100644 --- a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk +++ b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk @@ -4,7 +4,7 @@ # ################################################################################ -WIFIBROADCAST_NG_VERSION = 3648da920699c75ae349a2627b8e27fa680be941 +WIFIBROADCAST_NG_VERSION = ae2122c1fb70cd215bbc2e1b517b7b91f9401220 WIFIBROADCAST_NG_SITE = $(call github,svpcom,wfb-ng,$(WIFIBROADCAST_NG_VERSION)) WIFIBROADCAST_NG_LICENSE = GPL-3.0 @@ -18,11 +18,9 @@ define WIFIBROADCAST_NG_INSTALL_TARGET_CMDS $(INSTALL) -m 755 -d $(TARGET_DIR)/etc $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(WIFIBROADCAST_NG_PKGDIR)/files/drone.key $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(WIFIBROADCAST_NG_PKGDIR)/files/wfb.yaml - $(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(WIFIBROADCAST_NG_PKGDIR)/files/wlan_adapters.yaml $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(WIFIBROADCAST_NG_PKGDIR)/files/S98wifibroadcast - $(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(WIFIBROADCAST_NG_PKGDIR)/files/S99air_man $(INSTALL) -m 755 -d $(TARGET_DIR)/etc/sensors $(INSTALL) -m 644 -t $(TARGET_DIR)/etc/sensors $(WIFIBROADCAST_NG_PKGDIR)/sensor/* @@ -33,10 +31,6 @@ define WIFIBROADCAST_NG_INSTALL_TARGET_CMDS $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/wfb_tx_cmd $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(@D)/wfb_tun $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/wifibroadcast - $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/air_man - $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/air_man_cmd.sh - $(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/yaml-cli-multi - endef $(eval $(generic-package)) From d50d85992ef4bc0e4be6fed0e9fdd30d259a11ae Mon Sep 17 00:00:00 2001 From: sickgreg Date: Wed, 4 Mar 2026 09:51:25 +1100 Subject: [PATCH 13/14] Drop wifibroadcast-ng carryover from firmware PR --- .../wifibroadcast-ng/files/wifibroadcast | 66 ++---------------- .../{imx335_infinity6e.bin => imx335_fpv.bin} | Bin .../sensor/imx335_infinity6c.bin | Bin 137832 -> 0 bytes .../{imx415_infinity6e.bin => imx415_fpv.bin} | Bin .../sensor/imx415_infinity6c.bin | Bin 143490 -> 0 bytes .../wifibroadcast-ng/wifibroadcast-ng.mk | 2 +- 6 files changed, 8 insertions(+), 60 deletions(-) rename general/package/wifibroadcast-ng/sensor/{imx335_infinity6e.bin => imx335_fpv.bin} (100%) delete mode 100644 general/package/wifibroadcast-ng/sensor/imx335_infinity6c.bin rename general/package/wifibroadcast-ng/sensor/{imx415_infinity6e.bin => imx415_fpv.bin} (100%) delete mode 100644 general/package/wifibroadcast-ng/sensor/imx415_infinity6c.bin diff --git a/general/package/wifibroadcast-ng/files/wifibroadcast b/general/package/wifibroadcast-ng/files/wifibroadcast index 5165961763..c12b9e6cf1 100755 --- a/general/package/wifibroadcast-ng/files/wifibroadcast +++ b/general/package/wifibroadcast-ng/files/wifibroadcast @@ -24,7 +24,6 @@ load_config() { } load_modules() { - adapter_id="" for card in $(lsusb | awk '{print $6}' | uniq); do case "$card" in "0bda:8812" | "0bda:881a" | "0b05:17d2" | "2357:0101" | "2604:0012") @@ -33,12 +32,10 @@ load_modules() { "0bda:a81a") driver=8812eu - adapter_id="bl-m8812eu2" ;; "0bda:f72b" | "0bda:b733") driver=8733bu - adapter_id="bl-m8731bu4" ;; esac done @@ -57,19 +54,13 @@ load_modules() { opt2="rtw_tx_pwr_lmt_enable=0" fi - - modprobe "$driver" "$opt1" "$opt2" MaxTxBufLen=32 + modprobe "$driver" "$opt1" "$opt2" sleep 3 if ! ifconfig "$wfb_dev" up; then echo_log "Wireless driver not found!" exit 1 fi - - # Set .wireless.wlan_adapter in /etc/wfb.yaml if adapter_id is set - if [ -n "$adapter_id" ]; then - yaml-cli-multi -i /etc/wfb.yaml -s .wireless.wlan_adapter "$adapter_id" - fi } load_mlink() { @@ -102,7 +93,7 @@ load_wfb() { start_broadcast() { echo_log "Starting wfb_tx" wfb_tx -K "$wfb_key" -M "$mcs_index" -B "$width" -k "$fec_k" -n "$fec_n" -U rtp_local \ - -S "$stbc" -L "$ldpc" -i "$link_id" -C 8000 -J 10 -E 5000 "$wfb_dev" &> /dev/null & + -S "$stbc" -L "$ldpc" -i "$link_id" -C 8000 "$wfb_dev" &> /dev/null & } start_tunnel() { @@ -130,66 +121,23 @@ start_telemetry() { fi msposd -b 115200 -c 8 -r "$osd_fps" -m /dev/"$serial" \ -o 127.0.0.1:"$port_tx" -z "$size" > /dev/null & - - sleep 5 - echo "&L70&F28&G8CPU:&C TEMP:&T\n&B" >/tmp/MSPOSD.msg fi } video_settings() { - for card in $(lsusb | awk '{print $6}' | uniq); do - case "$card" in - "0bda:8812" | "0bda:881a" | "0b05:17d2" | "2357:0101" | "2604:0012") - driver=88XXau - wifibroadcast cli -s .wireless.txpower 20 - wifibroadcast cli -s .wireless.wlan_adapter bl-r8812af1 - wifibroadcast cli -s .broadcast.stbc 1 - wifibroadcast cli -s .broadcast.ldpc 1 - ;; - - "0bda:a81a") - driver=8812eu - wifibroadcast cli -s .wireless.txpower 40 - wifibroadcast cli -s .wireless.wlan_adapter bl-m8812eu2 - wifibroadcast cli -s .broadcast.stbc 1 - wifibroadcast cli -s .broadcast.ldpc 1 - ;; - - "0bda:f72b" | "0bda:b733") - driver=8733bu - wifibroadcast cli -s .wireless.txpower 20 - wifibroadcast cli -s .wireless.wlan_adapter bl-m8731bu4 - wifibroadcast cli -s .broadcast.stbc 0 - wifibroadcast cli -s .broadcast.ldpc 0 - ;; - esac - done - sensor=$(ipcinfo -s) - family=$(ipcinfo -f) - - cli -s .isp.sensorConfig /etc/sensors/"$sensor"_"$family".bin - cli -s .isp.exposure 16 + cli -s .isp.sensorConfig /etc/sensors/"$sensor"_fpv.bin + cli -s .isp.exposure 5 cli -s .video0.fps 60 - cli -s .video0.bitrate 8000 + cli -s .video0.bitrate 8192 cli -s .video0.codec h265 cli -s .video0.rcMode cbr cli -s .outgoing.enabled true cli -s .outgoing.wfb true + cli -s .fpv.enabled true + cli -s .fpv.noiseLevel 1 cli -s .records.split 1 cli -s .records.notime true - cli -s .fpv.enabled true - cli -s .fpv.noiseLevel 0 - - wifibroadcast cli -s .wireless.mlink 3994 - wifibroadcast cli -s .wireless.link_control alink - sed -i '/alink_drone &/d' /etc/rc.local && sed -i -e '$i alink_drone &' /etc/rc.local - - if [ "$sensor" = "imx335" ]; then - cli -s .video0.size 1920x1440 - else - cli -s .video0.size 1920x1080 - fi } start() { diff --git a/general/package/wifibroadcast-ng/sensor/imx335_infinity6e.bin b/general/package/wifibroadcast-ng/sensor/imx335_fpv.bin similarity index 100% rename from general/package/wifibroadcast-ng/sensor/imx335_infinity6e.bin rename to general/package/wifibroadcast-ng/sensor/imx335_fpv.bin diff --git a/general/package/wifibroadcast-ng/sensor/imx335_infinity6c.bin b/general/package/wifibroadcast-ng/sensor/imx335_infinity6c.bin deleted file mode 100644 index 57220303362c265f973c15ed9a20af06cb775290..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137832 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 HB;@}AHKBdP diff --git a/general/package/wifibroadcast-ng/sensor/imx415_infinity6e.bin b/general/package/wifibroadcast-ng/sensor/imx415_fpv.bin similarity index 100% rename from general/package/wifibroadcast-ng/sensor/imx415_infinity6e.bin rename to general/package/wifibroadcast-ng/sensor/imx415_fpv.bin diff --git a/general/package/wifibroadcast-ng/sensor/imx415_infinity6c.bin b/general/package/wifibroadcast-ng/sensor/imx415_infinity6c.bin deleted file mode 100644 index a54e1a7be5bea95a7fa42a90d4412bc6603890be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143490 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 diff --git a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk index 382a1b5b09..e646700748 100644 --- a/general/package/wifibroadcast-ng/wifibroadcast-ng.mk +++ b/general/package/wifibroadcast-ng/wifibroadcast-ng.mk @@ -4,7 +4,7 @@ # ################################################################################ -WIFIBROADCAST_NG_VERSION = ae2122c1fb70cd215bbc2e1b517b7b91f9401220 +WIFIBROADCAST_NG_VERSION = 3648da920699c75ae349a2627b8e27fa680be941 WIFIBROADCAST_NG_SITE = $(call github,svpcom,wfb-ng,$(WIFIBROADCAST_NG_VERSION)) WIFIBROADCAST_NG_LICENSE = GPL-3.0 From ef56cff89d559462adcb3c3e71160805b299597e Mon Sep 17 00:00:00 2001 From: sickgreg Date: Wed, 4 Mar 2026 18:25:29 +1100 Subject: [PATCH 14/14] Rename APFPV Greg payload repo --- general/package/apfpv-greg-payload/apfpv-greg-payload.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/general/package/apfpv-greg-payload/apfpv-greg-payload.mk b/general/package/apfpv-greg-payload/apfpv-greg-payload.mk index 6cd8a74f44..a8ef9c793d 100644 --- a/general/package/apfpv-greg-payload/apfpv-greg-payload.mk +++ b/general/package/apfpv-greg-payload/apfpv-greg-payload.mk @@ -9,7 +9,7 @@ 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-greg10-package.git +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