A comprehensive Takeoff and Landing Data (TOLD) calculator for the Cirrus SF50 Vision Jet, supporting G1 through G2+ models.
This app has not been approved by the FAA or by Cirrus Aircraft as an official source of performance information. Always verify performance information with official sources when using this app.
- Takeoff Performance: Calculate ground run, takeoff distance over 50ft obstacle, and Vx climb gradient
- Landing Performance: Calculate landing distance, ground run, VREF, and go-around climb gradient
- Multi-Model Support: G1, G2, and G2+ (with updated thrust schedule) models
- Safety Factors: Configurable safety factor for conservative performance calculations
- Airport Database: Integrated FAA NASR data for US airports
- OurAirports Data: International airport coverage with runway information
- Live Weather: Fetch METAR/TAF data automatically or input custom conditions
- Location-Based Search: Find nearby airports using device location
- Favorites & Recents: Quick access to frequently used airports
- NOTAM Support: Account for runway contamination, obstacles, and displaced thresholds
- Widget Support: Home screen widget displaying selected airport runway data
- Timezone Support: View times in UTC or airport local time
- Custom Fuel Density: Adjust for actual fuel density variations
- Framework: SwiftUI + Swift 6.0
- Data Persistence: SwiftData for local storage
- Shared Data: App Groups for widget communication
- Settings Management: Defaults library for type-safe UserDefaults
- Error Monitoring: BugSnag for crash reporting and performance monitoring
SF50 TOLD/
├── SF50 TOLD/ # Main iOS app target
│ ├── SF50_TOLDApp.swift # App entry point & initialization
│ ├── Views/ # SwiftUI views
│ │ ├── ContentView.swift # Main tab view container
│ │ ├── Performance/ # Takeoff/Landing calculation views
│ │ ├── Pickers/ # Airport, runway, weather pickers
│ │ ├── Settings/ # App settings & configuration
│ │ ├── Loading/ # Airport data loading UI
│ │ └── TLR/ # Takeoff/Landing Report generation
│ ├── Loaders/ # Airport data loading logic
│ └── TLR/ # HTML report generation
├── SF50 Shared/ # Shared business logic
│ ├── Models/ # SwiftData models (Airport, Runway, NOTAM)
│ ├── Performance/ # Performance calculation engines
│ │ ├── Models/ # G1 & G2+ performance models
│ │ └── ViewModel/ # Takeoff/Landing view models
│ ├── Weather/ # METAR/TAF parsing
│ ├── NearestAirport/ # Location-based airport search
│ └── Defaults.swift # Shared settings definitions
├── SF50 Runways/ # Widget extension
├── SF50 SharedTests/ # Unit tests
└── SF50 TOLDUITests/ # UI tests
Two calculation approaches are implemented:
- Tabular Model (
DataTable.swift): Multi-dimensional interpolation of official AFM tables - Regression Model: Polynomial regression models
Performance data is sourced from:
- G1: P/N 31452-001 Rev A1
- G2-G2+: P/N 31452-002 Rev 2
- Updated Thrust Schedule: P/N 31452-111 Rev 1
- SwiftData Models:
Airport,Runway,NOTAM - Persistence: Group container (
group.codes.tim.TOLD) for widget sharing - Schema Versioning: Currently on schema v3 with migration support
- NASR Integration: Downloads and parses FAA's 28-day NASR cycle
- OurAirports: CSV parsing for international airports
- Background Loading: Asynchronous download with progress tracking
- User Consent: Required before downloading large datasets
- METAR/TAF Parsing: Custom XML parser for NOAA Aviation Weather Service
- Manual Entry: Full manual weather input with validation
- Cached Results: Weather data cached to reduce API calls
- WidgetKit: Lock screen and home screen widgets
- Shared ModelContainer: Reads from app group container
- Auto-Refresh: Updates when selected airport changes
- Input Collection: User selects airport, runway, enters weight/fuel
- Weather Data: Fetch live METAR or accept manual input
- Density Altitude: Calculate from field elevation, temperature, altimeter
- Wind Components: Decompose wind into headwind/crosswind
- Table Lookup: Interpolate base performance from AFM tables
- Adjustments: Apply corrections for:
- Slope
- Tailwind
- Anti-ice
- Runway contamination (wet/icy)
- Safety Factor: Multiply by user-configured factor (default: 1.0)
- Results Display: Show distances, speeds, climb gradients
DataTableTests: Multi-dimensional interpolation validationTabularPerformanceModelTests: G1/G2+ model accuracyRegressionPerformanceModelTests: Regression model validationMETARXMLParserTests: Weather parsing edge cases
- End-to-end takeoff/landing calculation flows
- Airport search and selection
- Weather input validation
- Performance regression tests against known values
- GitHub Actions: Automated testing on push/PR
- Linters: SwiftLint + swift-format
- Test Plans: Separate unit and UI test plans
fastlane screenshots: Generate localized screenshots
- Xcode 16.0+
- iOS 18.0+ deployment target
- Swift 6.0
- Ruby + Bundler (for Fastlane)
Managed via Swift Package Manager:
- Bugsnag: Error monitoring
- BugsnagPerformance: Performance monitoring
- Defaults: Type-safe UserDefaults wrapper
- SwiftNASR: NASR data parsing
- ZIPFoundation: NASR archive extraction
- swift-collections: OrderedDictionary for NOTAM ordering
Located in Data/:
- AFM Tables: CSV files containing official performance tables
- make-tables/: Python scripts to convert AFM PDFs to CSV
- make-regressions/: Python scripts to generate regression coefficients
emptyWeight: Aircraft empty weightfuelDensity: Jet-A density (lb/gal)safetyFactor: Multiplier for conservative calculationsupdatedThrustSchedule: Toggle G2+ thrust scheduleuseRegressionModel: Enable experimental regression models
UI-TESTINGlaunch argument: Resets app state for UI tests- Group container:
group.codes.tim.TOLD - WeatherKit entitlement required for weather data