Skip to content

Configuration

Belay.NET provides a comprehensive configuration system for customizing device communication, protocol settings, session management, and performance tuning. Configuration can be provided through code, JSON files, environment variables, or dependency injection.

Configuration Overview

The configuration system is organized into several key areas:

  • Device Configuration: Connection timeouts, discovery settings, and retry policies
  • Communication Configuration: Serial port settings and Raw REPL protocol parameters
  • Session Configuration: Session management, timeouts, and cleanup behavior
  • Executor Configuration: Task execution, caching, and performance settings
  • Exception Handling: Error handling behavior and logging configuration

Basic Configuration

Using Dependency Injection

csharp
using Microsoft.Extensions.DependencyInjection;
using Belay.Extensions.Configuration;

public void ConfigureServices(IServiceCollection services)
{
    services.AddBelay(config =>
    {
        // Device connection settings
        config.Device.DefaultConnectionTimeoutMs = 10000;
        config.Device.DefaultCommandTimeoutMs = 30000;
        
        // Communication settings
        config.Communication.Serial.DefaultBaudRate = 115200;
        config.Communication.Serial.ReadTimeoutMs = 1000;
        config.Communication.Serial.WriteTimeoutMs = 1000;
        
        // Session management
        config.Session.MaxConcurrentSessions = 10;
        config.Session.DefaultSessionTimeoutMs = 300000; // 5 minutes
        config.Session.EnableSessionCleanup = true;
        
        // Task executor settings
        config.Executor.DefaultTaskTimeoutMs = 30000;
        config.Executor.MaxCacheSize = 1000;
        config.Executor.EnableCachingByDefault = false;
        config.Executor.CacheExpirationMs = 600000; // 10 minutes
        
        // Raw REPL protocol (adaptive settings)
        config.Communication.RawRepl.EnableAdaptiveTiming = true;
        config.Communication.RawRepl.EnableAdaptiveFlowControl = true;
        config.Communication.RawRepl.EnableRawPasteAutoDetection = true;
        config.Communication.RawRepl.BaseResponseTimeout = TimeSpan.FromSeconds(2);
        config.Communication.RawRepl.MaxResponseTimeout = TimeSpan.FromSeconds(30);
        config.Communication.RawRepl.PreferredWindowSize = null; // Auto-detect
        
        // Exception handling
        config.ExceptionHandling.LogExceptions = true;
        config.ExceptionHandling.IncludeStackTraces = true;
        config.ExceptionHandling.PreserveContext = true;
    });
}

Direct Configuration

csharp
using Belay.Core;
using Belay.Extensions.Configuration;

// Create device with custom configuration
var config = new BelayConfiguration
{
    Device = new DeviceConfiguration
    {
        DefaultConnectionTimeoutMs = 5000,
        DefaultCommandTimeoutMs = 15000
    },
    Communication = new CommunicationConfiguration
    {
        Serial = new SerialConfiguration
        {
            DefaultBaudRate = 115200,
            ReadTimeoutMs = 2000,
            WriteTimeoutMs = 2000
        }
    }
};

// Use with device creation (when configuration support is added)
// var device = Device.FromConnectionString("serial:COM3", config);

Configuration Sources

JSON Configuration

Belay.NET integrates with .NET's configuration system and can be configured via appsettings.json:

csharp
public void ConfigureServices(IServiceCollection services, IConfiguration configuration)
{
    services.AddBelay(config =>
    {
        // Bind from appsettings.json
        configuration.GetSection("Belay").Bind(config);
        
        // Override specific settings programmatically
        config.Communication.RawRepl.EnableVerboseLogging = 
            configuration.GetValue<bool>("Belay:Debug:EnableProtocolLogging");
    });
}

Environment Variables

csharp
services.AddBelay(config =>
{
    // Override with environment variables
    config.Device.DefaultConnectionTimeoutMs = 
        int.Parse(Environment.GetEnvironmentVariable("BELAY_CONNECTION_TIMEOUT") ?? "5000");
        
    config.Communication.Serial.DefaultBaudRate = 
        int.Parse(Environment.GetEnvironmentVariable("BELAY_BAUD_RATE") ?? "115200");
        
    // Debug mode from environment
    if (Environment.GetEnvironmentVariable("BELAY_DEBUG") == "true")
    {
        config.Communication.RawRepl.EnableVerboseLogging = true;
        config.ExceptionHandling.IncludeStackTraces = true;
    }
});

Command Line Arguments

csharp
public void ConfigureServices(IServiceCollection services, string[] args)
{
    services.AddBelay(config =>
    {
        // Override with command line arguments
        if (args.Contains("--debug"))
        {
            config.Communication.RawRepl.EnableVerboseLogging = true;
            config.ExceptionHandling.IncludeStackTraces = true;
        }
        
        if (args.Contains("--conservative"))
        {
            config.Communication.RawRepl.EnableAdaptiveTiming = false;
            config.Communication.RawRepl.EnableAdaptiveFlowControl = false;
            config.Communication.RawRepl.EnableRawPasteAutoDetection = false;
        }
    });
}

Configuration File Format

appsettings.json Structure

json
{
  "Belay": {
    "Device": {
      "DefaultConnectionTimeoutMs": 5000,
      "DefaultCommandTimeoutMs": 30000,
      "Discovery": {
        "EnableAutoDiscovery": true,
        "DiscoveryTimeoutMs": 10000,
        "SerialPortPatterns": ["COM*", "/dev/ttyUSB*", "/dev/ttyACM*"]
      },
      "Retry": {
        "MaxRetries": 3,
        "InitialRetryDelayMs": 1000,
        "BackoffMultiplier": 2.0,
        "MaxRetryDelayMs": 30000
      }
    },
    "Communication": {
      "Serial": {
        "DefaultBaudRate": 115200,
        "ReadTimeoutMs": 1000,
        "WriteTimeoutMs": 1000
      },
      "RawRepl": {
        "InitializationTimeout": "00:00:05",
        "BaseResponseTimeout": "00:00:02",
        "MaxResponseTimeout": "00:00:30",
        "PreferredWindowSize": null,
        "MinimumWindowSize": 16,
        "MaximumWindowSize": 2048,
        "MaxRetryAttempts": 3,
        "RetryDelay": "00:00:00.100",
        "StartupDelay": "00:00:02",
        "MaxStartupDelay": "00:00:10",
        "InterruptDelay": "00:00:00.100",
        "EnableRawPasteAutoDetection": true,
        "EnableAdaptiveTiming": true,
        "EnableAdaptiveFlowControl": true,
        "EnableVerboseLogging": false
      }
    },
    "Session": {
      "DefaultSessionTimeoutMs": 300000,
      "MaxConcurrentSessions": 10,
      "EnableSessionCleanup": true,
      "SessionCleanupIntervalMs": 60000
    },
    "Executor": {
      "DefaultTaskTimeoutMs": 30000,
      "MaxCacheSize": 1000,
      "EnableCachingByDefault": false,
      "CacheExpirationMs": 600000
    },
    "ExceptionHandling": {
      "RethrowExceptions": true,
      "LogExceptions": true,
      "IncludeStackTraces": true,
      "ExceptionLogLevel": "Error",
      "PreserveContext": true,
      "MaxContextEntries": 50
    }
  }
}

Environment-Specific Configuration

appsettings.Development.json:

json
{
  "Belay": {
    "Communication": {
      "RawRepl": {
        "EnableVerboseLogging": true
      }
    },
    "ExceptionHandling": {
      "IncludeStackTraces": true,
      "ExceptionLogLevel": "Debug"
    }
  }
}

appsettings.Production.json:

json
{
  "Belay": {
    "Communication": {
      "RawRepl": {
        "EnableVerboseLogging": false
      }
    },
    "ExceptionHandling": {
      "IncludeStackTraces": false,
      "ExceptionLogLevel": "Error"
    }
  }
}

Configuration Reference

Device Configuration

SettingDefaultDescription
DefaultConnectionTimeoutMs5000Timeout for establishing device connections
DefaultCommandTimeoutMs30000Default timeout for executing commands
Discovery.EnableAutoDiscoverytrueEnable automatic device discovery
Discovery.DiscoveryTimeoutMs10000Timeout for device discovery operations
Discovery.SerialPortPatterns["COM*", "/dev/ttyUSB*", "/dev/ttyACM*"]Patterns for serial port scanning
Retry.MaxRetries3Maximum number of operation retries
Retry.InitialRetryDelayMs1000Initial delay between retries
Retry.BackoffMultiplier2.0Exponential backoff multiplier
Retry.MaxRetryDelayMs30000Maximum delay between retries

Communication Configuration

SettingDefaultDescription
Serial.DefaultBaudRate115200Default serial communication baud rate
Serial.ReadTimeoutMs1000Serial read operation timeout
Serial.WriteTimeoutMs1000Serial write operation timeout

Session Configuration

SettingDefaultDescription
DefaultSessionTimeoutMs300000Default session timeout (5 minutes)
MaxConcurrentSessions10Maximum concurrent device sessions
EnableSessionCleanuptrueEnable automatic session cleanup
SessionCleanupIntervalMs60000Session cleanup interval (1 minute)

Executor Configuration

SettingDefaultDescription
DefaultTaskTimeoutMs30000Default timeout for task execution
MaxCacheSize1000Maximum number of cached task results
EnableCachingByDefaultfalseEnable caching for all tasks by default
CacheExpirationMs600000Cache expiration time (10 minutes)

Exception Handling Configuration

SettingDefaultDescription
RethrowExceptionstrueRe-throw exceptions after handling
LogExceptionstrueLog exceptions when they occur
IncludeStackTracestrueInclude stack traces in exception logs
ExceptionLogLevelErrorLog level for exception messages
PreserveContexttruePreserve execution context in exceptions
MaxContextEntries50Maximum context entries to preserve

Raw REPL Protocol Configuration

The Raw REPL protocol supports adaptive configuration that automatically detects device capabilities and adjusts communication parameters for optimal performance.

Core Protocol Settings

SettingDefaultTypeDescription
InitializationTimeout00:00:05TimeSpanTimeout for protocol initialization
BaseResponseTimeout00:00:02TimeSpanBase timeout for device responses
MaxResponseTimeout00:00:30TimeSpanMaximum response timeout after adaptive increases
StartupDelay00:00:02TimeSpanInitial device startup delay
MaxStartupDelay00:00:10TimeSpanMaximum startup delay after adjustments
InterruptDelay00:00:00.100TimeSpanDelay after interrupt sequences
RetryDelay00:00:00.100TimeSpanBase delay between retry attempts
MaxRetryAttempts3intMaximum retry attempts for operations

Flow Control Settings

SettingDefaultTypeDescription
PreferredWindowSizenullint?Fixed window size (null = auto-detect)
MinimumWindowSize16intMinimum acceptable window size
MaximumWindowSize2048intMaximum window size to request

Adaptive Features

SettingDefaultTypeDescription
EnableRawPasteAutoDetectiontrueboolAuto-detect raw-paste mode support
EnableAdaptiveTimingtrueboolAutomatically adjust timeouts
EnableAdaptiveFlowControltrueboolOptimize flow control parameters
EnableVerboseLoggingfalseboolEnable detailed protocol logging

Conservative Configuration

For problematic devices or when auto-detection fails:

csharp
services.AddBelay(config =>
{
    var conservative = config.Communication.RawRepl.CreateFallbackConfiguration();
    config.Communication.RawRepl = conservative;
    
    // Or manually configure
    config.Communication.RawRepl.EnableAdaptiveTiming = false;
    config.Communication.RawRepl.EnableAdaptiveFlowControl = false;
    config.Communication.RawRepl.EnableRawPasteAutoDetection = false;
    config.Communication.RawRepl.BaseResponseTimeout = TimeSpan.FromSeconds(5);
    config.Communication.RawRepl.StartupDelay = TimeSpan.FromSeconds(5);
    config.Communication.RawRepl.InterruptDelay = TimeSpan.FromMilliseconds(500);
    config.Communication.RawRepl.PreferredWindowSize = 32;
});

Platform-Specific Settings

ESP32 (recommended):

json
{
  "Communication": {
    "RawRepl": {
      "StartupDelay": "00:00:03",
      "InterruptDelay": "00:00:00.200",
      "PreferredWindowSize": 64
    }
  }
}

Raspberry Pi Pico (recommended):

json
{
  "Communication": {
    "RawRepl": {
      "StartupDelay": "00:00:01.500",
      "InterruptDelay": "00:00:00.050",
      "PreferredWindowSize": 128
    }
  }
}

CircuitPython (recommended):

json
{
  "Communication": {
    "RawRepl": {
      "EnableRawPasteAutoDetection": false,
      "StartupDelay": "00:00:02.500",
      "InterruptDelay": "00:00:00.300"
    }
  }
}

Environment-Specific Examples

Development Environment

csharp
#if DEBUG
services.AddBelay(config =>
{
    // Verbose logging for debugging
    config.Communication.RawRepl.EnableVerboseLogging = true;
    config.ExceptionHandling.IncludeStackTraces = true;
    
    // Shorter timeouts for faster development
    config.Device.DefaultConnectionTimeoutMs = 3000;
    config.Device.DefaultCommandTimeoutMs = 15000;
    
    // Enable auto-discovery
    config.Device.Discovery.EnableAutoDiscovery = true;
});
#endif

Production Environment

csharp
#if RELEASE
services.AddBelay(config =>
{
    // Minimal logging for performance
    config.Communication.RawRepl.EnableVerboseLogging = false;
    config.ExceptionHandling.IncludeStackTraces = false;
    
    // Conservative timeouts for reliability
    config.Device.DefaultConnectionTimeoutMs = 10000;
    config.Device.DefaultCommandTimeoutMs = 60000;
    
    // Enable caching for performance
    config.Executor.EnableCachingByDefault = true;
    config.Executor.CacheExpirationMs = 1800000; // 30 minutes
});
#endif

Testing Environment

csharp
services.AddBelay(config =>
{
    // Fast timeouts for quick tests
    config.Device.DefaultConnectionTimeoutMs = 2000;
    config.Device.DefaultCommandTimeoutMs = 10000;
    
    // Detailed logging for diagnostics
    config.ExceptionHandling.LogExceptions = true;
    config.ExceptionHandling.IncludeStackTraces = true;
    
    // Disable adaptive features for consistent behavior
    config.Communication.RawRepl.EnableAdaptiveTiming = false;
    config.Communication.RawRepl.EnableAdaptiveFlowControl = false;
});

Configuration Validation

Belay.NET validates configuration at startup and provides helpful error messages:

csharp
services.AddBelay(config =>
{
    // Invalid configuration will throw BelayConfigurationException
    config.Device.DefaultConnectionTimeoutMs = -1; // Invalid: negative timeout
    config.Communication.Serial.DefaultBaudRate = 0; // Invalid: zero baud rate
    config.Session.MaxConcurrentSessions = -5; // Invalid: negative sessions
});

Best Practices

  1. Environment-Specific Settings: Use different configurations for development, testing, and production
  2. Conservative Production Settings: Disable verbose logging and use longer timeouts in production
  3. Adaptive Features: Enable adaptive protocol features for better device compatibility
  4. Caching Strategy: Configure caching based on your application's usage patterns
  5. Timeout Management: Set timeouts appropriate for your device types and network conditions
  6. Error Handling: Configure exception handling based on your logging and monitoring strategy

External Resources

Need help? Check our GitHub Discussions for configuration examples and troubleshooting.

Released under the Apache License 2.0.