Skip to content

Instantly share code, notes, and snippets.

@casselc
Last active August 4, 2020 18:38
Show Gist options
  • Save casselc/09b1ed46a86b500cabd2e14ada1a3719 to your computer and use it in GitHub Desktop.
Save casselc/09b1ed46a86b500cabd2e14ada1a3719 to your computer and use it in GitHub Desktop.
{:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Atfmdataservice/tfmDataService,
:attrs
#:xmlns.http%3A%2F%2Fwww.w3.org%2F2001%2FXMLSchema-instance{:schemaLocation
"urn:us:gov:dot:faa:atm:tfm:tfmdataservice TFMData_Service.xsd"},
:content
({:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Atfmdataservice/fltdOutput,
:attrs {},
:content
({:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Aflightdata/fltdMessage,
:attrs
{:acid "NKS424",
:airline "NKS",
:sensitivity "A",
:depArpt "KLAX",
:msgType "trackInformation",
:sourceTimeStamp "2020-07-07T23:13:52Z",
:sourceFacility "KMSP",
:cdmPart "false",
:fdTrigger "HCS_TRACK_MSG",
:arrArpt "KMSP",
:flightRef "135346551"},
:content
({:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Aflightdata/trackInformation,
:attrs {},
:content
({:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Aflightdatacommonmessages/qualifiedAircraftId,
:attrs {},
:content
({:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Atfmdatacoreelements/aircraftId,
:attrs {},
:content ("NKS424")}
{:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Atfmdatacoreelements/computerId,
:attrs {},
:content
({:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Atfmdatacoreelements/facilityIdentifier,
:attrs {},
:content ("KMSP")}
{:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Atfmdatacoreelements/idNumber,
:attrs {},
:content ("284")})}
{:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Atfmdatacoreelements/gufi,
:attrs {},
:content ("KL66181300")}
{:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Atfmdatacoreelements/igtd,
:attrs {},
:content ("2020-07-07T20:15:00Z")}
{:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Atfmdatacoreelements/departurePoint,
:attrs {},
:content
({:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Atfmdatacoreelements/airport,
:attrs {},
:content ("KLAX")})}
{:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Atfmdatacoreelements/arrivalPoint,
:attrs {},
:content
({:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Atfmdatacoreelements/airport,
:attrs {},
:content ("KMSP")})})}
{:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Aflightdatacommonmessages/speed,
:attrs {},
:content ("246")}
{:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Aflightdatacommonmessages/reportedAltitude,
:attrs {},
:content
({:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Atfmdatacoreelements/assignedAltitude,
:attrs {},
:content
({:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Atfmdatacoreelements/simpleAltitude,
:attrs {},
:content ("038")})})}
{:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Aflightdatacommonmessages/position,
:attrs {},
:content
({:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Atfmdatacoreelements/latitude,
:attrs {},
:content
({:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Atfmdatacoreelements/latitudeDMS,
:attrs {:degrees "44", :direction "NORTH", :minutes "57"},
:content ()})}
{:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Atfmdatacoreelements/longitude,
:attrs {},
:content
({:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Atfmdatacoreelements/longitudeDMS,
:attrs {:degrees "093", :direction "WEST", :minutes "28"},
:content ()})})}
{:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Aflightdatacommonmessages/timeAtPosition,
:attrs {},
:content ("2020-07-07T23:13:52Z")}
{:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Aflightdatacommonmessages/ncsmTrackData,
:attrs {},
:content
({:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Aflightdatacommonmessages/eta,
:attrs
{:etaType "ESTIMATED", :timeValue "2020-07-07T23:21:21Z"},
:content ()}
{:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Aflightdatacommonmessages/rvsmData,
:attrs
{:currentCompliance "true",
:equipped "true",
:futureCompliance "true"},
:content ()}
{:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Aflightdatacommonmessages/arrivalFixAndTime,
:attrs {:arrTime "2020-07-07T23:06:57Z", :fixName "BAINY"},
:content ()}
{:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Aflightdatacommonmessages/departureFixAndTime,
:attrs {:arrTime "2020-07-07T20:36:00Z", :fixName "DAG"},
:content ()}
{:tag
:xmlns.urn%3Aus%3Agov%3Adot%3Afaa%3Aatm%3Atfm%3Aflightdatacommonmessages/nextEvent,
:attrs
{:latitudeDecimal "44.85405",
:longitudeDecimal "-93.4310028"},
:content ()})})})})})}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<ds:tfmDataService xmlns:ds="urn:us:gov:dot:faa:atm:tfm:tfmdataservice"
xmlns="urn:us:gov:dot:faa:atm:tfm:tfmdataservice"
xmlns:fdm="urn:us:gov:dot:faa:atm:tfm:flightdata"
xmlns:nxce="urn:us:gov:dot:faa:atm:tfm:tfmdatacoreelements"
xmlns:nxcm="urn:us:gov:dot:faa:atm:tfm:flightdatacommonmessages"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:us:gov:dot:faa:atm:tfm:tfmdataservice TFMData_Service.xsd">
<fltdOutput>
<fdm:fltdMessage acid="NKS424" airline="NKS" arrArpt="KMSP" cdmPart="false" depArpt="KLAX" fdTrigger="HCS_TRACK_MSG" flightRef="135346551" msgType="trackInformation" sensitivity="A" sourceFacility="KMSP" sourceTimeStamp="2020-07-07T23:13:52Z">
<fdm:trackInformation>
<nxcm:qualifiedAircraftId>
<nxce:aircraftId>NKS424</nxce:aircraftId>
<nxce:computerId>
<nxce:facilityIdentifier>KMSP</nxce:facilityIdentifier>
<nxce:idNumber>284</nxce:idNumber>
</nxce:computerId>
<nxce:gufi>KL66181300</nxce:gufi>
<nxce:igtd>2020-07-07T20:15:00Z</nxce:igtd>
<nxce:departurePoint>
<nxce:airport>KLAX</nxce:airport>
</nxce:departurePoint>
<nxce:arrivalPoint>
<nxce:airport>KMSP</nxce:airport>
</nxce:arrivalPoint>
</nxcm:qualifiedAircraftId>
<nxcm:speed>246</nxcm:speed>
<nxcm:reportedAltitude>
<nxce:assignedAltitude>
<nxce:simpleAltitude>038</nxce:simpleAltitude>
</nxce:assignedAltitude>
</nxcm:reportedAltitude>
<nxcm:position>
<nxce:latitude>
<nxce:latitudeDMS degrees="44" direction="NORTH" minutes="57"/>
</nxce:latitude>
<nxce:longitude>
<nxce:longitudeDMS degrees="093" direction="WEST" minutes="28"/>
</nxce:longitude>
</nxcm:position>
<nxcm:timeAtPosition>2020-07-07T23:13:52Z</nxcm:timeAtPosition>
<nxcm:ncsmTrackData>
<nxcm:eta etaType="ESTIMATED" timeValue="2020-07-07T23:21:21Z"/>
<nxcm:rvsmData currentCompliance="true" equipped="true" futureCompliance="true"/>
<nxcm:arrivalFixAndTime arrTime="2020-07-07T23:06:57Z" fixName="BAINY"/>
<nxcm:departureFixAndTime arrTime="2020-07-07T20:36:00Z" fixName="DAG"/>
<nxcm:nextEvent latitudeDecimal="44.85405" longitudeDecimal="-93.4310028"/>
</nxcm:ncsmTrackData>
</fdm:trackInformation>
</fdm:fltdMessage>
</fltdOutput>
</ds:tfmDataService>
(ns chucklehead.parse
(:require
[clojure.data.xml :refer [alias-uri]]
[clojure.java.io :refer [input-stream]]
[java-time :as jt]
[meander.epsilon :as m]))
(alias-uri :tx "urn:us:gov:dot:faa:atm:tfm:tfmdataservice")
(alias-uri :fce "urn:us:gov:dot:faa:atm:tfm:ficommondatatypes")
(alias-uri :fcm "urn:us:gov:dot:faa:atm:tfm:ficommonmessages")
(alias-uri :fm2 "urn:us:gov:dot:faa:atm:tfm:ficommonmessages2")
(alias-uri :fim "urn:us:gov:dot:faa:atm:tfm:flowinformation")
(alias-uri :fdm "urn:us:gov:dot:faa:atm:tfm:flightdata")
(alias-uri :frt "urn:us:gov:dot:faa:atm:tfm:rapttimeline")
(alias-uri :trr "urn:us:gov:dot:faa:atm:tfm:tfmrequestreplytypes")
(alias-uri :ax "http://www.fixm.aero/tfm/3.1")
(alias-uri :nxce "urn:us:gov:dot:faa:atm:tfm:tfmdatacoreelements")
(alias-uri :nxcm "urn:us:gov:dot:faa:atm:tfm:flightdatacommonmessages")
(defn- dms->decimal
"Returns decimal representation of the DMS coordinate specified in the map."
[{:keys [degrees minutes seconds direction] :or {seconds "0"}}]
(let [d (Integer/parseInt degrees)
m (Integer/parseInt minutes)
s (Integer/parseInt seconds)
dir (case direction
("NORTH" "EAST") 1
("SOUTH" "WEST") -1)]
(float (* (+ d (/ m 60) (/ s 3600))
dir))))
(m/defsyntax speed
[speed]
`{:tag ::nxcm/speed
:content ((m/app Integer/parseInt ~speed))})
(m/defsyntax position
[latitude longitude]
`{:tag ::nxcm/position
:content (m/scan
{:tag ::nxce/latitude
:content ({:tag ::nxce/latitudeDMS
:attrs (m/app dms->decimal ~latitude)})}
{:tag ::nxce/longitude
:content ({:tag ::nxce/longitudeDMS
:attrs (m/app dms->decimal ~longitude)})})})
(m/defsyntax altitude
[altitude]
`{:tag ::nxcm/reportedAltitude
:content ({:tag ::nxce/assignedAltitude
:content ((m/or
{:tag ::nxce/simpleAltitude
:content (~altitude)}
{:tag ::nxce/blockedAltitude
:attrs {:min (~altitude)}}
(m/let [~altitude "UNKNOWN"])))})})
(m/defsyntax time-at-position
[track-ts]
`{:tag ::nxcm/timeAtPosition
:content ((m/app jt/offset-date-time ~track-ts))})
(m/defsyntax eta
[eta-ts eta-type]
`{:tag ::nxcm/eta
:attrs {:timeValue (m/app jt/offset-date-time ~eta-ts)
:etaType ~eta-type}})
(m/defsyntax track-with-next
[latitude longitude eta-ts eta-type]
`{:tag ::nxcm/ncsmTrackData
:content (m/separated
(eta ~eta-ts ~eta-type)
{:tag ::nxcm/nextEvent
:attrs {:latitudeDecimal (m/app Double/parseDouble ~latitude)
:longitudeDecimal (m/app Double/parseDouble ~longitude)}})})
(m/defsyntax route-with-next
[latitude longitude eta-ts eta-type]
`{:tag ::nxcm/ncsmRouteData
:content (m/separated
(eta ~eta-ts ~eta-type)
{:tag ::nxcm/nextPosition
:attrs {:latitudeDecimal (m/app Double/parseDouble ~latitude)
:longitudeDecimal (m/app Double/parseDouble ~longitude)}})})
(m/defsyntax track-info
[track-ts speed altitude latitude longitude next-latitude next-longitude eta-ts eta-type]
`({:tag ::fdm/trackInformation
:content (m/scan
(speed ~speed)
(altitude ~altitude)
(position ~latitude ~longitude)
(time-at-position ~track-ts)
(m/or (track-with-next ~next-latitude ~next-longitude ~eta-ts ~eta-type)
(route-with-next ~next-latitude ~next-longitude ~eta-ts ~eta-type)
(m/let [~next-latitude 0.0 ~next-longitude 0.0 ~eta-ts (jt/offset-date-time "1942-04-01T00:00:00.000000000-00:00") ~eta-type "PROPOSED"])))}))
(m/defsyntax track-info-msg
[flight-ref track-ts aircraft-id airline departure-airport arrival-airport speed altitude latitude longitude next-latitude next-longitude eta-ts eta-type]
`{:tag ::fdm/fltdMessage
:attrs {:msgType "trackInformation"
:flightRef (m/app Long/parseLong ~flight-ref)
:acid ~aircraft-id
:airline ~airline
:depArpt (m/or (m/some ~departure-airport)
(m/let [~departure-airport "null"]))
:arrArpt (m/or (m/some ~arrival-airport)
(m/let [~arrival-airport "null"]))}
:content (track-info ~track-ts ~speed ~altitude ~latitude ~longitude ~next-latitude ~next-longitude ~eta-ts ~eta-type)})
(defn trackInformation->flight-track
[track-xml]
(m/rewrite track-xml
(track-info-msg
?flight-ref
?track-ts
?aircraft-id
?airline
?departure-airport
?arrival-airport
?speed
?altitude
?latitude
?longitude
?next-lat
?next-long
?eta-ts
?eta-type)
{:flight/ref ?flight-ref
:flight/aircraft-id ?aircraft-id
:flight/airline ?airline
:flight/arrival-airport ?arrival-airport
:flight/departure-airport ?departure-airport
:track/at-ts ?track-ts
:track/latitude ?latitude
:track/longitude ?longitude
:track/next-latitude ?next-lat
:track/next-longitude ?next-long
:track/speed ?speed
:track/altitude ?altitude
:track/eta-ts ?eta-ts
:track/eta-type ?eta-type}))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment