diff --git a/scripts/README_TX_POWER.md b/scripts/README_TX_POWER.md new file mode 100644 index 0000000..a3dd132 --- /dev/null +++ b/scripts/README_TX_POWER.md @@ -0,0 +1,151 @@ +# WireClaw TX Power Control Scripts + +## Vue d'ensemble + +Deux scripts bash pour contrôler la puissance d'émission (TX) du système WireClaw : + +- **`set_TX_power_base.sh`** — Base (Jetson) +- **`set_TX_power_drone.sh`** — Drone (Pi Zero) + +## Utilisation + +### Base (Jetson) + +```bash +./set_TX_power_base.sh +``` + +**Exemples :** +```bash +./set_TX_power_base.sh 10 # Puissance faible (~3 dBm) +./set_TX_power_base.sh 31 # Puissance moyenne (~10 dBm) +./set_TX_power_base.sh 52 # Puissance haute (~20 dBm) +./set_TX_power_base.sh 63 # Puissance maximale (~23 dBm) +``` + +**Interface :** `wlx54c9ff02f26e` +**Méthode :** `iw dev ... set txpower fixed` +**Requis :** `sudo` + +--- + +### Drone (Pi Zero) + +```bash +./set_TX_power_drone.sh +``` + +**Exemples :** +```bash +./set_TX_power_drone.sh 10 # Puissance faible (~3 dBm) +./set_TX_power_drone.sh 31 # Puissance moyenne (~10 dBm) +./set_TX_power_drone.sh 52 # Puissance haute (~20 dBm) +./set_TX_power_drone.sh 63 # Puissance maximale (~23 dBm) +``` + +**Interface :** `wlan-drone` (via SSH) +**Méthode :** `modprobe -r rtl88xxau_wfb && modprobe rtl88xxau_wfb rtw_tx_pwr_idx_override=` +**Requis :** SSH alias `jetson-pi` + `sudo` sur Pi Zero + +--- + +## Table de conversion Index → dBm + +| Index | dBm approximatif | +|-------|------------------| +| 0 | 0 dBm | +| 10 | ~3 dBm | +| 20 | ~6 dBm | +| 31 | ~10 dBm | +| 42 | ~15 dBm | +| 52 | ~20 dBm | +| 63 | ~23 dBm (max) | + +## Prérequis + +### Jetson (Base) +- Commande `iw` disponible (`/usr/sbin/iw`) +- Sudo sans mot de passe configuré +- Interface `wlx54c9ff02f26e` active + +### Pi Zero (Drone) +- SSH alias `jetson-pi` fonctionnel dans `~/.ssh/config` +- Session sudo "chaude" lancée sur Pi Zero +- Module driver `rtl88xxau_wfb` chargé +- Interface `wlan-drone` active + +## Configuration de la session sudo "chaude" + +Sur Pi Zero, au démarrage de session : +```bash +sudo -v +``` + +Cela cache le mot de passe pendant 15 minutes (~5 min après dernière commande sudo). + +## Aide + +```bash +./set_TX_power_base.sh --help +./set_TX_power_drone.sh --help +``` + +## Version + +- **Base script :** 1.0.0 +- **Drone script :** 1.0.0 + +## Auteur + +WireClaw TX Power Control System + +## Notes + +- La conversion Index → dBm est approximative et dépend du chipset/driver +- Modifier la puissance affecte immédiatement le trafic en cours (peut déconnecter) +- Les limites régionales (FCC/ETSI) peuvent être appliquées par le driver +- Le Pi Zero demande un rechargement du module (interruption de service ~2s) + +--- + +## Exemples d'utilisation + +### Configuration complète (Base + Drone) + +```bash +# Tous deux à puissance moyenne (~10 dBm) +./set_TX_power_base.sh 31 +./set_TX_power_drone.sh 31 +``` + +### Configuration asymétrique + +```bash +# Base en haute puissance, Drone en faible puissance +./set_TX_power_base.sh 52 +./set_TX_power_drone.sh 10 +``` + +### Reset (minimum) + +```bash +./set_TX_power_base.sh 0 +./set_TX_power_drone.sh 0 +``` + +--- + +## Troubleshooting + +### Erreur : "sudo requis" +Sur Jetson : lancez `sudo -v` pour activer une session sudo "chaude" + +### Erreur : "SSH non disponible" +Vérifiez que l'alias `jetson-pi` est configuré dans `~/.ssh/config` + +### Erreur : "Module not found" +Vérifiez que le driver `rtl88xxau_wfb` est compilé et chargé sur Pi Zero + +### Changement de puissance non visible +Vérifiez avec : `iw dev info | grep txpower` + diff --git a/scripts/set_TX_power_base.sh b/scripts/set_TX_power_base.sh new file mode 100755 index 0000000..8a1bac0 --- /dev/null +++ b/scripts/set_TX_power_base.sh @@ -0,0 +1,156 @@ +#!/bin/bash + +# WireClaw TX Power Control - Base (Jetson) +# Version: 1.0.0 +# Description: Modifie la puissance d'émission (TX) du Jetson via iw +# Usage: ./set_TX_power_base.sh +# Example: ./set_TX_power_base.sh 10 + +set -e + +VERSION="1.0.0" +SCRIPT_NAME=$(basename "$0") + +# Configuration +JETSON_IFACE="wlx54c9ff02f26e" +IW_CMD="/usr/sbin/iw" + +# Couleurs +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +# Fonctions +print_header() { + echo -e "${BLUE}════════════════════════════════════════════════════════${NC}" + echo -e "${BLUE} WireClaw TX Power Control - BASE (Jetson) v${VERSION}${NC}" + echo -e "${BLUE}════════════════════════════════════════════════════════${NC}" +} + +print_info() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +print_success() { + echo -e "${GREEN}[✓]${NC} $1" +} + +print_error() { + echo -e "${RED}[✗]${NC} $1" +} + +show_help() { + cat << EOF +${BLUE}Usage:${NC} + $SCRIPT_NAME + +${BLUE}Arguments:${NC} + power_index Index de puissance TX (0-63) + 0 = 0 dBm (minimum) + 10 = ~3 dBm + 20 = ~6 dBm + 31 = ~10 dBm + 42 = ~15 dBm + 52 = ~20 dBm + 63 = ~23 dBm (maximum) + +${BLUE}Exemples:${NC} + $SCRIPT_NAME 10 # Puissance faible + $SCRIPT_NAME 31 # Puissance moyenne + $SCRIPT_NAME 52 # Puissance haute + $SCRIPT_NAME 63 # Puissance maximale + +${BLUE}Interface:${NC} + ${JETSON_IFACE} + +EOF +} + +# Validation +validate_input() { + if [ -z "$1" ]; then + print_error "Aucun index spécifié" + echo "" + show_help + exit 1 + fi + + if ! [[ "$1" =~ ^[0-9]+$ ]]; then + print_error "L'index doit être un nombre entier" + exit 1 + fi + + if [ "$1" -lt 0 ] || [ "$1" -gt 63 ]; then + print_error "L'index doit être entre 0 et 63 (reçu: $1)" + exit 1 + fi +} + +# Conversion index (0-63) -> dBm (0-23) +index_to_dbm() { + echo $(( ($1 * 23) / 63 )) +} + +# Obtenir la puissance actuelle +get_current_power() { + $IW_CMD dev "$JETSON_IFACE" info 2>/dev/null | grep "txpower" | awk '{print $2, $3}' || echo "unknown" +} + +# Modifier la puissance +set_power() { + local index=$1 + local dbm=$(index_to_dbm "$index") + local mbm=$(( dbm * 100 )) + + print_info "Modification du Jetson (Base)..." + echo -n " Puissance actuelle: " + get_current_power + + if sudo -n $IW_CMD dev "$JETSON_IFACE" set txpower fixed "$mbm" 2>/dev/null; then + sleep 0.5 + echo -n " Puissance nouvelle: " + get_current_power + print_success "Jetson configuré (index=$index, ~$dbm dBm)" + return 0 + else + print_error "Impossible de configurer (sudo requis)" + return 1 + fi +} + +# Main +main() { + print_header + + case "$1" in + -h|--help) + show_help + exit 0 + ;; + -v|--version) + echo "WireClaw TX Power Control - Base v${VERSION}" + exit 0 + ;; + esac + + validate_input "$1" + + echo "" + set_power "$1" + STATUS=$? + + echo "" + echo -e "${BLUE}════════════════════════════════════════════════════════${NC}" + + if [ $STATUS -eq 0 ]; then + print_success "Puissance TX Base configurée (index=$1)" + exit 0 + else + print_error "Impossible de configurer la puissance TX" + exit 1 + fi +} + +main "$@" diff --git a/scripts/set_TX_power_drone.sh b/scripts/set_TX_power_drone.sh new file mode 100755 index 0000000..6857b22 --- /dev/null +++ b/scripts/set_TX_power_drone.sh @@ -0,0 +1,170 @@ +#!/bin/bash + +# WireClaw TX Power Control - Drone (Pi Zero) +# Version: 1.0.0 +# Description: Modifie la puissance d'émission (TX) du Pi Zero via modprobe rtw_tx_pwr_idx_override +# Usage: ./set_TX_power_drone.sh +# Example: ./set_TX_power_drone.sh 10 + +set -e + +VERSION="1.0.0" +SCRIPT_NAME=$(basename "$0") + +# Configuration +PIZERO_SSH_ALIAS="jetson-pi" +PIZERO_MODULE="rtl88xxau_wfb" +PIZERO_IFACE="wlan-drone" +IW_CMD="/usr/sbin/iw" + +# Couleurs +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +# Fonctions +print_header() { + echo -e "${BLUE}════════════════════════════════════════════════════════${NC}" + echo -e "${BLUE} WireClaw TX Power Control - DRONE (Pi Zero) v${VERSION}${NC}" + echo -e "${BLUE}════════════════════════════════════════════════════════${NC}" +} + +print_info() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +print_success() { + echo -e "${GREEN}[✓]${NC} $1" +} + +print_error() { + echo -e "${RED}[✗]${NC} $1" +} + +print_warning() { + echo -e "${YELLOW}[!]${NC} $1" +} + +show_help() { + cat << EOF +${BLUE}Usage:${NC} + $SCRIPT_NAME + +${BLUE}Arguments:${NC} + power_index Index de puissance TX (0-63) + 0 = 0 dBm (minimum) + 10 = ~3 dBm + 20 = ~6 dBm + 31 = ~10 dBm + 42 = ~15 dBm + 52 = ~20 dBm + 63 = ~23 dBm (maximum) + +${BLUE}Exemples:${NC} + $SCRIPT_NAME 10 # Puissance faible + $SCRIPT_NAME 31 # Puissance moyenne + $SCRIPT_NAME 52 # Puissance haute + $SCRIPT_NAME 63 # Puissance maximale + +${BLUE}Interface:${NC} + ${PIZERO_IFACE} (via SSH: ${PIZERO_SSH_ALIAS}) + +${BLUE}Méthode:${NC} + ssh jetson-pi "sudo modprobe -r ${PIZERO_MODULE} && sudo modprobe ${PIZERO_MODULE} rtw_tx_pwr_idx_override=" + +${BLUE}Notes:${NC} + - Recharge le module du driver + - Nécessite sudo sur Pi Zero + - Session sudo "chaude" requise + +EOF +} + +# Validation +validate_input() { + if [ -z "$1" ]; then + print_error "Aucun index spécifié" + echo "" + show_help + exit 1 + fi + + if ! [[ "$1" =~ ^[0-9]+$ ]]; then + print_error "L'index doit être un nombre entier" + exit 1 + fi + + if [ "$1" -lt 0 ] || [ "$1" -gt 63 ]; then + print_error "L'index doit être entre 0 et 63 (reçu: $1)" + exit 1 + fi +} + +# Obtenir la puissance actuelle +get_current_power() { + ssh "$PIZERO_SSH_ALIAS" "$IW_CMD dev $PIZERO_IFACE info 2>/dev/null | grep txpower | awk '{print \$2, \$3}'" 2>/dev/null || echo "unknown" +} + +# Modifier la puissance +set_power() { + local index=$1 + + print_info "Modification du Pi Zero (Drone)..." + echo -n " Puissance actuelle: " + get_current_power + + print_info "Recharge du module ${PIZERO_MODULE}..." + print_info " Commande: sudo modprobe -r ${PIZERO_MODULE} && sudo modprobe ${PIZERO_MODULE} rtw_tx_pwr_idx_override=$index" + + if ssh "$PIZERO_SSH_ALIAS" "sudo -n modprobe -r $PIZERO_MODULE && sudo -n modprobe $PIZERO_MODULE rtw_tx_pwr_idx_override=$index" 2>/dev/null; then + sleep 2 # Attendre le rechargement complet du module et la reconnexion + echo -n " Puissance nouvelle: " + get_current_power + print_success "Pi Zero configuré (index=$index)" + return 0 + else + print_error "Impossible de recharger le module" + print_error "Vérifiez que:" + print_error " 1. SSH vers ${PIZERO_SSH_ALIAS} fonctionne" + print_error " 2. Une session sudo 'chaude' est active sur Pi Zero" + print_error " 3. Le module ${PIZERO_MODULE} existe" + return 1 + fi +} + +# Main +main() { + print_header + + case "$1" in + -h|--help) + show_help + exit 0 + ;; + -v|--version) + echo "WireClaw TX Power Control - Drone v${VERSION}" + exit 0 + ;; + esac + + validate_input "$1" + + echo "" + set_power "$1" + STATUS=$? + + echo "" + echo -e "${BLUE}════════════════════════════════════════════════════════${NC}" + + if [ $STATUS -eq 0 ]; then + print_success "Puissance TX Drone configurée (index=$1)" + exit 0 + else + print_error "Impossible de configurer la puissance TX" + exit 1 + fi +} + +main "$@"