# Logging System Integration

## Overview
PyBusMonitor1553 integrates the `TkinterLogger` system from the `externals/python-tkinter-logger` submodule to provide comprehensive application logging with GUI display.

## Architecture

### Components
1. **TkinterLogger Module** (`externals/python-tkinter-logger/tkinter_logger.py`)
   - Thread-safe logging via Queue
   - Tkinter widget integration
   - Intelligent batching (70%+ overhead reduction)
   - Adaptive polling (fast when active, slow when idle)
   - Auto-scroll and line limit management

2. **GUI Integration** ([pybusmonitor1553/gui/main_window.py](../pybusmonitor1553/gui/main_window.py))
   - ScrolledText widget at bottom of window (8 lines)
   - Configured for 500-line history
   - Color-coded log levels
   - Read-only display

3. **Application Modules** (logging producers)
   - [core/network.py](../pybusmonitor1553/core/network.py) - UDP connection events
   - [core/dispatcher.py](../pybusmonitor1553/core/dispatcher.py) - Message parsing errors
   - [core/scheduler.py](../pybusmonitor1553/core/scheduler.py) - Transmission events

## GUI Layout

```
┌─────────────────────────────────────────────────┐
│  Menu Bar                                       │
├──────────────┬──────────────────────────────────┤
│              │                                  │
│  Message     │  Notebook Tabs:                 │
│  List        │  - Message Detail               │
│  (TreeView)  │  - Radar Status                 │
│              │  - Raw Data                     │
│              │                                  │
├──────────────┴──────────────────────────────────┤
│  Application Log (ScrolledText)                │
│  15:36:10 [INFO] UDP Listening on 127.0.0.1... │
│  15:36:10 [INFO] Multi-rate traffic started    │
│                                                  │
├──────────────────────────────────────────────────┤
│  Status Bar: ● Connected | TX: 123 | RX: 456   │
└──────────────────────────────────────────────────┘
```

## Logging Configuration

### Initialization
```python
# In main_window.py __init__()
self.logger_system = TkinterLogger(self.root)
self.logger_system.setup(
    enable_console=True,      # Also output to console
    enable_tkinter=True,      # Enable GUI widget
    enable_file=False,        # No file logging (optional)
    log_format='%(asctime)s [%(levelname)s] %(name)s: %(message)s',
    date_format='%H:%M:%S',
    root_level=logging.INFO   # Set minimum log level
)

# Attach to widget
self.logger_system.add_tkinter_handler(
    self.log_text,
    max_lines=500  # Keep last 500 lines
)
```

### Usage in Modules
```python
import logging

logger = logging.getLogger(__name__)

# Use standard Python logging
logger.info("UDP Listening on 127.0.0.1:61553")
logger.error("Error parsing MsgA1: invalid format")
logger.debug("Sent MsgA4 (SA 4)")  # Only if root_level=DEBUG
```

## Log Levels and Color Coding

| Level    | Color      | Usage                                    |
|----------|------------|------------------------------------------|
| DEBUG    | Gray       | Detailed packet dumps (if enabled)       |
| INFO     | Black      | Normal operations (connection, startup)  |
| WARNING  | Orange     | Non-critical issues (fallbacks)          |
| ERROR    | Red        | Parsing errors, send failures            |
| CRITICAL | Dark Red   | Fatal errors requiring attention         |

## Performance Optimizations

### Batching
- Logs buffered in Queue by background threads
- GUI processes up to 50 logs every 200ms
- Single widget enable/disable operation per batch
- Prevents GUI event overflow

### Adaptive Polling
```python
# From tkinter_logger.py
_poll_interval_ms = 200  # Base: 5Hz when active
# Slows to 1Hz when idle for 2 seconds
# Resumes fast polling when new logs arrive
```

### Memory Management
- Auto-trim to 500 lines (configurable)
- Prevents unbounded memory growth
- Old logs automatically discarded

### Smart Auto-Scroll
- Only scrolls to bottom if user was already there
- Preserves user scroll position when reviewing history
- Checks scroll position once per batch

## Module-Specific Logging

### Network Module ([core/network.py](../pybusmonitor1553/core/network.py#L1-L10))
```python
logger.info(f"UDP Listening on {self.rx_ip}:{self.rx_port}")
logger.error(f"Error starting UDP: {e}")
logger.info("UDP Stopped")
logger.debug(f"RX from {addr}: {hex_dump(data)}")  # If DEBUG_PACKETS=True
```

### Dispatcher ([core/dispatcher.py](../pybusmonitor1553/core/dispatcher.py#L1-L8))
```python
logger.error(f"Error parsing {msg_class.__name__}: {e}")
```

### Scheduler ([core/scheduler.py](../pybusmonitor1553/core/scheduler.py#L1-L9))
```python
logger.info(f"Multi-rate traffic generation started ({mode} format, {BASE_TICK_HZ}Hz base tick)")
logger.info(f"Message rates: A1/A3/A7/A8/B6=6.25Hz, A2/B7=25Hz, A4/A5=50Hz")
logger.info("Traffic generation stopped")
logger.debug(f"Sent {msg_obj.__class__.__name__} (SA {msg_obj.SUBADDRESS})")  # If not QUIET_MODE
```

### GUI Module ([gui/main_window.py](../pybusmonitor1553/gui/main_window.py#L19-L24))
```python
logger.info("Logging system initialized")
logger.info("PyBusMonitor1553 GUI initialized")
logger.info("Shutting down GUI...")
```

## Debug Flags Integration

Existing debug flags now use logging system:

| Module     | Flag             | Effect                               |
|------------|------------------|--------------------------------------|
| network.py | `DEBUG_PACKETS`  | Hex dump via `logger.debug()`        |
| scheduler.py | `DEBUG_PACKETS` | Packet hex dump via `logger.debug()` |
| scheduler.py | `QUIET_MODE`    | Suppress per-message logs            |

## Shutdown Sequence

```python
# In main_window.py
def shutdown(self):
    logging.getLogger(__name__).info("Shutting down GUI...")
    if self.logger_system:
        self.logger_system.shutdown()

# Registered on window close
root.protocol("WM_DELETE_WINDOW", on_closing)
```

Ensures all pending logs are flushed before exit.

## Future Enhancements

### File Logging (Optional)
```python
logger_system.setup(
    enable_file=True,
    file_path='logs/pybusmonitor.log',
    file_max_bytes=5*1024*1024,  # 5MB
    file_backup_count=3           # Keep 3 rotated files
)
```

### Log Level Control
Add GUI menu to change log level at runtime:
```python
View → Log Level → DEBUG/INFO/WARNING/ERROR
```

### Log Export
Add button to save current log buffer to file:
```python
File → Export Log...
```

### Filtering
Add search/filter capabilities:
```python
# Filter by module name, level, or message content
```

## Troubleshooting

### Logs Not Appearing in GUI
1. Check `TkinterLogger` import succeeded (no import error)
2. Verify `logger_system.setup()` was called
3. Ensure `add_tkinter_handler()` completed successfully
4. Check root logger level allows desired logs

### Console Logs Only
If GUI widget shows nothing but console shows logs:
- TkinterLogger may not be available (check imports)
- Widget may not be properly initialized
- Check for exceptions during `_setup_logging()`

### Performance Issues
If GUI becomes sluggish with logging:
- Reduce `root_level` to WARNING or ERROR
- Enable `QUIET_MODE` in scheduler
- Disable `DEBUG_PACKETS` in network/scheduler
- Reduce `max_lines` in widget handler

## References
- [TkinterLogger Documentation](../externals/python-tkinter-logger/TKINTER_LOGGER_README.md)
- [Python Logging Module](https://docs.python.org/3/library/logging.html)
