mirror of
https://github.com/OpenSquawk/OpenSquawk
synced 2026-08-01 06:06:05 +08:00
462 lines
18 KiB
TypeScript
462 lines
18 KiB
TypeScript
// A320 SOP Timeline – Cold & Dark bis Handoff nach Takeoff
|
||
// Quellen: Airbus A320 FCOM/FCTM Standard Procedures + VATSIM/IRL ATC Phraseology
|
||
// Hinweis: Vereinfacht für Sim-/VATSIM-Nutzung. Immer aktuelle FCOM/Charts checken.
|
||
|
||
export type Actor = 'pf' | 'pm' | 'atc' | 'pilot' | 'system' | 'cabin'
|
||
|
||
export interface SopStep {
|
||
id: string
|
||
actor: Actor
|
||
label: string // kurz – wird im Timeline-Card oben angezeigt
|
||
callout?: string // wörtlicher Funkspruch / Callout
|
||
detail?: string // Erläuterung / wo hinschauen
|
||
look?: string // Wo der Blick hingeht (für Eyeflow-Hinweis)
|
||
inputKeys?: string[] // Felder im Scratchpad, die hier relevant sind
|
||
/** Variant-Branches (horizontale Slides), z. B. "External Power" vs "APU" */
|
||
variants?: { id: string; title: string; steps: SopStep[] }[]
|
||
}
|
||
|
||
export interface SopPhase {
|
||
id: string
|
||
title: string
|
||
subtitle?: string
|
||
color: string // Tailwind-Farbtoken
|
||
steps: SopStep[]
|
||
}
|
||
|
||
export interface SopAircraftProfile {
|
||
id: string
|
||
name: string
|
||
phases: SopPhase[]
|
||
}
|
||
|
||
const a320Phases: SopPhase[] = [
|
||
{
|
||
id: 'cockpit-prep',
|
||
title: 'Cockpit Preparation',
|
||
subtitle: 'Cold & Dark → Pre-Flight ready',
|
||
color: 'cyan',
|
||
steps: [
|
||
{
|
||
id: 'safety-exterior',
|
||
actor: 'pf',
|
||
label: 'Safety Exterior / Receive Aircraft',
|
||
detail: 'Gear pins, chocks in place, GPU/APU plan klären.',
|
||
look: 'Außenbereich · Fahrwerk · GPU-Status',
|
||
},
|
||
{
|
||
id: 'batteries',
|
||
actor: 'pf',
|
||
label: 'Batteries → ON',
|
||
detail: 'BAT 1 + BAT 2 ON. Voltage check >25.5V.',
|
||
look: 'Overhead · ELEC Panel',
|
||
variants: [
|
||
{
|
||
id: 'gpu',
|
||
title: 'External Power verfügbar',
|
||
steps: [
|
||
{id: 'ext-pwr', actor: 'pf', label: 'EXT PWR → ON', detail: 'AVAIL Light grün, dann ON drücken.'},
|
||
],
|
||
},
|
||
{
|
||
id: 'apu-only',
|
||
title: 'Nur APU',
|
||
steps: [
|
||
{id: 'apu-master', actor: 'pf', label: 'APU MASTER → ON, dann START', detail: 'AVAIL nach ~50 s. APU GEN auto.'},
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: 'ext-lts',
|
||
actor: 'pf',
|
||
label: 'NAV & LOGO Lights → ON',
|
||
detail: 'Signal nach außen: cockpit besetzt.',
|
||
look: 'Overhead · EXT LT',
|
||
},
|
||
{
|
||
id: 'cockpit-prep-flow',
|
||
actor: 'pf',
|
||
label: 'Cockpit Preparation Flow',
|
||
detail: 'Overhead von links oben nach rechts unten: ADIRS NAV (3x), Fuel Pumps ON, Anti-ICE OFF, Probes auto, Cabin Press auto, Air Cond auto.',
|
||
look: 'Overhead Panel · Flow',
|
||
},
|
||
{
|
||
id: 'fmgs-init',
|
||
actor: 'pf',
|
||
label: 'FMGS · INIT A',
|
||
detail: 'CO RTE laden ODER FROM/TO + ALTN, FLT NBR, COST INDEX, CRZ FL setzen.',
|
||
look: 'MCDU · INIT A',
|
||
inputKeys: ['departure', 'destination', 'altn', 'flightNumber', 'costIndex', 'crzFL'],
|
||
},
|
||
{
|
||
id: 'fmgs-fpln',
|
||
actor: 'pf',
|
||
label: 'FMGS · F-PLN',
|
||
detail: 'SID, Enroute, STAR/Approach. Discontinuities clearen.',
|
||
look: 'MCDU · F-PLN',
|
||
inputKeys: ['sid', 'route'],
|
||
},
|
||
{
|
||
id: 'fmgs-init-b',
|
||
actor: 'pf',
|
||
label: 'FMGS · INIT B (Fuel Pred)',
|
||
detail: 'ZFW/ZFWCG aus Loadsheet, BLOCK fuel.',
|
||
look: 'MCDU · INIT B',
|
||
inputKeys: ['zfw', 'zfwcg', 'blockFuel'],
|
||
},
|
||
{
|
||
id: 'fmgs-perf',
|
||
actor: 'pf',
|
||
label: 'FMGS · PERF TAKEOFF',
|
||
detail: 'V1 / VR / V2, FLEX TEMP, THR RED / ACC ALT, TRANS ALT.',
|
||
look: 'MCDU · PERF · TAKEOFF',
|
||
inputKeys: ['v1', 'vr', 'v2', 'flexTemp', 'thrRed', 'accAlt'],
|
||
},
|
||
{
|
||
id: 'atis',
|
||
actor: 'pilot',
|
||
label: 'ATIS holen (D-ATIS / Voice)',
|
||
detail: 'Letter, Wind, Vis, RWY, QNH, Trans Level notieren.',
|
||
inputKeys: ['atisLetter', 'wind', 'qnh', 'rwy', 'transLevel'],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: 'clearance',
|
||
title: 'Clearance Delivery',
|
||
subtitle: 'IFR-Freigabe einholen',
|
||
color: 'sky',
|
||
steps: [
|
||
{
|
||
id: 'init-call',
|
||
actor: 'pilot',
|
||
label: 'Initial Call',
|
||
callout: '«[Station] Delivery, [Callsign], stand [XX], request IFR clearance to [DEST], information [ATIS], ready to copy.»',
|
||
inputKeys: ['callsign', 'stand', 'destination', 'atisLetter'],
|
||
},
|
||
{
|
||
id: 'clearance-rx',
|
||
actor: 'atc',
|
||
label: 'Clearance erhalten',
|
||
callout: '«[Callsign], cleared to [DEST] via [SID], runway [RWY], climb initially [ALT], squawk [SQK].»',
|
||
detail: 'CRAFT-Schema mitschreiben.',
|
||
inputKeys: ['sid', 'initialClimb', 'squawk'],
|
||
},
|
||
{
|
||
id: 'readback',
|
||
actor: 'pilot',
|
||
label: 'Readback',
|
||
callout: '«Cleared to [DEST] via [SID], runway [RWY], climb [ALT], squawk [SQK], [Callsign].»',
|
||
},
|
||
{
|
||
id: 'xpdr-set',
|
||
actor: 'pf',
|
||
label: 'XPDR Code setzen, FCU ALT prüfen',
|
||
look: 'Pedestal · ATC · FCU',
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: 'pushback-start',
|
||
title: 'Pushback & Engine Start',
|
||
color: 'indigo',
|
||
steps: [
|
||
{
|
||
id: 'before-start-flow',
|
||
actor: 'pf',
|
||
label: 'Before Start Flow',
|
||
detail: 'Windows/Doors closed, Beacon ON, Park Brake set, Thrust Levers IDLE, ENG MODE selector NORM.',
|
||
},
|
||
{
|
||
id: 'request-start',
|
||
actor: 'pilot',
|
||
label: 'Pushback & Startup anfordern',
|
||
callout: '«[Station] Ground, [Callsign], stand [XX], request pushback and startup.»',
|
||
inputKeys: ['callsign', 'stand'],
|
||
},
|
||
{
|
||
id: 'pushback-clr',
|
||
actor: 'atc',
|
||
label: 'Push & Start approved',
|
||
callout: '«[Callsign], pushback and startup approved, face [direction].»',
|
||
},
|
||
{
|
||
id: 'cabin-secure',
|
||
actor: 'cabin',
|
||
label: 'Cabin secure / Doors closed',
|
||
detail: 'PA: «Cabin crew, doors on automatic, cross-check.»',
|
||
},
|
||
{
|
||
id: 'beacon-on',
|
||
actor: 'pf',
|
||
label: 'BEACON → ON',
|
||
look: 'Overhead · EXT LT',
|
||
},
|
||
{
|
||
id: 'eng-start',
|
||
actor: 'pf',
|
||
label: 'Engine Start',
|
||
detail: 'ENG MODE selector → IGN/START. ENG MASTER 2 → ON, abwarten bis stabil, dann ENG MASTER 1 → ON. N1, EGT, N2, FF überwachen.',
|
||
look: 'ECAM ENG · Pedestal',
|
||
},
|
||
{
|
||
id: 'after-start-flow',
|
||
actor: 'pf',
|
||
label: 'After Start Flow',
|
||
detail: 'ENG MODE → NORM, APU BLEED OFF (wenn Pack ON kommt), Anti-ICE wie nötig, Pitch Trim setzen, RUDDER Trim 0, Flaps CONF 1+F oder 2 (perf-abhängig), Spoilers ARM, ECAM Status check.',
|
||
inputKeys: ['flapsConfig', 'pitchTrim'],
|
||
},
|
||
{
|
||
id: 'flight-controls',
|
||
actor: 'pf',
|
||
label: 'Flight Controls Check',
|
||
callout: '«Full left … full right … neutral … full forward … full back … neutral.»',
|
||
detail: 'PM bestätigt jede Bewegung über ECAM F/CTL Page.',
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: 'taxi',
|
||
title: 'Taxi',
|
||
color: 'emerald',
|
||
steps: [
|
||
{
|
||
id: 'request-taxi',
|
||
actor: 'pilot',
|
||
label: 'Taxi request',
|
||
callout: '«[Station] Ground, [Callsign], request taxi.»',
|
||
},
|
||
{
|
||
id: 'taxi-clr',
|
||
actor: 'atc',
|
||
label: 'Taxi clearance',
|
||
callout: '«[Callsign], taxi to holding point [RWY] via [TWY A, B, C].»',
|
||
inputKeys: ['taxiRoute', 'holdingPoint'],
|
||
},
|
||
{
|
||
id: 'taxi-readback',
|
||
actor: 'pilot',
|
||
label: 'Readback',
|
||
callout: '«Taxi to holding point [RWY] via [TWY], [Callsign].»',
|
||
},
|
||
{
|
||
id: 'taxi-lights',
|
||
actor: 'pf',
|
||
label: 'NOSE Light → TAXI, Brakes check',
|
||
detail: 'PM: «Brakes checked.» max 30 kts gerade, max 10 kts in Kurven.',
|
||
},
|
||
{
|
||
id: 'before-tko-checklist',
|
||
actor: 'pm',
|
||
label: 'Before Takeoff Checklist (down to the line)',
|
||
detail: 'Flaps · Pitch Trim · Flight Controls · ECAM Memo: T.O. NO BLUE.',
|
||
},
|
||
{
|
||
id: 'takeoff-briefing',
|
||
actor: 'pf',
|
||
label: 'Takeoff Briefing',
|
||
detail: 'Standard: dep RWY [XX], SID [..], engine failure plan, return gates, MSA, weather.',
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: 'lineup-tko',
|
||
title: 'Line-Up & Takeoff',
|
||
color: 'amber',
|
||
steps: [
|
||
{
|
||
id: 'handoff-twr',
|
||
actor: 'atc',
|
||
label: 'Handoff Tower',
|
||
callout: '«[Callsign], contact Tower [FREQ].»',
|
||
inputKeys: ['twrFreq'],
|
||
},
|
||
{
|
||
id: 'twr-call',
|
||
actor: 'pilot',
|
||
label: 'Tower Call',
|
||
callout: '«[Station] Tower, [Callsign], holding short [RWY].»',
|
||
},
|
||
{
|
||
id: 'lineup',
|
||
actor: 'atc',
|
||
label: 'Line-up clearance',
|
||
callout: '«[Callsign], line up runway [RWY] and wait.»',
|
||
},
|
||
{
|
||
id: 'before-tko-line',
|
||
actor: 'pf',
|
||
label: 'Below-the-line Items',
|
||
detail: 'Cabin Crew advised, Packs/Anti-Ice per perf, T.O. CONFIG TEST gedrückt, Strobes ON, TCAS TA/RA, Landing Lights ON, NOSE Light → T.O.',
|
||
callout: 'Cabin: «Cabin crew, takeoff.»',
|
||
},
|
||
{
|
||
id: 'cleared-tko',
|
||
actor: 'atc',
|
||
label: 'Cleared for Takeoff',
|
||
callout: '«[Callsign], wind [..], runway [RWY], cleared for takeoff.»',
|
||
},
|
||
{
|
||
id: 'tko-roll',
|
||
actor: 'pf',
|
||
label: 'Takeoff Roll',
|
||
detail: 'Thrust Levers 50 % N1, stabil, dann FLEX/TOGA. PF hand auf Thrust bis V1.',
|
||
},
|
||
{
|
||
id: 'thrust-set',
|
||
actor: 'pm',
|
||
label: 'Callout: «Thrust set»',
|
||
callout: '«Thrust set, FMA: MAN FLEX [TEMP] / SRS / RWY.»',
|
||
look: 'PFD · FMA',
|
||
},
|
||
{
|
||
id: 'kts-100',
|
||
actor: 'pm',
|
||
label: '«100 knots»',
|
||
callout: '«100 knots.»',
|
||
look: 'PFD · Speed Tape',
|
||
detail: 'PF antwortet «checked».',
|
||
},
|
||
{
|
||
id: 'v1',
|
||
actor: 'pm',
|
||
label: '«V1»',
|
||
callout: '«V1.»',
|
||
detail: 'PF nimmt Hand vom Thrust Lever.',
|
||
},
|
||
{
|
||
id: 'rotate',
|
||
actor: 'pm',
|
||
label: '«Rotate»',
|
||
callout: '«Rotate.»',
|
||
detail: 'PF: smooth pitch up zu 12.5° → ca. 15° Initial.',
|
||
},
|
||
{
|
||
id: 'positive-climb',
|
||
actor: 'pm',
|
||
label: '«Positive climb»',
|
||
callout: 'PM: «Positive climb.» — PF: «Gear up.»',
|
||
look: 'PFD · V/S, Altitude',
|
||
},
|
||
],
|
||
},
|
||
{
|
||
id: 'after-tko',
|
||
title: 'After Takeoff & Handoff',
|
||
color: 'rose',
|
||
steps: [
|
||
{
|
||
id: 'thr-red',
|
||
actor: 'system',
|
||
label: 'THR RED ALT erreicht',
|
||
detail: 'FMA: CLB. Thrust Levers in CL detent.',
|
||
look: 'PFD · FMA',
|
||
inputKeys: ['thrRed'],
|
||
},
|
||
{
|
||
id: 'acc-alt',
|
||
actor: 'system',
|
||
label: 'ACC ALT erreicht',
|
||
detail: 'Auto-Beschleunigung auf Green-Dot. Flap-Retraction-Schedule beginnt.',
|
||
inputKeys: ['accAlt'],
|
||
},
|
||
{
|
||
id: 'flap-1',
|
||
actor: 'pf',
|
||
label: '«Flaps 1» bei F-Speed',
|
||
callout: 'PF: «Flaps 1.» PM: «Speed checked, flaps 1.»',
|
||
},
|
||
{
|
||
id: 'flap-0',
|
||
actor: 'pf',
|
||
label: '«Flaps 0» bei S-Speed',
|
||
callout: 'PF: «Flaps 0.» PM: «Speed checked, flaps 0.»',
|
||
},
|
||
{
|
||
id: 'after-tko-flow',
|
||
actor: 'pf',
|
||
label: 'After Takeoff Flow',
|
||
detail: 'Gear UP & off, Spoilers disarm, Flaps 0, Packs ON falls vorher off, APU MASTER OFF wenn nicht mehr benötigt, Anti-ICE wie nötig, Landing Lts AUTO/OFF (>10.000 ft), NOSE Light OFF, Seatbelts wie nötig.',
|
||
},
|
||
{
|
||
id: 'after-tko-checklist',
|
||
actor: 'pm',
|
||
label: 'After Takeoff / Climb Checklist',
|
||
detail: 'Landing Gear UP · Flaps 0 · Packs ON · Baro: bei TRANS ALT auf STD.',
|
||
},
|
||
{
|
||
id: 'handoff-dep',
|
||
actor: 'atc',
|
||
label: 'Handoff Departure / Center',
|
||
callout: '«[Callsign], contact Departure [FREQ], good day.»',
|
||
inputKeys: ['depFreq'],
|
||
},
|
||
{
|
||
id: 'dep-call',
|
||
actor: 'pilot',
|
||
label: 'Initial Call Departure',
|
||
callout: '«[Station] Departure, [Callsign], passing [ALT] for [CLEARED ALT], [SID].»',
|
||
},
|
||
],
|
||
},
|
||
]
|
||
|
||
export const a320Profile: SopAircraftProfile = {
|
||
id: 'a320',
|
||
name: 'Airbus A320 (CEO/NEO)',
|
||
phases: a320Phases,
|
||
}
|
||
|
||
export const sopProfiles: SopAircraftProfile[] = [a320Profile]
|
||
|
||
/** Felder für den Scratchpad – gruppiert. */
|
||
export interface ScratchField {
|
||
key: string
|
||
label: string
|
||
placeholder?: string
|
||
group: 'flight' | 'perf' | 'atc' | 'fuel' | 'env'
|
||
}
|
||
|
||
export const scratchFields: ScratchField[] = [
|
||
{key: 'callsign', label: 'Callsign', placeholder: 'DLH4AB', group: 'flight'},
|
||
{key: 'flightNumber', label: 'Flight Nbr', placeholder: 'DLH441', group: 'flight'},
|
||
{key: 'aircraftReg', label: 'Aircraft Reg', placeholder: 'D-AIZA', group: 'flight'},
|
||
{key: 'departure', label: 'Departure', placeholder: 'EDDF', group: 'flight'},
|
||
{key: 'destination', label: 'Destination', placeholder: 'LEMD', group: 'flight'},
|
||
{key: 'altn', label: 'Alternate', placeholder: 'LEBL', group: 'flight'},
|
||
{key: 'route', label: 'Route', placeholder: 'TOBAK Y163 ...', group: 'flight'},
|
||
{key: 'crzFL', label: 'CRZ FL', placeholder: 'FL360', group: 'flight'},
|
||
{key: 'costIndex', label: 'Cost Index', placeholder: '30', group: 'flight'},
|
||
{key: 'stand', label: 'Stand / Gate', placeholder: 'V152', group: 'flight'},
|
||
|
||
{key: 'atisLetter', label: 'ATIS', placeholder: 'D', group: 'env'},
|
||
{key: 'wind', label: 'Wind', placeholder: '250/08', group: 'env'},
|
||
{key: 'qnh', label: 'QNH', placeholder: '1013', group: 'env'},
|
||
{key: 'rwy', label: 'RWY', placeholder: '25C', group: 'env'},
|
||
{key: 'transLevel', label: 'Trans Level', placeholder: 'FL70', group: 'env'},
|
||
{key: 'transAlt', label: 'Trans Alt', placeholder: '5000', group: 'env'},
|
||
|
||
{key: 'sid', label: 'SID', placeholder: 'OBOKA1L', group: 'atc'},
|
||
{key: 'initialClimb', label: 'Initial Climb', placeholder: '5000 ft', group: 'atc'},
|
||
{key: 'squawk', label: 'Squawk', placeholder: '1000', group: 'atc'},
|
||
{key: 'taxiRoute', label: 'Taxi Route', placeholder: 'N, L, M', group: 'atc'},
|
||
{key: 'holdingPoint', label: 'Holding Point', placeholder: 'S4', group: 'atc'},
|
||
{key: 'twrFreq', label: 'Tower', placeholder: '119.905', group: 'atc'},
|
||
{key: 'depFreq', label: 'Departure', placeholder: '120.150', group: 'atc'},
|
||
|
||
{key: 'zfw', label: 'ZFW (t)', placeholder: '60.5', group: 'fuel'},
|
||
{key: 'zfwcg', label: 'ZFWCG (%)', placeholder: '27.5', group: 'fuel'},
|
||
{key: 'blockFuel', label: 'Block Fuel (t)', placeholder: '12.4', group: 'fuel'},
|
||
{key: 'tripFuel', label: 'Trip Fuel (t)', placeholder: '8.7', group: 'fuel'},
|
||
|
||
{key: 'flapsConfig', label: 'Flaps T/O', placeholder: '1+F', group: 'perf'},
|
||
{key: 'flexTemp', label: 'FLEX TEMP', placeholder: '52', group: 'perf'},
|
||
{key: 'v1', label: 'V1', placeholder: '142', group: 'perf'},
|
||
{key: 'vr', label: 'VR', placeholder: '146', group: 'perf'},
|
||
{key: 'v2', label: 'V2', placeholder: '150', group: 'perf'},
|
||
{key: 'thrRed', label: 'THR RED', placeholder: '1500', group: 'perf'},
|
||
{key: 'accAlt', label: 'ACC ALT', placeholder: '1500', group: 'perf'},
|
||
{key: 'pitchTrim', label: 'Pitch Trim', placeholder: 'DN 1.2', group: 'perf'},
|
||
]
|