├── sensors └── .keep ├── txprofiles └── .keep ├── presets ├── default-mario-aio │ ├── sensor │ │ └── .keep │ └── preset-config.yaml ├── high-power-fpv │ ├── sensor │ │ └── .keep │ └── preset-config.yaml ├── vtxmenu-041725 │ ├── sensor │ │ └── .keep │ ├── preset-config.yaml │ └── vtxmenu.ini ├── vtxmenu-202505 │ ├── sensor │ │ └── .keep │ ├── preset-config.yaml │ └── vtxmenu.ini ├── default-ultrasight │ ├── sensor │ │ └── .keep │ └── preset-config.yaml └── default-runcam-wifilink │ ├── sensor │ └── .keep │ └── preset-config.yaml ├── package.json ├── images ├── preset-tab.png └── preset-details-view.png ├── tools └── indexer │ ├── package.json │ ├── package-lock.json │ └── indexer.js ├── .gitignore ├── create_preset.sh ├── .github └── workflows │ └── run-indexer.yml ├── PRESET_INDEX.yaml └── README.md /sensors/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /txprofiles/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /presets/default-mario-aio/sensor/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /presets/high-power-fpv/sensor/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /presets/vtxmenu-041725/sensor/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /presets/vtxmenu-202505/sensor/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /presets/default-ultrasight/sensor/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /presets/default-runcam-wifilink/sensor/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "js-yaml": "4.1.0" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /images/preset-tab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenIPC/fpv-presets/master/images/preset-tab.png -------------------------------------------------------------------------------- /images/preset-details-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenIPC/fpv-presets/master/images/preset-details-view.png -------------------------------------------------------------------------------- /presets/vtxmenu-041725/preset-config.yaml: -------------------------------------------------------------------------------- 1 | name: "vtxmenu-041725" 2 | author: "OpenIPC" 3 | description: "VTXMenu" 4 | category: "FPV" 5 | sensor: "" # Set sensor file if needed 6 | status: "Community" 7 | tags: ["vtxmenu-041725"] 8 | files: {} 9 | additional_files: 10 | - vtxmenu.ini 11 | -------------------------------------------------------------------------------- /presets/vtxmenu-202505/preset-config.yaml: -------------------------------------------------------------------------------- 1 | name: "vtxmenu-202505" 2 | author: "OpenIPC" 3 | description: "Latest VTXMenu as of May 2025" 4 | category: "FPV" 5 | sensor: "" # Set sensor file if needed 6 | status: "Official" 7 | tags: ["vtxmenu-202505"] 8 | files: {} 9 | additional_files: 10 | - vtxmenu.ini 11 | -------------------------------------------------------------------------------- /tools/indexer/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "openipc-preset-indexer", 3 | "version": "1.0.0", 4 | "description": "Preset indexer for OpenIPC configuration presets", 5 | "main": "indexer.js", 6 | "scripts": { 7 | "index": "node indexer.js", 8 | "validate": "node indexer.js" 9 | }, 10 | "dependencies": { 11 | "js-yaml": "^4.1.0" 12 | }, 13 | "devDependencies": { 14 | "@types/node": "^16.11.6" 15 | } 16 | } -------------------------------------------------------------------------------- /presets/high-power-fpv/preset-config.yaml: -------------------------------------------------------------------------------- 1 | name: "high-power-fpv" 2 | author: "OpenIPC Dev" 3 | description: "Description of high-power-fpv." 4 | category: "FPV" 5 | sensor: "" # Set sensor file if needed 6 | status: "Experimental" 7 | tags: [ "high-power", "fpv" ] 8 | files: 9 | wfb.yaml: 10 | wireless.channel: "161" 11 | wireless.txpower: "20" 12 | broadcast.stbc: "0" 13 | broadcast.ldpc: "0" 14 | broadcast.mcs_index: "1" 15 | broadcast.tun_index: "1" 16 | broadcast.fec_k: "8" 17 | broadcast.fec_n: "12" 18 | telemetry.serial: ttyS2 19 | telemetry.router: msposd 20 | majestic.yaml: 21 | fpv.enabled: "false" 22 | system.logLevel: "debug" 23 | video0.codec: "h264" 24 | video0.fps: "120" 25 | -------------------------------------------------------------------------------- /presets/default-mario-aio/preset-config.yaml: -------------------------------------------------------------------------------- 1 | name: "default-mario-aio" 2 | author: "OpenIPC" 3 | description: "Mario AIO FPV Preset" 4 | category: "FPV" 5 | sensor: "" # Set sensor file if needed 6 | status: "Official" 7 | tags: ["mario", "aio"] 8 | files: 9 | wfb.yaml: 10 | wireless.channel: "161" 11 | wireless.txpower: "20" 12 | broadcast.stbc: "1" 13 | broadcast.ldpc: "1" 14 | broadcast.mcs_index: "1" 15 | broadcast.tun_index: "1" 16 | broadcast.fec_k: "8" 17 | broadcast.fec_n: "12" 18 | telemetry.serial: ttyS2 19 | telemetry.router: msposd 20 | majestic.yaml: 21 | fpv.enabled: "true" 22 | fpv.noiseLevel: "0" 23 | system.logLevel: "debug" 24 | video0.codec: "h265" 25 | video0.fps: "60" 26 | video0.bitrate: "4096" 27 | video0.size: "1920x1080" 28 | -------------------------------------------------------------------------------- /presets/default-runcam-wifilink/preset-config.yaml: -------------------------------------------------------------------------------- 1 | name: "default-runcam-wifilink" 2 | author: "OpenIPC" 3 | description: "Runcam Wifilink OpenIPC FPV Preset" 4 | category: "FPV" 5 | sensor: "" # Set sensor file if needed 6 | status: "Official" 7 | tags: ["runcam", "wifilink"] 8 | files: 9 | wfb.yaml: 10 | wireless.channel: "161" 11 | wireless.txpower: "1" 12 | broadcast.stbc: "0" 13 | broadcast.ldpc: "0" 14 | broadcast.mcs_index: "1" 15 | broadcast.tun_index: "1" 16 | broadcast.fec_k: "8" 17 | broadcast.fec_n: "12" 18 | telemetry.serial: ttyS2 19 | telemetry.router: msposd 20 | majestic.yaml: 21 | fpv.enabled: "true" 22 | fpv.noiseLevel: "0" 23 | system.logLevel: "debug" 24 | video0.codec: "h265" 25 | video0.fps: "60" 26 | video0.bitrate: "4096" 27 | video0.size: "1920x1080" 28 | -------------------------------------------------------------------------------- /presets/default-ultrasight/preset-config.yaml: -------------------------------------------------------------------------------- 1 | name: "default-ultrasight" 2 | author: "Your Name" 3 | description: "Description of default-ultrasight." 4 | category: "FPV" 5 | sensor: "" # Set sensor file if needed 6 | status: "Community" 7 | tags: ["default-ultrasight"] 8 | files: 9 | wfb.yaml: 10 | wireless.channel: "161" 11 | wireless.txpower: "1" 12 | broadcast.stbc: "0" 13 | broadcast.ldpc: "0" 14 | broadcast.mcs_index: "1" 15 | broadcast.tun_index: "1" 16 | broadcast.fec_k: "8" 17 | broadcast.fec_n: "12" 18 | telemetry.serial: ttyS2 19 | telemetry.router: msposd 20 | 21 | majestic.yaml: 22 | fpv.enabled: "true" 23 | fpv.noiseLevel: "0" 24 | system.logLevel: "debug" 25 | video0.codec: "h265" 26 | video0.fps: "60" 27 | video0.bitrate: "4096" 28 | video0.size: "1920x1080" 29 | 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.o 2 | .DS_Store 3 | *~ 4 | *.uvopt 5 | *.dep 6 | *.bak 7 | *.uvgui.* 8 | *.swp 9 | *.save 10 | .project 11 | .settings 12 | .cproject 13 | obj/ 14 | patches/ 15 | startup_stm32f10x_md_gcc.s 16 | .idea 17 | 18 | # script-generated files 19 | docs/Manual.pdf 20 | README.pdf 21 | 22 | # artefacts of top-level Makefile 23 | /downloads/ 24 | /tools/ 25 | /build/ 26 | # local changes only 27 | make/local.mk 28 | 29 | # artefacts for VisualGDB (running in Visual Studio) 30 | mcu.mak 31 | mcu.mak.old 32 | stm32.mak 33 | 34 | # eclipse launch configurations 35 | /support/eclipse 36 | 37 | # ozone launch configurations 38 | /support/ozone 39 | 40 | # artefacts for Visual Studio Code 41 | /.vscode/ 42 | 43 | # artefacts for CLion 44 | /cmake-build-debug/ 45 | /CMakeLists.txt 46 | 47 | .vagrant 48 | ubuntu*.log 49 | /.vs 50 | 51 | # EEPROM image file (created by SITL) 52 | eeprom.bin 53 | 54 | # public file staging location 55 | /public 56 | 57 | # NPM packages folder 58 | /node_modules -------------------------------------------------------------------------------- /create_preset.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Exit on error 4 | set -e 5 | 6 | # Check if a preset name is provided 7 | if [ -z "$1" ]; then 8 | echo "Usage: $0 \"Preset Name\"" 9 | exit 1 10 | fi 11 | 12 | # Convert preset name to lowercase and replace spaces with underscores 13 | PRESET_NAME="$1" 14 | FOLDER_NAME=$(echo "$PRESET_NAME" | tr '[:upper:]' '[:lower:]' | tr ' ' '_') 15 | PRESET_DIR="./presets/$FOLDER_NAME" 16 | 17 | # Create the preset directory 18 | mkdir -p "$PRESET_DIR/sensor" 19 | 20 | # Create the preset-config.yaml file 21 | cat < "$PRESET_DIR/preset-config.yaml" 22 | name: "$PRESET_NAME" 23 | author: "Your Name" 24 | description: "Description of $PRESET_NAME." 25 | category: "FPV" 26 | sensor: "" # Set sensor file if needed 27 | status: "Community" 28 | tags: ["$PRESET_NAME"] 29 | files: 30 | wfb.conf: 31 | txpower: "1" 32 | channel: "161" 33 | driver_txpower_override: "20" 34 | stbc: "1" 35 | ldpc: "1" 36 | mcs_index: "1" 37 | fec_k: "8" 38 | fec_n: "12" 39 | telemetry.conf: 40 | serial: /dev/ttyS2 41 | # 2 for msposd 42 | router: 0 43 | majestic.yaml: 44 | fpv.enabled: "true" 45 | fpv.noiseLevel: "0" 46 | system.logLevel: "debug" 47 | video0.codec: "h265" 48 | video0.fps: "60" 49 | video0.bitrate: "4096" 50 | video0.size: "1920x1080" 51 | 52 | EOF 53 | 54 | 55 | # Create an empty sensor file as a placeholder 56 | touch "$PRESET_DIR/sensor/.keep" 57 | 58 | # Display success message 59 | echo "✅ Preset '$PRESET_NAME' created successfully in '$PRESET_DIR'" 60 | echo "Edit '$PRESET_DIR/preset-config.yaml' to configure the preset." 61 | -------------------------------------------------------------------------------- /tools/indexer/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "openipc-preset-indexer", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "openipc-preset-indexer", 9 | "version": "1.0.0", 10 | "dependencies": { 11 | "js-yaml": "^4.1.0" 12 | }, 13 | "devDependencies": { 14 | "@types/node": "^16.11.6" 15 | } 16 | }, 17 | "node_modules/@types/node": { 18 | "version": "16.18.126", 19 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", 20 | "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", 21 | "dev": true, 22 | "license": "MIT" 23 | }, 24 | "node_modules/argparse": { 25 | "version": "2.0.1", 26 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 27 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 28 | "license": "Python-2.0" 29 | }, 30 | "node_modules/js-yaml": { 31 | "version": "4.1.0", 32 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 33 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 34 | "license": "MIT", 35 | "dependencies": { 36 | "argparse": "^2.0.1" 37 | }, 38 | "bin": { 39 | "js-yaml": "bin/js-yaml.js" 40 | } 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /.github/workflows/run-indexer.yml: -------------------------------------------------------------------------------- 1 | name: Update Preset Index 2 | 3 | on: 4 | # Run on push to master branch 5 | push: 6 | branches: [ master ] 7 | paths: 8 | - 'presets/**' # Only run when changes occur in presets directory 9 | 10 | # Allow manual triggering 11 | workflow_dispatch: 12 | 13 | # Run on a schedule (e.g., daily at midnight UTC) 14 | schedule: 15 | - cron: '0 0 * * *' 16 | 17 | permissions: 18 | contents: write # Needed to commit back to the repository 19 | 20 | jobs: 21 | update-preset-index: 22 | runs-on: ubuntu-latest 23 | 24 | steps: 25 | - name: Checkout code 26 | uses: actions/checkout@v4 27 | with: 28 | fetch-depth: 0 # Fetch all history for git commands 29 | 30 | - name: Setup Node.js 31 | uses: actions/setup-node@v4 32 | with: 33 | node-version: '18' 34 | 35 | - name: Install dependencies 36 | run: | 37 | npm ci 38 | npm install js-yaml # Ensure yaml dependency is installed 39 | 40 | - name: Update indexer with git commit hash 41 | run: | 42 | # Get short commit hash 43 | GIT_HASH=$(git rev-parse --short HEAD) 44 | echo "Using commit hash: $GIT_HASH" 45 | 46 | # Create a temporary modified indexer that uses the git hash 47 | cat > tools/indexer/run-indexer.js << 'EOL' 48 | const indexer = require('./indexer'); 49 | const path = require('path'); 50 | 51 | // Get the git hash from environment variable 52 | const gitHash = process.env.GIT_HASH || 'unknown'; 53 | 54 | // Use the repository root path 55 | const repoPath = process.cwd(); 56 | 57 | // Generate the index with git hash as version 58 | const indexContent = indexer.generatePresetIndex(repoPath); 59 | 60 | // Update version with git hash 61 | if (indexContent) { 62 | indexContent.version = gitHash; 63 | indexContent.last_updated = new Date().toISOString(); 64 | 65 | // Write updated index back to file 66 | const fs = require('fs'); 67 | const yaml = require('js-yaml'); 68 | fs.writeFileSync( 69 | path.join(repoPath, 'PRESET_INDEX.yaml'), 70 | yaml.dump(indexContent) 71 | ); 72 | 73 | console.log(`Updated index version to ${gitHash}`); 74 | } 75 | 76 | // Validate the index 77 | indexer.validatePresetIndex(repoPath); 78 | EOL 79 | 80 | # Make the script executable 81 | chmod +x tools/indexer/run-indexer.js 82 | env: 83 | GIT_HASH: ${{ github.sha }} 84 | 85 | - name: Run preset indexer 86 | run: | 87 | node tools/indexer/run-indexer.js 88 | env: 89 | GIT_HASH: ${{ github.sha }} 90 | 91 | - name: Commit updated index 92 | run: | 93 | git config --local user.email "github-actions@github.com" 94 | git config --local user.name "GitHub Actions" 95 | git add PRESET_INDEX.yaml 96 | git diff --staged --quiet || git commit -m "Update preset index with commit ${{ github.sha }} [skip ci]" 97 | 98 | - name: Push changes 99 | uses: ad-m/github-push-action@master 100 | with: 101 | github_token: ${{ secrets.GITHUB_TOKEN }} 102 | branch: ${{ github.ref }} -------------------------------------------------------------------------------- /PRESET_INDEX.yaml: -------------------------------------------------------------------------------- 1 | version: 4951902d58b5d4016dbcd24cec52c053d1c72473 2 | last_updated: '2025-12-23T01:03:46.479Z' 3 | total_presets: 6 4 | presets: 5 | - name: default-mario-aio 6 | path: presets/default-mario-aio 7 | category: FPV 8 | author: OpenIPC 9 | description: Mario AIO FPV Preset 10 | tags: 11 | - mario 12 | - aio 13 | status: Official 14 | files: 15 | wfb.yaml: 16 | wireless.channel: '161' 17 | wireless.txpower: '20' 18 | broadcast.stbc: '1' 19 | broadcast.ldpc: '1' 20 | broadcast.mcs_index: '1' 21 | broadcast.tun_index: '1' 22 | broadcast.fec_k: '8' 23 | broadcast.fec_n: '12' 24 | telemetry.serial: ttyS2 25 | telemetry.router: msposd 26 | majestic.yaml: 27 | fpv.enabled: 'true' 28 | fpv.noiseLevel: '0' 29 | system.logLevel: debug 30 | video0.codec: h265 31 | video0.fps: '60' 32 | video0.bitrate: '4096' 33 | video0.size: 1920x1080 34 | additional_files: [] 35 | - name: default-runcam-wifilink 36 | path: presets/default-runcam-wifilink 37 | category: FPV 38 | author: OpenIPC 39 | description: Runcam Wifilink OpenIPC FPV Preset 40 | tags: 41 | - runcam 42 | - wifilink 43 | status: Official 44 | files: 45 | wfb.yaml: 46 | wireless.channel: '161' 47 | wireless.txpower: '1' 48 | broadcast.stbc: '0' 49 | broadcast.ldpc: '0' 50 | broadcast.mcs_index: '1' 51 | broadcast.tun_index: '1' 52 | broadcast.fec_k: '8' 53 | broadcast.fec_n: '12' 54 | telemetry.serial: ttyS2 55 | telemetry.router: msposd 56 | majestic.yaml: 57 | fpv.enabled: 'true' 58 | fpv.noiseLevel: '0' 59 | system.logLevel: debug 60 | video0.codec: h265 61 | video0.fps: '60' 62 | video0.bitrate: '4096' 63 | video0.size: 1920x1080 64 | additional_files: [] 65 | - name: default-ultrasight 66 | path: presets/default-ultrasight 67 | category: FPV 68 | author: Your Name 69 | description: Description of default-ultrasight. 70 | tags: 71 | - default-ultrasight 72 | status: Community 73 | files: 74 | wfb.yaml: 75 | wireless.channel: '161' 76 | wireless.txpower: '1' 77 | broadcast.stbc: '0' 78 | broadcast.ldpc: '0' 79 | broadcast.mcs_index: '1' 80 | broadcast.tun_index: '1' 81 | broadcast.fec_k: '8' 82 | broadcast.fec_n: '12' 83 | telemetry.serial: ttyS2 84 | telemetry.router: msposd 85 | majestic.yaml: 86 | fpv.enabled: 'true' 87 | fpv.noiseLevel: '0' 88 | system.logLevel: debug 89 | video0.codec: h265 90 | video0.fps: '60' 91 | video0.bitrate: '4096' 92 | video0.size: 1920x1080 93 | additional_files: [] 94 | - name: high-power-fpv 95 | path: presets/high-power-fpv 96 | category: FPV 97 | author: OpenIPC Dev 98 | description: Description of high-power-fpv. 99 | tags: 100 | - high-power 101 | - fpv 102 | status: Experimental 103 | files: 104 | wfb.yaml: 105 | wireless.channel: '161' 106 | wireless.txpower: '20' 107 | broadcast.stbc: '0' 108 | broadcast.ldpc: '0' 109 | broadcast.mcs_index: '1' 110 | broadcast.tun_index: '1' 111 | broadcast.fec_k: '8' 112 | broadcast.fec_n: '12' 113 | telemetry.serial: ttyS2 114 | telemetry.router: msposd 115 | majestic.yaml: 116 | fpv.enabled: 'false' 117 | system.logLevel: debug 118 | video0.codec: h264 119 | video0.fps: '120' 120 | additional_files: [] 121 | - name: vtxmenu-041725 122 | path: presets/vtxmenu-041725 123 | category: FPV 124 | author: OpenIPC 125 | description: VTXMenu 126 | tags: 127 | - vtxmenu-041725 128 | status: Community 129 | files: {} 130 | additional_files: 131 | - vtxmenu.ini 132 | - name: vtxmenu-202505 133 | path: presets/vtxmenu-202505 134 | category: FPV 135 | author: OpenIPC 136 | description: Latest VTXMenu as of May 2025 137 | tags: 138 | - vtxmenu-202505 139 | status: Official 140 | files: {} 141 | additional_files: 142 | - vtxmenu.ini 143 | -------------------------------------------------------------------------------- /tools/indexer/indexer.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | const yaml = require('js-yaml'); 4 | 5 | /** 6 | * Generates a preset index for a given repository 7 | * @param {string} repoPath - Path to the repository root 8 | * @param {string} outputPath - Optional custom output path for index file 9 | */ 10 | function generatePresetIndex(repoPath, outputPath = null) { 11 | console.log(`Starting preset indexing in: ${repoPath}`); 12 | 13 | const presets = []; 14 | 15 | /** 16 | * Find preset-config.yaml files in presets directory 17 | * @param {string} presetsDir - Directory containing preset folders 18 | */ 19 | function findPresetConfigs(presetsDir) { 20 | console.log(`Searching for presets in: ${presetsDir}`); 21 | 22 | try { 23 | // Ensure presets directory exists 24 | if (!fs.existsSync(presetsDir)) { 25 | console.error(`Presets directory not found: ${presetsDir}`); 26 | return; 27 | } 28 | 29 | // Get all subdirectories in the presets folder 30 | const presetFolders = fs.readdirSync(presetsDir) 31 | .filter(file => 32 | fs.statSync(path.join(presetsDir, file)).isDirectory() 33 | ); 34 | 35 | console.log(`Found ${presetFolders.length} potential preset folders`); 36 | 37 | presetFolders.forEach(presetFolder => { 38 | const fullPresetPath = path.join(presetsDir, presetFolder); 39 | const configPath = path.join(fullPresetPath, 'preset-config.yaml'); 40 | 41 | try { 42 | // Check if preset-config.yaml exists 43 | if (fs.existsSync(configPath)) { 44 | try { 45 | // Read and parse the preset configuration 46 | const presetConfig = yaml.load(fs.readFileSync(configPath, 'utf8')); 47 | 48 | // Validate preset configuration 49 | if (!presetConfig || typeof presetConfig !== 'object') { 50 | console.warn(`Invalid preset configuration in: ${configPath}`); 51 | return; 52 | } 53 | 54 | // Extract relevant metadata with fallback values 55 | const preset = { 56 | name: presetConfig.name || presetFolder, 57 | path: path.relative(repoPath, fullPresetPath), 58 | category: presetConfig.category || 'Uncategorized', 59 | author: presetConfig.author || 'Unknown', 60 | description: presetConfig.description || '', 61 | tags: Array.isArray(presetConfig.tags) ? presetConfig.tags : [], 62 | status: presetConfig.status || 'Draft', 63 | files: presetConfig.files || {}, 64 | additional_files: Array.isArray(presetConfig.additional_files) ? presetConfig.additional_files : [] 65 | 66 | }; 67 | 68 | console.log(`Found preset: ${preset.name} at ${preset.path}`); 69 | presets.push(preset); 70 | } catch (parseError) { 71 | console.error(`Error parsing ${configPath}:`, parseError); 72 | } 73 | } else { 74 | console.log(`No preset-config.yaml found in: ${fullPresetPath}`); 75 | } 76 | } catch (error) { 77 | console.error(`Error processing preset folder ${fullPresetPath}:`, error); 78 | } 79 | }); 80 | } catch (error) { 81 | console.error(`Error searching for presets in ${presetsDir}:`, error); 82 | } 83 | } 84 | 85 | // Start searching for preset configs in the presets directory 86 | const presetsDir = path.join(repoPath, 'presets'); 87 | findPresetConfigs(presetsDir); 88 | 89 | // Determine output path (use provided or default to repo root) 90 | const indexPath = outputPath || path.join(repoPath, 'PRESET_INDEX.yaml'); 91 | 92 | // Generate index file 93 | const indexContent = { 94 | version: 1, 95 | last_updated: new Date().toISOString(), 96 | total_presets: presets.length, 97 | presets: presets 98 | }; 99 | 100 | // Write index file 101 | try { 102 | fs.writeFileSync(indexPath, yaml.dump(indexContent)); 103 | console.log(`Generated preset index with ${presets.length} presets`); 104 | console.log(`Index saved to: ${indexPath}`); 105 | } catch (writeError) { 106 | console.error('Error writing index file:', writeError); 107 | } 108 | 109 | return indexContent; 110 | } 111 | 112 | /** 113 | * Validate the generated index 114 | * @param {string} repoPath - Path to the repository root 115 | * @param {string} indexPath - Path to the generated index file 116 | */ 117 | function validatePresetIndex(repoPath, indexPath = null) { 118 | const defaultIndexPath = path.join(repoPath, 'PRESET_INDEX.yaml'); 119 | const targetIndexPath = indexPath || defaultIndexPath; 120 | 121 | try { 122 | // Read the index file 123 | const indexContent = yaml.load(fs.readFileSync(targetIndexPath, 'utf8')); 124 | 125 | // Perform validations 126 | if (!indexContent.version) { 127 | throw new Error('Missing index version'); 128 | } 129 | 130 | if (!indexContent.presets || !Array.isArray(indexContent.presets)) { 131 | throw new Error('Invalid presets section'); 132 | } 133 | 134 | // Validate each preset 135 | indexContent.presets.forEach(preset => { 136 | if (!preset.name) { 137 | throw new Error(`Preset missing name: ${JSON.stringify(preset)}`); 138 | } 139 | 140 | // Verify preset path exists 141 | const presetPath = path.join(repoPath, preset.path, 'preset-config.yaml'); 142 | if (!fs.existsSync(presetPath)) { 143 | throw new Error(`Preset configuration not found: ${presetPath}`); 144 | } 145 | }); 146 | 147 | console.log('Preset index validation successful'); 148 | return true; 149 | } catch (error) { 150 | console.error('Preset index validation failed:', error); 151 | return false; 152 | } 153 | } 154 | 155 | // Allow script to be run directly or imported 156 | if (require.main === module) { 157 | const repoPath = process.argv[2] || process.cwd(); 158 | generatePresetIndex(repoPath); 159 | validatePresetIndex(repoPath); 160 | } 161 | 162 | module.exports = { 163 | generatePresetIndex, 164 | validatePresetIndex 165 | }; 166 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OpenIPC FPV Presets 2 | 3 | Collection of preconfigured presets for OpenIPC FPV Configurator application. 4 | 5 | ***USE AT YOUR OWN RISK.*** 6 | ***A lot of these presets are outdated, another solution is being designed.*** 7 | 8 | ## Overview 9 | 10 | OpenIPC FPV Presets provide ready-to-use configurations for FPV camera systems. These presets help you quickly set up your camera with optimal settings for different scenarios, such as racing, freestyle, or long-range flying. 11 | 12 | ### Key Benefits 13 | 14 | - **Quickly apply optimized camera settings** for different flying styles 15 | - **Easily share configurations** with the community 16 | - **Standardized format** for consistent configuration across devices 17 | 18 | ## How to Use Presets 19 | 20 | 1. **Open the OpenIPC FPV Configurator** application 21 | 2. **Navigate to the Presets tab** 22 | 3. **Browse and select** a preset from the list 23 | 4. **View the details** to understand what the preset optimizes 24 | 5. **Click "Apply Preset"** to configure your camera 25 | 26 | ![Preset Tab](images/preset-tab.png) 27 | 28 | ![Preset Details View](images/preset-details-view.png) 29 | 30 | ## How Presets Work 31 | 32 | ### Preset Layout 33 | 34 | #### 1. Repository Structure 35 | 36 | The repository contains: 37 | 38 | - **`PRESET_INDEX.yaml`**: Auto-generated index of all presets with their metadata. This file is used by the OpenIPC Configurator to quickly discover and load available presets. 39 | - **`presets/` directory**: Contains individual preset folders 40 | 41 | Each preset is a self-contained folder under the `presets/` directory that includes: 42 | 43 | - **`preset-config.yaml`**: Defines preset metadata, attributes, and modified files 44 | - **Additional files** referenced in the configuration (e.g., `vtxmenu.ini`) 45 | 46 | **Example Structure**: 47 | ``` 48 | / 49 | ├── PRESET_INDEX.yaml 50 | ├── presets/ 51 | │ ├── high_power_fpv/ 52 | │ │ ├── preset-config.yaml 53 | │ │ ├── vtxmenu.ini 54 | ``` 55 | 56 | #### 2. Preset Definition (`preset-config.yaml`) 57 | 58 | The `preset-config.yaml` file defines: 59 | 60 | - **Metadata**: `name`, `author`, `description`, and `category` 61 | - **Files**: Specifies files and their key-value modifications 62 | - **Additional Files**: Specifies supplementary files to be copied to the device 63 | 64 | **Example**: 65 | ```yaml 66 | name: "High Power FPV" 67 | author: "OpenIPC" 68 | description: "Optimized settings for high-power FPV." 69 | files: 70 | wfb.yaml: 71 | wireless.txpower: "30" 72 | wireless.channel: "161" 73 | majestic.yaml: 74 | fpv.enabled: "true" 75 | system.logLevel: "info" 76 | additional_files: 77 | - vtxmenu.ini 78 | ``` 79 | 80 | #### 3. Application Process 81 | 82 | When a preset is applied: 83 | 84 | 1. **File Modifications**: 85 | - Settings are applied to configuration files on your device 86 | 87 | 2. **Additional Files Transfer**: 88 | - Any specified additional files are copied to your device 89 | 90 | 3. **Logs**: 91 | - Success or failure of the operations is logged 92 | 93 | ## Contributing Presets 94 | 95 | Want to share your optimal camera settings with the community? Follow these steps to contribute a preset. 96 | 97 | ### 1. Fork the Repository 98 | 99 | 1. Click the "Fork" button at the top right of this repository 100 | 2. Clone your forked repository to your local machine: 101 | ```bash 102 | git clone https://github.com/YOUR-USERNAME/fpv-presets.git 103 | cd fpv-presets 104 | ``` 105 | 106 | ### 2. Create a New Preset 107 | 108 | #### Option A: Use the Helper Script 109 | 110 | 1. Run the provided creation script which will guide you through the process: 111 | ```bash 112 | ./create_preset.sh 113 | ``` 114 | This interactive script will: 115 | - Ask for your preset details 116 | - Create the necessary folder structure 117 | - Generate a template `preset-config.yaml` file 118 | 119 | #### Option B: Manual Creation 120 | 121 | 1. Create a new folder inside the `presets` directory. Use a descriptive name for your preset: 122 | ```bash 123 | mkdir -p presets/my-awesome-preset 124 | ``` 125 | 126 | 2. Inside your preset folder, create a `preset-config.yaml` file with the following structure: 127 | ```yaml 128 | name: "My Awesome Preset" 129 | category: "Race" # Options: Race, Freestyle, Cinematic, Indoor, LongRange, etc. 130 | author: "Your Name" 131 | description: "A detailed description of what this preset is optimized for" 132 | status: "Official" # Options: Draft, Testing, Stable, Official (used by OpenIPC devs) 133 | tags: 134 | - mario 135 | - aio 136 | - daylight 137 | - lowlatency 138 | 139 | # Camera configuration settings 140 | files: 141 | majestic.yaml: 142 | nightMode: false 143 | bitrate: 4 144 | wdr: false 145 | # Add all your camera configuration parameters here 146 | 147 | # Additional files to be copied to /etc on the device 148 | # These files must exist in your preset folder 149 | additional_files: 150 | - vtxmenu.ini 151 | ``` 152 | 153 | 3. Add any additional files referenced in the `additional_files` section to your preset folder. 154 | 155 | ### 3. Test Your Preset 156 | 157 | 1. Test your preset with the OpenIPC FPV Configurator to ensure it works as expected 158 | 2. Verify that your `preset-config.yaml` file is properly formatted and contains all necessary settings 159 | 160 | #### Testing with Your Forked Repository 161 | 162 | To test presets from your forked repository before submitting a pull request, you can configure the OpenIPC Configurator to use your fork: 163 | 164 | 1. Locate the `appsettings.yaml` file on your system: 165 | - Mac: `$HOME/Library/Application Support/OpenIPC_Config/Logs` 166 | - Windows: `%APPDATA%\Local\OpenIPC_Config\Logs` 167 | - Linux: `~/.config/openipc-configurator.log` 168 | 169 | 2. Add your forked repository to the `Presets` section in the `appsettings.yaml` file: 170 | ```yaml 171 | "Presets": { 172 | "Repositories": [ 173 | { 174 | "Url": "https://github.com/OpenIPC/fpv-presets", 175 | "Branch": "master", 176 | "Description": "Official OpenIPC presets repository", 177 | "IsActive": true 178 | }, 179 | { 180 | "Url": "https://github.com/YOUR-USERNAME/fpv-presets", 181 | "Branch": "main", 182 | "Description": "My custom presets repository", 183 | "IsActive": true 184 | } 185 | ] 186 | } 187 | ``` 188 | 189 | 3. Save the file and restart the OpenIPC Configurator 190 | 4. Your custom presets should now appear in the presets list within the application 191 | 192 | ### 4. Submit a Pull Request 193 | 194 | 1. Update the PRESET_INDEX.yaml file: 195 | - In the official OpenIPC repository, this is automatically done by GitHub Actions 196 | - For your forked repository, you may need to manually run the build script: 197 | ```bash 198 | ./build.sh 199 | ``` 200 | - Make sure to commit the updated PRESET_INDEX.yaml file with your changes 201 | 202 | 2. Commit your changes: 203 | ```bash 204 | git add presets/my-awesome-preset/ 205 | git add PRESET_INDEX.yaml 206 | git commit -m "Add My Awesome Preset for XYZ camera" 207 | git push origin main 208 | ``` 209 | 210 | 3. Go to the original repository and click "Pull Request" 211 | 4. Fill out the PR template with details about your preset 212 | 213 | ### Notes 214 | 215 | - The `PRESET_INDEX.yaml` file is automatically generated - don't modify it manually 216 | - Each preset must include a complete `preset-config.yaml` file 217 | - Make sure your preset has a unique and descriptive name 218 | - Include as much detail as possible in the description to help users understand when to use your preset 219 | 220 | ## Technical Details 221 | 222 | ### Preset Loading 223 | 224 | - The application first reads the `PRESET_INDEX.yaml` file to get a list of all available presets. 225 | - For each preset in the index, it then loads the corresponding preset folder. 226 | - It parses each `preset-config.yaml` to create a `Preset` object with all its settings. 227 | 228 | ### UI Workflow 229 | 230 | - **Preset List**: 231 | - Displays all available presets using a `ListBox`. 232 | - Users can select a preset by its name. 233 | 234 | - **Details Panel**: 235 | - Displays metadata (`Name`, `Author`, `Description`). 236 | - Lists file modifications and sensor file. 237 | 238 | - **"Apply Preset" Button**: 239 | - Applies the selected preset's changes to the remote device. 240 | - Button is enabled only if a preset is selected. 241 | 242 | ### Key Features 243 | 244 | - **Dynamic Preset Management**: 245 | - Add/remove presets by simply editing the `presets/` directory. 246 | - **File Abstraction**: 247 | - Presets only define attributes; the app handles file locations. 248 | - **User-Friendly UI**: 249 | - Select a preset, view details, and apply it with a single click. 250 | 251 | ### Preset Indexer 252 | 253 | The preset indexer is a critical component that generates the `PRESET_INDEX.yaml` file used by the OpenIPC Configurator to discover and load available presets. 254 | 255 | #### Purpose 256 | 257 | - Generates the `PRESET_INDEX.yaml` file in the root of the repository 258 | - Scans all presets and creates a centralized index 259 | - Enables the OpenIPC Configurator to quickly load available presets without scanning individual directories 260 | 261 | #### Implementation 262 | 263 | - Located at `tools/indexer/indexer.js` in the repository 264 | - Run using: `npx node tools/indexer/indexer.js` 265 | - Automatically called by the `build.sh` script during repository updates 266 | 267 | #### How It Works 268 | 269 | 1. The indexer scans through all folders in the `presets/` directory 270 | 2. It reads each `preset-config.yaml` file it finds 271 | 3. It extracts metadata (name, author, category, tags, etc.) 272 | 4. It compiles all this information into a single `PRESET_INDEX.yaml` file in the root of the repository 273 | 274 | #### Running the Indexer Manually 275 | 276 | When developing locally, you need to run the indexer after making changes: 277 | 278 | ```bash 279 | # From the repository root 280 | npx node tools/indexer/indexer.js 281 | ``` 282 | 283 | Or simply use the build script: 284 | 285 | ```bash 286 | # From the repository root 287 | ./build.sh 288 | ``` 289 | 290 | #### Important Notes 291 | 292 | - The indexer must be run after any changes to preset files 293 | - Never edit `PRESET_INDEX.yaml` manually as it will be overwritten by the indexer 294 | - The index file is crucial for the OpenIPC Configurator to discover presets 295 | - In the official repository, GitHub Actions automatically runs the indexer when changes are pushed 296 | - When working with a forked repository, you must manually run the indexer before submitting a pull request 297 | 298 | ## Future Enhancements 299 | 300 | * Add capability for users to add their own repositories 301 | * Save current settings to a file 302 | * Import/export preset configurations between devices 303 | -------------------------------------------------------------------------------- /presets/vtxmenu-041725/vtxmenu.ini: -------------------------------------------------------------------------------- 1 | ; VTXMenu Ini file format 2 | 3 | ; * Sections are pages 4 | ; * Sections can have Submenus or Options or Commands 5 | ; * Submenus link to other Sections 6 | ; * Options have a special colon seperated format in this order 7 | ; Name 8 | ; Range or List 9 | ; Command to read the value 10 | ; Command to write the value 11 | 12 | ; Range: Specify a numeric allowed list of values 13 | ; List: Somma seperated list of option 14 | ; * Command have colon separtedt list of lable and command to run 15 | 16 | [VTX MENU] 17 | Submenu1=BASIC SETTINGS 18 | Submenu2=ADVANCED SETTINGS 19 | 20 | [BASIC SETTINGS] 21 | Option1=CHANNELS 20MHZ:36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165:wifibroadcast cli -g .wireless.channel:wifibroadcast cli -s .wireless.channel {} 22 | Submenu1=RESOLUTION 23 | Submenu2=RUNCAM WIFILINK 24 | Submenu3=EMAX WYVERN 25 | Submenu4=VTX MENU 26 | 27 | [RESOLUTION] 28 | Command1=720P120:cli -s .video0.size 1280x720 && cli -s .video0.fps 120 && cli -s .isp.exposure 8 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local 29 | Command2=720P100:cli -s .video0.size 1280x720 && cli -s .video0.fps 100 && cli -s .isp.exposure 10 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local 30 | Command3=720P90:cli -s .video0.size 1280x720 && cli -s .video0.fps 90 && cli -s .isp.exposure 11 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local 31 | Command4=720P60:cli -s .video0.size 1280x720 && cli -s .video0.fps 60 && cli -s .isp.exposure 16 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local 32 | Command5=1080P90:cli -s .video0.size 1920x1080 && cli -s .video0.fps 90 && cli -s .isp.exposure 11 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local 33 | Command6=1080P60WIDE:cli -s .video0.size 1920x1080 && cli -s .video0.fps 60 && cli -s .isp.exposure 16 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local 34 | Command7=1080P60BOX:cli -s .video0.size 1440x1080 && cli -s .video0.fps 60 && cli -s .isp.exposure 16 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local && sed -i -e '$i sleep 0.5' /etc/rc.local && sed -i -e '$i echo setprecrop 0 0 904 0 1440 1080 > /proc/mi_modules/mi_vpe/mi_vpe0' /etc/rc.local 35 | Command8=1080P90BOX:cli -s .video0.size 1440x1080 && cli -s .video0.fps 90 && cli -s .isp.exposure 16 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local && sed -i -e '$i sleep 0.5' /etc/rc.local && sed -i -e '$i echo setprecrop 0 0 240 0 1440 1080 > /proc/mi_modules/mi_vpe/mi_vpe0' /etc/rc.local 36 | Submenu1=BASIC SETTINGS 37 | Submenu2=VTX MENU 38 | 39 | [RUNCAM WIFILINK] 40 | Command1=VERY LONG RANGE 2MBPS:cli -s .video0.bitrate 2048 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .broadcast.mcs_index 0 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 55 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 41 | Command2=LONG RANGE 4MBPS:cli -s .video0.bitrate 4096 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .broadcast.mcs_index 1 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 55 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 42 | Command3=MID RANGE 8MBPS:cli -s .video0.bitrate 8192 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .broadcast.mcs_index 2 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 50 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 43 | Command4=SHORT RANGE 15MBPS:cli -s .video0.bitrate 14336 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .broadcast.mcs_index 4 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 45 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 44 | Submenu1=ALINK PROFILE 1 45 | Submenu2=BASIC SETTINGS 46 | Submenu3=VTX MENU 47 | 48 | [EMAX WYVERN] 49 | Command1=VERY LONG RANGE 2MBPS:cli -s .video0.bitrate 2000 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .broadcast.mcs_index 0 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 30 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 50 | Command2=LONG RANGE 4MBPS:cli -s .video0.bitrate 4096 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .broadcast.mcs_index 1 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 30 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 51 | Command3=MID RANGE 8MBPS:cli -s .video0.bitrate 8192 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .broadcast.mcs_index 2 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 30 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 52 | Command4=SHORT RANGE 20MHZ 15MBPS:cli -s .video0.bitrate 14336 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .broadcast.mcs_index 4 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 30 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 53 | Option1=CHANNELS 40MHZ:36,44,52,60,100,108,116,124,132,140,149,157,165:wifibroadcast cli -g .wireless.channel:wifibroadcast cli -s .wireless.channel {} 54 | Command5=SHORT RANGE 40MHZ 20MBPS:cli -s .video0.bitrate 19456 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .broadcast.mcs_index 3 && wifibroadcast cli -s .wireless.width 40 && wifibroadcast cli -s .wireless.txpower 30 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 && wifibroadcast cli -s .wireless.channel 60 55 | Submenu1=ALINK PROFILE 2 56 | Submenu2=BASIC SETTINGS 57 | Submenu3=VTX MENU 58 | 59 | [ALINK PROFILE 1] 60 | Command1=25MW:truncate -s 0 /etc/txprofiles.conf && printf "# \n999 - 1200 long 0 8 12 1024 10 30 0,0,0,0 20 -12\n1201 - 1400 long 1 8 12 4096 10 30 0,0,0,0 20 -12\n1401 - 1500 long 2 8 12 5120 10 25 0,0,0,0 20 -12\n1501 - 1600 long 2 8 12 8192 10 25 0,0,0,0 20 -12\n1601 - 1700 long 2 8 12 8192 10 20 0,0,0,0 20 -12\n1701 - 1800 long 2 8 12 9216 10 20 0,0,0,0 20 -12\n1801 - 2001 long 2 8 12 10240 10 20 0,0,0,0 20 -12" >> /etc/txprofiles.conf 61 | Command2=200MW:truncate -s 0 /etc/txprofiles.conf && printf "# \n999 - 1200 long 0 8 12 1024 10 40 0,0,0,0 20 -12\n1201 - 1400 long 1 8 12 4096 10 40 0,0,0,0 20 -12\n1401 - 1500 long 2 8 12 5120 10 40 0,0,0,0 20 -12\n1501 - 1600 long 2 8 12 8192 10 40 0,0,0,0 20 -12\n1601 - 1700 long 2 8 12 8192 10 35 0,0,0,0 20 -12\n1701 - 1800 long 2 8 12 10240 10 35 0,0,0,0 20 -12\n1801 - 2001 long 2 8 12 10240 10 30 0,0,0,0 20 -12" >> /etc/txprofiles.conf 62 | Submenu1=RUNCAM WIFILINK 63 | Submenu2=BASIC SETTINGS 64 | Submenu3=VTX MENU 65 | 66 | [ALINK PROFILE 2] 67 | Command1=25MW:truncate -s 0 /etc/txprofiles.conf && printf "# \n999 - 1200 long 0 8 12 1024 10 30 0,0,0,0 20 -12\n1201 - 1400 long 1 8 12 4096 10 30 0,0,0,0 20 -12\n1401 - 1500 long 2 8 12 5120 10 25 0,0,0,0 20 -12\n1501 - 1600 long 2 8 12 8192 10 25 0,0,0,0 20 -12\n1601 - 1700 long 2 8 12 8192 10 20 0,0,0,0 20 -12\n1701 - 1800 long 2 8 12 9216 10 20 0,0,0,0 20 -12\n1801 - 2001 long 2 8 12 10240 10 20 0,0,0,0 20 -12" >> /etc/txprofiles.conf 68 | Command2=100MW:truncate -s 0 /etc/txprofiles.conf && printf "# \n999 - 1200 long 0 8 12 1024 10 45 0,0,0,0 20 -12\n1201 - 1400 long 1 8 12 4096 10 45 0,0,0,0 20 -12\n1401 - 1500 long 2 8 12 5120 10 45 0,0,0,0 20 -12\n1501 - 1600 long 2 8 12 8192 10 45 0,0,0,0 20 -12\n1601 - 1700 long 2 8 12 8192 10 40 0,0,0,0 20 -12\n1701 - 1800 long 2 8 12 10240 10 40 0,0,0,0 20 -12\n1801 - 2001 long 2 8 12 10240 10 35 0,0,0,0 20 -12" >> /etc/txprofiles.conf 69 | Command3=25MW_HIGH_BITRATE:truncate -s 0 /etc/txprofiles.conf && printf "# \n999 - 1200 long 0 8 12 1024 10 30 0,0,0,0 20 -12\n1201 - 1400 long 0 8 12 4096 10 30 0,0,0,0 40 -12\n1401 - 1500 long 1 8 12 5120 10 25 0,0,0,0 40 -12\n1501 - 1600 long 1 8 12 10240 10 25 0,0,0,0 40 -12\n1601 - 1700 long 1 8 12 10240 10 20 0,0,0,0 40 -12\n1701 - 1800 long 2 8 12 15360 10 20 0,0,0,0 40 -12\n1801 - 2001 long 2 8 12 16384 10 20 0,0,0,0 40 -12" >> /etc/txprofiles.conf 70 | Command4=100MW_HIGH_BITRATE:truncate -s 0 /etc/txprofiles.conf && printf "# \n999 - 1200 long 0 8 12 1024 10 40 0,0,0,0 20 -12\n1201 - 1400 long 0 8 12 4096 10 40 0,0,0,0 40 -12\n1401 - 1500 long 1 8 12 5120 10 40 0,0,0,0 40 -12\n1501 - 1600 long 1 8 12 10240 10 40 0,0,0,0 40 -12\n1601 - 1700 long 1 8 12 10240 10 35 0,0,0,0 40 -12\n1701 - 1800 long 2 8 12 15360 10 35 0,0,0,0 40 -12\n1801 - 2001 long 2 8 12 16384 10 30 0,0,0,0 40 -12" >> /etc/txprofiles.conf 71 | Submenu1=EMAX WYVERN 72 | Submenu2=BASIC SETTINGS 73 | Submenu3=VTX MENU 74 | 75 | [ADVANCED SETTINGS] 76 | Submenu1=CAMERA SETTINGS 77 | Submenu2=WFB-NG SETTINGS 78 | Submenu3=DATE SETTINGS 79 | Submenu4=VTX MENU 80 | 81 | [CAMERA SETTINGS] 82 | Submenu1=IMAGE 83 | Submenu2=VIDEO 84 | Submenu3=RECORDING 85 | Submenu4=ISP 86 | Submenu5=FPV 87 | Command1=RESTART MAJESTIC:killall -1 majestic 88 | Command2=ENABLE ADAPTIVE LINK:sed -i '/alink_drone &/d' /etc/rc.local && sed -i -e '$i alink_drone &' /etc/rc.local | cli -s .video0.qpDelta -12 89 | Command3=DISABLE ADAPTIVE LINK:sed -i '/alink_drone &/d' /etc/rc.local | cli -s .video0.qpDelta -4 90 | Submenu6=VTX MENU 91 | 92 | [IMAGE] 93 | Option1=MIRROR:TRUE,FALSE:cli -g .image.mirror | tr a-z A-Z:cli -s .image.mirror $(echo {} | tr A-Z a-z) 94 | Option2=FLIP:TRUE,FALSE:cli -g .image.flip | tr a-z A-Z:cli -s .image.flip $(echo {} | tr A-Z a-z) 95 | Option3=CONTRAST:0-100:cli -g .image.contrast:cli -s .image.contrast {} 96 | Option4=HUE:0-100:cli -g .image.hue:cli -s .image.hue {} 97 | Option5=SATURATION:0-100:cli -g .image.saturation:cli -s .image.saturation {} 98 | Option6=LUMINANCE:0-100:cli -g .image.luminance:cli -s .image.luminance {} 99 | Option7=ROTATE:0-360:cli -g .image.rotate:cli -s .image.rotate {} 100 | Submenu1=CAMERA SETTINGS 101 | Submenu2=VTX MENU 102 | 103 | [VIDEO] 104 | Option1=SIZE:1280X720,1456X816,1920X1080,1440X1080,1920X1440,2104X1184,2208X1248,2240X1264,2312X1304,2436X1828,2512X1416,2560X1440,2560X1920,2720X1528,2944X1656,3200X1800,3840X2160:cli -g .video0.size | tr x X:cli -s .video0.size $(echo {} | tr X x) 105 | Option2=FPS:20,30,40,50,60,70,80,90,100,120:cli -g .video0.fps:cli -s .video0.fps {} 106 | Option3=BITRATE:1024,2048,3072,4096,5120,6144,7168,8192,9216,10240,11264,12288,13312,14336,15360,16384,17408,18432,19456,20480,21504,22528,23552,24576,25600,26624,27648,28672,29692,30720:cli -g .video0.bitrate:cli -s .video0.bitrate {} 107 | Option4=CODEC:H264,H265:cli -g .video0.codec | tr h H:cli -s .video0.codec $(echo {}| tr H h) 108 | Option5=GOPSIZE:0.1-20:cli -g .video0.gopSize:cli -s .video0.gopSize {} 109 | Option6=RCMODE:VBR,AVBR,CBR:cli -g .video0.rcMode | tr a-z A-Z:cli -s .video0.rcMode $(echo {}| tr A-Z a-z) 110 | Command1=BOX 1440X1080@60:cli -s .video0.size 1440x1080 && cli -s .video0.fps 60 && cli -s .isp.exposure 16 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local && sed -i -e '$i sleep 0.5' /etc/rc.local && sed -i -e '$i echo setprecrop 0 0 904 0 1440 1080 > /proc/mi_modules/mi_vpe/mi_vpe0' /etc/rc.local 111 | Command1=BOX 1440X1080@90:cli -s .video0.size 1440x1080 && cli -s .video0.fps 90 && cli -s .isp.exposure 16 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local && sed -i -e '$i sleep 0.5' /etc/rc.local && sed -i -e '$i echo setprecrop 0 0 240 0 1440 1080 > /proc/mi_modules/mi_vpe/mi_vpe0' /etc/rc.local 112 | Command2=BOX 2560X1920:cli -s .video0.size 2560x1920 && cli -s .video0.fps 60 && cli -s .isp.exposure 16 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local && sed -i -e '$i sleep 0.5' /etc/rc.local && sed -i -e '$i echo setprecrop 0 0 904 0 2560 1920 > /proc/mi_modules/mi_vpe/mi_vpe0' /etc/rc.local 113 | Command3=BOX 2436X1828:cli -s .video0.size 2436x1828 && cli -s .video0.fps 60 && cli -s .isp.exposure 16 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local && sed -i -e '$i sleep 0.5' /etc/rc.local && sed -i -e '$i echo setprecrop 0 0 904 0 2436 1828 > /proc/mi_modules/mi_vpe/mi_vpe0' /etc/rc.local 114 | Command4=DISABLE BOX RESOLUTIONS:sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local 115 | ;Option7=MINQP:0-20:cli -g .video0.minQp:cli -s .video0.minQp {} 116 | ;Option8=MAXQP:0-100:cli -g .video0.maxQp:cli -s .video0.maxQp {} 117 | ;Option9=IPPROP:0-10:cli -g .video0.ipProp:cli -s .video0.ipProp {} 118 | ;Option10=PROFILE:MAIN,:cli -g .video0.profile | tr a-z A-Z:cli -s .video0.profile $(echo {}| tr A-Z a-z) 119 | ;Option11=SLICEUNITS:4:cli -g .video0.sliceUnits:cli -s .video0.sliceUnits {} 120 | ;Option12=QPDELTA:-10-+10:cli -g .video0.qpDelta:cli -s .video0.qpDelta {} ; negative number currently unsupported 121 | Submenu1=CAMERA SETTINGS 122 | Submenu2=VTX MENU 123 | 124 | [RECORDING] 125 | Option1=ENABLED:TRUE,FALSE:cli -g .records.enabled | tr a-z A-Z:cli -s .records.enabled $(echo {} | tr A-Z a-z) 126 | Option2=SPLIT:0-50:cli -g .records.split:cli -s .records.split {} 127 | Option3=MAXUSAGE:0-99:cli -g .records.maxUsage:cli -s .records.maxUsage {} 128 | Submenu1=CAMERA SETTINGS 129 | Submenu2=VTX MENU 130 | 131 | [ISP] 132 | Option1=EXPOSURE:5-50:cli -g .isp.exposure:cli -s .isp.exposure {} 133 | Option2=ANTIFLICKER:DISABLED,50,60:cli -g .isp.antiFlicker | tr a-z A-Z:cli -s .isp.antiFlicker $(echo {} | tr A-Z a-z) 134 | Option3=SENSOR FILE:/ETC/SENSORS/IMX415_FPV.BIN,/ETC/SENSORS/IMX415_MILOS10.BIN,/ETC/SENSORS/IMX415_MILOS15.BIN,/ETC/SENSORS/IMX335_MILOS12TWEAK.BIN,/ETC/SENSORS/IMX335_GREG15.BIN,/ETC/SENSORS/IMX335_SPIKE5.BIN,/ETC/SENSORS/GREGSPIKE05.BIN:cli -g .isp.sensorConfig | tr a-z A-Z:cli -s .isp.sensorConfig $(echo {} | tr A-Z a-z) 135 | Submenu1=CAMERA SETTINGS 136 | Submenu2=VTX MENU 137 | 138 | [FPV] 139 | Option1=ENABLED:TRUE,FALSE:cli -g .fpv.enabled | tr a-z A-Z:cli -s .fpv.enabled $(echo {} | tr A-Z a-z) 140 | Option2=NOISELEVEL:0,1:cli -g .fpv.noiseLevel:cli -s .fpv.noiseLevel {} 141 | Submenu1=CAMERA SETTINGS 142 | Submenu2=VTX MENU 143 | 144 | [WFB-NG SETTINGS] 145 | Option1=TXPOWER:1,20,25,30,35,40,45,50,55,58:wifibroadcast cli -g .wireless.txpower:wifibroadcast cli -s .wireless.txpower {} 146 | Option2=CHANNEL:36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165:wifibroadcast cli -g .wireless.channel:wifibroadcast cli -s .wireless.channel {} 147 | Option3=BANDWIDTH:20,40:wifibroadcast cli -g .wireless.width:wifibroadcast cli -s .wireless.width {} 148 | Option4=MCS_INDEX:0-11:wifibroadcast cli -g .broadcast.mcs_index:wifibroadcast cli -s .broadcast.mcs_index {} 149 | Option5=FEC_K:1-20:wifibroadcast cli -g .broadcast.fec_k:wifibroadcast cli -s .broadcast.fec_k {} 150 | Option6=FEC_N:1-20:wifibroadcast cli -g .broadcast.fec_n:wifibroadcast cli -s .broadcast.fec_n {} 151 | Option7=STBC:0,1:wifibroadcast cli -g .broadcast.stbc:wifibroadcast cli -s .broadcast.stbc {} 152 | Option8=LDPC:0,1:wifibroadcast cli -g .broadcast.ldpc:wifibroadcast cli -s .broadcast.ldpc {} 153 | Submenu1=VTX MENU 154 | 155 | [DATE SETTINGS] 156 | Option1=YEAR :2025-2050:echo $(date +%Y):date -s "{}-$(date '+%m-%d %H:%M')" 157 | Option2=MONTH :1-12:echo $(date +%m):date -s "$(date '+%Y')-{}-$(date '+%d %H:%M')" 158 | Option3=DAY :1-31:echo $(date +%d):date -s "$(date '+%Y-%m')-{} $(date '+%H:%M')" 159 | Option4=HOUR :0-23:echo $(date +%H):date -s "$(date '+%Y-%m-%d') {}:$(date '+%M')" 160 | Option5=MINUTE:0-59:echo $(date +%M):date -s "$(date '+%Y-%m-%d %H'):{}" 161 | ;Command1=File Date:date -s "@$(find /mnt/mmcblk0p1 -maxdepth 1 -type f -printf '%T@\n' | sort -n | tail -1)" 162 | Submenu1=VTX MENU -------------------------------------------------------------------------------- /presets/vtxmenu-202505/vtxmenu.ini: -------------------------------------------------------------------------------- 1 | ; VTXMenu Ini file format 2 | 3 | ; * Sections are pages 4 | ; * Sections can have Submenus or Options or Commands 5 | ; * Submenus link to other Sections 6 | ; * Options have a special colon seperated format in this order 7 | ; Name 8 | ; Range or List 9 | ; Command to read the value 10 | ; Command to write the value 11 | 12 | ; Range: Specify a numeric allowed list of values 13 | ; List: Somma seperated list of option 14 | ; * Command have colon separtedt list of lable and command to run 15 | 16 | [VTX MENU] 17 | Submenu1=BASIC SETTINGS 18 | Submenu2=ADVANCED SETTINGS 19 | 20 | [BASIC SETTINGS] 21 | Option1=CHANNELS 20MHZ:36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165:wifibroadcast cli -g .wireless.channel:wifibroadcast cli -s .wireless.channel {} 22 | Submenu1=RESOLUTION 23 | Submenu2=THINKER TINY 24 | Submenu3=RUNCAM WIFILINK 25 | Submenu4=EMAX WYVERN 26 | Submenu5=VTX MENU 27 | 28 | [RESOLUTION] 29 | Command1=720P120:cli -s .video0.size 1280x720 && cli -s .video0.fps 120 && cli -s .isp.exposure 8 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local 30 | Command2=720P100:cli -s .video0.size 1280x720 && cli -s .video0.fps 100 && cli -s .isp.exposure 10 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local 31 | Command3=720P90:cli -s .video0.size 1280x720 && cli -s .video0.fps 90 && cli -s .isp.exposure 11 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local 32 | Command4=720P60:cli -s .video0.size 1280x720 && cli -s .video0.fps 60 && cli -s .isp.exposure 16 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local 33 | Command5=1080P90:cli -s .video0.size 1920x1080 && cli -s .video0.fps 90 && cli -s .isp.exposure 11 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local 34 | Command6=1080P60WIDE:cli -s .video0.size 1920x1080 && cli -s .video0.fps 60 && cli -s .isp.exposure 16 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local 35 | Command7=1080P60BOX:cli -s .video0.size 1440x1080 && cli -s .video0.fps 60 && cli -s .isp.exposure 16 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local && sed -i -e '$i sleep 0.5' /etc/rc.local && sed -i -e '$i echo setprecrop 0 0 904 0 1440 1080 > /proc/mi_modules/mi_vpe/mi_vpe0' /etc/rc.local 36 | Command8=1080P90BOX:cli -s .video0.size 1440x1080 && cli -s .video0.fps 90 && cli -s .isp.exposure 11 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local && sed -i -e '$i sleep 0.5' /etc/rc.local && sed -i -e '$i echo setprecrop 0 0 240 0 1440 1080 > /proc/mi_modules/mi_vpe/mi_vpe0' /etc/rc.local 37 | Submenu1=BASIC SETTINGS 38 | Submenu2=VTX MENU 39 | 40 | [THINKER TINY] 41 | Command1=VERY LONG RANGE 2MBPS:cli -s .video0.bitrate 2000 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 1500 && wifibroadcast cli -s .broadcast.fec_k 8 && wifibroadcast cli -s .broadcast.fec_n 12 && wifibroadcast cli -s .broadcast.mcs_index 0 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 40 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 42 | Command2=LONG RANGE 4MBPS:cli -s .video0.bitrate 4096 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 1500 && wifibroadcast cli -s .broadcast.fec_k 8 && wifibroadcast cli -s .broadcast.fec_n 12 && wifibroadcast cli -s .broadcast.mcs_index 1 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 35 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 43 | Command3=MID RANGE 8MBPS:cli -s .video0.bitrate 8192 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 1500 && wifibroadcast cli -s .broadcast.fec_k 8 && wifibroadcast cli -s .broadcast.fec_n 12 && wifibroadcast cli -s .broadcast.mcs_index 2 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 35 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 44 | Command4=SHORT RANGE 20MHZ 15MBPS:cli -s .video0.bitrate 14336 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 1500 && wifibroadcast cli -s .broadcast.fec_k 8 && wifibroadcast cli -s .broadcast.fec_n 12 && wifibroadcast cli -s .broadcast.mcs_index 4 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 35 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 45 | Option1=CHANNELS 40MHZ:36,44,52,60,100,108,116,124,132,140,149,157,165:wifibroadcast cli -g .wireless.channel:wifibroadcast cli -s .wireless.channel {} 46 | Command5=SHORT RANGE 40MHZ 20MBPS:cli -s .video0.bitrate 19456 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 1500 && wifibroadcast cli -s .broadcast.fec_k 8 && wifibroadcast cli -s .broadcast.fec_n 12 && wifibroadcast cli -s .broadcast.mcs_index 3 && wifibroadcast cli -s .wireless.width 40 && wifibroadcast cli -s .wireless.txpower 35 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 && wifibroadcast cli -s .wireless.channel 60 47 | Command6=SHORT RANGE 40MHZ 25MBPS:cli -s .video0.bitrate 24576 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 3994 && wifibroadcast cli -s .broadcast.fec_k 12 && wifibroadcast cli -s .broadcast.fec_n 15 && wifibroadcast cli -s .broadcast.mcs_index 3 && wifibroadcast cli -s .wireless.width 40 && wifibroadcast cli -s .wireless.txpower 35 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 && wifibroadcast cli -s .wireless.channel 60 48 | Command7=SHORT RANGE 40MHZ 30MBPS:cli -s .video0.bitrate 29692 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 3994 && wifibroadcast cli -s .broadcast.fec_k 12 && wifibroadcast cli -s .broadcast.fec_n 15 && wifibroadcast cli -s .broadcast.mcs_index 3 && wifibroadcast cli -s .wireless.width 40 && wifibroadcast cli -s .wireless.txpower 35 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 && wifibroadcast cli -s .wireless.channel 60 49 | Submenu1=ALINK PROFILE THINKER TINY 50 | Submenu2=BASIC SETTINGS 51 | Submenu3=VTX MENU 52 | 53 | [RUNCAM WIFILINK] 54 | Command1=VERY LONG RANGE 2MBPS:cli -s .video0.bitrate 2048 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 1500 && wifibroadcast cli -s .broadcast.fec_k 8 && wifibroadcast cli -s .broadcast.fec_n 12 && wifibroadcast cli -s .broadcast.mcs_index 0 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 55 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 55 | Command2=LONG RANGE 4MBPS:cli -s .video0.bitrate 4096 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 1500 && wifibroadcast cli -s .broadcast.fec_k 8 && wifibroadcast cli -s .broadcast.fec_n 12 && wifibroadcast cli -s .broadcast.mcs_index 1 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 55 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 56 | Command3=MID RANGE 8MBPS:cli -s .video0.bitrate 8192 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 1500 && wifibroadcast cli -s .broadcast.fec_k 8 && wifibroadcast cli -s .broadcast.fec_n 12 && wifibroadcast cli -s .broadcast.mcs_index 2 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 50 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 57 | Command4=SHORT RANGE 15MBPS:cli -s .video0.bitrate 14336 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 1500 && wifibroadcast cli -s .broadcast.fec_k 8 && wifibroadcast cli -s .broadcast.fec_n 12 && wifibroadcast cli -s .broadcast.mcs_index 4 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 45 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 58 | Command5=SHORT RANGE 20MBPS:cli -s .video0.bitrate 19456 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 3994 && wifibroadcast cli -s .broadcast.fec_k 12 && wifibroadcast cli -s .broadcast.fec_n 15 && wifibroadcast cli -s .broadcast.mcs_index 4 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 45 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 59 | Submenu1=ALINK PROFILE RUNCAM 60 | Submenu2=BASIC SETTINGS 61 | Submenu3=VTX MENU 62 | 63 | [EMAX WYVERN] 64 | Command1=VERY LONG RANGE 2MBPS:cli -s .video0.bitrate 2000 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 1500 && wifibroadcast cli -s .broadcast.fec_k 8 && wifibroadcast cli -s .broadcast.fec_n 12 && wifibroadcast cli -s .broadcast.mcs_index 0 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 30 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 65 | Command2=LONG RANGE 4MBPS:cli -s .video0.bitrate 4096 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 1500 && wifibroadcast cli -s .broadcast.fec_k 8 && wifibroadcast cli -s .broadcast.fec_n 12 && wifibroadcast cli -s .broadcast.mcs_index 1 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 30 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 66 | Command3=MID RANGE 8MBPS:cli -s .video0.bitrate 8192 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 1500 && wifibroadcast cli -s .broadcast.fec_k 8 && wifibroadcast cli -s .broadcast.fec_n 12 && wifibroadcast cli -s .broadcast.mcs_index 2 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 30 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 67 | Command4=SHORT RANGE 20MHZ 15MBPS:cli -s .video0.bitrate 14336 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 1500 && wifibroadcast cli -s .broadcast.fec_k 8 && wifibroadcast cli -s .broadcast.fec_n 12 && wifibroadcast cli -s .broadcast.mcs_index 4 && wifibroadcast cli -s .wireless.width 20 && wifibroadcast cli -s .wireless.txpower 30 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 68 | Option1=CHANNELS 40MHZ:36,44,52,60,100,108,116,124,132,140,149,157,165:wifibroadcast cli -g .wireless.channel:wifibroadcast cli -s .wireless.channel {} 69 | Command5=SHORT RANGE 40MHZ 20MBPS:cli -s .video0.bitrate 19456 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 1500 && wifibroadcast cli -s .broadcast.fec_k 8 && wifibroadcast cli -s .broadcast.fec_n 12 && wifibroadcast cli -s .broadcast.mcs_index 3 && wifibroadcast cli -s .wireless.width 40 && wifibroadcast cli -s .wireless.txpower 30 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 && wifibroadcast cli -s .wireless.channel 60 70 | Command6=SHORT RANGE 40MHZ 25MBPS:cli -s .video0.bitrate 24576 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 3994 && wifibroadcast cli -s .broadcast.fec_k 12 && wifibroadcast cli -s .broadcast.fec_n 15 && wifibroadcast cli -s .broadcast.mcs_index 3 && wifibroadcast cli -s .wireless.width 40 && wifibroadcast cli -s .wireless.txpower 30 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 && wifibroadcast cli -s .wireless.channel 60 71 | Command7=SHORT RANGE 40MHZ 30MBPS:cli -s .video0.bitrate 29692 && cli -s .fpv.noiseLevel 0 && wifibroadcast cli -s .wireless.mlink 3994 && wifibroadcast cli -s .broadcast.fec_k 12 && wifibroadcast cli -s .broadcast.fec_n 15 && wifibroadcast cli -s .broadcast.mcs_index 3 && wifibroadcast cli -s .wireless.width 40 && wifibroadcast cli -s .wireless.txpower 30 && wifibroadcast cli -s .broadcast.stbc 1 && wifibroadcast cli -s .broadcast.ldpc 1 && wifibroadcast cli -s .wireless.channel 60 72 | Submenu1=ALINK PROFILE EMAX 73 | Submenu2=BASIC SETTINGS 74 | Submenu3=VTX MENU 75 | 76 | [ALINK PROFILE THINKER TINY] 77 | Command1=25MW:truncate -s 0 /etc/txprofiles.conf && printf "# \n999 - 1200 long 0 8 12 1024 10 30 0,0,0,0 20 -12\n1201 - 1400 long 1 8 12 4096 10 30 0,0,0,0 20 -12\n1401 - 1500 long 2 8 12 5120 10 30 0,0,0,0 20 -12\n1501 - 1600 long 2 8 12 8192 10 30 0,0,0,0 20 -12\n1601 - 1700 long 2 8 12 8192 10 30 0,0,0,0 20 -12\n1701 - 1800 long 2 8 12 9216 10 30 0,0,0,0 20 -12\n1801 - 2001 long 2 8 12 10240 10 30 0,0,0,0 20 -12" >> /etc/txprofiles.conf 78 | Command2=100MW:truncate -s 0 /etc/txprofiles.conf && printf "# \n999 - 1200 long 0 8 12 1024 10 30 0,0,0,0 20 -12\n1201 - 1400 long 1 8 12 4096 10 30 0,0,0,0 20 -12\n1401 - 1500 long 2 8 12 5120 10 30 0,0,0,0 20 -12\n1501 - 1600 long 2 8 12 8192 10 30 0,0,0,0 20 -12\n1601 - 1700 long 2 8 12 8192 10 30 0,0,0,0 20 -12\n1701 - 1800 long 2 8 12 10240 10 30 0,0,0,0 20 -12\n1801 - 2001 long 2 8 12 10240 10 30 0,0,0,0 20 -12" >> /etc/txprofiles.conf 79 | Command3=25MW_HIGH_BITRATE:truncate -s 0 /etc/txprofiles.conf && printf "# \n999 - 1200 long 0 8 12 1024 10 30 0,0,0,0 20 -12\n1201 - 1400 long 0 8 12 4096 10 30 0,0,0,0 40 -12\n1401 - 1500 long 1 8 12 5120 10 30 0,0,0,0 40 -12\n1501 - 1600 long 1 8 12 10240 10 30 0,0,0,0 40 -12\n1601 - 1700 long 1 8 12 10240 10 30 0,0,0,0 40 -12\n1701 - 1800 long 2 8 12 15360 10 25 0,0,0,0 40 -12\n1801 - 2001 long 2 8 12 16384 25 20 0,0,0,0 40 -12" >> /etc/txprofiles.conf 80 | Command4=100MW_HIGH_BITRATE:truncate -s 0 /etc/txprofiles.conf && printf "# \n999 - 1200 long 0 8 12 1024 10 30 0,0,0,0 20 -12\n1201 - 1400 long 0 8 12 4096 10 30 0,0,0,0 40 -12\n1401 - 1500 long 1 8 12 5120 10 30 0,0,0,0 40 -12\n1501 - 1600 long 1 8 12 10240 10 30 0,0,0,0 40 -12\n1601 - 1700 long 1 8 12 10240 10 30 0,0,0,0 40 -12\n1701 - 1800 long 2 8 12 15360 10 25 0,0,0,0 40 -12\n1801 - 2001 long 2 8 12 16384 10 25 0,0,0,0 40 -12" >> /etc/txprofiles.conf 81 | Option1=OSD DETAILS:0-5:grep osd_level /etc/alink.conf | cut -d= -f2:sed -i 's/osd_level=.*/osd_level={}/' /etc/alink.conf 82 | Submenu1=THINKER TINY 83 | Submenu2=BASIC SETTINGS 84 | Submenu3=VTX MENU 85 | 86 | [ALINK PROFILE RUNCAM] 87 | Command1=25MW:truncate -s 0 /etc/txprofiles.conf && printf "# \n999 - 1200 long 0 8 12 1024 10 30 0,0,0,0 20 -12\n1201 - 1400 long 1 8 12 4096 10 30 0,0,0,0 20 -12\n1401 - 1500 long 2 8 12 5120 10 30 0,0,0,0 20 -12\n1501 - 1600 long 2 8 12 8192 10 30 0,0,0,0 20 -12\n1601 - 1700 long 2 8 12 8192 10 25 0,0,0,0 20 -12\n1701 - 1800 long 2 8 12 9216 10 25 0,0,0,0 20 -12\n1801 - 2001 long 2 8 12 10240 10 25 0,0,0,0 20 -12" >> /etc/txprofiles.conf 88 | Command2=200MW:truncate -s 0 /etc/txprofiles.conf && printf "# \n999 - 1200 long 0 8 12 1024 10 55 0,0,0,0 20 -12\n1201 - 1400 long 1 8 12 4096 10 55 0,0,0,0 20 -12\n1401 - 1500 long 2 8 12 5120 10 55 0,0,0,0 20 -12\n1501 - 1600 long 2 8 12 8192 10 55 0,0,0,0 20 -12\n1601 - 1700 long 2 8 12 8192 10 55 0,0,0,0 20 -12\n1701 - 1800 long 2 8 12 10240 10 50 0,0,0,0 20 -12\n1801 - 2001 long 2 8 12 10240 10 45 0,0,0,0 20 -12" >> /etc/txprofiles.conf 89 | Option1=OSD DETAILS:0-5:grep osd_level /etc/alink.conf | cut -d= -f2:sed -i 's/osd_level=.*/osd_level={}/' /etc/alink.conf 90 | Submenu1=RUNCAM WIFILINK 91 | Submenu2=BASIC SETTINGS 92 | Submenu3=VTX MENU 93 | 94 | [ALINK PROFILE EMAX] 95 | Command1=25MW:truncate -s 0 /etc/txprofiles.conf && printf "# \n999 - 1200 long 0 8 12 1024 10 30 0,0,0,0 20 -12\n1201 - 1400 long 1 8 12 4096 10 30 0,0,0,0 20 -12\n1401 - 1500 long 2 8 12 5120 10 30 0,0,0,0 20 -12\n1501 - 1600 long 2 8 12 8192 10 30 0,0,0,0 20 -12\n1601 - 1700 long 2 8 12 8192 10 30 0,0,0,0 20 -12\n1701 - 1800 long 2 8 12 9216 10 30 0,0,0,0 20 -12\n1801 - 2001 long 2 8 12 10240 10 30 0,0,0,0 20 -12" >> /etc/txprofiles.conf 96 | Command2=100MW:truncate -s 0 /etc/txprofiles.conf && printf "# \n999 - 1200 long 0 8 12 1024 10 30 0,0,0,0 20 -12\n1201 - 1400 long 1 8 12 4096 10 30 0,0,0,0 20 -12\n1401 - 1500 long 2 8 12 5120 10 30 0,0,0,0 20 -12\n1501 - 1600 long 2 8 12 8192 10 30 0,0,0,0 20 -12\n1601 - 1700 long 2 8 12 8192 10 30 0,0,0,0 20 -12\n1701 - 1800 long 2 8 12 10240 10 30 0,0,0,0 20 -12\n1801 - 2001 long 2 8 12 10240 10 30 0,0,0,0 20 -12" >> /etc/txprofiles.conf 97 | Command3=25MW_HIGH_BITRATE:truncate -s 0 /etc/txprofiles.conf && printf "# \n999 - 1200 long 0 8 12 1024 10 30 0,0,0,0 20 -12\n1201 - 1400 long 0 8 12 4096 10 30 0,0,0,0 40 -12\n1401 - 1500 long 1 8 12 5120 10 30 0,0,0,0 40 -12\n1501 - 1600 long 1 8 12 10240 10 30 0,0,0,0 40 -12\n1601 - 1700 long 1 8 12 10240 10 30 0,0,0,0 40 -12\n1701 - 1800 long 2 8 12 15360 10 25 0,0,0,0 40 -12\n1801 - 2001 long 2 8 12 16384 25 20 0,0,0,0 40 -12" >> /etc/txprofiles.conf 98 | Command4=100MW_HIGH_BITRATE:truncate -s 0 /etc/txprofiles.conf && printf "# \n999 - 1200 long 0 8 12 1024 10 30 0,0,0,0 20 -12\n1201 - 1400 long 0 8 12 4096 10 30 0,0,0,0 40 -12\n1401 - 1500 long 1 8 12 5120 10 30 0,0,0,0 40 -12\n1501 - 1600 long 1 8 12 10240 10 30 0,0,0,0 40 -12\n1601 - 1700 long 1 8 12 10240 10 30 0,0,0,0 40 -12\n1701 - 1800 long 2 8 12 15360 10 25 0,0,0,0 40 -12\n1801 - 2001 long 2 8 12 16384 10 25 0,0,0,0 40 -12" >> /etc/txprofiles.conf 99 | Option1=OSD DETAILS:0-5:grep osd_level /etc/alink.conf | cut -d= -f2:sed -i 's/osd_level=.*/osd_level={}/' /etc/alink.conf 100 | Submenu1=EMAX WYVERN 101 | Submenu2=BASIC SETTINGS 102 | Submenu3=VTX MENU 103 | 104 | [ADVANCED SETTINGS] 105 | Submenu1=CAMERA SETTINGS 106 | Submenu2=WFB-NG SETTINGS 107 | Submenu3=DATE SETTINGS 108 | Submenu4=VTX MENU 109 | 110 | [CAMERA SETTINGS] 111 | Submenu1=IMAGE 112 | Submenu2=VIDEO 113 | Submenu3=RECORDING 114 | Submenu4=ISP 115 | Submenu5=FPV 116 | Command1=RESTART MAJESTIC:killall -1 majestic 117 | Command2=ENABLE ADAPTIVE LINK:sed -i '/alink_drone &/d' /etc/rc.local && sed -i -e '$i alink_drone &' /etc/rc.local | cli -s .video0.qpDelta -12 118 | Command3=DISABLE ADAPTIVE LINK:sed -i '/alink_drone &/d' /etc/rc.local | cli -s .video0.qpDelta -4 119 | Submenu6=VTX MENU 120 | 121 | [IMAGE] 122 | Option1=MIRROR:TRUE,FALSE:cli -g .image.mirror | tr a-z A-Z:cli -s .image.mirror $(echo {} | tr A-Z a-z) 123 | Option2=FLIP:TRUE,FALSE:cli -g .image.flip | tr a-z A-Z:cli -s .image.flip $(echo {} | tr A-Z a-z) 124 | Option3=CONTRAST:0-100:cli -g .image.contrast:cli -s .image.contrast {} 125 | Option4=HUE:0-100:cli -g .image.hue:cli -s .image.hue {} 126 | Option5=SATURATION:0-100:cli -g .image.saturation:cli -s .image.saturation {} 127 | Option6=LUMINANCE:0-100:cli -g .image.luminance:cli -s .image.luminance {} 128 | Option7=ROTATE:0-360:cli -g .image.rotate:cli -s .image.rotate {} 129 | Submenu1=CAMERA SETTINGS 130 | Submenu2=VTX MENU 131 | 132 | [VIDEO] 133 | Option1=SIZE:1280X720,1456X816,1920X1080,1440X1080,1920X1440,2104X1184,2208X1248,2240X1264,2312X1304,2436X1828,2512X1416,2560X1440,2560X1920,2720X1528,2944X1656,3200X1800,3840X2160:cli -g .video0.size | tr x X:cli -s .video0.size $(echo {} | tr X x) 134 | Option2=FPS:20,30,40,50,60,70,80,90,100,120:cli -g .video0.fps:cli -s .video0.fps {} 135 | Option3=BITRATE:1024,2048,3072,4096,5120,6144,7168,8192,9216,10240,11264,12288,13312,14336,15360,16384,17408,18432,19456,20480,21504,22528,23552,24576,25600,26624,27648,28672,29692,30720,31744,32768,33792,34816,35840,36864,37888,38912,39936,40960:cli -g .video0.bitrate:cli -s .video0.bitrate {} 136 | Option4=CODEC:H264,H265:cli -g .video0.codec | tr h H:cli -s .video0.codec $(echo {}| tr H h) 137 | Option5=GOPSIZE:0.1-20:cli -g .video0.gopSize:cli -s .video0.gopSize {} 138 | Option6=RCMODE:VBR,AVBR,CBR:cli -g .video0.rcMode | tr a-z A-Z:cli -s .video0.rcMode $(echo {}| tr A-Z a-z) 139 | Command1=BOX 1440X1080@60:cli -s .video0.size 1440x1080 && cli -s .video0.fps 60 && cli -s .isp.exposure 16 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local && sed -i -e '$i sleep 0.5' /etc/rc.local && sed -i -e '$i echo setprecrop 0 0 904 0 1440 1080 > /proc/mi_modules/mi_vpe/mi_vpe0' /etc/rc.local 140 | Command1=BOX 1440X1080@90:cli -s .video0.size 1440x1080 && cli -s .video0.fps 90 && cli -s .isp.exposure 16 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local && sed -i -e '$i sleep 0.5' /etc/rc.local && sed -i -e '$i echo setprecrop 0 0 240 0 1440 1080 > /proc/mi_modules/mi_vpe/mi_vpe0' /etc/rc.local 141 | Command2=BOX 2560X1920:cli -s .video0.size 2560x1920 && cli -s .video0.fps 60 && cli -s .isp.exposure 16 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local && sed -i -e '$i sleep 0.5' /etc/rc.local && sed -i -e '$i echo setprecrop 0 0 904 0 2560 1920 > /proc/mi_modules/mi_vpe/mi_vpe0' /etc/rc.local 142 | Command3=BOX 2436X1828:cli -s .video0.size 2436x1828 && cli -s .video0.fps 60 && cli -s .isp.exposure 16 && cli -s .fpv.enabled true && sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local && sed -i -e '$i sleep 0.5' /etc/rc.local && sed -i -e '$i echo setprecrop 0 0 904 0 2436 1828 > /proc/mi_modules/mi_vpe/mi_vpe0' /etc/rc.local 143 | Command4=DISABLE BOX RESOLUTIONS:sed -i '/sleep 0.5/d' /etc/rc.local && sed -i '/echo setprecrop*/d' /etc/rc.local 144 | ;Option7=MINQP:0-20:cli -g .video0.minQp:cli -s .video0.minQp {} 145 | ;Option8=MAXQP:0-100:cli -g .video0.maxQp:cli -s .video0.maxQp {} 146 | ;Option9=IPPROP:0-10:cli -g .video0.ipProp:cli -s .video0.ipProp {} 147 | ;Option10=PROFILE:MAIN,:cli -g .video0.profile | tr a-z A-Z:cli -s .video0.profile $(echo {}| tr A-Z a-z) 148 | ;Option11=SLICEUNITS:4:cli -g .video0.sliceUnits:cli -s .video0.sliceUnits {} 149 | ;Option12=QPDELTA:-10-+10:cli -g .video0.qpDelta:cli -s .video0.qpDelta {} ; negative number currently unsupported 150 | Submenu1=CAMERA SETTINGS 151 | Submenu2=VTX MENU 152 | 153 | [RECORDING] 154 | Option1=ENABLED:TRUE,FALSE:cli -g .records.enabled | tr a-z A-Z:cli -s .records.enabled $(echo {} | tr A-Z a-z) 155 | Option2=SPLIT:0-50:cli -g .records.split:cli -s .records.split {} 156 | Option3=MAXUSAGE:0-99:cli -g .records.maxUsage:cli -s .records.maxUsage {} 157 | Submenu1=CAMERA SETTINGS 158 | Submenu2=VTX MENU 159 | 160 | [ISP] 161 | Option1=EXPOSURE:5-50:cli -g .isp.exposure:cli -s .isp.exposure {} 162 | Option2=ANTIFLICKER:DISABLED,50,60:cli -g .isp.antiFlicker | tr a-z A-Z:cli -s .isp.antiFlicker $(echo {} | tr A-Z a-z) 163 | Option3=SENSOR FILE:/ETC/SENSORS/IMX415_FPV.BIN,/ETC/SENSORS/IMX415_MILOS10.BIN,/ETC/SENSORS/IMX415_MILOS15.BIN,/ETC/SENSORS/IMX335_MILOS12TWEAK.BIN,/ETC/SENSORS/IMX335_GREG15.BIN,/ETC/SENSORS/IMX335_SPIKE5.BIN,/ETC/SENSORS/GREGSPIKE05.BIN:cli -g .isp.sensorConfig | tr a-z A-Z:cli -s .isp.sensorConfig $(echo {} | tr A-Z a-z) 164 | Submenu1=CAMERA SETTINGS 165 | Submenu2=VTX MENU 166 | 167 | [FPV] 168 | Option1=ENABLED:TRUE,FALSE:cli -g .fpv.enabled | tr a-z A-Z:cli -s .fpv.enabled $(echo {} | tr A-Z a-z) 169 | Option2=NOISELEVEL:0,1:cli -g .fpv.noiseLevel:cli -s .fpv.noiseLevel {} 170 | Submenu1=CAMERA SETTINGS 171 | Submenu2=VTX MENU 172 | 173 | [WFB-NG SETTINGS] 174 | Option1=TXPOWER:1,20,25,30,35,40,45,50,55,58:wifibroadcast cli -g .wireless.txpower:wifibroadcast cli -s .wireless.txpower {} 175 | Option2=CHANNEL:36,40,44,48,52,56,60,64,100,104,108,112,116,120,124,128,132,136,140,144,149,153,157,161,165:wifibroadcast cli -g .wireless.channel:wifibroadcast cli -s .wireless.channel {} 176 | Option3=BANDWIDTH:20,40:wifibroadcast cli -g .wireless.width:wifibroadcast cli -s .wireless.width {} 177 | Option4=MCS_INDEX:0-13:wifibroadcast cli -g .broadcast.mcs_index:wifibroadcast cli -s .broadcast.mcs_index {} 178 | Option5=FEC_K:1-20:wifibroadcast cli -g .broadcast.fec_k:wifibroadcast cli -s .broadcast.fec_k {} 179 | Option6=FEC_N:1-20:wifibroadcast cli -g .broadcast.fec_n:wifibroadcast cli -s .broadcast.fec_n {} 180 | Option7=STBC:0,1:wifibroadcast cli -g .broadcast.stbc:wifibroadcast cli -s .broadcast.stbc {} 181 | Option8=LDPC:0,1:wifibroadcast cli -g .broadcast.ldpc:wifibroadcast cli -s .broadcast.ldpc {} 182 | Submenu1=VTX MENU 183 | 184 | [DATE SETTINGS] 185 | Option1=YEAR :2025-2050:echo $(date +%Y):date -s "{}-$(date '+%m-%d %H:%M')" 186 | Option2=MONTH :1-12:echo $(date +%m):date -s "$(date '+%Y')-{}-$(date '+%d %H:%M')" 187 | Option3=DAY :1-31:echo $(date +%d):date -s "$(date '+%Y-%m')-{} $(date '+%H:%M')" 188 | Option4=HOUR :0-23:echo $(date +%H):date -s "$(date '+%Y-%m-%d') {}:$(date '+%M')" 189 | Option5=MINUTE:0-59:echo $(date +%M):date -s "$(date '+%Y-%m-%d %H'):{}" 190 | ;Command1=File Date:date -s "@$(find /mnt/mmcblk0p1 -maxdepth 1 -type f -printf '%T@\n' | sort -n | tail -1)" 191 | Submenu1=VTX MENU --------------------------------------------------------------------------------