mirror of https://github.com/OpenIPC/firmware.git
				
				
				
			Add temperature monitor, add channels.sh, add jumbo frames (#1787)
							parent
							
								
									a066980166
								
							
						
					
					
						commit
						accf5a91ba
					
				|  | @ -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); | ||||
|  | @ -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 | ||||
|  | @ -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 | ||||
|  | @ -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 | ||||
|  | @ -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 | ||||
|  | @ -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 | ||||
|  | @ -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 | ||||
|  | @ -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 | ||||
|  | @ -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)) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue