diff --git a/docs/MassZero_Thermal_Camera.md b/docs/MassZero_Thermal_Camera.md
new file mode 100644
index 00000000000..83d6448839c
--- /dev/null
+++ b/docs/MassZero_Thermal_Camera.md
@@ -0,0 +1,639 @@
+# MassZero Thermal Camera Integration
+
+## Overview
+
+The MassZero Thermal Camera (MZTC) integration provides real-time thermal imaging capabilities for INAV flight controllers. This integration allows pilots to see thermal data overlaid on their OSD, enabling applications such as search and rescue, wildlife monitoring, and industrial inspection.
+
+## Purchase Information
+
+**MassZero Thermal Camera**
+Website: [https://masszerofpv.com](https://masszerofpv.com)
+Model: MassZero Thermal Camera Core Component
+Price: Contact MassZero for current pricing and availability
+
+## Hardware Requirements
+
+- INAV-compatible flight controller
+- MassZero Thermal Camera Core Component
+- Serial port (UART) connection
+- 3.3V power supply (check camera specifications)
+
+## Wiring
+
+### Serial Connection (UART Control)
+- **TX (FC)** → **RX (Camera)**
+- **RX (FC)** → **TX (Camera)**
+- **GND** → **GND**
+- **3.3V** → **VCC** (check camera power requirements)
+
+### Analog Video Connection (Video Output)
+- **Video Out (Camera)** → **Video In (FC)**
+- **GND** → **GND** (shared ground with UART)
+
+### Recommended Serial Ports
+- **USART2** (default)
+- **USART3**
+- **USART6**
+
+### Video Input Pins
+The thermal camera's analog video output must be connected to the flight controller's video input pins. Common video input configurations:
+
+#### For F4 Flight Controllers
+- **Video In**: PA8 (TIM1_CH1) - Primary video input
+- **Video In**: PA9 (TIM1_CH2) - Secondary video input
+- **Video In**: PA10 (TIM1_CH3) - Tertiary video input
+
+#### For F7 Flight Controllers
+- **Video In**: PA8 (TIM1_CH1) - Primary video input
+- **Video In**: PA9 (TIM1_CH2) - Secondary video input
+- **Video In**: PA10 (TIM1_CH3) - Tertiary video input
+- **Video In**: PC6 (TIM3_CH1) - Additional video input
+
+#### For H7 Flight Controllers
+- **Video In**: PA8 (TIM1_CH1) - Primary video input
+- **Video In**: PA9 (TIM1_CH2) - Secondary video input
+- **Video In**: PA10 (TIM1_CH3) - Tertiary video input
+- **Video In**: PC6 (TIM3_CH1) - Additional video input
+
+### Complete Wiring Example
+```
+MassZero Thermal Camera Flight Controller
+======================= =================
+VCC (3.3V) → 3.3V
+GND → GND
+TX → RX (USART2)
+RX → TX (USART2)
+Video Out → Video In (PA8)
+GND (Video) → GND
+```
+
+## Quick Start with Application Presets
+
+The easiest way to get started is to use one of the pre-configured application presets:
+
+### 🔥 Fire Detection
+```bash
+mztc preset fire_detection
+```
+Optimized for wildfire monitoring and hot spot identification.
+
+### 🚁 Search and Rescue
+```bash
+mztc preset search_rescue
+```
+Optimized for human detection and body heat signatures.
+
+### 👁️ Surveillance
+```bash
+mztc preset surveillance
+```
+Optimized for long-range monitoring and perimeter security.
+
+### ⚡ Rapid Environment Changes
+```bash
+mztc preset rapid_changes
+```
+Optimized for weather changes and dynamic environments.
+
+### 🏭 Industrial Inspection
+```bash
+mztc preset industrial
+```
+Optimized for equipment monitoring and thermal analysis.
+
+## Application-Specific Presets
+
+### 🔥 Fire Detection Mode
+**Use Case**: Wildfire monitoring, building fire detection, hot spot identification
+
+```bash
+mztc preset fire_detection
+```
+
+**Configuration Applied**:
+- **Mode**: ALERT (only captures when alerts triggered)
+- **Palette**: WHITE_HOT (maximum heat visibility)
+- **Brightness**: 70% (enhanced visibility)
+- **Contrast**: 80% (high contrast for hot spots)
+- **Digital Enhancement**: 75% (enhanced detail)
+- **Spatial Denoising**: 30% (preserve sharp edges)
+- **Temporal Denoising**: 40% (reduce noise while maintaining detail)
+- **Auto Shutter**: TIME_AND_TEMP (frequent calibration)
+- **FFC Interval**: 3 minutes (frequent calibration for accuracy)
+- **Temperature Alerts**: ON
+- **Alert High Temp**: 60°C (fire detection threshold)
+- **Alert Low Temp**: -10°C (environmental baseline)
+- **Update Rate**: 15 Hz (fast response)
+
+**Key Features**: High contrast, frequent calibration, temperature alerts, white-hot palette for maximum heat visibility
+
+### 🚁 Search and Rescue Mode
+**Use Case**: Human detection, body heat signatures, missing person searches
+
+```bash
+mztc preset search_rescue
+```
+
+**Configuration Applied**:
+- **Mode**: CONTINUOUS (continuous monitoring)
+- **Palette**: FUSION_1 (better contrast for human detection)
+- **Brightness**: 60% (balanced visibility)
+- **Contrast**: 70% (good contrast for body heat)
+- **Digital Enhancement**: 60% (enhanced detail)
+- **Spatial Denoising**: 50% (balanced noise reduction)
+- **Temporal Denoising**: 60% (smooth video)
+- **Auto Shutter**: TIME_AND_TEMP (balanced calibration)
+- **FFC Interval**: 5 minutes (regular calibration)
+- **Temperature Alerts**: ON
+- **Alert High Temp**: 45°C (human body temperature)
+- **Alert Low Temp**: 15°C (environmental baseline)
+- **Update Rate**: 9 Hz (good balance)
+- **Zoom Level**: 2X (enhanced detail for human detection)
+
+**Key Features**: Balanced settings, human body temperature range, 2X zoom for detail, fusion palette for better contrast
+
+### 👁️ Surveillance Mode
+**Use Case**: Long-range monitoring, perimeter security, wildlife observation
+
+```bash
+mztc preset surveillance
+```
+
+**Configuration Applied**:
+- **Mode**: SURVEILLANCE (optimized for long-range)
+- **Palette**: BLACK_HOT (stealth and contrast)
+- **Brightness**: 50% (standard visibility)
+- **Contrast**: 60% (good contrast)
+- **Digital Enhancement**: 50% (standard enhancement)
+- **Spatial Denoising**: 60% (good noise reduction)
+- **Temporal Denoising**: 70% (smooth video)
+- **Auto Shutter**: TIME_ONLY (less frequent calibration)
+- **FFC Interval**: 10 minutes (battery conservation)
+- **Temperature Alerts**: ON
+- **Alert High Temp**: 50°C (intrusion detection)
+- **Alert Low Temp**: 0°C (environmental baseline)
+- **Update Rate**: 5 Hz (battery conservation)
+- **Zoom Level**: 4X (long-range monitoring)
+
+**Key Features**: High zoom, low update rate for battery life, black-hot for stealth, longer calibration intervals
+
+### ⚡ Rapid Environment Changes Mode
+**Use Case**: Weather changes, altitude changes, temperature fluctuations, dynamic environments
+
+```bash
+mztc preset rapid_changes
+```
+
+**Configuration Applied**:
+- **Mode**: CONTINUOUS (continuous monitoring)
+- **Palette**: RAINBOW (maximum contrast and detail)
+- **Brightness**: 55% (balanced visibility)
+- **Contrast**: 65% (good contrast)
+- **Digital Enhancement**: 70% (enhanced detail for changing conditions)
+- **Spatial Denoising**: 40% (preserve detail)
+- **Temporal Denoising**: 30% (maintain responsiveness)
+- **Auto Shutter**: TEMP_ONLY (temperature-based calibration)
+- **FFC Interval**: 2 minutes (very frequent calibration)
+- **Temperature Alerts**: ON
+- **Alert High Temp**: 80°C (wide temperature range)
+- **Alert Low Temp**: -20°C (wide temperature range)
+- **Update Rate**: 20 Hz (high responsiveness)
+- **Bad Pixel Removal**: ON (maintain image quality)
+- **Vignetting Correction**: ON (compensate for environmental changes)
+
+**Key Features**: Very frequent calibration, temperature-based shutter, high update rate, rainbow palette for maximum contrast, bad pixel removal enabled
+
+### 🏭 Industrial Inspection Mode
+**Use Case**: Equipment monitoring, thermal analysis, machinery inspection
+
+```bash
+mztc preset industrial
+```
+
+**Configuration Applied**:
+- **Mode**: CONTINUOUS (continuous monitoring)
+- **Palette**: IRON_RED_1 (heat visualization)
+- **Brightness**: 60% (good visibility)
+- **Contrast**: 75% (high contrast for equipment)
+- **Digital Enhancement**: 65% (enhanced detail)
+- **Spatial Denoising**: 45% (balanced noise reduction)
+- **Temporal Denoising**: 55% (smooth video)
+- **Auto Shutter**: TIME_AND_TEMP (balanced calibration)
+- **FFC Interval**: 7 minutes (regular calibration)
+- **Temperature Alerts**: ON
+- **Alert High Temp**: 100°C (equipment overheating)
+- **Alert Low Temp**: -30°C (wide temperature range)
+- **Update Rate**: 12 Hz (good balance)
+- **Zoom Level**: 1X (standard view)
+
+**Key Features**: Wide temperature range, iron-red palette for heat visualization, balanced settings for equipment monitoring
+
+## Temperature Range Guidelines
+
+| Application | Min Temp | Max Temp | Palette | Update Rate | FFC Interval | Zoom |
+|-------------|----------|----------|---------|-------------|--------------|------|
+| Fire Detection | -10°C | 60°C+ | White Hot | 15 Hz | 3 min | 1X |
+| Search & Rescue | 15°C | 45°C | Fusion 1 | 9 Hz | 5 min | 2X |
+| Surveillance | 0°C | 50°C | Black Hot | 5 Hz | 10 min | 4X |
+| Rapid Changes | -20°C | 80°C | Rainbow | 20 Hz | 2 min | 1X |
+| Industrial | -30°C | 100°C | Iron Red | 12 Hz | 7 min | 1X |
+
+## Customizing Presets
+
+After applying a preset, you can fine-tune individual parameters:
+
+```bash
+# Apply a preset
+mztc preset fire_detection
+
+# Fine-tune specific parameters
+set mztc_brightness = 75
+set mztc_contrast = 85
+set mztc_alert_high_temp = 65.0
+
+# Save the customized configuration
+mztc save_config
+```
+
+## Preset Selection Guide
+
+### Choose Fire Detection When:
+- Monitoring for wildfires or building fires
+- Detecting hot spots or overheating equipment
+- Need maximum sensitivity to heat sources
+- Working in outdoor environments
+
+### Choose Search and Rescue When:
+- Looking for people in search and rescue operations
+- Detecting human body heat signatures
+- Need good detail and contrast for human detection
+- Working in moderate temperature environments
+
+### Choose Surveillance When:
+- Long-range monitoring or perimeter security
+- Need to conserve battery power
+- Working in stealth mode (black-hot palette)
+- Monitoring large areas with minimal detail requirements
+
+### Choose Rapid Changes When:
+- Weather conditions are changing rapidly
+- Altitude changes during flight
+- Temperature fluctuations in the environment
+- Need maximum responsiveness and detail
+
+### Choose Industrial When:
+- Monitoring equipment or machinery
+- Thermal analysis of industrial processes
+- Need wide temperature range monitoring
+- Working in controlled industrial environments
+
+## Troubleshooting Presets
+
+### If a preset doesn't work well:
+1. Check your environment conditions
+2. Adjust brightness and contrast manually
+3. Try a different palette mode
+4. Modify the temperature alert thresholds
+5. Adjust the FFC interval based on stability
+
+### For extreme environments:
+- **Very cold**: Use Industrial preset with lower alert thresholds
+- **Very hot**: Use Fire Detection preset with higher alert thresholds
+- **High altitude**: Use Rapid Changes preset for frequent calibration
+- **Long missions**: Use Surveillance preset for battery conservation
+
+## Advanced Usage
+
+### Creating Custom Presets
+While the CLI doesn't support custom preset creation, you can create scripts or use the configuration system to quickly apply your preferred settings:
+
+```bash
+# Create a custom configuration script
+# Save your preferred settings to a file
+# Apply them when needed
+```
+
+### Preset Combinations
+You can mix and match features from different presets:
+
+```bash
+# Start with a base preset
+mztc preset search_rescue
+
+# Modify specific features
+set mztc_palette_mode = RAINBOW # Use rainbow instead of fusion
+set mztc_zoom_level = 4X # Use higher zoom
+set mztc_update_rate = 20 # Use higher update rate
+```
+
+This gives you the flexibility to start with a proven configuration and customize it for your specific needs.
+
+## Configuration
+
+### CLI Commands
+
+#### Basic Configuration
+```
+# Enable MassZero Thermal Camera
+set mztc_enabled = ON
+
+# Set serial port (USART2, USART3, USART6, etc.)
+set mztc_port = USART2
+
+# Set baud rate (115200 is standard)
+set mztc_baudrate = 115200
+
+# Set operating mode
+set mztc_mode = CONTINUOUS
+```
+
+#### Operating Modes
+- `DISABLED` - Camera disabled
+- `STANDBY` - Low power, periodic updates
+- `CONTINUOUS` - Continuous frame capture
+- `TRIGGERED` - Capture on demand
+- `ALERT` - Only capture when alerts triggered
+- `RECORDING` - High-speed recording mode
+- `CALIBRATION` - Calibration mode
+- `SURVEILLANCE` - Long-range surveillance mode
+
+#### Image Parameters
+```
+# Set brightness (0-100, default 50)
+set mztc_brightness = 50
+
+# Set contrast (0-100, default 50)
+set mztc_contrast = 50
+
+# Set digital enhancement (0-100, default 50)
+set mztc_digital_enhancement = 50
+
+# Set spatial denoising (0-100, default 50)
+set mztc_spatial_denoise = 50
+
+# Set temporal denoising (0-100, default 50)
+set mztc_temporal_denoise = 50
+```
+
+#### Color Palettes
+```
+# Set color palette
+set mztc_palette_mode = WHITE_HOT
+```
+
+Available palettes:
+- `WHITE_HOT` - White hot (default)
+- `BLACK_HOT` - Black hot
+- `FUSION_1` - Fusion 1
+- `RAINBOW` - Rainbow
+- `FUSION_2` - Fusion 2
+- `IRON_RED_1` - Iron red 1
+- `IRON_RED_2` - Iron red 2
+- `SEPIA` - Sepia
+- `COLOR_1` - Color 1
+- `COLOR_2` - Color 2
+- `ICE_FIRE` - Ice fire
+- `RAIN` - Rain
+- `GREEN_HOT` - Green hot
+- `RED_HOT` - Red hot
+
+#### Zoom and Mirror
+```
+# Set zoom level (1X, 2X, 4X, 8X)
+set mztc_zoom_level = 1X
+
+# Set mirror mode (NONE, HORIZONTAL, VERTICAL, CENTRAL)
+set mztc_mirror_mode = NONE
+```
+
+#### Auto Shutter
+```
+# Set auto shutter mode
+set mztc_auto_shutter = TIME_AND_TEMP
+```
+
+Available modes:
+- `TEMP_ONLY` - Based on temperature difference only
+- `TIME_ONLY` - Based on time interval only
+- `TIME_AND_TEMP` - Both time and temperature (default)
+
+#### Temperature Alerts
+```
+# Enable temperature alerts
+set mztc_temperature_alerts = ON
+
+# Set high temperature alert (Celsius)
+set mztc_alert_high_temp = 80.0
+
+# Set low temperature alert (Celsius)
+set mztc_alert_low_temp = -10.0
+```
+
+#### Calibration
+```
+# Set FFC interval (minutes)
+set mztc_ffc_interval = 5
+
+# Enable bad pixel removal
+set mztc_bad_pixel_removal = ON
+
+# Enable vignetting correction
+set mztc_vignetting_correction = ON
+```
+
+#### Channel Control
+```
+# Set RC channels for camera control
+set mztc_zoom_channel = AUX1
+set mztc_palette_channel = AUX2
+set mztc_ffc_channel = AUX3
+set mztc_brightness_channel = AUX4
+set mztc_contrast_channel = AUX5
+```
+
+#### Camera Management
+```
+# Get camera initialization status
+mztc init_status
+
+# Save configuration to camera flash
+mztc save_config
+
+# Restore camera to factory defaults
+mztc restore_defaults
+
+# Trigger manual calibration (FFC)
+mztc calibrate
+
+# Reconnect to camera
+mztc reconnect
+```
+
+#### Video Configuration
+```
+# Enable video input
+set video_input = ON
+
+# Set video input source (check your FC's video input pins)
+set video_input_pin = PA8
+
+# Set video input mode
+set video_input_mode = PAL # or NTSC
+
+# Enable thermal camera video overlay
+set video_thermal_overlay = ON
+
+# Set thermal video transparency (0-100)
+set video_thermal_alpha = 50
+```
+
+### MSP Commands
+
+The thermal camera supports MSP V2 commands for remote control:
+
+- `MSP2_MZTC_CONFIG` (0x3000) - Get configuration
+- `MSP2_SET_MZTC_CONFIG` (0x3001) - Set configuration
+- `MSP2_MZTC_STATUS` (0x3002) - Get status
+- `MSP2_MZTC_FRAME_DATA` (0x3003) - Get thermal frame data
+- `MSP2_MZTC_CALIBRATE` (0x3004) - Trigger calibration
+- `MSP2_MZTC_MODE` (0x3005) - Set operating mode
+- `MSP2_MZTC_PALETTE` (0x3006) - Set color palette
+- `MSP2_MZTC_ZOOM` (0x3007) - Set zoom level
+- `MSP2_MZTC_SHUTTER` (0x3008) - Trigger manual shutter
+
+## OSD Integration
+
+### Thermal Data Display
+The thermal camera data can be displayed on the OSD using the following elements:
+
+- **Thermal Temperature** - Current temperature reading
+- **Thermal Min/Max** - Temperature range in frame
+- **Thermal Center** - Center point temperature
+- **Thermal Hot Spot** - Hottest point coordinates and temperature
+- **Thermal Cold Spot** - Coldest point coordinates and temperature
+
+### OSD Configuration
+```
+# Enable thermal camera OSD elements
+set osd_thermal_temp = ON
+set osd_thermal_minmax = ON
+set osd_thermal_center = ON
+set osd_thermal_hotspot = ON
+set osd_thermal_coldspot = ON
+```
+
+## Troubleshooting
+
+### Common Issues
+
+#### Camera Not Connecting
+1. Check wiring connections
+2. Verify serial port configuration
+3. Check baud rate (should be 115200)
+4. Ensure camera is powered on
+5. Check for loose connections
+
+#### No Thermal Data
+1. Verify camera is in correct mode
+2. Check if calibration is needed
+3. Verify frame data is being received
+4. Check error flags in status
+
+#### Poor Image Quality
+1. Adjust brightness and contrast
+2. Modify denoising settings
+3. Check if calibration is needed
+4. Verify camera temperature
+
+#### Calibration Issues
+1. Ensure camera is at stable temperature
+2. Point camera at uniform surface
+3. Wait for calibration to complete
+4. Check calibration interval settings
+
+#### Video Issues
+1. Check video input pin configuration
+2. Verify video input mode (PAL/NTSC)
+3. Check video input signal strength
+4. Ensure proper grounding of video signal
+5. Verify video input is enabled in configuration
+6. Check for video input conflicts with other cameras
+
+### Debug Information
+
+#### Status Monitoring
+```
+# Check camera status
+status
+
+# Check thermal camera specific status
+mztc status
+```
+
+#### Error Codes
+- `COMMUNICATION` - Serial communication error
+- `CALIBRATION` - Calibration failed
+- `TEMPERATURE` - Temperature sensor error
+- `MEMORY` - Memory allocation error
+- `TIMEOUT` - Command timeout
+- `INVALID_CONFIG` - Invalid configuration
+
+## Technical Specifications
+
+### Camera Specifications
+- **Resolution**: 160x120 pixels (typical)
+- **Temperature Range**: -20°C to +100°C
+- **Accuracy**: ±2°C or ±2%
+- **Update Rate**: 1-30 Hz (configurable)
+- **Communication**: UART 115200 bps
+- **Power**: 3.3V (check specifications)
+- **Video Output**: Analog composite video (PAL/NTSC)
+- **Video Resolution**: 640x480 (typical)
+- **Video Frame Rate**: 25/30 fps (PAL/NTSC)
+
+### Protocol Details
+- **Packet Format**: Custom UART protocol
+- **Device Address**: 0x36
+- **Checksum**: Sum of address + command + data
+- **Error Handling**: Comprehensive error reporting
+
+## Safety Considerations
+
+### Important Safety Notes
+1. **DO NOT** aim the detector at strong light sources (sun, fire, lasers)
+2. **DO NOT** touch the detector directly - use anti-static gloves
+3. **Avoid** corrosive gas environments
+4. **Ensure** proper ventilation - camera generates heat
+5. **Use** original packaging for transport/storage
+
+### Operational Considerations
+1. **Boot Time**: Camera needs ~2-3 seconds to initialize
+2. **FFC Timing**: Default auto-shutter every 5 minutes
+3. **Bad Pixels**: May appear over time - use bad pixel removal
+4. **Temperature Drift**: Perform background correction after environment changes
+5. **Power Consumption**: Camera may draw significant current during FFC
+
+## Support
+
+For technical support and questions:
+- **MassZero Website**: [https://masszerofpv.com](https://masszerofpv.com)
+- **INAV Discord**: [https://discord.gg/peg2hhbYwN](https://discord.gg/peg2hhbYwN)
+- **INAV GitHub**: [https://github.com/iNavFlight/inav](https://github.com/iNavFlight/inav)
+
+## Changelog
+
+### Version 1.1.0
+- **Application Presets**: Added complete preset system with 5 optimized configurations
+- **Enhanced Documentation**: Added detailed preset descriptions, troubleshooting guides, and selection criteria
+- **Temperature Guidelines**: Added comprehensive temperature range table for all applications
+- **Advanced Usage**: Added custom preset creation and combination guidance
+
+### Version 1.0.0
+- Initial MassZero Thermal Camera integration
+- Basic UART protocol implementation
+- MSP V2 command support
+- OSD integration
+- CLI configuration support
+- SITL simulation support
+- Camera management functions (init status, save config, restore defaults)
+- Comprehensive test coverage
diff --git a/docs/Settings.md b/docs/Settings.md
index 75101866c95..26fadf6f378 100644
--- a/docs/Settings.md
+++ b/docs/Settings.md
@@ -3519,6 +3519,256 @@ Mask of RX channels that may be overridden by MSP `SET_RAW_RC`. Note that this r
---
+### mztc_alert_high_temp
+
+High temperature alert threshold
+
+| Default | Min | Max |
+| --- | --- | --- |
+| 80.0 | -40 | 200 |
+
+---
+
+### mztc_alert_low_temp
+
+Low temperature alert threshold
+
+| Default | Min | Max |
+| --- | --- | --- |
+| -10.0 | -40 | 200 |
+
+---
+
+### mztc_auto_shutter
+
+Auto shutter calibration mode
+
+| Allowed Values | |
+| --- | --- |
+| TEMP_ONLY | |
+| TIME_ONLY | |
+| TIME_AND_TEMP | Default |
+
+---
+
+### mztc_bad_pixel_removal
+
+Enable bad pixel removal
+
+| Default | Min | Max |
+| --- | --- | --- |
+| ON | OFF | ON |
+
+---
+
+### mztc_baudrate
+
+Baud rate for MassZero Thermal Camera
+
+| Default | Min | Max |
+| --- | --- | --- |
+| 6 | 0 | 10 |
+
+---
+
+### mztc_brightness
+
+Image brightness (0-100)
+
+| Default | Min | Max |
+| --- | --- | --- |
+| 50 | 0 | 100 |
+
+---
+
+### mztc_contrast
+
+Image contrast (0-100)
+
+| Default | Min | Max |
+| --- | --- | --- |
+| 50 | 0 | 100 |
+
+---
+
+### mztc_crosshair_enabled
+
+Enable crosshair overlay
+
+| Default | Min | Max |
+| --- | --- | --- |
+| OFF | OFF | ON |
+
+---
+
+### mztc_digital_enhancement
+
+Digital enhancement level (0-100)
+
+| Default | Min | Max |
+| --- | --- | --- |
+| 50 | 0 | 100 |
+
+---
+
+### mztc_enabled
+
+Enable MassZero Thermal Camera
+
+| Default | Min | Max |
+| --- | --- | --- |
+| OFF | OFF | ON |
+
+---
+
+### mztc_ffc_interval
+
+Flat Field Calibration interval in minutes (0=disabled)
+
+| Default | Min | Max |
+| --- | --- | --- |
+| 5 | 0 | 60 |
+
+---
+
+### mztc_mirror_mode
+
+Image mirroring mode
+
+| Allowed Values | |
+| --- | --- |
+| NONE | Default |
+| HORIZONTAL | |
+| VERTICAL | |
+| CENTRAL | |
+
+---
+
+### mztc_mode
+
+Operating mode for MassZero Thermal Camera
+
+| Allowed Values | |
+| --- | --- |
+| DISABLED | |
+| STANDBY | Default |
+| CONTINUOUS | |
+| TRIGGERED | |
+| ALERT | |
+| RECORDING | |
+| CALIBRATION | |
+| SURVEILLANCE | |
+
+---
+
+### mztc_palette_mode
+
+Color palette mode
+
+| Allowed Values | |
+| --- | --- |
+| WHITE_HOT | Default |
+| BLACK_HOT | |
+| FUSION_1 | |
+| RAINBOW | |
+| FUSION_2 | |
+| IRON_RED_1 | |
+| IRON_RED_2 | |
+| SEPIA | |
+| COLOR_1 | |
+| COLOR_2 | |
+| ICE_FIRE | |
+| RAIN | |
+| GREEN_HOT | |
+| RED_HOT | |
+
+---
+
+### mztc_port
+
+Serial port for MassZero Thermal Camera
+
+| Default | Min | Max |
+| --- | --- | --- |
+| 1 | 0 | 7 |
+
+---
+
+### mztc_spatial_denoise
+
+Spatial denoising level (0-100)
+
+| Default | Min | Max |
+| --- | --- | --- |
+| 50 | 0 | 100 |
+
+---
+
+### mztc_temperature_alerts
+
+Enable temperature alerts
+
+| Default | Min | Max |
+| --- | --- | --- |
+| OFF | OFF | ON |
+
+---
+
+### mztc_temperature_unit
+
+Temperature unit (Celsius, Fahrenheit, Kelvin)
+
+| Allowed Values | |
+| --- | --- |
+| CELSIUS | Default |
+| FAHRENHEIT | |
+| KELVIN | |
+
+---
+
+### mztc_temporal_denoise
+
+Temporal denoising level (0-100)
+
+| Default | Min | Max |
+| --- | --- | --- |
+| 50 | 0 | 100 |
+
+---
+
+### mztc_update_rate
+
+Frame update rate in Hz
+
+| Default | Min | Max |
+| --- | --- | --- |
+| 9 | 1 | 30 |
+
+---
+
+### mztc_vignetting_correction
+
+Enable vignetting correction
+
+| Default | Min | Max |
+| --- | --- | --- |
+| ON | OFF | ON |
+
+---
+
+### mztc_zoom_level
+
+Digital zoom level
+
+| Allowed Values | |
+| --- | --- |
+| 1X | Default |
+| 2X | |
+| 4X | |
+| 8X | |
+
+---
+
### name
Craft name
diff --git a/src/main/CMakeLists.txt b/src/main/CMakeLists.txt
index ec771d14700..f83eeb806b6 100755
--- a/src/main/CMakeLists.txt
+++ b/src/main/CMakeLists.txt
@@ -1,4 +1,3 @@
-
main_sources(COMMON_SRC
main.c
@@ -64,6 +63,7 @@ main_sources(COMMON_SRC
config/parameter_group.h
config/general_settings.c
config/general_settings.h
+ config/mztc_camera.h
drivers/1-wire.c
drivers/1-wire.h
@@ -411,6 +411,11 @@ main_sources(COMMON_SRC
io/osd/custom_elements.c
+ io/mztc_camera.c
+ io/mztc_camera.h
+ io/osd/mztc_camera_osd.c
+ io/osd/mztc_camera_osd.h
+
mavlink/mavlink_command.c
mavlink/mavlink_command.h
mavlink/mavlink_guided.c
@@ -432,6 +437,8 @@ main_sources(COMMON_SRC
msp/msp_serial.c
msp/msp_serial.h
+ msp/msp_mztc.c
+ msp/msp_mztc.h
programming/logic_condition.c
programming/logic_condition.h
@@ -478,7 +485,6 @@ main_sources(COMMON_SRC
rx/sim.c
rx/sim.h
-
scheduler/scheduler.c
scheduler/scheduler.h
diff --git a/src/main/config/mztc_camera.h b/src/main/config/mztc_camera.h
new file mode 100644
index 00000000000..e0e6e5febbe
--- /dev/null
+++ b/src/main/config/mztc_camera.h
@@ -0,0 +1,192 @@
+/*
+ * This file is part of INAV.
+ *
+ * INAV is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * INAV is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR ANY PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with INAV. If not, see .
+ */
+
+#pragma once
+
+#include
+#include
+
+#ifdef USE_MZTC
+
+#include "config/parameter_group.h"
+#include "drivers/time.h"
+
+// MassZero Thermal Camera operating modes
+typedef enum {
+ MZTC_MODE_DISABLED = 0,
+ MZTC_MODE_STANDBY, // Low power, periodic updates
+ MZTC_MODE_CONTINUOUS, // Continuous frame capture
+ MZTC_MODE_TRIGGERED, // Capture on demand
+ MZTC_MODE_ALERT, // Only capture when alerts triggered
+ MZTC_MODE_RECORDING, // High-speed recording mode
+ MZTC_MODE_CALIBRATION, // Calibration mode
+ MZTC_MODE_SURVEILLANCE // Long-range surveillance mode
+} mztcMode_e;
+
+// MassZero Thermal Camera temperature units
+typedef enum {
+ MZTC_UNIT_CELSIUS = 0,
+ MZTC_UNIT_FAHRENHEIT = 1,
+ MZTC_UNIT_KELVIN = 2
+} mztcTemperatureUnit_e;
+
+// MassZero Thermal Camera color palettes
+typedef enum {
+ MZTC_PALETTE_WHITE_HOT = 0, // Default white hot
+ MZTC_PALETTE_BLACK_HOT = 1, // Black hot
+ MZTC_PALETTE_FUSION_1 = 2, // Fusion 1
+ MZTC_PALETTE_RAINBOW = 3, // Rainbow
+ MZTC_PALETTE_FUSION_2 = 4, // Fusion 2
+ MZTC_PALETTE_IRON_RED_1 = 5, // Iron red 1
+ MZTC_PALETTE_IRON_RED_2 = 6, // Iron red 2
+ MZTC_PALETTE_SEPIA = 7, // Sepia
+ MZTC_PALETTE_COLOR_1 = 8, // Color 1
+ MZTC_PALETTE_COLOR_2 = 9, // Color 2
+ MZTC_PALETTE_ICE_FIRE = 10, // Ice fire
+ MZTC_PALETTE_RAIN = 11, // Rain
+ MZTC_PALETTE_GREEN_HOT = 12, // Green hot
+ MZTC_PALETTE_RED_HOT = 13 // Red hot
+} mztcPaletteMode_e;
+
+// MassZero Thermal Camera zoom levels
+typedef enum {
+ MZTC_ZOOM_1X = 0, // 1x zoom (default)
+ MZTC_ZOOM_2X = 1, // 2x zoom
+ MZTC_ZOOM_4X = 2, // 4x zoom (per thermal camera docs)
+ MZTC_ZOOM_8X = 3 // 8x zoom (per thermal camera docs)
+} mztcZoomLevel_e;
+
+// MassZero Thermal Camera mirror modes
+typedef enum {
+ MZTC_MIRROR_NONE = 0, // No mirroring (default)
+ MZTC_MIRROR_HORIZONTAL = 1, // Horizontal mirror
+ MZTC_MIRROR_VERTICAL = 2, // Vertical mirror
+ MZTC_MIRROR_CENTRAL = 3 // Both horizontal and vertical
+} mztcMirrorMode_e;
+
+// MassZero Thermal Camera auto shutter modes
+typedef enum {
+ MZTC_SHUTTER_TEMP_ONLY = 0, // Based on temperature difference only
+ MZTC_SHUTTER_TIME_ONLY = 1, // Based on time interval only
+ MZTC_SHUTTER_TIME_AND_TEMP = 2 // Both time and temperature (default)
+} mztcShutterMode_e;
+
+// MassZero Thermal Camera configuration structure
+typedef struct mztcConfig_s {
+ uint8_t enabled; // Enable/disable MassZero Thermal Camera
+ uint8_t port; // Serial port (USART1-8, etc.)
+ uint8_t baudrate; // Baud rate index
+ uint8_t mode; // Operating mode
+ uint8_t update_rate; // Frame update rate (Hz)
+ uint8_t temperature_unit; // Temperature unit
+ uint8_t palette_mode; // Color palette
+ uint8_t auto_shutter; // Auto shutter mode
+ uint8_t digital_enhancement; // Digital enhancement (0-100)
+ uint8_t spatial_denoise; // Spatial denoising (0-100)
+ uint8_t temporal_denoise; // Temporal denoising (0-100)
+ uint8_t brightness; // Brightness (0-100)
+ uint8_t contrast; // Contrast (0-100)
+ uint8_t zoom_level; // Digital zoom level
+ uint8_t mirror_mode; // Image mirroring
+ uint8_t crosshair_enabled; // Enable crosshair overlay
+ uint8_t temperature_alerts; // Enable temperature alerts
+ float alert_high_temp; // High temperature alert threshold
+ float alert_low_temp; // Low temperature alert threshold
+ uint8_t ffc_interval; // Flat Field Calibration interval (minutes)
+ uint8_t bad_pixel_removal; // Enable bad pixel removal
+ uint8_t vignetting_correction; // Enable vignetting correction
+ // Channel control configuration
+ uint8_t zoom_channel; // 0 = disabled, 1-18 = AUX1-18
+ uint8_t palette_channel; // 0 = disabled, 1-18 = AUX1-18
+ uint8_t ffc_channel; // 0 = disabled, 1-18 = AUX1-18
+ uint8_t brightness_channel; // 0 = disabled, 1-18 = AUX1-18
+ uint8_t contrast_channel; // 0 = disabled, 1-18 = AUX1-18
+} mztcConfig_t;
+
+// MassZero Thermal Camera status structure
+typedef struct mztcStatus_s {
+ uint8_t status; // Camera status
+ uint8_t mode; // Current mode
+ bool connected; // Connection status
+ uint8_t connection_quality; // Connection quality indicator
+ uint8_t last_calibration; // Minutes since last calibration
+ float camera_temperature; // Camera internal temperature
+ float ambient_temperature; // Ambient temperature
+ uint32_t frame_count; // Frame counter
+ uint8_t error_flags; // Error status flags
+ uint32_t last_frame_time; // Last frame timestamp
+} mztcStatus_t;
+
+// MassZero Thermal Camera frame data structure
+typedef struct mztcFrameData_s {
+ uint16_t width; // Frame width
+ uint16_t height; // Frame height
+ float min_temp; // Minimum temperature in frame
+ float max_temp; // Maximum temperature in frame
+ float center_temp; // Center point temperature
+ float hottest_temp; // Hottest point temperature
+ float coldest_temp; // Coldest point temperature
+ uint16_t hottest_x; // Hottest point X coordinate
+ uint16_t hottest_y; // Hottest point Y coordinate
+ uint16_t coldest_x; // Coldest point X coordinate
+ uint16_t coldest_y; // Coldest point Y coordinate
+ uint8_t data[256]; // Raw thermal data (reduced size for MSP)
+} mztcFrameData_t;
+
+// MassZero Thermal Camera status values
+#define MZTC_STATUS_OFFLINE 0x00
+#define MZTC_STATUS_INITIALIZING 0x01
+#define MZTC_STATUS_READY 0x02
+#define MZTC_STATUS_CAPTURING 0x03
+#define MZTC_STATUS_CALIBRATING 0x04
+#define MZTC_STATUS_ERROR 0x05
+#define MZTC_STATUS_ALERT 0x06
+#define MZTC_STATUS_RECORDING 0x07
+
+// MassZero Thermal Camera error flags
+#define MZTC_ERROR_COMMUNICATION 0x01
+#define MZTC_ERROR_CALIBRATION 0x02
+#define MZTC_ERROR_TEMPERATURE 0x04
+#define MZTC_ERROR_MEMORY 0x08
+#define MZTC_ERROR_TIMEOUT 0x10
+#define MZTC_ERROR_INVALID_CONFIG 0x20
+
+// MassZero Thermal Camera limits
+#define MZTC_MAX_UPDATE_RATE 30 // Maximum 30 Hz
+#define MZTC_MIN_UPDATE_RATE 1 // Minimum 1 Hz
+#define MZTC_MAX_FFC_INTERVAL 60 // Maximum 60 minutes
+#define MZTC_MIN_FFC_INTERVAL 1 // Minimum 1 minute
+
+// Parameter group declaration
+PG_DECLARE(mztcConfig_t, mztcConfig);
+
+// Function declarations
+void mztcInit(void);
+void mztcUpdate(timeUs_t currentTimeUs);
+bool mztcIsEnabled(void);
+mztcStatus_t* mztcGetStatus(void);
+bool mztcTriggerCalibration(void);
+bool mztcSetMode(mztcMode_e mode);
+bool mztcSetPalette(mztcPaletteMode_e palette);
+bool mztcSetZoom(mztcZoomLevel_e zoom);
+bool mztcSetImageParams(uint8_t brightness, uint8_t contrast, uint8_t enhancement);
+bool mztcSetDenoising(uint8_t spatial, uint8_t temporal);
+bool mztcSetTemperatureAlerts(bool enabled, float high_temp, float low_temp);
+bool mztcIsConnected(void);
+void mztcSimulateDataReception(void);
+
+#endif // USE_MZTC
diff --git a/src/main/config/parameter_group_ids.h b/src/main/config/parameter_group_ids.h
index c3d009ecbe4..f807761cb9e 100644
--- a/src/main/config/parameter_group_ids.h
+++ b/src/main/config/parameter_group_ids.h
@@ -134,7 +134,13 @@
#define PG_GEOZONES 1043
#define PG_GEOZONE_VERTICES 1044
#define PG_DRONECAN_CONFIG 1045
+#ifdef USE_MZTC
+#define PG_MZTC_CAMERA_CONFIG 1046
+#define PG_MZTC_OSD_CONFIG 1047
+#define PG_INAV_END PG_MZTC_OSD_CONFIG
+#else
#define PG_INAV_END PG_DRONECAN_CONFIG
+#endif
// OSD configuration (subject to change)
//#define PG_OSD_FONT_CONFIG 2047
diff --git a/src/main/fc/cli.c b/src/main/fc/cli.c
index 731b156f9ce..b985fa45c69 100644
--- a/src/main/fc/cli.c
+++ b/src/main/fc/cli.c
@@ -96,6 +96,7 @@ bool cliMode = false;
#include "io/osd.h"
#include "io/osd/custom_elements.h"
#include "io/serial.h"
+#include "io/mztc_camera.h"
#include "fc/fc_msp_box.h"
@@ -156,6 +157,21 @@ static uint16_t cliDelayMs = 0;
static void cliAssert(char *cmdline);
#endif
+#ifdef USE_MZTC
+static void cliMztc(char *cmdline);
+static void cliMztcMode(char *cmdline);
+static void cliMztcConfig(char *cmdline);
+static void cliMztcPalette(char *cmdline);
+static void cliMztcZoom(char *cmdline);
+static void cliMztcEnhancement(char *cmdline);
+static void cliMztcDenoise(char *cmdline);
+static void cliMztcAlerts(char *cmdline);
+static void cliMztcCalibrate(char *cmdline);
+static void cliMztcShutter(char *cmdline);
+static void cliMztcReconnect(char *cmdline);
+static void cliMztcSimulateData(char *cmdline);
+#endif
+
#ifdef USE_CLI_BATCH
static bool commandBatchActive = false;
static bool commandBatchError = false;
@@ -4943,6 +4959,294 @@ static void printBootLog(char *cmdline __attribute__((unused))) {
}
#endif
+#ifdef USE_MZTC
+// MassZero Thermal Camera CLI commands
+static void cliMztc(char *cmdline __attribute__((unused))) {
+ if (!mztcIsEnabled()) {
+ cliPrintLine("MassZero Thermal Camera is disabled");
+ return;
+ }
+
+ const mztcStatus_t *status = mztcGetStatus();
+ if (!status) {
+ cliPrintLine("MassZero Thermal Camera not available");
+ return;
+ }
+
+ cliPrintLine("MassZero Thermal Camera Status:");
+ cliPrintLinef(" Connected: %s", (status->connection_quality > 0) ? "YES" : "NO");
+ cliPrintLinef(" Mode: %d", status->mode);
+ cliPrintLinef(" Camera Temp: %.1f°C", (double)status->camera_temperature);
+ cliPrintLinef(" Ambient Temp: %.1f°C", (double)status->ambient_temperature);
+ cliPrintLinef(" Frame Count: %lu", (unsigned long)status->frame_count);
+ cliPrintLinef(" Last Update: %lu ms ago", (unsigned long)(millis() - status->last_frame_time));
+ cliPrintLinef(" Error Flags: 0x%02X", status->error_flags);
+}
+
+static void cliMztcMode(char *cmdline) {
+ if (strlen(cmdline) == 0) {
+ const mztcStatus_t *status = mztcGetStatus();
+ if (status) {
+ cliPrintLinef("Current mode: %d", status->mode);
+ }
+ return;
+ }
+
+ int mode = atoi(cmdline);
+ if (mode < 0 || mode > 7) {
+ cliPrintLine("Invalid mode. Use 0-7");
+ return;
+ }
+
+ if (mztcSetMode((mztcMode_e)mode)) {
+ cliPrintLinef("Mode set to %d", mode);
+ } else {
+ cliPrintLine("Failed to set mode");
+ }
+}
+
+static void cliMztcConfig(char *cmdline) {
+ if (strlen(cmdline) == 0) {
+ cliPrintLine("Usage: mztc_config [brightness] [contrast] [enhancement]");
+ return;
+ }
+
+ char *brightness_str = strtok(cmdline, " ");
+ char *contrast_str = strtok(NULL, " ");
+ char *enhancement_str = strtok(NULL, " ");
+
+ uint8_t brightness = 50, contrast = 50, enhancement = 50;
+ bool has_values = false;
+
+ if (brightness_str) {
+ brightness = atoi(brightness_str);
+ if (brightness > 100) {
+ cliPrintLine("Brightness must be 0-100");
+ return;
+ }
+ has_values = true;
+ }
+
+ if (contrast_str) {
+ contrast = atoi(contrast_str);
+ if (contrast > 100) {
+ cliPrintLine("Contrast must be 0-100");
+ return;
+ }
+ has_values = true;
+ }
+
+ if (enhancement_str) {
+ enhancement = atoi(enhancement_str);
+ if (enhancement > 100) {
+ cliPrintLine("Enhancement must be 0-100");
+ return;
+ }
+ has_values = true;
+ }
+
+ if (has_values && mztcSetImageParams(brightness, contrast, enhancement)) {
+ cliPrintLinef("Configuration updated: brightness=%d, contrast=%d, enhancement=%d",
+ brightness, contrast, enhancement);
+ } else if (has_values) {
+ cliPrintLine("Failed to update configuration");
+ }
+}
+
+static void cliMztcPalette(char *cmdline) {
+ if (strlen(cmdline) == 0) {
+ cliPrintLine("Usage: mztc_palette [palette]");
+ cliPrintLine("Available palettes: 0-13");
+ return;
+ }
+
+ int palette = atoi(cmdline);
+ if (palette < 0 || palette > 13) {
+ cliPrintLine("Invalid palette. Use 0-13");
+ return;
+ }
+
+ if (mztcSetPalette((mztcPaletteMode_e)palette)) {
+ cliPrintLinef("Palette set to %d", palette);
+ } else {
+ cliPrintLine("Failed to set palette");
+ }
+}
+
+static void cliMztcZoom(char *cmdline) {
+ if (strlen(cmdline) == 0) {
+ cliPrintLine("Usage: mztc_zoom [level]");
+ cliPrintLine("Available levels: 0-3 (1x, 2x, 4x, 8x)");
+ return;
+ }
+
+ int zoom = atoi(cmdline);
+ if (zoom < 0 || zoom > 3) {
+ cliPrintLine("Invalid zoom level. Use 0-3");
+ return;
+ }
+
+ if (mztcSetZoom((mztcZoomLevel_e)zoom)) {
+ cliPrintLinef("Zoom set to %d", zoom);
+ } else {
+ cliPrintLine("Failed to set zoom");
+ }
+}
+
+static void cliMztcEnhancement(char *cmdline) {
+ if (strlen(cmdline) == 0) {
+ cliPrintLine("Usage: mztc_enhancement [value]");
+ cliPrintLine("Value range: 0-100");
+ return;
+ }
+
+ int value = atoi(cmdline);
+ if (value < 0 || value > 100) {
+ cliPrintLine("Enhancement must be 0-100");
+ return;
+ }
+
+ // Get current values to preserve them
+ const mztcConfig_t *config = mztcConfig();
+ if (mztcSetImageParams(config->brightness, config->contrast, value)) {
+ cliPrintLinef("Digital enhancement set to %d", value);
+ } else {
+ cliPrintLine("Failed to set enhancement");
+ }
+}
+
+static void cliMztcDenoise(char *cmdline) {
+ if (strlen(cmdline) == 0) {
+ cliPrintLine("Usage: mztc_denoise [spatial] [temporal]");
+ cliPrintLine("Value range: 0-100");
+ return;
+ }
+
+ char *spatial_str = strtok(cmdline, " ");
+ char *temporal_str = strtok(NULL, " ");
+
+ uint8_t spatial = 50, temporal = 50;
+
+ if (spatial_str) {
+ spatial = atoi(spatial_str);
+ if (spatial > 100) {
+ cliPrintLine("Spatial denoising must be 0-100");
+ return;
+ }
+ }
+
+ if (temporal_str) {
+ temporal = atoi(temporal_str);
+ if (temporal > 100) {
+ cliPrintLine("Temporal denoising must be 0-100");
+ return;
+ }
+ }
+
+ if (mztcSetDenoising(spatial, temporal)) {
+ cliPrintLinef("Denoising updated: spatial=%d, temporal=%d", spatial, temporal);
+ } else {
+ cliPrintLine("Failed to update denoising");
+ }
+}
+
+static void cliMztcAlerts(char *cmdline) {
+ if (strlen(cmdline) == 0) {
+ cliPrintLine("Usage: mztc_alerts [enabled] [high_temp] [low_temp]");
+ return;
+ }
+
+ char *enabled_str = strtok(cmdline, " ");
+ char *high_str = strtok(NULL, " ");
+ char *low_str = strtok(NULL, " ");
+
+ if (enabled_str) {
+ int enabled = atoi(enabled_str);
+ if (enabled != 0 && enabled != 1) {
+ cliPrintLine("Enabled must be 0 or 1");
+ return;
+ }
+ }
+
+ if (high_str) {
+ float high = atof(high_str);
+ if (high < -40.0f || high > 300.0f) {
+ cliPrintLine("High temperature must be -40 to 300°C");
+ return;
+ }
+ }
+
+ if (low_str) {
+ float low = atof(low_str);
+ if (low < -40.0f || low > 300.0f) {
+ cliPrintLine("Low temperature must be -40 to 300°C");
+ return;
+ }
+ }
+
+ bool enabled = false;
+ float high_temp = 100.0f, low_temp = -10.0f;
+
+ if (enabled_str) {
+ enabled = atoi(enabled_str) ? true : false;
+ }
+ if (high_str) {
+ high_temp = atof(high_str);
+ }
+ if (low_str) {
+ low_temp = atof(low_str);
+ }
+
+ if (mztcSetTemperatureAlerts(enabled, high_temp, low_temp)) {
+ cliPrintLinef("Temperature alerts %s (high=%.1f°C, low=%.1f°C)",
+ enabled ? "enabled" : "disabled", (double)high_temp, (double)low_temp);
+ } else {
+ cliPrintLine("Failed to configure alerts");
+ }
+}
+
+static void cliMztcCalibrate(char *cmdline __attribute__((unused))) {
+ if (mztcTriggerCalibration()) {
+ cliPrintLine("Calibration triggered");
+ } else {
+ cliPrintLine("Failed to trigger calibration");
+ }
+}
+
+static void cliMztcShutter(char *cmdline __attribute__((unused))) {
+ if (mztcTriggerCalibration()) {
+ cliPrintLine("Manual shutter triggered");
+ } else {
+ cliPrintLine("Failed to trigger shutter");
+ }
+}
+
+static void cliMztcReconnect(char *cmdline)
+{
+ UNUSED(cmdline);
+
+ if (mztcIsEnabled()) {
+ mztcRequestReconnect();
+ cliPrintLine("MZTC: Forcing reconnection...");
+ } else {
+ cliPrintLine("MZTC: Camera is disabled");
+ }
+}
+
+// MZTC Simulate data command (SITL only)
+static void cliMztcSimulateData(char *cmdline)
+{
+ UNUSED(cmdline);
+
+ if (mztcIsEnabled()) {
+ mztcSimulateDataReception();
+ cliPrintLine("MZTC: Simulated data reception (SITL mode)");
+ } else {
+ cliPrintLine("MZTC: Camera is disabled");
+ }
+}
+#endif // USE_MZTC
+
static void cliHelp(char *cmdline);
// should be sorted a..z for bsearch()
@@ -5020,6 +5324,18 @@ const clicmd_t cmdTable[] = {
#endif
CLI_COMMAND_DEF("map", "configure rc channel order", "[