Files
NYSM-NYD/tools/start_holodeck_complete.sh

455 lines
11 KiB
Bash

#!/bin/bash
# NowYouSeeMe Complete Holodeck Environment Startup Script
# This script launches the complete holodeck environment with all components
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
BUILD_DIR="$PROJECT_ROOT/build"
BIN_DIR="$BUILD_DIR/bin"
CONFIG_DIR="$PROJECT_ROOT/config"
LOG_DIR="$PROJECT_ROOT/logs"
# Create necessary directories
mkdir -p "$LOG_DIR"
mkdir -p "$CONFIG_DIR"
# Function to print colored output
print_status() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Function to check if a command exists
command_exists() {
command -v "$1" >/dev/null 2>&1
}
# Function to check if a port is available
port_available() {
! nc -z localhost "$1" 2>/dev/null
}
# Function to wait for a service to be ready
wait_for_service() {
local service_name="$1"
local port="$2"
local max_attempts=30
local attempt=1
print_status "Waiting for $service_name to be ready on port $port..."
while [ $attempt -le $max_attempts ]; do
if port_available "$port"; then
print_success "$service_name is ready"
return 0
fi
echo -n "."
sleep 1
attempt=$((attempt + 1))
done
print_error "$service_name failed to start within $max_attempts seconds"
return 1
}
# Function to start a background service
start_background_service() {
local service_name="$1"
local command="$2"
local log_file="$3"
print_status "Starting $service_name..."
if [ -n "$log_file" ]; then
nohup $command > "$log_file" 2>&1 &
else
nohup $command > /dev/null 2>&1 &
fi
local pid=$!
echo $pid > "$LOG_DIR/${service_name}.pid"
print_success "$service_name started with PID $pid"
}
# Function to stop a background service
stop_background_service() {
local service_name="$1"
local pid_file="$LOG_DIR/${service_name}.pid"
if [ -f "$pid_file" ]; then
local pid=$(cat "$pid_file")
if kill -0 "$pid" 2>/dev/null; then
print_status "Stopping $service_name (PID $pid)..."
kill "$pid"
rm -f "$pid_file"
print_success "$service_name stopped"
else
print_warning "$service_name was not running"
rm -f "$pid_file"
fi
else
print_warning "$service_name PID file not found"
fi
}
# Function to check system requirements
check_system_requirements() {
print_status "Checking system requirements..."
# Check for required commands
local required_commands=("cmake" "make" "python3" "pip3")
for cmd in "${required_commands[@]}"; do
if ! command_exists "$cmd"; then
print_error "$cmd is not installed"
exit 1
fi
done
# Check for required Python packages
local required_packages=("PyQt6" "opencv-python" "numpy" "psutil")
for package in "${required_packages[@]}"; do
if ! python3 -c "import $package" 2>/dev/null; then
print_warning "$package Python package is not installed"
fi
done
# Check for required system libraries
if ! ldconfig -p | grep -q libopencv; then
print_warning "OpenCV system libraries not found"
fi
if ! ldconfig -p | grep -q libeigen; then
print_warning "Eigen3 system libraries not found"
fi
print_success "System requirements check completed"
}
# Function to build the project
build_project() {
print_status "Building NowYouSeeMe project..."
if [ ! -d "$BUILD_DIR" ]; then
mkdir -p "$BUILD_DIR"
fi
cd "$BUILD_DIR"
if [ ! -f "CMakeCache.txt" ]; then
print_status "Running CMake configuration..."
cmake .. -DCMAKE_BUILD_TYPE=Release
fi
print_status "Compiling project..."
make -j$(nproc)
if [ $? -eq 0 ]; then
print_success "Project built successfully"
else
print_error "Build failed"
exit 1
fi
}
# Function to create configuration files
create_configurations() {
print_status "Creating configuration files..."
# Main configuration
cat > "$CONFIG_DIR/holodeck_config.json" << EOF
{
"holodeck": {
"enabled": true,
"view_type": "3D",
"update_rate": 30
},
"device_management": {
"discovery_port": 8080,
"max_connections": 100,
"discovery_interval": 5,
"connection_timeout": 30
},
"azure_integration": {
"subscription_id": "your-subscription-id",
"resource_group": "nowyouseeme-rg",
"location": "eastus",
"tenant_id": "your-tenant-id",
"client_id": "your-client-id",
"client_secret": "your-client-secret"
},
"slam_processing": {
"map_scale": 1.0,
"update_rate": 30,
"enable_rf_fusion": true,
"enable_vision_slam": true,
"enable_nerf_rendering": true
},
"ui_settings": {
"window_width": 1600,
"window_height": 1200,
"theme": "dark",
"auto_save": true
}
}
EOF
# Camera configuration
cat > "$CONFIG_DIR/camera_config.json" << EOF
{
"camera": {
"device_id": 0,
"width": 1920,
"height": 1080,
"fps": 30,
"exposure": -1,
"gain": -1
},
"calibration": {
"pattern_width": 9,
"pattern_height": 6,
"square_size": 0.025
}
}
EOF
# CSI configuration
cat > "$CONFIG_DIR/csi_config.json" << EOF
{
"csi": {
"interface": "wlan0",
"frequency": 2.4,
"bandwidth": 20,
"num_antennas": 4,
"num_subcarriers": 64
},
"processing": {
"enable_aoa": true,
"enable_cir": true,
"enable_beamforming": true
}
}
EOF
print_success "Configuration files created"
}
# Function to start core services
start_core_services() {
print_status "Starting core services..."
# Start device manager
if [ -f "$BIN_DIR/device_manager" ]; then
start_background_service "device_manager" "$BIN_DIR/device_manager 8080 100" "$LOG_DIR/device_manager.log"
wait_for_service "Device Manager" 8080
else
print_warning "Device manager binary not found"
fi
# Start Azure integration
if [ -f "$BIN_DIR/azure_integration" ]; then
start_background_service "azure_integration" "$BIN_DIR/azure_integration $CONFIG_DIR/holodeck_config.json" "$LOG_DIR/azure_integration.log"
else
print_warning "Azure integration binary not found"
fi
# Start SLAM processor
if [ -f "$BIN_DIR/ekf_fusion" ]; then
start_background_service "slam_processor" "$BIN_DIR/ekf_fusion" "$LOG_DIR/slam_processor.log"
else
print_warning "SLAM processor binary not found"
fi
print_success "Core services started"
}
# Function to start UI
start_ui() {
print_status "Starting holodeck UI..."
if command_exists "python3"; then
cd "$PROJECT_ROOT"
python3 src/ui/holodeck_ui.py &
local ui_pid=$!
echo $ui_pid > "$LOG_DIR/holodeck_ui.pid"
print_success "Holodeck UI started with PID $ui_pid"
else
print_error "Python3 not found, cannot start UI"
fi
}
# Function to start monitoring
start_monitoring() {
print_status "Starting system monitoring..."
# Start resource monitoring
cat > "$LOG_DIR/monitor_resources.sh" << 'EOF'
#!/bin/bash
while true; do
echo "$(date): CPU: $(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)%, Memory: $(free | grep Mem | awk '{printf "%.1f", $3/$2 * 100.0}')%" >> /tmp/holodeck_resources.log
sleep 5
done
EOF
chmod +x "$LOG_DIR/monitor_resources.sh"
start_background_service "resource_monitor" "$LOG_DIR/monitor_resources.sh" "$LOG_DIR/resource_monitor.log"
print_success "System monitoring started"
}
# Function to show status
show_status() {
print_status "Holodeck Environment Status:"
echo
# Check running services
local services=("device_manager" "azure_integration" "slam_processor" "holodeck_ui" "resource_monitor")
for service in "${services[@]}"; do
local pid_file="$LOG_DIR/${service}.pid"
if [ -f "$pid_file" ]; then
local pid=$(cat "$pid_file")
if kill -0 "$pid" 2>/dev/null; then
print_success "$service: Running (PID $pid)"
else
print_error "$service: Not running (stale PID file)"
rm -f "$pid_file"
fi
else
print_warning "$service: Not running"
fi
done
echo
# Show recent logs
if [ -f "$LOG_DIR/device_manager.log" ]; then
print_status "Recent device manager logs:"
tail -n 5 "$LOG_DIR/device_manager.log"
echo
fi
if [ -f "$LOG_DIR/azure_integration.log" ]; then
print_status "Recent Azure integration logs:"
tail -n 5 "$LOG_DIR/azure_integration.log"
echo
fi
}
# Function to stop all services
stop_all_services() {
print_status "Stopping all holodeck services..."
local services=("device_manager" "azure_integration" "slam_processor" "holodeck_ui" "resource_monitor")
for service in "${services[@]}"; do
stop_background_service "$service"
done
print_success "All services stopped"
}
# Function to show help
show_help() {
echo "NowYouSeeMe Complete Holodeck Environment"
echo
echo "Usage: $0 [COMMAND]"
echo
echo "Commands:"
echo " start Start the complete holodeck environment"
echo " stop Stop all holodeck services"
echo " restart Restart all holodeck services"
echo " status Show status of all services"
echo " build Build the project"
echo " config Create configuration files"
echo " check Check system requirements"
echo " help Show this help message"
echo
echo "Examples:"
echo " $0 start # Start the complete environment"
echo " $0 status # Check service status"
echo " $0 stop # Stop all services"
}
# Main script logic
case "${1:-start}" in
start)
print_status "Starting NowYouSeeMe Complete Holodeck Environment..."
check_system_requirements
build_project
create_configurations
start_core_services
start_ui
start_monitoring
print_success "Holodeck environment started successfully!"
echo
print_status "Services are starting up. Use '$0 status' to check status."
print_status "Use '$0 stop' to stop all services."
echo
;;
stop)
stop_all_services
;;
restart)
stop_all_services
sleep 2
$0 start
;;
status)
show_status
;;
build)
build_project
;;
config)
create_configurations
;;
check)
check_system_requirements
;;
help)
show_help
;;
*)
print_error "Unknown command: $1"
echo
show_help
exit 1
;;
esac
# Cleanup function
cleanup() {
print_status "Cleaning up..."
stop_all_services
}
# Set up signal handlers
trap cleanup EXIT
trap 'print_status "Interrupted by user"; exit 1' INT TERM
exit 0