Add temperature monitor, add channels.sh, add jumbo frames (#1787)

pull/1788/head
snokvist 2025-04-06 19:28:18 +02:00 committed by GitHub
parent a066980166
commit accf5a91ba
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 446 additions and 191 deletions

View File

@ -0,0 +1,127 @@
diff --git a/src/tx.cpp b/src/tx.cpp
index 4dcfd87..b1a9d94 100644
--- a/src/tx.cpp
+++ b/src/tx.cpp
@@ -1347,7 +1347,7 @@ int open_control_fd(int control_port)
void local_loop(int argc, char* const* argv, int optind, int srv_port, int rcv_buf, int log_interval,
int udp_port, int debug_port, int k, int n, const string &keypair, int fec_timeout,
uint64_t epoch, uint32_t channel_id, uint32_t fec_delay, bool use_qdisc, uint32_t fwmark,
- radiotap_header_t &radiotap_header, uint8_t frame_type, int control_port, bool mirror)
+ radiotap_header_t &radiotap_header, uint8_t frame_type, int control_port, int socket_type, bool mirror)
{
vector<int> rx_fd;
vector<string> wlans;
@@ -1357,7 +1357,7 @@ void local_loop(int argc, char* const* argv, int optind, int srv_port, int rcv_b
for(int i = 0; optind + i < argc; i++)
{
int bind_port = udp_port != 0 ? udp_port + i : 0;
- int fd = open_udp_socket_for_rx(bind_port, rcv_buf);
+ int fd = open_udp_socket_for_rx(bind_port, rcv_buf, INADDR_ANY, socket_type);
if (udp_port == 0)
{
@@ -1371,7 +1371,15 @@ void local_loop(int argc, char* const* argv, int optind, int srv_port, int rcv_b
bind_port = ntohs(saddr.sin_port);
IPC_MSG("%" PRIu64 "\tLISTEN_UDP\t%d:%x\n", get_time_ms(), bind_port, i);
}
- WFB_INFO("Listen on %d for %s\n", bind_port, argv[optind + i]);
+
+ if (socket_type == SOCK_SEQPACKET)
+ {
+ WFB_INFO("Listen on %s for %s\n", UNIX_SOCKET, argv[optind + i]);
+ }
+ else
+ {
+ WFB_INFO("Listen on %d for %s\n", bind_port, argv[optind + i]);
+ }
rx_fd.push_back(fd);
wlans.push_back(string(argv[optind + i]));
}
@@ -1499,8 +1507,9 @@ int main(int argc, char * const *argv)
bool use_qdisc = false;
uint32_t fwmark = 0;
tx_mode_t tx_mode = LOCAL;
+ int socket_type = SOCK_DGRAM;
- while ((opt = getopt(argc, argv, "dI:K:k:n:u:p:F:l:B:G:S:L:M:N:D:T:i:e:R:f:mVQP:C:")) != -1) {
+ while ((opt = getopt(argc, argv, "dI:K:k:n:u:p:F:l:B:G:S:L:M:N:D:T:i:e:R:f:mVQUP:C:")) != -1) {
switch (opt) {
case 'I':
tx_mode = INJECTOR;
@@ -1599,10 +1608,13 @@ int main(int argc, char * const *argv)
case 'C':
control_port = atoi(optarg);
break;
+ case 'U':
+ socket_type = SOCK_SEQPACKET;
+ break;
default: /* '?' */
show_usage:
WFB_INFO("Local TX: %s [-K tx_key] [-k RS_K] [-n RS_N] [-u udp_port] [-R rcv_buf] [-p radio_port] [-F fec_delay] [-B bandwidth] [-G guard_interval] [-S stbc] [-L ldpc] [-M mcs_index] [-N VHT_NSS]\n"
- " [-T fec_timeout] [-l log_interval] [-e epoch] [-i link_id] [-f { data | rts }] [-m] [-V] [-Q] [-P fwmark] [-C control_port] interface1 [interface2] ...\n",
+ " [-T fec_timeout] [-l log_interval] [-e epoch] [-i link_id] [-f { data | rts }] [-m] [-V] [-Q] [-U] [-P fwmark] [-C control_port] interface1 [interface2] ...\n",
argv[0]);
WFB_INFO("TX distributor: %s -d [-K tx_key] [-k RS_K] [-n RS_N] [-u udp_port] [-R rcv_buf] [-p radio_port] [-F fec_delay] [-B bandwidth] [-G guard_interval] [-S stbc] [-L ldpc] [-M mcs_index] [-N VHT_NSS]\n"
" [-T fec_timeout] [-l log_interval] [-e epoch] [-i link_id] [-f { data | rts }] [-m] [-V] [-Q] [-P fwmark] [-C control_port] host1:port1,port2,... [host2:port1,port2,...] ...\n",
@@ -1658,7 +1670,7 @@ int main(int argc, char * const *argv)
local_loop(argc, argv, optind, srv_port, rcv_buf, log_interval,
udp_port, debug_port, k, n, keypair, fec_timeout,
epoch, channel_id, fec_delay, use_qdisc, fwmark,
- radiotap_header, frame_type, control_port, mirror);
+ radiotap_header, frame_type, control_port, socket_type, mirror);
break;
diff --git a/src/wifibroadcast.cpp b/src/wifibroadcast.cpp
index d082958..a1f9f76 100644
--- a/src/wifibroadcast.cpp
+++ b/src/wifibroadcast.cpp
@@ -18,6 +18,7 @@
#include <stdlib.h>
#include <stdarg.h>
#include <sys/socket.h>
+#include <sys/un.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string>
@@ -65,9 +66,26 @@ uint64_t get_time_us(void) // in microseconds
int open_udp_socket_for_rx(int port, int rcv_buf_size, uint32_t bind_addr, int socket_type, int socket_protocol)
{
struct sockaddr_in saddr;
- int fd = socket(AF_INET, socket_type, socket_protocol);
+ struct sockaddr_un uaddr;
+
+ int socket_family = (socket_type == SOCK_SEQPACKET) ? AF_UNIX : AF_INET;
+ int fd = socket(socket_family, socket_type, socket_protocol);
if (fd < 0) throw runtime_error(string_format("Error opening socket: %s", strerror(errno)));
+ if (socket_family == AF_UNIX)
+ {
+ memset(&uaddr, '\0', sizeof(uaddr));
+ uaddr.sun_family = socket_family;
+ strcpy(uaddr.sun_path, UNIX_SOCKET);
+
+ if (::connect(fd, (struct sockaddr *) &uaddr, sizeof(uaddr)) < 0)
+ {
+ close(fd);
+ throw runtime_error(string_format("Unable to connect to %s : %s", uaddr.sun_path, strerror(errno)));
+ }
+ return fd;
+ }
+
const int optval = 1;
if(setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&optval , sizeof(optval)) !=0)
{
diff --git a/src/wifibroadcast.hpp b/src/wifibroadcast.hpp
index 0947a76..9bc8e1d 100644
--- a/src/wifibroadcast.hpp
+++ b/src/wifibroadcast.hpp
@@ -286,6 +286,8 @@ typedef struct {
#define IPC_MSG_SEND() fflush(stdout)
#endif
+#define UNIX_SOCKET "/tmp/wfb_stream"
+
int open_udp_socket_for_rx(int port, int rcv_buf_size, uint32_t bind_addr = INADDR_ANY, int socket_type = SOCK_DGRAM, int socket_protocol = 0);
uint64_t get_time_ms(void);
uint64_t get_time_us(void);

View File

@ -1,17 +0,0 @@
#!/bin/sh
case "$1" in
start)
echo "Generating or updating /etc/vtx_info.yaml..."
generate_vtx_info
;;
stop)
echo "Generating or updating /etc/vtx_info.yaml only done when starting..."
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac

View File

@ -0,0 +1,18 @@
#!/bin/sh
case "$1" in
start)
echo "Starting temperature check..."
temp_monitor &>/dev/null &
;;
stop)
echo "Stopping temperature check..."
killall -q temp_monitor
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac

View File

@ -0,0 +1,41 @@
#!/bin/sh
case "$1" in
5)
echo "Channel5 change."
channel5.sh "$2"
;;
6)
echo "Channel6 change."
channel6.sh "$2"
;;
7)
echo "Channel7 change."
channel7.sh "$2"
;;
8)
echo "Channel8 change."
channel8.sh "$2"
;;
9)
echo "Channel9 change."
channel9.sh "$2"
;;
10)
echo "Channel10 change."
channel10.sh "$2"
;;
11)
echo "Channel11 change."
channel11.sh "$2"
;;
12)
echo "Channel12 change."
channel12.sh "$2"
;;
*)
echo "No valid channel specified."
;;
esac
exit 0

View File

@ -1,174 +0,0 @@
#!/bin/sh
CFG_FILE="/etc/vtx_info.yaml"
### 1. Fetch SoC from fw_printenv
soc=$(fw_printenv soc 2>/dev/null | awk -F= '/soc=/ {print $2}')
[ -z "$soc" ] && soc="ssc338q"
### 2. Determine min/max bitrate based on SoC
case "$soc" in
"ssc30kq")
min_bitrate="2800"
max_bitrate="18000"
;;
"ssc338q")
min_bitrate="2800"
max_bitrate="28000"
;;
*)
# Fallback if an unexpected SoC is found
min_bitrate="2800"
max_bitrate="28000"
;;
esac
### 3. Fetch sensor from fw_printenv
sensor=$(fw_printenv sensor 2>/dev/null | awk -F= '/sensor=/ {print $2}')
[ -z "$sensor" ] && sensor="imx335"
### 4. Fetch build_option from /etc/os-release
build_option=$(awk -F= '/^BUILD_OPTION=/ {print $2}' /etc/os-release)
[ -z "$build_option" ] && build_option="fpv"
### 5. Detect Wi-Fi card from lsusb, map to known adapter
raw_driver="none"
for card in $(lsusb | awk '{print $6}' | sort | uniq); do
case "$card" in
"0bda:8812"|"0bda:881a"|"0b05:17d2"|"2357:0101"|"2604:0012")
raw_driver="rtl8812au"
break
;;
"0bda:a81a")
raw_driver="rtl8812eu"
break
;;
"0bda:f72b"|"0bda:b733")
raw_driver="rtl8733bu"
break
;;
esac
done
### 6. Determine Wi-Fi settings based on adapter
case "$raw_driver" in
"rtl8812au")
min_bw="5"
max_bw="40"
ldpc="1"
stbc="1"
max_mcs="7"
# MCS0..7 -> stepped down from 63 to 40
mcs0_max_tx="63"
mcs1_max_tx="60"
mcs2_max_tx="57"
mcs3_max_tx="54"
mcs4_max_tx="51"
mcs5_max_tx="48"
mcs6_max_tx="44"
mcs7_max_tx="40"
;;
"rtl8812eu")
min_bw="5"
max_bw="20"
ldpc="1"
stbc="1"
max_mcs="7"
# MCS0..7 -> stepped down from 63 to 40
mcs0_max_tx="63"
mcs1_max_tx="60"
mcs2_max_tx="57"
mcs3_max_tx="54"
mcs4_max_tx="51"
mcs5_max_tx="48"
mcs6_max_tx="44"
mcs7_max_tx="40"
;;
"rtl8733bu")
min_bw="20"
max_bw="40"
ldpc="0"
stbc="0"
max_mcs="7"
# MCS0..7 -> stepped down from 63 to 40
mcs0_max_tx="63"
mcs1_max_tx="60"
mcs2_max_tx="57"
mcs3_max_tx="54"
mcs4_max_tx="51"
mcs5_max_tx="48"
mcs6_max_tx="44"
mcs7_max_tx="40"
;;
*)
# Default if no known adapter
raw_driver="none"
min_bw="20"
max_bw="20"
ldpc="0"
stbc="0"
max_mcs="7"
# All MCS min=1, max=30
mcs0_max_tx="30"
mcs1_max_tx="30"
mcs2_max_tx="30"
mcs3_max_tx="30"
mcs4_max_tx="30"
mcs5_max_tx="30"
mcs6_max_tx="30"
mcs7_max_tx="30"
;;
esac
# For all adapters (recognized or not), mcsN_min_tx=1
mcs0_min_tx="1"
mcs1_min_tx="1"
mcs2_min_tx="1"
mcs3_min_tx="1"
mcs4_min_tx="1"
mcs5_min_tx="1"
mcs6_min_tx="1"
mcs7_min_tx="1"
### 7. If /etc/vtx_info.yaml doesn't exist, create it; else update via yaml-cli
if [ ! -f "$CFG_FILE" ]; then
cat <<EOF > "$CFG_FILE"
vtx_info:
vtx_id: ff00
build_option: $build_option
soc: $soc
wifi:
wifi_adapter: $raw_driver
min_bw: $min_bw
max_bw: $max_bw
ldpc: $ldpc
stbc: $stbc
max_mcs: $max_mcs
tx_power:
mcs0_min_tx: $mcs0_min_tx
mcs0_max_tx: $mcs0_max_tx
mcs1_min_tx: $mcs1_min_tx
mcs1_max_tx: $mcs1_max_tx
mcs2_min_tx: $mcs2_min_tx
mcs2_max_tx: $mcs2_max_tx
mcs3_min_tx: $mcs3_min_tx
mcs3_max_tx: $mcs3_max_tx
mcs4_min_tx: $mcs4_min_tx
mcs4_max_tx: $mcs4_max_tx
mcs5_min_tx: $mcs5_min_tx
mcs5_max_tx: $mcs5_max_tx
mcs6_min_tx: $mcs6_min_tx
mcs6_max_tx: $mcs6_max_tx
mcs7_min_tx: $mcs7_min_tx
mcs7_max_tx: $mcs7_max_tx
video:
sensor: $sensor
min_bitrate: $min_bitrate
max_bitrate: $max_bitrate
EOF
echo "Created $CFG_FILE with default/auto-detected values."
else
echo "$CFG_FILE found. Updating values with yaml-cli..."
echo "Updated $CFG_FILE with new auto-detected or default values via yaml-cli."
fi

View File

@ -0,0 +1,74 @@
#!/bin/sh
# Define temperature thresholds:
NORMAL_THRESHOLD=85 # Normal if below 85°C
REBOOT_THRESHOLD=100 # Reboot if 100°C or higher
# --- Get Adapter info ---
for card in $(lsusb | awk '{print $6}' | sort | uniq); do
case "$card" in
"0bda:8812" | "0bda:881a" | "0b05:17d2" | "2357:0101" | "2604:0012")
driver=88XXau
;;
"0bda:a81a")
driver=8812eu
;;
"0bda:f72b" | "0bda:b733")
driver=8733bu
;;
esac
done
wifi_adapter=""$driver""
echo "Wifi adapter found: $driver"
while true; do
# --- Get VTX Temperature ---
# Example output from ipcinfo --temp: "39.00"
vtx_temp=$(ipcinfo --temp)
vtx_int=$(echo "$vtx_temp" | cut -d. -f1)
adapter_temp=0
if [ "$wifi_adapter" = "8733bu" ]; then
# Expected format: "rf_path: 0, thermal_value: 37, offset: 45, temperature: 20"
adapter_temp=$(grep -o 'temperature: [0-9]*' /proc/net/rtl8733bu/wlan0/thermal_state | awk '{print $2}')
elif [ "$wifi_adapter" = "88XXau" ]; then
echo "Adapter 88XXau temperature extraction not implemented yet."
adapter_temp=0
elif [ "$wifi_adapter" = "8812eu" ]; then
if [ -f /proc/net/rtl88x2eu/wlan0/thermal_state ]; then
# Extract both temperature values and choose the highest
adapter_temp=$(grep -o 'temperature: [0-9]*' /proc/net/rtl88x2eu/wlan0/thermal_state | awk '{print $2}' | sort -n | tail -1)
else
echo "Thermal state file for 8812eu not found."
adapter_temp=0
fi
else
echo "Unknown adapter type: $wifi_adapter"
fi
# Fallback if adapter_temp is empty
if [ -z "$adapter_temp" ]; then
adapter_temp=0
fi
echo "VTX temperature: ${vtx_temp}°C, Adapter temperature: ${adapter_temp}°C"
# --- Determine the Highest Temperature ---
if [ "$adapter_temp" -gt "$vtx_int" ]; then
max_temp=$adapter_temp
else
max_temp=$vtx_int
fi
# --- Determine the current state based on max_temp ---
if [ "$max_temp" -lt "$NORMAL_THRESHOLD" ]; then
echo "All is well... Nothing to do" > /dev/null
elif [ "$max_temp" -lt "$REBOOT_THRESHOLD" ]; then
echo "Warning: High temperature was detected.\nVTX Temp:&T WifiTemp:&W &L30 &G8 &F18" > /tmp/MSPOSD.msg
else
echo "VTX will reboot due to thermal state...\nVTX Temp:&T WifiTemp:&W &L30 &G8 &F18.\nRebooting in 15 seconds..." > /tmp/MSPOSD.msg
sleep 15
reboot
fi
sleep 5
done

View File

@ -0,0 +1,17 @@
wireless:
txpower: 1
channel: 161
width: 20
broadcast:
mcs_index: 2
tun_index: 1
fec_k: 8
fec_n: 12
stbc: 0
ldpc: 0
link_id: 7669206
jumbo_frames: false
telemetry:
router: msposd
serial: ttyS2
osd_fps: 20

View File

@ -0,0 +1,162 @@
#!/bin/sh
wfb_key=/etc/drone.key
wfb_dev=wlan0
echo_log() {
echo "$1" | logger -s -t wifibroadcast
}
wfb_yaml() {
if [ -e "$1" ]; then
while IFS=: read -r key value; do
key=$(eval echo "$key")
value=$(eval echo "$value")
export "$key=$value"
done < "$1"
fi
}
load_config() {
wfb_yaml /etc/wfb.yaml
[ ! -e "$wfb_key" ] && wfb_key=/rom/etc/drone.key
}
load_modules() {
for card in $(lsusb | awk '{print $6}' | uniq); do
case "$card" in
"0bda:8812" | "0bda:881a" | "0b05:17d2" | "2357:0101" | "2604:0012")
driver=88XXau
modprobe "$driver"
;;
"0bda:a81a")
driver=8812eu
modprobe "$driver" rtw_regd_src=1 rtw_tx_pwr_by_rate=0 rtw_tx_pwr_lmt_enable=0
;;
"0bda:f72b" | "0bda:b733")
driver=8733bu
modprobe "$driver" rtw_regd_src=1 rtw_tx_pwr_by_rate=0 rtw_tx_pwr_lmt_enable=0
;;
esac
done
if [ -z "$driver" ]; then
echo_log "Wireless module not detected!"
exit 1
fi
echo_log "Detected driver: $driver"
if ! ifconfig "$wfb_dev" up; then
echo_log "Wireless driver not found!"
exit 1
fi
}
load_interface() {
iw "$wfb_dev" set monitor none
[ "$width" = "40" ] && wfb_width=HT40+ || wfb_width=HT20
iw "$wfb_dev" set channel "$channel" "$wfb_width"
iw reg set 00
[ "$driver" = "88XXau" ] && wfb_power=$((txpower * -100)) || wfb_power=$((txpower * 50))
iw "$wfb_dev" set txpower fixed "$wfb_power"
if [ "$jumbo_frames" = "true" ]; then
ip link set dev "$wfb_dev" mtu 3994
fi
}
start_broadcast() {
echo_log "Starting wfb_tx"
wfb_tx -K "$wfb_key" -M "$mcs_index" -B "$width" -k "$fec_k" -n "$fec_n" \
-S "$stbc" -L "$ldpc" -i "$link_id" -C 8000 -G short "$wfb_dev" &> /dev/null &
}
start_tunnel() {
echo_log "Starting wfb_tun"
wfb_rx -K "$wfb_key" -i "$link_id" -p 160 -u 5800 "$wfb_dev" &> /dev/null &
wfb_tx -K "$wfb_key" -M "$tun_index" -B "$width" -k "$fec_k" -n "$fec_n" \
-S "$stbc" -L "$ldpc" -i "$link_id" -p 32 -u 5801 "$wfb_dev" &> /dev/null &
wfb_tun -a 10.5.0.10/24 > /dev/null &
}
start_telemetry() {
chipset=$(ipcinfo -c)
[ "$chipset" = "ssc33x" ] && devmem 0x1F207890 16 0x8
echo_log "Starting $router"
if [ "$router" = "mavfwd" ]; then
mavfwd -b 115200 -c 8 -p 100 -a 15 -t -m /dev/"$serial" \
-i 0.0.0.0:14550 -o 10.5.0.1:14551 > /dev/null &
else
if [ "$router" = "msposd" ]; then
size=$(curl -s localhost/api/v1/config.json | jsonfilter -e "@.video0.size")
fi
msposd -b 115200 -c 8 -r "$osd_fps" -m /dev/"$serial" \
-o 10.5.0.1:14551 -z "$size" > /dev/null &
fi
}
video_settings() {
sensor=$(ipcinfo -s)
cli -s .isp.sensorConfig /etc/sensors/"$sensor"_fpv.bin
cli -s .isp.exposure 5
cli -s .video0.fps 60
cli -s .video0.bitrate 8192
cli -s .video0.codec h265
cli -s .video0.rcMode cbr
cli -s .outgoing.enabled true
cli -s .outgoing.server udp://0.0.0.0:5600
cli -s .fpv.enabled true
cli -s .fpv.noiseLevel 1
}
start() {
load_config
load_modules
load_interface
if [ ! -e /etc/system.ok ]; then
sleep 1
video_settings
touch /etc/system.ok
killall -1 majestic
fi
stop
start_broadcast
start_tunnel
start_telemetry
}
stop() {
for process in wfb_rx wfb_tx wfb_tun msposd mavfwd; do
if [ -n "$(pidof $process)" ]; then
echo_log "Stopping $process"
killall -q "$process"
fi
done
}
case "$1" in
start|stop)
$1
;;
resetv)
cp -f /rom/etc/majestic.yaml /etc/majestic.yaml
video_settings
;;
resetw)
cp -f /rom/etc/wfb.yaml /etc/wfb.yaml
start
;;
*)
echo "Usage: $0 {start|stop|resetv|resetw}"
exit 1
;;
esac

View File

@ -5,11 +5,18 @@
################################################################################
define WIFIBROADCAST_EXT_INSTALL_TARGET_CMDS
$(INSTALL) -m 755 -d $(TARGET_DIR)/etc
$(INSTALL) -m 644 -t $(TARGET_DIR)/etc $(WIFIBROADCAST_NG_PKGDIR)/files/wfb.yaml
$(INSTALL) -m 755 -d $(TARGET_DIR)/etc/init.d
$(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(WIFIBROADCAST_EXT_PKGDIR)/files/S75generate_vtx_info
$(INSTALL) -m 755 -t $(TARGET_DIR)/etc/init.d $(WIFIBROADCAST_NG_PKGDIR)/files/S991temp_monitor
$(INSTALL) -m 755 -d $(TARGET_DIR)/usr/bin
$(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_EXT_PKGDIR)/files/generate_vtx_info
$(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/temp_monitor
$(INSTALL) -m 755 -t $(TARGET_DIR)/usr/bin $(WIFIBROADCAST_NG_PKGDIR)/files/channels.sh
endef
$(eval $(generic-package))