From: Flightgear-commitlogs <ma...@hy...> - 2015-01-22 06:57:45
|
The branch, master has been updated - Log ----------------------------------------------------------------- commit 2999bcf00e93f9d9cca5a536ce7f2ac0f5d0f8a1 Author: Wolfram Wagner Date: Thu Jan 22 07:27:33 2015 +0100 + added aliases to chat menu for quick reference + made chat menu better readable + added support for VRB winds to chat and aliases + added Metar analysis for VFR,MVFR,IFR,LIFR and display + added splitting of long auto generated chat lines to ensure transmission - Summary ------------------------------------------------------------- .../fgfs/multiplayer/MultiplayerClient.java | 25 +- de.knewcleus.openradar/data/atcMessages/alias.txt | 6 +- .../data/atcMessages/cmd-props.txt | 4 +- .../data/atcMessages/cmd-short.txt | 52 +-- de.knewcleus.openradar/data/atcMessages/de.txt | 12 +- de.knewcleus.openradar/data/atcMessages/en.txt | 14 +- de.knewcleus.openradar/data/atcMessages/es.txt | 14 +- de.knewcleus.openradar/data/atcMessages/fr.txt | 14 +- de.knewcleus.openradar/data/atcMessages/it.txt | 14 +- de.knewcleus.openradar/data/atcMessages/nl.txt | 14 +- de.knewcleus.openradar/data/atcMessages/pl.txt | 14 +- de.knewcleus.openradar/data/atcMessages/pt.txt | 12 +- de.knewcleus.openradar/data/atcMessages/ru.txt | 14 +- de.knewcleus.openradar/data/atcMessages/tags.txt | 1 + .../gui/chat/auto/AtcAliasChatMessage.java | 4 +- .../gui/chat/auto/AtcMenuChatMessage.java | 9 +- .../openradar/gui/status/StatusPanel.java | 33 +- .../openradar/gui/status/radio/RadioPanel.java | 1 + .../de/knewcleus/openradar/weather/MetarData.java | 453 ++++++++++++--------- .../knewcleus/openradar/weather/MetarReader.java | 2 +- 20 files changed, 411 insertions(+), 301 deletions(-) - Diff ---------------------------------------------------------------- diff --git a/de.knewcleus.fgfs/src/de/knewcleus/fgfs/multiplayer/MultiplayerClient.java b/de.knewcleus.fgfs/src/de/knewcleus/fgfs/multiplayer/MultiplayerClient.java index 470286e..0162f73 100644 --- a/de.knewcleus.fgfs/src/de/knewcleus/fgfs/multiplayer/MultiplayerClient.java +++ b/de.knewcleus.fgfs/src/de/knewcleus/fgfs/multiplayer/MultiplayerClient.java @@ -159,9 +159,32 @@ public abstract class MultiplayerClient<T extends Player> extends AbstractMultip */ public synchronized void sendChatMessage(String f, String message) { // chatQueue is synchronized itself - chatQueue.add(new OutgoingMessage(message)); + while(message!=null) { + if(message.length()>128) { + // message too long, send next line + int sep = findSeparator(message); + String nextLine = message.substring(0,sep); + chatQueue.add(new OutgoingMessage(nextLine)); + message = message.substring(sep).trim(); + } else { + // message is short enough / send the rest + chatQueue.add(new OutgoingMessage(message.trim())); + message=null; // end while loop + } + } setFrequency(f); } + + + private int findSeparator(String message) { + String line = message.substring(0,128); + int sep = line.lastIndexOf(" "); + if(sep<100) { + // hard line break + sep=128; + } + return sep; + } public synchronized void setFrequency(String f) { if (!"".equals(f.trim())) { diff --git a/de.knewcleus.openradar/data/atcMessages/alias.txt b/de.knewcleus.openradar/data/atcMessages/alias.txt index 038af4f..2a5e9f4 100644 --- a/de.knewcleus.openradar/data/atcMessages/alias.txt +++ b/de.knewcleus.openradar/data/atcMessages/alias.txt @@ -6,7 +6,7 @@ out=Welcome to <aptname> - please advise ATC of your intentions, FGCOM <com0> radar=Radar Contact range <distance> mi, QNH <hPa>/<mmHg>, active rwy(s) <runways-land>, FGCOM <com0> own=Resume your OWN navigation - Frequency change approved - Radar surveillance remains active end=You are leaving my airspace - Frequency change approved - Radar service terminated -atis=ATIS for <icao> at <icao-altitude> ft: QNH <hPa>/<mmHg> wind <winds> active rwy(s) <runways> FGCOM <com0> +atis=ATIS for <icao> at <icao-altitude> ft: QNH <hPa>/<mmHg> wind <winds> active rwy(s) <runways><com_all> rgd=Thanks for flying with us today. Have a good day en=Engine startup approved, please indicate planned destination @@ -16,7 +16,7 @@ hs=Hold short runway {0.RWY} lw=Line up and wait on runway, report when ready for departure mc=Maintain runway heading, climb to {0.ALT} -to=Wind <wind-direction> at <wind-speed> kt, cleared for takeoff runway {0.RWY} +to=Wind <winds>, cleared for takeoff runway {0.RWY} tl=Turn left heading {0} tr=Turn right heading {0} @@ -27,7 +27,7 @@ rs=Reduce speed to {0} ils=<distance> mi out, maintain hdg until intercepting localizer, cleared for ILS appr rwy {0.RWY} ris=<distance> mi out, report when you have runway in sight -lan=<distance> mi out, wind <wind-direction> at <wind-speed> kts, cleared to land rwy {0.RWY} +lan=<distance> mi out, wind <winds> , cleared to land rwy {0.RWY} vac=Welcome to <aptname> -- exit runway to the {0} csr=Cleared to cross runway {0} diff --git a/de.knewcleus.openradar/data/atcMessages/cmd-props.txt b/de.knewcleus.openradar/data/atcMessages/cmd-props.txt index 4a51dc8..2f3d284 100644 --- a/de.knewcleus.openradar/data/atcMessages/cmd-props.txt +++ b/de.knewcleus.openradar/data/atcMessages/cmd-props.txt @@ -17,7 +17,7 @@ /sim/gui/dialogs/ATC-ML/ATC-MP/CMD-target /sim/gui/dialogs/ATC-ML/ATC-MP/CMD-target -/sim/gui/dialogs/ATC-ML/ATC-MP/CMD-target,/sim/atc/wind-from-display,/environment/wind-speed-kt +/sim/gui/dialogs/ATC-ML/ATC-MP/CMD-target,/openradar/metar/wind /sim/gui/dialogs/ATC-ML/ATC-MP/CMD-target /sim/gui/dialogs/ATC-ML/ATC-MP/CMD-target @@ -27,7 +27,7 @@ /sim/gui/dialogs/ATC-ML/ATC-MP/CMD-target,/sim/gui/dialogs/ATC-ML/ATC-MP/CMD-target-range /sim/gui/dialogs/ATC-ML/ATC-MP/CMD-target,/sim/gui/dialogs/ATC-ML/ATC-MP/CMD-target-range -/sim/gui/dialogs/ATC-ML/ATC-MP/CMD-target,/sim/gui/dialogs/ATC-ML/ATC-MP/CMD-target-range,/sim/atc/wind-from-display,/environment/wind-speed-kt +/sim/gui/dialogs/ATC-ML/ATC-MP/CMD-target,/sim/gui/dialogs/ATC-ML/ATC-MP/CMD-target-range,/openradar/metar/wind /sim/gui/dialogs/ATC-ML/ATC-MP/CMD-target,/sim/gui/dialogs/ATC-ML/ATC-MP/CMD-APname /sim/gui/dialogs/ATC-ML/ATC-MP/CMD-target diff --git a/de.knewcleus.openradar/data/atcMessages/cmd-short.txt b/de.knewcleus.openradar/data/atcMessages/cmd-short.txt index 59c95a6..3334ab7 100644 --- a/de.knewcleus.openradar/data/atcMessages/cmd-short.txt +++ b/de.knewcleus.openradar/data/atcMessages/cmd-short.txt @@ -1,37 +1,37 @@ (To All: empty) (Target: empty) -<span style="color:rgb(48,97,48);">Welcome outside</span> -<span style="color:rgb(48,97,48);">Welcome to the airport</span> -<span style="color:rgb(48,97,48);">Radar contact + QNH + RW</span> +<span style="color:rgb(48,97,48);">Welcome outside (.in)</span> +<span style="color:rgb(48,97,48);">Welcome to the airport (.out)</span> +<span style="color:rgb(48,97,48);">Radar contact + QNH + RW (.radar)</span> -<span style="color:rgb(117,0,0);">Follow FlightPlan</span> -<span style="color:rgb(117,0,0);">Leaving Area</span> -ATIS +<span style="color:rgb(117,0,0);">Follow FlightPlan (.own)</span> +<span style="color:rgb(117,0,0);">Leaving Area (.end)</span> +ATIS (.atis) Help Contact ATC -<span style="color:rgb(116,69,23);">Start Up Engine</span> -<span style="color:rgb(116,69,23);">Push Back</span> -<span style="color:rgb(116,69,23);">Taxi To</span> -<span style="color:rgb(116,69,23);">Hold Short</span> +<span style="color:rgb(116,69,23);"><b>Start Up</b> Engine (.en)</span> +<span style="color:rgb(116,69,23);"><b>Push Back</b> (.pb #)</span> +<span style="color:rgb(116,69,23);"><b>Taxi</b> To (.tx #)</span> +<span style="color:rgb(116,69,23);"><b>Hold Short</b> (.hs #)</span> -<span style="color:rgb(48,97,48);">Line Up and wait on runway</span> -<span style="color:rgb(48,97,48);">Maintain Hdg + Climb</span> -<span style="color:rgb(48,97,48);">Take Off</span> +<span style="color:rgb(48,97,48);"><b>Line Up</b> and wait on runway (.lw)</span> +<span style="color:rgb(48,97,48);"><b>Maintain</b> Hdg + Climb (.mc #)</span> +<span style="color:rgb(48,97,48);"><b>Take Off (.to #)</b></span> -<span style="color:rgb(22,66,88);">left turn</span> -<span style="color:rgb(22,66,88);">right turn</span> -<span style="color:rgb(22,66,88);">climb</span> -<span style="color:rgb(22,66,88);">descent</span> -<span style="color:rgb(22,66,88);">reduce speed</span> +<span style="color:rgb(22,66,88);"><b>left</b> turn (.tl #)</span> +<span style="color:rgb(22,66,88);"><b>right</b> turn (.tr #)</span> +<span style="color:rgb(22,66,88);"><b>climb</b> (.cm #)</span> +<span style="color:rgb(22,66,88);"><b>descent</b> (.dm #)</span> +<span style="color:rgb(22,66,88);"><b>reduce speed</b> (.rs #)</span> -<span style="color:rgb(117,0,0);">ILS intercept clearance</span> -<span style="color:rgb(117,0,0);">RW inSight</span> -<span style="color:rgb(117,0,0);">Land</span> -<span style="color:rgb(117,0,0);">Exit runway (left/right)</span> -<span style="color:rgb(117,0,0);">Cleared to cross</span> +<span style="color:rgb(117,0,0);"><b>ILS</b> intercept clearance (.ils #)</span> +<span style="color:rgb(117,0,0);"><b>RW in sight</b> (.ris)</span> +<span style="color:rgb(117,0,0);"><b>Land</b> (.lan #)</span> +<span style="color:rgb(117,0,0);"><b>Exit</b> runway (left/right) (.vac #)</span> +<span style="color:rgb(117,0,0);">Cleared to <b>cross</b> (.csr #)</span> -FGCOM only for ATC -uncontrolled flying -do not start on RW +FGCOM only for ATC (.chat) +uncontrolled flying (.disturb) +do not start on RW (.getoff) how to set startpos diff --git a/de.knewcleus.openradar/data/atcMessages/de.txt b/de.knewcleus.openradar/data/atcMessages/de.txt index 397a450..3a134d6 100644 --- a/de.knewcleus.openradar/data/atcMessages/de.txt +++ b/de.knewcleus.openradar/data/atcMessages/de.txt @@ -1,9 +1,9 @@ An alle Piloten: %s: -%s: Willkommen im Gebiet: %s - beabsichtigen Sie in %s zu landen ? FGCOM %s -%s: Willkommen in %s, bitte informieren Sie ATC ueber Ihre Plaene, FGCOM %s -%s: Radar-Kontakt in %3.0f mi Entfernung, Hoehenmesser %s, planen Sie mit Landebahn %s, FGCOM %s +%s: Willkommen im Gebiet: %s - beabsichtigen Sie in %s zu landen? %s +%s: Willkommen in %s, bitte informieren Sie ATC ueber Ihre Plaene, %s +%s: Radar-Kontakt in %3.0f mi Entfernung, Hoehenmesser %s, planen Sie mit Landebahn %s, %s %s: Folgen Sie Ihrem Flugplan - Radar-Ueberwachung bleibt aktiv %s: Sie verlassen meine Zone - Sie koennen nun die Frequenz wechseln - RADAR Service wird beendet - Guten Flug! @@ -17,7 +17,7 @@ An alle Piloten: %s: Rollen Sie in Startposition, Ausrichten etc. Melden Sie wenn fertig zum Start %s: Halten Sie die Richtung der Landebahn und steigen Sie auf: -%s: Wind aus %03.0f mit %2.0f kt, Startfreigabe fuer RW: +%s: Wind %s, Startfreigabe fuer RW: %s: Drehen Sie nach links, neuer Kurs: %s: Drehen Sie nach rechts, neuer Kurs: @@ -27,11 +27,11 @@ An alle Piloten: %s: %3.0f mi entfernt, halten Sie Ihren Kurs bis zum Einschwenken in den Localizer, Freigabe zum ILS-Anflug fuer RW: %s: %3.0f mi entfernt, melden sie wenn "Landebahn in Sicht" -%s: %3.0f mi entfernt, Wind aus %03.0f mit %2.0f kt, Freigabe zur Landung auf RW: +%s: %3.0f mi entfernt, Wind %s, Freigabe zur Landung auf RW: %s: Willkommen in %s -- Verlassen Sie die Landbahn nach: %s: Rollen Sie zu Gate und/oder Terminal: -Bitte benutzen Sie FGCOM %s nur fuer Gespräche mit ATC - NICHT zwischen Piloten! +Bitte benutzen Sie %s nur fuer Gespräche mit ATC - NICHT zwischen Piloten! %s: Sie stoeren unsere ATC Simulation --> bitte benutzen Sie einen anderen Flughafen fuer unkontrolliertes Fliegen! %s: Bitte starten Sie Ihre Fluege nicht auf den Landebahnen - zumindest raeumen Sie diese sofort wieder OHNE zu starten! Zur Definition der Startpositionen siehe: http://www.emmerich-j.de/HB/DE/3_Intro.html diff --git a/de.knewcleus.openradar/data/atcMessages/en.txt b/de.knewcleus.openradar/data/atcMessages/en.txt index d879127..001d44a 100644 --- a/de.knewcleus.openradar/data/atcMessages/en.txt +++ b/de.knewcleus.openradar/data/atcMessages/en.txt @@ -1,13 +1,13 @@ To All Airmen: %s -%s: Welcome to the %s area -- are you inbound %s ? FGCOM %s -%s: Welcome to %s - please advise ATC of your intentions, FGCOM %s -%s: Radar Contact range %3.0f mi, QNH %s, expect runway %s, FGCOM %s +%s: Welcome to the %s area -- are you inbound %s? %s +%s: Welcome to %s - please advise ATC of your intentions, %s +%s: Radar Contact range %3.0f mi, QNH %s, expect runway %s, %s %s: Resume your OWN navigation - Radar surveillance is active %s: You are leaving my airspace - frequency change approved - radar service terminated -ATIS for %s at %2.0f ft: QNH %s wind %s active rwy(s) %s FGCOM %s +ATIS for %s at %2.0f ft: QNH %s wind %s active rwy(s) %s; %s ATC-Contact-Help: for ARRIVAL key: "-">>"3">>"3">>"3" for DEPARTURE key: "-">>"3">>"6" %s: Cleared for engine startup, please indicate planned destination @@ -17,7 +17,7 @@ ATC-Contact-Help: for ARRIVAL key: "-">>"3">>"3">>"3" for DEPARTURE key: "-">>" %s: Line up and wait on runway, report when ready for departure %s: Maintain runway heading, climb to: -%s: Wind %03.0f at %2.0f kt, clear for takeoff runway: +%s: Wind %s, clear for takeoff runway: %s: Turn left heading: %s: Turn right heading: @@ -27,11 +27,11 @@ ATC-Contact-Help: for ARRIVAL key: "-">>"3">>"3">>"3" for DEPARTURE key: "-">>" %s: %3.0f mi out, maintain hdg until intercepting localizer, cleared for ILS appr rwy: %s: %3.0f mi out, report when runway in sight -%s: %3.0f mi out, wind %03.0f at %1.0f kts, cleared to land runway: +%s: %3.0f mi out, wind %s, cleared to land runway: %s: Welcome to %s -- exit runway to the: %s: Cleared to cross runway: -Please use FGCOM %s only to talk to ATC, NOT to chat between airmen! +Please use %s only to talk to ATC, NOT to chat between airmen! %s: You are disturbing our ATC training --> please use another airport for uncontrolled flying %s: Please do not start your session on an active runway - please get OFF RUNWAY fast %s: To define Startpositions see: http://www.emmerich-j.de/HB/EN/Intro (or /DE/Intro) diff --git a/de.knewcleus.openradar/data/atcMessages/es.txt b/de.knewcleus.openradar/data/atcMessages/es.txt index fc5b1a0..a7774c0 100644 --- a/de.knewcleus.openradar/data/atcMessages/es.txt +++ b/de.knewcleus.openradar/data/atcMessages/es.txt @@ -1,13 +1,13 @@ A todos los hombres del aire: %s -%s: Bienvenido a %s - ¿ vuela con destino a %s ? FGCOM %s -%s: Bienvenido a %s - por favor informe al ATC sobre sus intenciones, FGCOM %s -%s: Contacto Radar a %3.0f mi, QNH %s, espere pista: %s, FGCOM %s +%s: Bienvenido a %s - ¿ vuela con destino a %s? %s +%s: Bienvenido a %s - por favor informe al ATC sobre sus intenciones, %s +%s: Contacto Radar a %3.0f mi, QNH %s, espere pista: %s, %s %s: Esta abandonando mi area - Autorizado a cambiar frecuencia - Que tenga buen viaje -ATIS en %s a %2.0f ft: QNH %s viento %3.0f. Pista en uso %s FGCOM %s +ATIS en %s a %2.0f ft: QNH %s viento %3.0f. Pista en uso %s %s %s: Autorizado a Arrancar Motores @@ -17,7 +17,7 @@ ATIS en %s a %2.0f ft: QNH %s viento %3.0f. Pista en uso %s FGCOM %s %s: Entre en pista Alinie y Mantenga espera, informe cuando este listo para Salir %s: mantenga rumbo de pista, ascienda a: -%s: viento %03.0f Grados a %2.0f Nudos, autorizado despegue pista: +%s: viento %s, autorizado despegue pista: %s: Gire a la Izquierda rumbo: %s: Gire a la Derecha rumbo: @@ -27,11 +27,11 @@ ATIS en %s a %2.0f ft: QNH %s viento %3.0f. Pista en uso %s FGCOM %s %s: esta a %3.0f millas , mantenga rumbo hasta interceptar el localizador, autorizado aproximacion ILS pista: %s: se encuentra a %3.0f millas informe con pista a la vista -%s: esta a %3.0f millas , viento %03.0f Grados a %2.0f Nudos, autorizado a aterrizar pista: +%s: esta a %3.0f millas , viento %s, autorizado a aterrizar pista: %s: Bienvenido a %s -- abandone la pista hacia la: %s: ruede a punto Terminal: -Por favor usa solo FGCOM %s para hablar con el ATC, los hombres del aire no chatean! +Por favor usa solo %s para hablar con el ATC, los hombres del aire no chatean! %s: Sin darte cuenta estas perturbando nuestro entrenamiento ATC (Air Traffic Control) --> por favor usa otro Aeropuerto para vuelos no controlados %s: Por favor no inicies tu session en la pista activa. Por ejemplo para EDDF fija tu posicion de salida en Linea de comandos CMD o en el asistente: --parkpos=B45 o A10..25, B42..48, etc. diff --git a/de.knewcleus.openradar/data/atcMessages/fr.txt b/de.knewcleus.openradar/data/atcMessages/fr.txt index 1b83b1c..9c17aff 100644 --- a/de.knewcleus.openradar/data/atcMessages/fr.txt +++ b/de.knewcleus.openradar/data/atcMessages/fr.txt @@ -1,13 +1,13 @@ A tous les pilotes: %s -%s: Bienvenue dans la region de %s - etes-vous en approche de %s ? FGCOM %s -%s: Bienvenue a %s - Merci d'informez le controleur de vos intentions, FGCOM %s -%s: Contact radar %3.0f nm, QNH %s, piste en service %s, FGCOM %s +%s: Bienvenue dans la region de %s - etes-vous en approche de %s? %s +%s: Bienvenue a %s - Merci d'informez le controleur de vos intentions, %s +%s: Contact radar %3.0f nm, QNH %s, piste en service %s, %s %s: Vous quittez mon espace aerien - vous pouvez quitter la frequence - bon vol -ATIS de %s sur %2.0f ft: QNH %s, vent %s, piste(s) en service %s, FGCOM %s +ATIS de %s sur %2.0f ft: QNH %s, vent %s, piste(s) en service %s, %s Contact-ATC-Aide: pour ARRIVEE touche: "-">>"3">>"3">>"3" pour DEPART touche: "-">>"3">>"6" %s: Mise en route moteur approuvee @@ -17,7 +17,7 @@ Contact-ATC-Aide: pour ARRIVEE touche: "-">>"3">>"3">>"3" pour DEPART touche: " %s: Roulez au point d'arret piste et rappelez quand pret au depart %s: Maintenez le cap de la piste, montez a: -%s: Vent %03.0f a %2.0f kt, autorise a decoller piste: +%s: Vent %s, autorise a decoller piste: %s: Virez a gauche cap: %s: Virez a droite cap: @@ -27,11 +27,11 @@ Contact-ATC-Aide: pour ARRIVEE touche: "-">>"3">>"3">>"3" pour DEPART touche: " %s: A %3.0f nm, maintenez le cap jusqu'a interception du localizer, autorise ILS piste: %s: %3.0f nm, rappelez quand la piste est en vue -%s: A %3.0f nm, vent %03.0f a %2.0f kts, autorise a atterrir piste: +%s: A %3.0f nm, vent %s, autorise a atterrir piste: %s: Bienvenue a %s -- degagez la piste par la: %s: Roulez vers Porte/Terminal: -SVP utilisez FGCOM %s seulement pour communiquer avec l'ATC, et PAS pour discuter entre pilotes! +SVP utilisez %s seulement pour communiquer avec l'ATC, et PAS pour discuter entre pilotes! %s: Vous perturbez l'entrainement ATC (Air Traffic Control) --> SVP pour les vols non controles, utilisez un autre aeroport %s: SVP ne demarrez pas votre session sur une piste active - sinon, degagez rapidement - et ne decollez pas directement! Ajustez votre position de depart ex. pour EDDF -ligne de commande ou fenetre: --parkpos= B42..48, or A10..25, etc. \ No newline at end of file diff --git a/de.knewcleus.openradar/data/atcMessages/it.txt b/de.knewcleus.openradar/data/atcMessages/it.txt index 454b71a..da310f5 100644 --- a/de.knewcleus.openradar/data/atcMessages/it.txt +++ b/de.knewcleus.openradar/data/atcMessages/it.txt @@ -1,13 +1,13 @@ A tutti i piloti: %s -%s: Benvenuto nell'area di %s -- è diretto a %s? FGCOM %s -%s: Benvenuto a %s - comunichi all'ATC le Sue intenzioni, FGCOM %s -%s: Contatto radar range %3.0f miglia, QNH %s, pista in uso %s, FGCOM %s +%s: Benvenuto nell'area di %s -- è diretto a %s? %s +%s: Benvenuto a %s - comunichi all'ATC le Sue intenzioni, %s +%s: Contatto radar range %3.0f miglia, QNH %s, pista in uso %s, %s %s: Riprenda la SUA navigazione - sorveglianza radar attiva %s: Sta lasciando il mio spazio aereo - autorizzato a cambiare frequenza - servizio radar terminato -ATIS per %s a %2.0f piedi: QNH %s vento %s pista/e in uso %s FGCOM %s +ATIS per %s a %2.0f piedi: QNH %s vento %s pista/e in uso %s %s Aiuto contatto ATC: tasti per l'ARRIVO: "-">>"3">>"3">>"3" tasti per la PARTENZA: "-">>"3">>"6" %s: Autorizzato alla messa in moto, indichi la destinazione pianificata @@ -17,7 +17,7 @@ Aiuto contatto ATC: tasti per l'ARRIVO: "-">>"3">>"3">>"3" tasti per la PARTENZ %s: Si allinei sulla pista, riporti pronto a decollare %s: Mantenga la prua della pista, salga a: -%s: Vento da %03.0f gradi %2.0f nodi, autorizzato al decollo pista: +%s: Vento %s, autorizzato al decollo pista: %s: Viri a sinistra prua: %s: Viri a destra prua: @@ -27,11 +27,11 @@ Aiuto contatto ATC: tasti per l'ARRIVO: "-">>"3">>"3">>"3" tasti per la PARTENZ %s: A %3.0f miglia, mantenga la prua fino a intercettare il localizzatore, autorizzato all'avvicinamento ILS pista: %s: A %3.0f miglia, riporti pista visibile -%s: A %3.0f miglia, vento da %03.0f gradi %1.0f nodi, autorizzato all'atterraggio pista: +%s: A %3.0f miglia, vento %s, autorizzato all'atterraggio pista: %s: Benvenuto a %s -- liberi la pista sulla: %s: Autorizzato ad attraversare la pista: -Utilizzi FGCOM %s solo per parlare con l'ATC, NON per parlare tra piloti! +Utilizzi %s solo per parlare con l'ATC, NON per parlare tra piloti! %s: Sta disturbando il nostro training ATC --> utilizzi un altro aeroporto per volare in condizioni non controllate %s: Non avvii la sessione su una pista attiva - LIBERI LA PISTA velocemente %s: Per definire le posizioni di avvio veda: http://www.emmerich-j.de/HB/EN/Intro (o /DE/Intro) \ No newline at end of file diff --git a/de.knewcleus.openradar/data/atcMessages/nl.txt b/de.knewcleus.openradar/data/atcMessages/nl.txt index 053cc70..3172a0b 100644 --- a/de.knewcleus.openradar/data/atcMessages/nl.txt +++ b/de.knewcleus.openradar/data/atcMessages/nl.txt @@ -1,13 +1,13 @@ Aan alle piloten: %s -%s: Welkom in %s - ben je inkomend op %s ? FGCOM %s -%s: Welkom in %s - Geef uw vliegplan aan bij de luchtverkeerdleiding, FGCOM %s -%s: Radar contact op %3.0f nm, QNH %s, verwacht landingsbaan %s, FGCOM %s +%s: Welkom in %s - ben je inkomend op %s? %s +%s: Welkom in %s - Geef uw vliegplan aan bij de luchtverkeerdleiding, %s +%s: Radar contact op %3.0f nm, QNH %s, verwacht landingsbaan %s, %s %s: U verlaat mijn luchtruim - U mag van frequentie wisselen - Goede reis! -ATIS op %s, hoogte %2.0f ft, QNH %s, wind %s, actieve baan/banen %s, FGCOM %s +ATIS op %s, hoogte %2.0f ft, QNH %s, wind %s, actieve baan/banen %s, %s %s: Motoren opstarten toegestaan @@ -17,7 +17,7 @@ ATIS op %s, hoogte %2.0f ft, QNH %s, wind %s, actieve baan/banen %s, FGCOM %s %s: Taxi in positie en stop, meld gereed voor vertrek %s: Houd startbaan richting, en klim naar: -%s: wind uit %03.0f %2.0f kt, Klaar voor vertrek op baan: +%s: wind %s, Klaar voor vertrek op baan: %s: Draai naar links, richting: %s: Draai naar rechts, richting: @@ -27,11 +27,11 @@ ATIS op %s, hoogte %2.0f ft, QNH %s, wind %s, actieve baan/banen %s, FGCOM %s %s: %3.0f nm van luchthaven, behoud richting totdat ILS indicatie zichtbaar is, u mag ILS volgen naar landingsbaan: %s: %3.0f nm van luchthaven, rapporteer landingsbaan in zicht -%s: %3.0f nm van luchthaven, wind uit %03.0f %2.0f kt, u mag landen op: +%s: %3.0f nm van luchthaven, wind %s, u mag landen op: %s: Welkome in %s -- verlaat landingsbaan: %s: taxi naar de Gate/Terminal: -Gebruik FGCOM %s alleen indien u met de luchtverkeersleiding spreekt. Gebruik FGCOM NIET tussen piloten!!! +Gebruik %s alleen indien u met de luchtverkeersleiding spreekt. Gebruik NIET tussen piloten!!! %s: U verstoord onze ATC (Air Traffic Control, Luchtverkeersleiding) training --> Gebruik alstublieft een andere luchthaven voor ongecontroleerd vliegen! %s: Start uw sessie NIET op een actieve baan - maak de baan direct vrij! - Niet opstijgen!!!! Zet de startpositie op bijvoorbeeld EHBK in de cmd-line of wizard: --parkpos= B42..48, or A10..25, enz om een start positie op te geven. diff --git a/de.knewcleus.openradar/data/atcMessages/pl.txt b/de.knewcleus.openradar/data/atcMessages/pl.txt index b79b066..1a1c218 100644 --- a/de.knewcleus.openradar/data/atcMessages/pl.txt +++ b/de.knewcleus.openradar/data/atcMessages/pl.txt @@ -1,13 +1,13 @@ Do wszystkich pilotow: %s -%s: Tu radar %s - Czy ladujesz w %s ? FGCOM %s -%s: Tu radar %s - prosze o informacje o twoich zamiarach. FGCOM %s -%s: Kontakt radarowy - %3.0f mil, QNH %s, aktywny pas %s, FGCOM %s +%s: Tu radar %s - Czy ladujesz w %s? %s +%s: Tu radar %s - prosze o informacje o twoich zamiarach. %s +%s: Kontakt radarowy - %3.0f mil, QNH %s, aktywny pas %s, %s %s: Opuszczasz moja strefe kontroli - milego lotu. -Informacja ATIS dla %s na %2.0f ft: QNH %s wiatru %s, aktywny pas: %s Czestotliwosc FGCOM %s +Informacja ATIS dla %s na %2.0f ft: QNH %s wiatru %s, aktywny pas: %s Czestotliwosc %s %s: Zgoda na uruchomienie silnikow @@ -17,7 +17,7 @@ Informacja ATIS dla %s na %2.0f ft: QNH %s wiatru %s, aktywny pas: %s Czestotl %s: Zajmij pas, zglos gotowosc do startu. %s: Utrzymuj kurs, wejdz na wysokosc -%s: Kierunek wiatru %03.0f z sila %2.0f, Zgoda na start z pasa: +%s: Kierunek %s, Zgoda na start z pasa: %s: Zmien kurs w lewo na %s: Zmien kurs w prawo na @@ -27,11 +27,11 @@ Informacja ATIS dla %s na %2.0f ft: QNH %s wiatru %s, aktywny pas: %s Czestotl %s: Odleglosc %3.0f mil, utrzymuj kurs do przechwycenia sciezki podejscia, zgoda na podejscie ILS na pas %s: Odleglosc %3.0f mil, zglos widocznosc pasa. -%s: Odleglosc %3.0f mil, kierunek wiatru %03.0f z sila %2.0f, zgoda na ladowanie na pasie: +%s: Odleglosc %3.0f mil, kierunek %s, zgoda na ladowanie na pasie: %s: Mile widziany w %s -- Zwolnij pas skrecajac w %s: Koluj do stanowiska -Prosze uzywac FGCOM %s tylko do komunikacji z wieza, nie do rozmow pomiedzy pilotami! +Prosze uzywac %s tylko do komunikacji z wieza, nie do rozmow pomiedzy pilotami! %s: Przeszkadzasz w naszym treningu Kontroli Ruchu Powietrznego --> prosze uzyj innego lotniska do swobodnego lotu %s: Prosze nie rozpoczynaj swojej sesji na aktywnym pasie lub zwolnij go jak najszybciej - nie startuj bezposrednio! Ustaw pozycje staryowa np. dla EDDF w cmd-line lub oknie programu: --parkpos=B45 or A10..25, B42..48, etc. diff --git a/de.knewcleus.openradar/data/atcMessages/pt.txt b/de.knewcleus.openradar/data/atcMessages/pt.txt index ff5d040..f6d7f65 100644 --- a/de.knewcleus.openradar/data/atcMessages/pt.txt +++ b/de.knewcleus.openradar/data/atcMessages/pt.txt @@ -1,9 +1,9 @@ A todos os pilotos: %s -%s: Bem-vindo a %s, Estamos a chegar a %s ? FGCOM %s -%s: Bem-vindo a %s, Por favor informe a ATC das suas intencoes, FGCOM %s -%s: Contacto do radar a %3.0f mi de distancia, QNH %s, Esta a abandonar a nossa area, FGCOM %s +%s: Bem-vindo a %s, Estamos a chegar a %s? %s +%s: Bem-vindo a %s, Por favor informe a ATC das suas intencoes, %s +%s: Contacto do radar a %3.0f mi de distancia, QNH %s, Esta a abandonar a nossa area, %s %s: Pode trocar a frequencia - Boa viagem! @@ -17,7 +17,7 @@ A todos os pilotos: %s: Va ate a posicao de arranque e aguarde. Avise quando estiver pronto para partir. %s: Mantenha o rumo da pista, para subir: -%s: Vento de %03.0f com %2.0f, Livre para a pista de descolagem: +%s: Vento %s, Livre para a pista de descolagem: %s: Vire a esquerda, novo curso: %s: Vire a direita, novo curso: @@ -27,11 +27,11 @@ A todos os pilotos: %s: %3.0f mi distancia, mantenha o seu curso ate interceptar o localizador, ordem para abordagem a pista: -%s: %3.0f mi Distancia, Vento %03.0f com %2.0f, Ordem para aterrar na pista: +%s: %3.0f mi Distancia, Vento %s, Ordem para aterrar na pista: %s: Boas-vindas in %s -- Abandone a pista para o: %s: Va ate a porta e\ou terminal: -Por favor use FGCOM %s apenas para falar com o ATC - NAO entre pilotos! +Por favor use %s apenas para falar com o ATC - NAO entre pilotos! %s: Voce esta a interferir com o nosso ATC (Air Traffic Control) Simulacao --> Por favor utilize um aeroporto alternativo para o voo descontrolado! %s: Por favor, nao iniciar o seus voos em pistas activas. Define por exemplo para EDDF na linha de comandos ou assistente a opcao: --parkpos=B45 or A10..25, B42..48, etc. diff --git a/de.knewcleus.openradar/data/atcMessages/ru.txt b/de.knewcleus.openradar/data/atcMessages/ru.txt index 5085f6a..c561ea4 100644 --- a/de.knewcleus.openradar/data/atcMessages/ru.txt +++ b/de.knewcleus.openradar/data/atcMessages/ru.txt @@ -1,13 +1,13 @@ %s -%s: Dobro pozjalovat' v %s - Vi napravlyaetes' v %s ? FGCOM %s -%s: Dobro pozjalovat' v %s - pozhaluista, soobs4ite dispet4eru o vashih namereniyah, FGCOM %s -%s: Dalnost' obnaruzheniya radara %3.0f morskih mil', davlenie na urovne morya %s, ozhidaite polosu %s, FGCOM %s +%s: Dobro pozjalovat' v %s - Vi napravlyaetes' v %s? %s +%s: Dobro pozjalovat' v %s - pozhaluista, soobs4ite dispet4eru o vashih namereniyah, %s +%s: Dalnost' obnaruzheniya radara %3.0f morskih mil', davlenie na urovne morya %s, ozhidaite polosu %s, %s %s: Vi pokidaete moe vozdushnoe prostranstvo - razreshau smenit' 4astotu - priyatnogo poleta %s: Vi ostavlyaete moe vozdushnoe prostranstvo. Razreshau izmenit' 4astotu radara. Obsluzhivanie ATC zakon4eno. S4astlivogo poleta -ATIS dlya %s na visote %2.0f futov: davlenie %s, veter %s, aktivnaya polosa %s, FGCOM %s +ATIS dlya %s na visote %2.0f futov: davlenie %s, veter %s, aktivnaya polosa %s, %s ATC-Contact-Help: for ARRIVAL key: "-">>"3">>"3">>"3" for DEPARTURE key: "-">>"3">>"6" %s: Razreshau start dvigatelei @@ -17,7 +17,7 @@ ATC-Contact-Help: for ARRIVAL key: "-">>"3">>"3">>"3" for DEPARTURE key: "-">>" %s: Zanimaete poziciu, dolozhite o gotovnosti k vzletu %s: sohranyaite napravlenie polosi, nabiraite visotu: -%s: veter %03.0f so skorost'u %2.0f uzlov, razreshau vzlet s polosi: +%s: veter %s, razreshau vzlet s polosi: %s: povernite nalevo, napravlenie: %s: povernite napravo, napravlenie: @@ -27,11 +27,11 @@ ATC-Contact-Help: for ARRIVAL key: "-">>"3">>"3">>"3" for DEPARTURE key: "-">>" %s: %3.0f mil' do polosi, sohranyite napravlenie do zahvata glissadi, razreshau zahod na posadku po KGS: %s: %3.0f mil' do polosi, dolozhite o vizualnom kontakte -%s: %3.0f mil' do polosi, veter %03.0f so skorost'u %2.0f uzlov, razreshau posadku na polosu: +%s: %3.0f mil' do polosi, veter %s, razreshau posadku na polosu: %s: viezd %s polosi: %s: Dobro pozhalovat' v %s - svernite s vzletno-posado4noi polosi: -pozhaluista ispolzuite FGCOM %s tol'ko dly razgovorov s dispet4erom, NE dly razgovorov mezhdu pilotami! +pozhaluista ispolzuite %s tol'ko dly razgovorov s dispet4erom, NE dly razgovorov mezhdu pilotami! %s: Vi narushaete trenirovku kontroly vozdushnogo dvizheniya --> pozhaluista ispolzuite drugoi aeroport dlya nekontroliruemih poletov %s: Pozhaluista, ne na4inaite sessiu na polose, ili, kak minimum, o4istite ee srazu , ne vzletaite srazu zhe. Ustanovite na4alnuu poziciu EDDF v komandnoi stroke ili Wizard'е: --parkpos= B42..48, or A10..25, etc. diff --git a/de.knewcleus.openradar/data/atcMessages/tags.txt b/de.knewcleus.openradar/data/atcMessages/tags.txt index c974287..996efd2 100644 --- a/de.knewcleus.openradar/data/atcMessages/tags.txt +++ b/de.knewcleus.openradar/data/atcMessages/tags.txt @@ -11,6 +11,7 @@ <distance> Aircraft's current distance to local airport <callsign> ATC callsign. <aircraft> Aircraft's callsign +<com_all> All active radio frequencies + additional radio text <com0> ATC primary frequency <com1> ATC secondary frequency <winds> Current winds diff --git a/de.knewcleus.openradar/src/de/knewcleus/openradar/gui/chat/auto/AtcAliasChatMessage.java b/de.knewcleus.openradar/src/de/knewcleus/openradar/gui/chat/auto/AtcAliasChatMessage.java index a78b0e6..7338060 100644 --- a/de.knewcleus.openradar/src/de/knewcleus/openradar/gui/chat/auto/AtcAliasChatMessage.java +++ b/de.knewcleus.openradar/src/de/knewcleus/openradar/gui/chat/auto/AtcAliasChatMessage.java @@ -171,9 +171,9 @@ public class AtcAliasChatMessage { if(text.contains("<com_all>")) { String v; if(master.getRadioManager().getModels().isEmpty()) { - v="n/a"; + v=""; } else { - v = master.getRadioManager().getActiveFrequenciesForDisplay(); + v = "; FGCOM "+master.getRadioManager().getActiveFrequenciesForDisplay(); } if(master.getAirportData().isAltRadioTextEnabled()) { v+="; "+master.getAirportData().getAltRadioText(); diff --git a/de.knewcleus.openradar/src/de/knewcleus/openradar/gui/chat/auto/AtcMenuChatMessage.java b/de.knewcleus.openradar/src/de/knewcleus/openradar/gui/chat/auto/AtcMenuChatMessage.java index 0ae3ad2..b8a10d6 100644 --- a/de.knewcleus.openradar/src/de/knewcleus/openradar/gui/chat/auto/AtcMenuChatMessage.java +++ b/de.knewcleus.openradar/src/de/knewcleus/openradar/gui/chat/auto/AtcMenuChatMessage.java @@ -116,12 +116,15 @@ public class AtcMenuChatMessage { } else if("/openradar/comm/frequencies".equals(varName)) { String v; if(master.getRadioManager().getModels().isEmpty()) { - v="n/a"; + v=""; } else { - v = master.getRadioManager().getActiveFrequenciesForDisplay(); + v = " FGCOM " + master.getRadioManager().getActiveFrequenciesForDisplay(); } if(master.getAirportData().isAltRadioTextEnabled()) { - v+="; "+master.getAirportData().getAltRadioText(); + if(v.length()>0) { + v+="; "; + } + v+=master.getAirportData().getAltRadioText(); } values.add(v); } else if("/openradar/transitionAlt".equals(varName)) { diff --git a/de.knewcleus.openradar/src/de/knewcleus/openradar/gui/status/StatusPanel.java b/de.knewcleus.openradar/src/de/knewcleus/openradar/gui/status/StatusPanel.java index 3d2a382..d3e807e 100644 --- a/de.knewcleus.openradar/src/de/knewcleus/openradar/gui/status/StatusPanel.java +++ b/de.knewcleus.openradar/src/de/knewcleus/openradar/gui/status/StatusPanel.java @@ -32,7 +32,9 @@ */ package de.knewcleus.openradar.gui.status; +import java.awt.Color; import java.awt.Dimension; +import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ComponentAdapter; @@ -82,6 +84,7 @@ public class StatusPanel extends javax.swing.JPanel implements IMetarListener { private javax.swing.JLabel lbVisibility; private javax.swing.JLabel lbPtS; private javax.swing.JLabel lbSelection; + private javax.swing.JLabel lbFlightConditions; private javax.swing.JLabel lbWind; private javax.swing.JLabel lbWeatherPhaenomena; private javax.swing.JSeparator sep1; @@ -132,6 +135,7 @@ public class StatusPanel extends javax.swing.JPanel implements IMetarListener { lbSelection = new javax.swing.JLabel(); lbPressure = new javax.swing.JLabel(); lbVisibility = new javax.swing.JLabel(); + lbFlightConditions = new javax.swing.JLabel(); lbWind = new javax.swing.JLabel(); lbWeatherPhaenomena = new javax.swing.JLabel(); lbPtS = new javax.swing.JLabel(); @@ -236,13 +240,26 @@ public class StatusPanel extends javax.swing.JPanel implements IMetarListener { gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 4); headerPanel.add(weatherPanel, gridBagConstraints); + lbFlightConditions.setForeground(Color.white); + lbFlightConditions.setText("VFR"); + lbFlightConditions.setOpaque(true); + lbFlightConditions.setFont(lbFlightConditions.getFont().deriveFont(Font.BOLD)); + lbFlightConditions.setForeground(Color.white); + lbFlightConditions.addMouseListener(metarMouseListener); + gridBagConstraints = new java.awt.GridBagConstraints(); + gridBagConstraints.gridx = 0; + gridBagConstraints.gridy = 0; + gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; + gridBagConstraints.insets = new java.awt.Insets(2, 6, 0, 4); + weatherPanel.add(lbFlightConditions, gridBagConstraints); + lbWind.setForeground(Palette.LIGHTBLUE); lbWind.setText("W:"); lbWind.setToolTipText("Wind: knods@Direction"); lbWind.setName(master.getAirportData().getAirportCode()); lbWind.addMouseListener(metarMouseListener); gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridx = 0; + gridBagConstraints.gridx = 1; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(2, 6, 0, 4); @@ -254,7 +271,7 @@ public class StatusPanel extends javax.swing.JPanel implements IMetarListener { lbPressure.addMouseListener(metarMouseListener); lbPressure.setToolTipText("Pressure"); gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridx = 1; + gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.insets = new java.awt.Insets(2, 10, 0, 4); @@ -265,7 +282,7 @@ public class StatusPanel extends javax.swing.JPanel implements IMetarListener { lbVisibility.setName(master.getAirportData().getAirportCode()); lbVisibility.addMouseListener(metarMouseListener); gridBagConstraints = new java.awt.GridBagConstraints(); - gridBagConstraints.gridx = 2; + gridBagConstraints.gridx = 3; gridBagConstraints.gridy = 0; gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST; gridBagConstraints.weightx = 1.0; @@ -280,7 +297,7 @@ public class StatusPanel extends javax.swing.JPanel implements IMetarListener { gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; - gridBagConstraints.gridwidth = 3; + gridBagConstraints.gridwidth = 4; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 6, 2, 4); weatherPanel.add(lbWeatherPhaenomena, gridBagConstraints); @@ -398,14 +415,16 @@ public class StatusPanel extends javax.swing.JPanel implements IMetarListener { currentMetar = metar; + lbFlightConditions.setText(" "+metar.getFlightConditions()+" "); + lbFlightConditions.setBackground(metar.getFlightConditionColor()); StringBuilder sb = new StringBuilder(); - sb.append("Wind: "); + //sb.append("Wind: "); sb.append(metar.getWindDisplayString()); lbWind.setText(sb.toString()); - lbPressure.setText(String.format("QNH: %2.2f / %4.0f", metar.getPressureInHG(),metar.getPressureHPa())); + lbPressure.setText(String.format("QNH: %2.2f/%4.0f", metar.getPressureInHG(),metar.getPressureHPa())); lbWind.setToolTipText(metar.getMetarBaseData()); lbPressure.setToolTipText(metar.getMetarBaseData()); - lbVisibility.setText(metar.isCavok()?"CAVOK":"Vis: "+metar.getVisibility()+""+metar.getVisibilityUnit()); + lbVisibility.setText(metar.isCavok()?"CAVOK":"V: "+metar.getVisibility()+""+metar.getVisibilityUnit()); lbVisibility.setToolTipText(metar.getMetarBaseData()); String phaenomena = metar.getWeatherPhaenomena().trim(); if(phaenomena.isEmpty()) { diff --git a/de.knewcleus.openradar/src/de/knewcleus/openradar/gui/status/radio/RadioPanel.java b/de.knewcleus.openradar/src/de/knewcleus/openradar/gui/status/radio/RadioPanel.java index 3195d28..4904d4e 100644 --- a/de.knewcleus.openradar/src/de/knewcleus/openradar/gui/status/radio/RadioPanel.java +++ b/de.knewcleus.openradar/src/de/knewcleus/openradar/gui/status/radio/RadioPanel.java @@ -252,6 +252,7 @@ public class RadioPanel extends JPanel { if(e.getKeyChar() == '\n') { master.getAirportData().setAltRadioText(tfAltRadioText.getText()); master.getAirportData().storeAirportData(master); + master.getMpChatManager().requestFocusForInput(); e.consume(); } if(tfAltRadioText.getText().length()>40) { diff --git a/de.knewcleus.openradar/src/de/knewcleus/openradar/weather/MetarData.java b/de.knewcleus.openradar/src/de/knewcleus/openradar/weather/MetarData.java index 9e1b63c..96ac4fd 100644 --- a/de.knewcleus.openradar/src/de/knewcleus/openradar/weather/MetarData.java +++ b/de.knewcleus.openradar/src/de/knewcleus/openradar/weather/MetarData.java @@ -3,35 +3,32 @@ * * This file is part of OpenRadar. * - * OpenRadar 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 + * OpenRadar 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. * - * OpenRadar is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * OpenRadar is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A 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 - * OpenRadar. If not, see <http://www.gnu.org/licenses/>. + * You should have received a copy of the GNU General Public License along with OpenRadar. If not, see + * <http://www.gnu.org/licenses/>. * * Diese Datei ist Teil von OpenRadar. * - * OpenRadar ist Freie Software: Sie können es unter den Bedingungen der GNU - * General Public License, wie von der Free Software Foundation, Version 3 der - * Lizenz oder (nach Ihrer Option) jeder späteren veröffentlichten Version, + * OpenRadar ist Freie Software: Sie können es unter den Bedingungen der GNU General Public License, wie von der Free + * Software Foundation, Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren veröffentlichten Version, * weiterverbreiten und/oder modifizieren. * - * OpenRadar wird in der Hoffnung, dass es nützlich sein wird, aber OHNE JEDE - * GEWÄHELEISTUNG, bereitgestellt; sogar ohne die implizite Gewährleistung der - * MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Siehe die GNU General - * Public License für weitere Details. + * OpenRadar wird in der Hoffnung, dass es nützlich sein wird, aber OHNE JEDE GEWÄHELEISTUNG, bereitgestellt; sogar ohne + * die implizite Gewährleistung der MARKTFÄHIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Siehe die GNU General Public + * License für weitere Details. * - * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem - * Programm erhalten haben. Wenn nicht, siehe <http://www.gnu.org/licenses/>. + * Sie sollten eine Kopie der GNU General Public License zusammen mit diesem Programm erhalten haben. Wenn nicht, siehe + * <http://www.gnu.org/licenses/>. */ package de.knewcleus.openradar.weather; +import java.awt.Color; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -42,6 +39,7 @@ import java.util.StringTokenizer; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; +import de.knewcleus.fgfs.Units; import de.knewcleus.openradar.gui.GuiMasterController; import de.knewcleus.openradar.gui.chat.auto.AtcMenuChatMessage; import de.knewcleus.openradar.gui.setup.AirportData; @@ -49,11 +47,8 @@ import de.knewcleus.openradar.gui.setup.AirportData; /** * This class parses and delivers the METAR information. * - * KSFO 140705Z 29010KT 10SM BKN002 14/13 A3020 RMK AO2 - * http://de.wikipedia.org/wiki/METAR - * Airport date time wind:DDDSS - * A => Airpressure in inHG - * Q => Airpressure in hectorpascal + * KSFO 140705Z 29010KT 10SM BKN002 14/13 A3020 RMK AO2 http://de.wikipedia.org/wiki/METAR Airport date time wind:DDDSS + * A => Airpressure in inHG Q => Airpressure in hectorpascal * * * 2012/10/14 18:13KSFO 141813Z 32008KT 10SM SCT008 16/12 A3022 RMK AO2 @@ -73,7 +68,7 @@ public class MetarData { // wind private boolean windDirectionVariates = false; - private String windUnit = "KT"; + private String windUnit = "KT"; private String windDirection = null; private int windDirectionI = -1; private String windDirectionMin = null; @@ -85,16 +80,27 @@ public class MetarData { // visibility && weather phenomena private float visibility; + private float visibilitySM; private String visibilityUnit; private int temperature; private int dewPoint; + private int ceiling; + private String flightConditions; + private Color flightConditionColor; // clouds - public enum CloudDensity { CAVOK,CLR,NSC,NCD,FEW,SCT,BKN,OVC} + public enum CloudDensity { + CAVOK, CLR, NSC, NCD, FEW, SCT, BKN, OVC + } + private CloudDensity cloudDensity; private int cloudBase; - public enum CloudType { TCU, CB } + + public enum CloudType { + TCU, CB + } + private CloudType cloudType = null; // air presssure @@ -104,10 +110,14 @@ public class MetarData { // color code (military) boolean cavok = false; - private String weatherPhaenomena; + private String weatherPhaenomena = ""; private String weatherPhaenomenaHuman; + // trend - private enum Trend { NOSIG, BECMG, TEMPO} + private enum Trend { + NOSIG, BECMG, TEMPO + } + private Trend trend = null; private ArrayList<String> atisVariables; @@ -115,251 +125,285 @@ public class MetarData { private long created = System.currentTimeMillis(); private final static Logger log = LogManager.getLogger(MetarData.class); - + public MetarData(AirportData data, String metar) { - exists=true; + exists = true; // parse metar data this.metarBaseData = metar.substring(metar.indexOf("\n")).trim(); - this.data=data; - StringTokenizer st = new StringTokenizer(metar," \n"); + this.data = data; + StringTokenizer st = new StringTokenizer(metarBaseData, " "); try { - observationTime = sdf.parse(st.nextToken()+" "+st.nextToken()); + observationTime = sdf.parse(metar.substring(0,metar.indexOf("\n"))); } catch (ParseException e) { - log.error("Error while parsing observation time!",e); + log.error("Error while parsing observation time!", e); } - airportCode=st.nextToken(); + airportCode = st.nextToken(); try { String t = st.nextToken(); // former last update code 141813Z t = st.nextToken(); - if(t.matches("AUTO")) { + if (t.matches("AUTO")) { // automatic station t = st.nextToken(); } - if(t.matches("^[A-Z]{3}")) { + if (t.matches("^[A-Z]{3}")) { // correction indicator t = st.nextToken(); } - if(t.matches("^[VRB0-9G]{5,8}KT.*$")) { - parseWind(t,"KT"); + if (t.matches("^[VRB0-9G]{5,8}KT.*$")) { + parseWind(t, "KT"); t = st.nextToken(); - } else if(t.matches("^[VRB0-9G]{5,8}KMH.*$")) { - parseWind(t,"KMH"); + } else if (t.matches("^[VRB0-9G]{5,8}KMH.*$")) { + parseWind(t, "KMH"); t = st.nextToken(); - } else if(t.matches("^[VRB0-9G]MPS.*$")) { - parseWind(t,"MPS"); + } else if (t.matches("^[VRB0-9G]MPS.*$")) { + parseWind(t, "MPS"); t = st.nextToken(); } else { t = st.nextToken(); // ignore it } - if(t.matches("^[\\d]{3}V[\\d]{3}$")) { + if (t.matches("^[\\d]{3}V[\\d]{3}$")) { parseVariations(t); t = st.nextToken(); } - if(t.matches("^[\\d]{4}$") || t.matches("^[\\d/]{1,4}SM$")) { - parseVisibility(t); - t = st.nextToken(); + while (true) { + if (t.matches("^[\\d]{4}$") || t.matches("^[\\d/]{1,4}SM$") || t.matches("^[\\d]{1,4}/[\\d]{1,4}SM$")) { + parseVisibility(t); + t = st.nextToken(); + } + if (t.matches("^[\\d]{4}.*$")) { + parseDirectionalVisibility(t); + } + if (t.matches("^CAVOK$")) + parseCavok(t); + else if (t.matches("^R.*/.*$")) + parseRunwayVisibility(t); + else if (t.matches("^A[\\d]{4}$")) + parsePressureInHG(t); + else if (t.matches("^Q[\\d]{4}$")) + parsePressureHPa(t); + else if (t.matches("[M]{0,1}^[\\d]{2}/[M]{0,1}[\\d]{2}$")) + parseTemperatures(t); // todo M1/M4 + else if (t.matches("^RMK$")) + break; // means "national information follow + else + parsePhenomena(t); + if (st.hasMoreElements()) { + t = st.nextToken(); + } else { + break; + } } + ceiling = getValueOf("BKN"); + int ceilingOVC = getValueOf("OVC"); + ceiling = ceiling < ceilingOVC ? ceiling : ceilingOVC; + + + double angle = (double) (getWindDirectionI() - 270) / 360d * 2 * Math.PI; + windFromNorth = Math.sin(angle) * (double) getWindSpeed(); + windFromWest = Math.cos(angle) * (double) getWindSpeed(); + // System.out.println("Wind N: "+windFromNorth+" W: "+windFromWest); - weatherPhaenomena = metar.substring(metar.indexOf(t)); weatherPhaenomena = weatherPhaenomena.replaceAll("A[\\d]{4}", ""); weatherPhaenomena = weatherPhaenomena.replaceAll("Q[\\d]{4}", ""); weatherPhaenomena = weatherPhaenomena.replaceAll("[\\d]{2}/[\\d]{2}", ""); weatherPhaenomena = weatherPhaenomena.replaceAll("CAVOK", ""); - if(weatherPhaenomena.contains("RMK")) { - weatherPhaenomena = weatherPhaenomena.substring(0,weatherPhaenomena.indexOf("RMK")).trim(); + if (weatherPhaenomena.contains("RMK")) { + weatherPhaenomena = weatherPhaenomena.substring(0, weatherPhaenomena.indexOf("RMK")).trim(); } weatherPhaenomena = weatherPhaenomena.replaceAll(" ", " "); weatherPhaenomena = weatherPhaenomena.replaceAll("\n", ""); - if(t.matches("^[\\d]{4}.*$")) { - parseDirectionalVisibility(t); - } - while(true) { - if(t.matches("^CAVOK$")) parseCavok(t); - else if(t.matches("^R.*/.*$")) parseRunwayVisibility(t); - else if(t.matches("^A[\\d]{4}$")) parsePressureInHG(t); - else if(t.matches("^Q[\\d]{4}$")) parsePressureHPa(t); - else if(t.matches("[M]{0,1}^[\\d]{2}/[M]{0,1}[\\d]{2}$")) parseTemperatures(t); // todo M1/M4 - else if(t.matches("^RMK$")) break; // means "national information follow - else parsePhenomena(t); - if(st.hasMoreElements()) { - t = st.nextToken(); - } else { - break; - } + weatherPhaenomenaHuman = weatherPhaenomena.replaceAll("SKC", "sky clear "); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("FEW", "few clouds "); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("SCT", "scattered "); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("BKN", "broken "); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("OVC", "overcast "); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("TCU", "towering cumulus "); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("CB", "Cumulonimbus "); + + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("CLR", "clear "); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("NSC", "Nil significant clouds "); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("CAVOK", "clouds+vis OK"); + + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("NOSIG", "(stable)"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("BECMG", "(will change)"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("TEMPO", "(is changing)"); + + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("-", "light "); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("\\+", "heavy "); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("RA", "rain"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("DZ", "drizzle"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("SN", "snow"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("PE", "ice pellets"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("GR", "hail"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("GS", "snow pellets"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("IC", "ice crystals"); + + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("MI", "shallow "); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("BC", "patches "); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("PR", "partial "); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("DR", "drifting "); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("BL", "blowing "); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("SH", "showers "); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("TS", "thunder storm "); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("FR", "freezing "); + + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("BR", "mist,"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("FG", "fog,"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("SA", "sand,"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("VA", "vulcano ash,"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("FU", "smoke,"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("HZ", "haze,"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("SU", "dust,"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("SS", "sand storm,"); + + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("REDZ", "drizzle"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("RERA", "rain,"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("RESN", "snow"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("REASN", "snow"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("REFZRA", "frozen rain,"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("RESH", "showers "); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("REGR", "hail"); + weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("RETS", "thunderstorm"); + + if (ceiling < 500 || visibilitySM < 1) { + flightConditions = "LIFR"; + flightConditionColor = new Color(218,0,213); + } else if (ceiling < 1000 || visibilitySM < 3) { + flightConditions = "IFR"; + flightConditionColor = new Color(200,0,0);; + } else if (ceiling < 3000 || visibilitySM < 5) { + flightConditions = "MVFR"; + flightConditionColor = new Color(0,0,200); + } else { + flightConditions = "VFR"; + flightConditionColor = new Color(0,150,0); } - double angle = (double)(getWindDirectionI()-270)/360d*2*Math.PI; - windFromNorth = Math.sin(angle)*(double)getWindSpeed(); - windFromWest = Math.cos(angle)*(double)getWindSpeed(); - //System.out.println("Wind N: "+windFromNorth+" W: "+windFromWest); - - weatherPhaenomenaHuman = weatherPhaenomena.replaceAll("SKC","sky clear "); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("FEW","few clouds "); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("SCT","scattered "); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("BKN","broken "); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("OVC","overcast "); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("TCU","towering cumulus "); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("CB","Cumulonimbus "); - - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("CLR","clear "); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("NSC","Nil significant clouds "); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("CAVOK","clouds+vis OK"); - - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("NOSIG","(stable)"); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("BECMG","(will change)"); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("TEMPO","(is changing)"); - - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("-","light "); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("\\+","heavy "); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("RA","rain"); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("DZ","drizzle"); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("SN","snow"); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("PE","ice pellets"); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("GR","hail"); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("GS","snow pellets"); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("IC","ice crystals"); - - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("MI","shallow "); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("BC","patches "); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("PR","partial "); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("DR","drifting "); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("BL","blowing "); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("SH","showers "); - weatherPhaenomenaHuman = weatherPhaenomenaHuman.replaceAll("TS","thunder storm "); - ... [truncated message content] |