├── .clang-format ├── .gitignore ├── Jenkinsfile ├── LICENSE ├── Makefile ├── README.md ├── common.h ├── convert.cc ├── convert.h ├── debian-bullseye ├── dump978-fa.preinst └── skyaware978.preinst ├── debian-buster ├── dump978-fa.preinst └── skyaware978.preinst ├── debian ├── changelog ├── compat ├── control ├── copyright ├── dump978-fa.default ├── dump978-fa.install ├── dump978-fa.postinst ├── dump978-fa.service ├── dump978-fa.udev ├── lighttpd │ ├── 88-skyaware978-statcache.conf │ └── 89-skyaware978.conf ├── rules ├── skyaware978.default ├── skyaware978.install ├── skyaware978.maintscript ├── skyaware978.postinst ├── skyaware978.postrm ├── skyaware978.service ├── source │ └── format ├── start-dump978-fa └── start-skyaware978 ├── demodulator.cc ├── demodulator.h ├── dump978_main.cc ├── exception.h ├── faup978_main.cc ├── faup978_reporter.cc ├── faup978_reporter.h ├── fec.cc ├── fec.h ├── fec_tests.cc ├── legacy ├── LICENSE ├── Makefile ├── README.md ├── dump978.c ├── extract_nexrad.c ├── fec.c ├── fec.h ├── fec_tests.c ├── plot_nexrad.py ├── reader.c ├── reader.h ├── uat.h ├── uat2esnt.c ├── uat2json.c ├── uat2text.c ├── uat_decode.c └── uat_decode.h ├── libs ├── fec │ ├── README │ ├── README.fec │ ├── char.h │ ├── decode_rs.h │ ├── decode_rs_char.c │ ├── encode_rs.c │ ├── encode_rs.h │ ├── encode_rs_char.c │ ├── init_rs.h │ ├── init_rs_char.c │ ├── lesser.txt │ ├── rs-common.h │ └── rs.h └── json.hpp ├── message_dispatch.cc ├── message_dispatch.h ├── message_source.h ├── prepare-build.sh ├── sample-data.txt.gz ├── sample_source.cc ├── sample_source.h ├── skyaware ├── config.js ├── db │ ├── 0.json │ ├── 1.json │ ├── 2.json │ ├── 3.json │ ├── 39.json │ ├── 3C.json │ ├── 4.json │ ├── 40.json │ ├── 400.json │ ├── 406.json │ ├── 42.json │ ├── 43.json │ ├── 44.json │ ├── 48.json │ ├── 484.json │ ├── 4B.json │ ├── 4C.json │ ├── 4D.json │ ├── 5.json │ ├── 6.json │ ├── 7.json │ ├── 7C.json │ ├── 7C0.json │ ├── 7C1.json │ ├── 7C2.json │ ├── 7C3.json │ ├── 7C4.json │ ├── 7C6.json │ ├── 7C7.json │ ├── 8.json │ ├── 9.json │ ├── A.json │ ├── A0.json │ ├── A00.json │ ├── A01.json │ ├── A02.json │ ├── A03.json │ ├── A04.json │ ├── A05.json │ ├── A06.json │ ├── A07.json │ ├── A08.json │ ├── A09.json │ ├── A0A.json │ ├── A0B.json │ ├── A0C.json │ ├── A0D.json │ ├── A0F.json │ ├── A1.json │ ├── A11.json │ ├── A12.json │ ├── A14.json │ ├── A15.json │ ├── A16.json │ ├── A17.json │ ├── A18.json │ ├── A19.json │ ├── A1A.json │ ├── A1B.json │ ├── A1C.json │ ├── A1D.json │ ├── A1E.json │ ├── A1F.json │ ├── A2.json │ ├── A20.json │ ├── A21.json │ ├── A22.json │ ├── A23.json │ ├── A24.json │ ├── A25.json │ ├── A26.json │ ├── A27.json │ ├── A29.json │ ├── A2A.json │ ├── A2C.json │ ├── A2D.json │ ├── A2E.json │ ├── A2F.json │ ├── A3.json │ ├── A31.json │ ├── A32.json │ ├── A33.json │ ├── A34.json │ ├── A35.json │ ├── A36.json │ ├── A37.json │ ├── A38.json │ ├── A39.json │ ├── A3A.json │ ├── A3B.json │ ├── A3C.json │ ├── A3E.json │ ├── A3F.json │ ├── A4.json │ ├── A40.json │ ├── A41.json │ ├── A42.json │ ├── A43.json │ ├── A44.json │ ├── A45.json │ ├── A47.json │ ├── A48.json │ ├── A4A.json │ ├── A4B.json │ ├── A4C.json │ ├── A4D.json │ ├── A4E.json │ ├── A4F.json │ ├── A5.json │ ├── A50.json │ ├── A51.json │ ├── A52.json │ ├── A53.json │ ├── A54.json │ ├── A55.json │ ├── A56.json │ ├── A57.json │ ├── A58.json │ ├── A59.json │ ├── A5A.json │ ├── A5B.json │ ├── A5D.json │ ├── A5E.json │ ├── A6.json │ ├── A60.json │ ├── A63.json │ ├── A64.json │ ├── A65.json │ ├── A66.json │ ├── A67.json │ ├── A68.json │ ├── A69.json │ ├── A6A.json │ ├── A6B.json │ ├── A6C.json │ ├── A6D.json │ ├── A6E.json │ ├── A6F.json │ ├── A7.json │ ├── A70.json │ ├── A71.json │ ├── A72.json │ ├── A73.json │ ├── A74.json │ ├── A76.json │ ├── A77.json │ ├── A78.json │ ├── A79.json │ ├── A7C.json │ ├── A7D.json │ ├── A7E.json │ ├── A7F.json │ ├── A8.json │ ├── A80.json │ ├── A81.json │ ├── A82.json │ ├── A83.json │ ├── A84.json │ ├── A85.json │ ├── A86.json │ ├── A87.json │ ├── A88.json │ ├── A89.json │ ├── A8A.json │ ├── A8B.json │ ├── A8C.json │ ├── A8D.json │ ├── A9.json │ ├── A90.json │ ├── A92.json │ ├── A94.json │ ├── A95.json │ ├── A96.json │ ├── A97.json │ ├── A98.json │ ├── A99.json │ ├── A9A.json │ ├── A9B.json │ ├── A9C.json │ ├── A9D.json │ ├── A9E.json │ ├── A9F.json │ ├── AA.json │ ├── AA0.json │ ├── AA1.json │ ├── AA2.json │ ├── AA3.json │ ├── AA4.json │ ├── AA5.json │ ├── AA6.json │ ├── AA7.json │ ├── AA8.json │ ├── AAA.json │ ├── AAB.json │ ├── AAD.json │ ├── AAE.json │ ├── AAF.json │ ├── AB.json │ ├── AB0.json │ ├── AB1.json │ ├── AB2.json │ ├── AB3.json │ ├── AB4.json │ ├── AB5.json │ ├── AB6.json │ ├── AB7.json │ ├── AB8.json │ ├── AB9.json │ ├── ABA.json │ ├── ABB.json │ ├── ABC.json │ ├── ABD.json │ ├── AC.json │ ├── AC1.json │ ├── AC2.json │ ├── AC3.json │ ├── AC4.json │ ├── AC6.json │ ├── AC7.json │ ├── AC8.json │ ├── AC9.json │ ├── ACA.json │ ├── ACB.json │ ├── ACC.json │ ├── ACD.json │ ├── ACE.json │ ├── ACF.json │ ├── AD.json │ ├── AD0.json │ ├── AD1.json │ ├── AD2.json │ ├── AD3.json │ ├── AD4.json │ ├── AD5.json │ ├── AD6.json │ ├── AD7.json │ ├── AD8.json │ ├── ADA.json │ ├── ADB.json │ ├── ADC.json │ ├── ADD.json │ ├── ADE.json │ ├── B.json │ ├── C.json │ ├── D.json │ ├── E.json │ ├── E4.json │ ├── F.json │ ├── README │ └── aircraft_types │ │ ├── README │ │ └── icao_aircraft_types.json ├── dbloader.js ├── flags-tiny │ ├── Afghanistan.png │ ├── Albania.png │ ├── Algeria.png │ ├── American_Samoa.png │ ├── Andorra.png │ ├── Angola.png │ ├── Anguilla.png │ ├── Antigua_and_Barbuda.png │ ├── Argentina.png │ ├── Armenia.png │ ├── Aruba.png │ ├── Australia.png │ ├── Austria.png │ ├── Azerbaijan.png │ ├── Bahamas.png │ ├── Bahrain.png │ ├── Bangladesh.png │ ├── Barbados.png │ ├── Belarus.png │ ├── Belgium.png │ ├── Belize.png │ ├── Benin.png │ ├── Bermuda.png │ ├── Bhutan.png │ ├── Bolivia.png │ ├── Bosnia.png │ ├── Botswana.png │ ├── Brazil.png │ ├── British_Virgin_Islands.png │ ├── Brunei.png │ ├── Bulgaria.png │ ├── Burkina_Faso.png │ ├── Burundi.png │ ├── Cambodia.png │ ├── Cameroon.png │ ├── Canada.png │ ├── Cape_Verde.png │ ├── Cayman_Islands.png │ ├── Central_African_Republic.png │ ├── Chad.png │ ├── Chile.png │ ├── China.png │ ├── Christmas_Island.png │ ├── Colombia.png │ ├── Comoros.png │ ├── Cook_Islands.png │ ├── Costa_Rica.png │ ├── Cote_d_Ivoire.png │ ├── Croatia.png │ ├── Cuba.png │ ├── Cyprus.png │ ├── Cyprus_Northern.png │ ├── Czech_Republic.png │ ├── Democratic_Republic_of_the_Congo.png │ ├── Denmark.png │ ├── Djibouti.png │ ├── Dominica.png │ ├── Dominican_Republic.png │ ├── Ecuador.png │ ├── Egypt.png │ ├── El_Salvador.png │ ├── Equatorial_Guinea.png │ ├── Eritrea.png │ ├── Estonia.png │ ├── Ethiopia.png │ ├── Falkland_Islands.png │ ├── Faroe_Islands.png │ ├── Fiji.png │ ├── Finland.png │ ├── France.png │ ├── French_Polynesia.png │ ├── Gabon.png │ ├── Gambia.png │ ├── Georgia.png │ ├── Germany.png │ ├── Ghana.png │ ├── Gibraltar.png │ ├── Greece.png │ ├── Greenland.png │ ├── Grenada.png │ ├── Guam.png │ ├── Guatemala.png │ ├── Guinea.png │ ├── Guinea_Bissau.png │ ├── Guyana.png │ ├── Haiti.png │ ├── Honduras.png │ ├── Hong_Kong.png │ ├── Hungary.png │ ├── Iceland.png │ ├── India.png │ ├── Indonesia.png │ ├── Iran.png │ ├── Iraq.png │ ├── Ireland.png │ ├── Israel.png │ ├── Italy.png │ ├── Jamaica.png │ ├── Japan.png │ ├── Jordan.png │ ├── Kazakhstan.png │ ├── Kenya.png │ ├── Kiribati.png │ ├── Kuwait.png │ ├── Kyrgyzstan.png │ ├── Laos.png │ ├── Latvia.png │ ├── Lebanon.png │ ├── Lesotho.png │ ├── Liberia.png │ ├── Libya.png │ ├── Liechtenstein.png │ ├── Lithuania.png │ ├── Luxembourg.png │ ├── Macao.png │ ├── Macedonia.png │ ├── Madagascar.png │ ├── Malawi.png │ ├── Malaysia.png │ ├── Maldives.png │ ├── Mali.png │ ├── Malta.png │ ├── Marshall_Islands.png │ ├── Martinique.png │ ├── Mauritania.png │ ├── Mauritius.png │ ├── Mexico.png │ ├── Micronesia.png │ ├── Moldova.png │ ├── Monaco.png │ ├── Mongolia.png │ ├── Montenegro.png │ ├── Montserrat.png │ ├── Morocco.png │ ├── Mozambique.png │ ├── Myanmar.png │ ├── Namibia.png │ ├── Nauru.png │ ├── Nepal.png │ ├── Netherlands.png │ ├── Netherlands_Antilles.png │ ├── New_Zealand.png │ ├── Nicaragua.png │ ├── Niger.png │ ├── Nigeria.png │ ├── Niue.png │ ├── Norfolk_Island.png │ ├── North_Korea.png │ ├── Norway.png │ ├── Oman.png │ ├── Pakistan.png │ ├── Palau.png │ ├── Panama.png │ ├── Papua_New_Guinea.png │ ├── Paraguay.png │ ├── Peru.png │ ├── Philippines.png │ ├── Pitcairn_Islands.png │ ├── Poland.png │ ├── Portugal.png │ ├── Puerto_Rico.png │ ├── Qatar.png │ ├── README.txt │ ├── Republic_of_the_Congo.png │ ├── Romania.png │ ├── Russian_Federation.png │ ├── Rwanda.png │ ├── Saint_Kitts_and_Nevis.png │ ├── Saint_Lucia.png │ ├── Saint_Pierre.png │ ├── Saint_Vicent_and_the_Grenadines.png │ ├── Samoa.png │ ├── San_Marino.png │ ├── Sao_Tome_and_Principe.png │ ├── Saudi_Arabia.png │ ├── Senegal.png │ ├── Serbia.png │ ├── Seychelles.png │ ├── Sierra_Leone.png │ ├── Singapore.png │ ├── Slovakia.png │ ├── Slovenia.png │ ├── Soloman_Islands.png │ ├── Somalia.png │ ├── South_Africa.png │ ├── South_Georgia.png │ ├── South_Korea.png │ ├── Soviet_Union.png │ ├── Spain.png │ ├── Sri_Lanka.png │ ├── Sudan.png │ ├── Suriname.png │ ├── Swaziland.png │ ├── Sweden.png │ ├── Switzerland.png │ ├── Syria.png │ ├── Taiwan.png │ ├── Tajikistan.png │ ├── Tanzania.png │ ├── Thailand.png │ ├── Tibet.png │ ├── Timor-Leste.png │ ├── Togo.png │ ├── Tonga.png │ ├── Trinidad_and_Tobago.png │ ├── Tunisia.png │ ├── Turkey.png │ ├── Turkmenistan.png │ ├── Turks_and_Caicos_Islands.png │ ├── Tuvalu.png │ ├── UAE.png │ ├── US_Virgin_Islands.png │ ├── Uganda.png │ ├── Ukraine.png │ ├── United_Kingdom.png │ ├── United_States_of_America.png │ ├── Uruguay.png │ ├── Uzbekistan.png │ ├── Vanuatu.png │ ├── Vatican_City.png │ ├── Venezuela.png │ ├── Vietnam.png │ ├── Wallis_and_Futuna.png │ ├── Yemen.png │ ├── Yugoslavia.png │ ├── Zambia.png │ ├── Zimbabwe.png │ └── blank.png ├── flags.js ├── formatter.js ├── images │ ├── alt_legend_feet.svg │ ├── alt_legend_meters.svg │ ├── box-checked.png │ ├── box-checked@2x.png │ ├── box-checked@3x.png │ ├── box-empty.png │ ├── box-empty@2x.png │ ├── box-empty@3x.png │ ├── close-settings.png │ ├── close-settings@2x.png │ ├── close-settings@3x.png │ ├── column-adjust.png │ ├── column-adjust@2x.png │ ├── column-adjust@3x.png │ ├── fa_logo_color.png │ ├── fa_logo_color@2x.png │ ├── fa_logo_color@3x.png │ ├── ff-sa-logo.png │ ├── ff-sa-logo@2x.png │ ├── ff-sa-logo@3x.png │ ├── ff-sv-logo.png │ ├── ff-sv-logo@2x.png │ ├── ff-sv-logo@3x.png │ ├── hide_sidebar_active_48x40.png │ ├── hide_sidebar_inactive_48x40.png │ ├── icon-information@2x.png │ ├── map-icon.png │ ├── map-icon@2x.png │ ├── map-icon@3x.png │ ├── pa-sa-logo.png │ ├── pa-sa-logo@2x.png │ ├── pa-sa-logo@3x.png │ ├── pa-sv-logo.png │ ├── pa-sv-logo@2x.png │ ├── pa-sv-logo@3x.png │ ├── settings-icon.png │ ├── settings-icon@2x.png │ ├── settings-icon@3x.png │ ├── show_sidebar_active_48x40.png │ ├── show_sidebar_inactive_48x40.png │ ├── table-icon.png │ ├── table-icon@2x.png │ ├── table-icon@3x.png │ ├── toggle-height@2x.png │ ├── toggle-width@2x.png │ ├── zoom-in.png │ ├── zoom-in@2x.png │ ├── zoom-in@3x.png │ ├── zoom-out.png │ ├── zoom-out@2x.png │ └── zoom-out@3x.png ├── index.html ├── jquery │ ├── README │ ├── jquery-3.0.0.min.js │ ├── jquery-ui-1.11.4-smoothness.css │ ├── jquery-ui-1.11.4.min.js │ └── plugins │ │ └── jquery.validate.min.js ├── layers.js ├── markers.js ├── noUiSlider │ ├── CHANGELOG.MD │ ├── CONTRIBUTING.md │ ├── LICENSE.md │ ├── README.md │ └── distribute │ │ ├── nouislider.css │ │ ├── nouislider.js │ │ ├── nouislider.min.css │ │ └── nouislider.min.js ├── ol │ ├── ol-layerswitcher.css │ ├── ol-layerswitcher.js │ ├── ol3-layerswitcher.css │ ├── ol3-layerswitcher.js │ ├── v4.4.2 │ │ ├── ol-4.4.2.css │ │ └── ol-4.4.2.js │ └── v6.3.1 │ │ ├── ol.css │ │ ├── ol.css.map │ │ ├── ol.js │ │ └── ol.js.map ├── planeObject.js ├── registrations.js ├── script.js ├── spinny.gif ├── style.css └── test │ ├── markers_test.html │ └── markers_test.js ├── skyaware978_main.cc ├── skyaware_writer.cc ├── skyaware_writer.h ├── soapy_source.cc ├── soapy_source.h ├── socket_input.cc ├── socket_input.h ├── socket_output.cc ├── socket_output.h ├── stratux_serial.cc ├── stratux_serial.h ├── track.cc ├── track.h ├── uat_message.cc ├── uat_message.h └── uat_protocol.h /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | Language: Cpp 3 | BasedOnStyle: LLVM 4 | AlignEscapedNewlinesLeft: true 5 | BraceWrapping: 6 | AfterClass: true 7 | AfterFunction: true 8 | ColumnLimit: 500 9 | IndentWidth: 4 10 | ObjCBlockIndentWidth: 4 11 | TabWidth: 4 12 | UseTab: Never 13 | NamespaceIndentation: All 14 | ... 15 | 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | *.o 3 | dump978-fa 4 | skyview978 5 | faup978 6 | fec_tests 7 | -------------------------------------------------------------------------------- /Jenkinsfile: -------------------------------------------------------------------------------- 1 | node(label: 'raspberrypi') { 2 | properties([ 3 | disableConcurrentBuilds(), 4 | durabilityHint(hint: 'PERFORMANCE_OPTIMIZED') 5 | ]) 6 | 7 | def srcdir = "${WORKSPACE}/src" 8 | 9 | stage('Checkout') { 10 | sh "rm -fr ${srcdir}" 11 | sh "mkdir ${srcdir}" 12 | dir(srcdir) { 13 | checkout scm 14 | } 15 | } 16 | 17 | def dist_arch_list = [ 18 | ["bookworm", "armhf"], 19 | ["bookworm", "arm64"], 20 | ["bullseye", "armhf"], 21 | ["bullseye", "arm64"], 22 | ["buster", "armhf"] 23 | ] 24 | 25 | def pkgdirs = [:] 26 | def resultdirs = [:] 27 | for (int i = 0; i < dist_arch_list.size(); ++i) { 28 | def dist_and_arch = dist_arch_list[i] 29 | def dist = dist_and_arch[0] 30 | def arch = dist_and_arch[1] 31 | 32 | String pkgdir 33 | if (pkgdirs.containsKey(dist)) { 34 | pkgdir = pkgdirs[dist] 35 | } else { 36 | pkgdir = "pkg-${dist}" 37 | stage("Prepare source for ${dist}") { 38 | sh "rm -fr ${pkgdir}" 39 | sh "${srcdir}/prepare-build.sh ${dist} ${pkgdir}" 40 | } 41 | pkgdirs[dist] = pkgdir 42 | } 43 | 44 | def resultdir = "results-${dist}-${arch}" 45 | resultdirs[dist_and_arch] = resultdir 46 | stage("Build for ${dist} (${arch})") { 47 | sh "rm -fr ${resultdir}" 48 | sh "mkdir -p ${resultdir}" 49 | dir(pkgdir) { 50 | sh "DIST=${dist} BRANCH=${env.BRANCH_NAME} ARCH=${arch} pdebuild --use-pdebuild-internal --debbuildopts -b --buildresult ${WORKSPACE}/${resultdir} -- --override-config" 51 | } 52 | archiveArtifacts artifacts: "${resultdir}/*.deb", fingerprint: true 53 | } 54 | 55 | stage("Test install on ${dist} (${arch})") { 56 | sh "BRANCH=${env.BRANCH_NAME} ARCH=${arch} /build/pi-builder/scripts/validate-packages.sh ${dist} ${resultdir}/dump978-fa_*.deb ${resultdir}/skyaware978_*.deb ${resultdir}/skyview978_*.deb" 57 | } 58 | } 59 | 60 | stage('Deploy to internal repository') { 61 | for (int i = 0; i < dist_arch_list.size(); ++i) { 62 | def dist_and_arch = dist_arch_list[i] 63 | def dist = dist_and_arch[0] 64 | def arch = dist_and_arch[1] 65 | def resultdir = resultdirs[dist_and_arch] 66 | sh "/build/pi-builder/scripts/deploy.sh -distribution ${dist} -architectures ${arch} -branch ${env.BRANCH_NAME} ${resultdir}/*.deb" 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2015, Oliver Jowett 2 | Copyright (c) 2019, FlightAware LLC. 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | * Redistributions of source code must retain the above copyright notice, this 9 | list of conditions and the following disclaimer. 10 | 11 | * Redistributions in binary form must reproduce the above copyright notice, 12 | this list of conditions and the following disclaimer in the documentation 13 | and/or other materials provided with the distribution. 14 | 15 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 16 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 19 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 22 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 23 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | VERSION ?= $(shell git rev-parse --short HEAD) 2 | ifneq ($(VERSION),) 3 | CPPFLAGS+=-DVERSION=\"$(VERSION)\" 4 | endif 5 | 6 | CC ?= gcc 7 | CFLAGS += -Wall -Werror -O2 -g -Ilibs 8 | 9 | CXX ?= g++ 10 | CXXFLAGS += -std=c++11 -Wall -Wno-psabi -Werror -O2 -g -Ilibs 11 | 12 | LIBS=-lboost_system -lboost_program_options -lboost_regex -lboost_filesystem -lpthread 13 | LIBS_SDR=-lSoapySDR 14 | 15 | all: dump978-fa skyaware978 16 | 17 | dump978-fa: dump978_main.o socket_output.o message_dispatch.o fec.o libs/fec/init_rs_char.o libs/fec/decode_rs_char.o sample_source.o soapy_source.o convert.o demodulator.o uat_message.o stratux_serial.o 18 | $(CXX) $(CXXFLAGS) $(LDFLAGS) $^ -o $@ $(LIBS) $(LIBS_SDR) 19 | 20 | faup978: faup978_main.o socket_input.o uat_message.o track.o faup978_reporter.o 21 | $(CXX) $(CXXFLAGS) $(LDFLAGS) $^ -o $@ $(LIBS) 22 | 23 | skyaware978: skyaware978_main.o socket_input.o uat_message.o track.o skyaware_writer.o 24 | $(CXX) $(CXXFLAGS) $(LDFLAGS) $^ -o $@ $(LIBS) 25 | 26 | fec_tests: fec_tests.o libs/fec/init_rs_char.o libs/fec/decode_rs_char.o libs/fec/encode_rs_char.o 27 | $(CXX) $(CXXFLAGS) $(LDFLAGS) $^ -o $@ 28 | 29 | format: 30 | clang-format -style=file -i *.cc *.h 31 | 32 | clean: 33 | rm -f *.o libs/fec/*.o dump978-fa faup978 skyaware978 fec_tests 34 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # dump978-fa 2 | 3 | This is the FlightAware 978MHz UAT decoder. 4 | 5 | It is a reimplementation in C++, loosely based on the demodulator from 6 | https://github.com/mutability/dump978. 7 | 8 | For prebuilt Raspbian packages, see https://flightaware.com/adsb/piaware/install 9 | 10 | ## Overview 11 | 12 | dump978-fa is the main binary. It talks to the SDR, demodulates UAT data, 13 | and provides the data in a variety of ways - either as raw messages or as 14 | json-formatted decoded messages, and either on a network port or to stdout. 15 | 16 | skyaware978 connects to a running dump978-fa and writes json files suitable 17 | for use by the SkyAware web map. 18 | 19 | ## Building as a package 20 | 21 | Caution: The package build is memory-hungry. A 1GB Pi will fail to build the 22 | package. Please build on a machine with more memory, or add swap. 23 | 24 | ``` 25 | $ sudo apt-get install \ 26 | build-essential \ 27 | debhelper \ 28 | dh-systemd \ 29 | libboost-system-dev \ 30 | libboost-program-options-dev \ 31 | libboost-regex-dev \ 32 | libboost-filesystem-dev \ 33 | libsoapysdr-dev 34 | 35 | $ dpkg-buildpackage -b 36 | $ sudo dpkg -i ../dump978-fa_*.deb ../skyaware978_*.deb 37 | ``` 38 | 39 | ## Building from source 40 | 41 | 1. Ensure SoapySDR and Boost are installed 42 | 2. 'make' 43 | 44 | ## Installing the SoapySDR driver module 45 | 46 | You will want at least one SoapySDR driver installed. For rtlsdr, try 47 | 48 | ``` 49 | $ sudo apt-get install soapysdr-module-rtlsdr 50 | ``` 51 | 52 | ## Configuration 53 | 54 | For a package install, see `/etc/default/dump978-fa` and 55 | `/etc/default/skyaware978`. 56 | 57 | The main options are: 58 | 59 | * `--sdr` specifies the SDR to use, in the format expected by 60 | SoapySDR. For a rtlsdr, try `--sdr driver=rtlsdr`. To select a 61 | particular rtlsdr dongle by serial number, try 62 | `--sdr driver=rtlsdr,serial=01234567` 63 | * `--sdr-gain` sets the SDR gain (default: max) 64 | * `--raw-port` listens on the given TCP port and provides raw messages 65 | * `--json-port` listens on the given TCP port and provides decoded messages 66 | in json format 67 | 68 | Pass `--help` for a full list of options. 69 | 70 | ## Third-party code 71 | 72 | Third-party source code included in libs/: 73 | 74 | * fec - from Phil Karn's fec-3.0.1 library (see fec/README) 75 | * json.hpp - JSON for Modern C++ v3.5.0 - https://github.com/nlohmann/json 76 | -------------------------------------------------------------------------------- /common.h: -------------------------------------------------------------------------------- 1 | // -*- c++ -*- 2 | 3 | // Copyright (c) 2019, FlightAware LLC. 4 | // All rights reserved. 5 | // Licensed under the 2-clause BSD license; see the LICENSE file 6 | 7 | #ifndef UAT_COMMON_H 8 | #define UAT_COMMON_H 9 | 10 | #ifndef VERSION 11 | #define VERSION "unknown version compiled " __DATE__ " " __TIME__ 12 | #endif 13 | 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | namespace flightaware::uat { 20 | typedef std::vector Bytes; 21 | typedef std::vector PhaseBuffer; 22 | 23 | inline static double RoundN(double value, unsigned dp) { 24 | const double scale = std::pow(10, dp); 25 | return std::round(value * scale) / scale; 26 | } 27 | 28 | const auto unix_epoch = std::chrono::system_clock::from_time_t(0); 29 | 30 | inline static std::uint64_t now_millis() { return std::chrono::duration_cast(std::chrono::system_clock::now() - unix_epoch).count(); } 31 | }; // namespace flightaware::uat 32 | 33 | #endif 34 | -------------------------------------------------------------------------------- /convert.h: -------------------------------------------------------------------------------- 1 | // -*- c++ -*- 2 | 3 | // Copyright (c) 2019, FlightAware LLC. 4 | // All rights reserved. 5 | // Licensed under the 2-clause BSD license; see the LICENSE file 6 | 7 | #ifndef DUMP978_CONVERT_H 8 | #define DUMP978_CONVERT_H 9 | 10 | #include 11 | #include 12 | 13 | #include "common.h" 14 | 15 | namespace flightaware::uat { 16 | // Describes a sample data layout: 17 | // CU8 - interleaved I/Q data, 8 bit unsigned integers 18 | // CS8_ - interleaved I/Q data, 8 bit signed integers 19 | // CS16H - interleaved I/Q data, 16 bit signed integers, host byte order 20 | // CF32H - interleaved I/Q data, 32 bit signed floats, host byte order 21 | enum class SampleFormat { CU8, CS8_, CS16H, CF32H, UNKNOWN }; 22 | 23 | // Return the number of bytes for 1 sample in the given format 24 | inline static unsigned BytesPerSample(SampleFormat f) { 25 | switch (f) { 26 | case SampleFormat::CU8: 27 | return 2; 28 | case SampleFormat::CS8_: 29 | return 2; 30 | case SampleFormat::CS16H: 31 | return 4; 32 | case SampleFormat::CF32H: 33 | return 8; 34 | default: 35 | return 0; 36 | } 37 | } 38 | 39 | // Base class for all sample converters. 40 | // Use SampleConverter::Create to build converters. 41 | class SampleConverter { 42 | public: 43 | typedef std::shared_ptr Pointer; 44 | 45 | SampleConverter(SampleFormat format) : format_(format), bytes_per_sample_(flightaware::uat::BytesPerSample(format)) {} 46 | 47 | virtual ~SampleConverter() {} 48 | 49 | // Read samples from `begin` .. `end` and write one phase value per sample to 50 | // `out`. The input buffer should contain an integral number of samples 51 | // (trailing partial samples are ignored, not buffered). 52 | virtual void ConvertPhase(Bytes::const_iterator begin, Bytes::const_iterator end, PhaseBuffer::iterator out) = 0; 53 | 54 | // Read samples from `begin` .. `end` and write one magnitude-squared value 55 | // per sample to `out`. The input buffer should contain an integral number of 56 | // samples (trailing partial samples are ignored, not buffered). 57 | virtual void ConvertMagSq(Bytes::const_iterator begin, Bytes::const_iterator end, std::vector::iterator out) = 0; 58 | 59 | SampleFormat Format() const { return format_; } 60 | unsigned BytesPerSample() const { return bytes_per_sample_; } 61 | 62 | // Return a new SampleConverter that converts from the given format 63 | static Pointer Create(SampleFormat format); 64 | 65 | private: 66 | SampleFormat format_; 67 | unsigned bytes_per_sample_; 68 | }; 69 | 70 | class CU8Converter : public SampleConverter { 71 | public: 72 | CU8Converter(); 73 | 74 | void ConvertPhase(Bytes::const_iterator begin, Bytes::const_iterator end, PhaseBuffer::iterator out) override; 75 | void ConvertMagSq(Bytes::const_iterator begin, Bytes::const_iterator end, std::vector::iterator out) override; 76 | 77 | private: 78 | union cu8_alias { 79 | std::uint8_t iq[2]; 80 | std::uint16_t iq16; 81 | }; 82 | 83 | std::array lookup_phase_; 84 | std::array lookup_magsq_; 85 | }; 86 | 87 | class CS8Converter : public SampleConverter { 88 | public: 89 | CS8Converter(); 90 | 91 | void ConvertPhase(Bytes::const_iterator begin, Bytes::const_iterator end, PhaseBuffer::iterator out) override; 92 | void ConvertMagSq(Bytes::const_iterator begin, Bytes::const_iterator end, std::vector::iterator out) override; 93 | 94 | private: 95 | union cs8_alias { 96 | std::int8_t iq[2]; 97 | std::uint16_t iq16; 98 | }; 99 | 100 | std::array lookup_phase_; 101 | std::array lookup_magsq_; 102 | }; 103 | 104 | class CS16HConverter : public SampleConverter { 105 | public: 106 | CS16HConverter(); 107 | void ConvertPhase(Bytes::const_iterator begin, Bytes::const_iterator end, PhaseBuffer::iterator out) override; 108 | void ConvertMagSq(Bytes::const_iterator begin, Bytes::const_iterator end, std::vector::iterator out) override; 109 | 110 | private: 111 | std::uint16_t TableAtan(std::uint32_t r); 112 | std::uint16_t TableAtan2(std::int16_t y, std::int16_t x); 113 | std::array lookup_atan_; 114 | }; 115 | 116 | class CF32HConverter : public SampleConverter { 117 | public: 118 | CF32HConverter() : SampleConverter(SampleFormat::CF32H) {} 119 | void ConvertPhase(Bytes::const_iterator begin, Bytes::const_iterator end, PhaseBuffer::iterator out) override; 120 | void ConvertMagSq(Bytes::const_iterator begin, Bytes::const_iterator end, std::vector::iterator out) override; 121 | }; 122 | }; // namespace flightaware::uat 123 | 124 | #endif 125 | -------------------------------------------------------------------------------- /debian-bullseye/dump978-fa.preinst: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | # Work around Debian bug #989155 5 | if [ "$1" = upgrade ] && [ -d /run/systemd/system ] ; then 6 | deb-systemd-invoke stop 'dump978-fa.service' >/dev/null || true 7 | fi 8 | -------------------------------------------------------------------------------- /debian-bullseye/skyaware978.preinst: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | # Work around Debian bug #989155 5 | if [ "$1" = upgrade ] && [ -d /run/systemd/system ] ; then 6 | deb-systemd-invoke stop 'skyaware978.service' >/dev/null || true 7 | fi 8 | -------------------------------------------------------------------------------- /debian-buster/dump978-fa.preinst: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | # Work around Debian bug #989155 5 | if [ "$1" = upgrade ] && [ -d /run/systemd/system ] ; then 6 | deb-systemd-invoke stop 'dump978-fa.service' >/dev/null || true 7 | fi 8 | -------------------------------------------------------------------------------- /debian-buster/skyaware978.preinst: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | # Work around Debian bug #989155 5 | if [ "$1" = upgrade ] && [ -d /run/systemd/system ] ; then 6 | deb-systemd-invoke stop 'skyaware978.service' >/dev/null || true 7 | fi 8 | -------------------------------------------------------------------------------- /debian/compat: -------------------------------------------------------------------------------- 1 | 12 2 | -------------------------------------------------------------------------------- /debian/control: -------------------------------------------------------------------------------- 1 | Source: dump978-fa 2 | Section: embedded 3 | Priority: extra 4 | Maintainer: Oliver Jowett 5 | Build-Depends: debhelper(>=12), libboost-system-dev, libboost-program-options-dev, libboost-regex-dev, libboost-filesystem-dev, libsoapysdr-dev 6 | Standards-Version: 3.9.3 7 | Homepage: http://www.flightaware.com/ 8 | Vcs-Git: https://github.com/flightaware/dump978.git 9 | 10 | Package: dump978-fa 11 | Architecture: any 12 | Pre-Depends: ${misc:Pre-Depends} 13 | Depends: ${shlibs:Depends}, ${misc:Depends}, adduser 14 | Recommends: skyaware978, soapysdr-module-rtlsdr 15 | Description: ADS-B UAT Ground Station System 16 | . 17 | FlightAware's SDR decoder for UAT ADS-B messages on 978MHz. 18 | 19 | Package: skyaware978 20 | Replaces: skyview978 (<< 3.7.2~) 21 | Breaks: skyview978 (<< 3.7.2~) 22 | Architecture: any 23 | Pre-Depends: ${misc:Pre-Depends} 24 | Depends: ${shlibs:Depends}, ${misc:Depends}, adduser, lighttpd 25 | Description: Local web interface for dump978 26 | . 27 | Provides a web interface to display aircraft data received from dump978. 28 | 29 | Package: skyview978 30 | Depends: skyaware978, ${misc:Depends} 31 | Architecture: all 32 | Priority: optional 33 | Section: oldlibs 34 | Description: transitional package 35 | This is a transitional package. It can safely be removed. 36 | -------------------------------------------------------------------------------- /debian/dump978-fa.default: -------------------------------------------------------------------------------- 1 | # dump978-fa configuration 2 | # This is sourced by /usr/share/dump978-fa/start-dump978-fa as a 3 | # shellscript fragment. 4 | 5 | # If you are using a PiAware sdcard image, this config file is regenerated 6 | # on boot based on the contents of piaware-config.txt; any changes made to this 7 | # file will be lost. 8 | 9 | # dump978-fa won't automatically start unless ENABLED=yes 10 | ENABLED=yes 11 | 12 | RECEIVER_OPTIONS="--sdr driver=rtlsdr --format CS8" 13 | DECODER_OPTIONS="" 14 | NET_OPTIONS="--raw-port 30978 --json-port 30979" 15 | -------------------------------------------------------------------------------- /debian/dump978-fa.install: -------------------------------------------------------------------------------- 1 | dump978-fa usr/bin/ 2 | debian/start-dump978-fa /usr/share/dump978-fa/ 3 | -------------------------------------------------------------------------------- /debian/dump978-fa.postinst: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # postinst script for dump978 3 | # 4 | # see: dh_installdeb(1) 5 | 6 | set -e 7 | 8 | # summary of how this script can be called: 9 | # * `configure' 10 | # * `abort-upgrade' 11 | # * `abort-remove' `in-favour' 12 | # 13 | # * `abort-remove' 14 | # * `abort-deconfigure' `in-favour' 15 | # `removing' 16 | # 17 | # for details, see http://www.debian.org/doc/debian-policy/ or 18 | # the debian-policy package 19 | 20 | NAME=dump978-fa 21 | RUNAS=dump978 22 | 23 | case "$1" in 24 | configure) 25 | . /usr/share/debconf/confmodule 26 | 27 | if ! getent passwd "$RUNAS" >/dev/null 28 | then 29 | adduser --system --home /usr/share/$NAME --no-create-home --quiet "$RUNAS" 30 | fi 31 | 32 | # plugdev required for USB access 33 | adduser "$RUNAS" plugdev 34 | ;; 35 | 36 | abort-upgrade|abort-remove|abort-deconfigure) 37 | ;; 38 | 39 | *) 40 | echo "postinst called with unknown argument \`$1'" >&2 41 | exit 1 42 | ;; 43 | esac 44 | 45 | # dh_installdeb will replace this with shell code automatically 46 | # generated by other debhelper scripts. 47 | 48 | #DEBHELPER# 49 | 50 | exit 0 51 | -------------------------------------------------------------------------------- /debian/dump978-fa.service: -------------------------------------------------------------------------------- 1 | # dump978-fa service for systemd 2 | 3 | [Unit] 4 | Description=dump978 ADS-B UAT receiver 5 | Documentation=https://flightaware.com/adsb/piaware/ 6 | Wants=network.target 7 | After=network.target 8 | 9 | [Service] 10 | User=dump978 11 | ExecStart=/usr/share/dump978-fa/start-dump978-fa 12 | SyslogIdentifier=dump978-fa 13 | Type=simple 14 | Restart=on-failure 15 | RestartSec=30 16 | RestartPreventExitStatus=64 17 | Nice=-5 18 | 19 | [Install] 20 | WantedBy=default.target 21 | -------------------------------------------------------------------------------- /debian/dump978-fa.udev: -------------------------------------------------------------------------------- 1 | # Stratux uatradio. 2 | # 0403:7028 (Stratux UATRadio) 3 | ATTRS{idProduct}=="7028", ATTRS{idVendor}=="0403", RUN+="/sbin/modprobe -q ftdi_sio" RUN+="/bin/sh -c 'echo 0403 7028 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id'" 4 | ATTRS{idProduct}=="7028", ATTRS{idVendor}=="0403", SUBSYSTEM=="tty", OWNER="root", MODE="0666", SYMLINK+="uatradio" 5 | -------------------------------------------------------------------------------- /debian/lighttpd/88-skyaware978-statcache.conf: -------------------------------------------------------------------------------- 1 | # The stat cache must be disabled, as aircraft.json changes 2 | # frequently and lighttpd's stat cache often ends up with the 3 | # wrong content length. 4 | server.stat-cache-engine = "disable" 5 | -------------------------------------------------------------------------------- /debian/lighttpd/89-skyaware978.conf: -------------------------------------------------------------------------------- 1 | # Allows access to the static files that provide the skyaware978 map view, 2 | # and also to the dynamically-generated json parts that contain aircraft 3 | # data and are periodically written by the skyaware978 daemon. 4 | 5 | alias.url += ( 6 | "/skyaware978/data/" => "/run/skyaware978/", 7 | "/skyaware978/" => "/usr/share/skyaware978/html/" 8 | ) 9 | 10 | # redirect the slash-less URL 11 | url.redirect += ( 12 | "^/skyaware978$" => "/skyaware978/" 13 | ) 14 | 15 | # Listen on port 8978 and serve the map there, too. 16 | $SERVER["socket"] == ":8978" { 17 | alias.url += ( 18 | "/data/" => "/run/skyaware978/", 19 | "/" => "/usr/share/skyaware978/html/" 20 | ) 21 | } 22 | 23 | # Add CORS header 24 | server.modules += ( "mod_setenv" ) 25 | $HTTP["url"] =~ "^/skyaware978/data/.*\.json$" { 26 | setenv.add-response-header = ( "Access-Control-Allow-Origin" => "*" ) 27 | } 28 | -------------------------------------------------------------------------------- /debian/rules: -------------------------------------------------------------------------------- 1 | #!/usr/bin/make -f 2 | # -*- makefile -*- 3 | 4 | # Uncomment this to turn on verbose mode. 5 | export DH_VERBOSE=1 6 | 7 | export DEB_BUILD_MAINT_OPTIONS = hardening=+all 8 | 9 | DPKG_EXPORT_BUILDFLAGS = 1 10 | include /usr/share/dpkg/default.mk 11 | 12 | override_dh_auto_build: 13 | dh_auto_build -- VERSION=$(DEB_VERSION) dump978-fa skyaware978 14 | 15 | override_dh_installinit: 16 | dh_installinit --no-stop-on-upgrade --no-restart-after-upgrade 17 | 18 | override_dh_installsystemd: 19 | dh_installsystemd --no-restart-after-upgrade 20 | 21 | %: 22 | dh $@ 23 | -------------------------------------------------------------------------------- /debian/skyaware978.default: -------------------------------------------------------------------------------- 1 | # skyaware978 configuration 2 | # This is sourced by /usr/share/skyaware978/start-skyaware978 as a 3 | # shellscript fragment. 4 | 5 | # If you are using a PiAware sdcard image, this config file is regenerated 6 | # on boot based on the contents of piaware-config.txt; any changes made to this 7 | # file will be lost. 8 | 9 | # skyaware978 won't automatically start unless ENABLED=yes 10 | ENABLED=yes 11 | 12 | NET_OPTIONS="--connect localhost:30978 --reconnect-interval 30" 13 | HISTORY_OPTIONS="--history-count 120 --history-interval 30" 14 | -------------------------------------------------------------------------------- /debian/skyaware978.install: -------------------------------------------------------------------------------- 1 | skyaware/* usr/share/skyaware978/html 2 | debian/lighttpd/* etc/lighttpd/conf-available 3 | skyaware978 usr/bin/ 4 | debian/start-skyaware978 usr/share/skyaware978/ 5 | -------------------------------------------------------------------------------- /debian/skyaware978.maintscript: -------------------------------------------------------------------------------- 1 | rm_conffile /etc/lighttpd/conf-available/89-skyview978.conf 3.7.2~ 2 | rm_conffile /etc/lighttpd/conf-available/88-skyview978-statcache.conf 3.7.2~ 3 | -------------------------------------------------------------------------------- /debian/skyaware978.postinst: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # postinst script for skyaware978 3 | # 4 | # see: dh_installdeb(1) 5 | 6 | set -e 7 | 8 | # summary of how this script can be called: 9 | # * `configure' 10 | # * `abort-upgrade' 11 | # * `abort-remove' `in-favour' 12 | # 13 | # * `abort-remove' 14 | # * `abort-deconfigure' `in-favour' 15 | # `removing' 16 | # 17 | # for details, see http://www.debian.org/doc/debian-policy/ or 18 | # the debian-policy package 19 | 20 | NAME=skyaware978 21 | RUNAS=skyaware 22 | 23 | case "$1" in 24 | configure) 25 | if ! getent passwd "$RUNAS" >/dev/null 26 | then 27 | adduser --system --home /usr/share/$NAME --no-create-home --quiet "$RUNAS" 28 | fi 29 | 30 | if dpkg --compare-versions "$2" lt "3.7.2~" 31 | then 32 | # handle various combinations of the symlink targets existing or not existing 33 | for m in skyview978 skyview978-statcache 34 | do 35 | if [ -e /etc/lighttpd/conf-enabled/*-${m}.conf ] 36 | then 37 | echo "Disabling lighttpd $m module" 38 | lighty-disable-mod $m || true 39 | fi 40 | done 41 | 42 | for f in /etc/lighttpd/conf-enabled/*-skyview978*.conf 43 | do 44 | if [ -h $f ] && [ ! -e $f ] 45 | then 46 | # dangling symlink that lighty-disable-mod didn't deal with 47 | echo "Removing $f.." >&2 48 | rm $f 49 | fi 50 | done 51 | fi 52 | 53 | # set up lighttpd 54 | echo "Enabling lighttpd integration.." >&2 55 | lighty-enable-mod skyaware978 || true 56 | 57 | # only enable the statcache config if there is nothing else around that already 58 | # configures it, because lighttpd fails if it's configured twice 59 | if ! grep -q -E '^\S*server.stat-cache-engine' /etc/lighttpd/conf-enabled/*.conf 60 | then 61 | echo "Enabling lighttpd integration (stat cache).." >&2 62 | lighty-enable-mod skyaware978-statcache || true 63 | fi 64 | 65 | echo "Restarting lighttpd.." >&2 66 | invoke-rc.d lighttpd restart || true 67 | ;; 68 | 69 | abort-upgrade|abort-remove|abort-deconfigure) 70 | ;; 71 | 72 | *) 73 | echo "postinst called with unknown argument \`$1'" >&2 74 | exit 1 75 | ;; 76 | esac 77 | 78 | # dh_installdeb will replace this with shell code automatically 79 | # generated by other debhelper scripts. 80 | 81 | #DEBHELPER# 82 | 83 | exit 0 84 | -------------------------------------------------------------------------------- /debian/skyaware978.postrm: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # postrm script for #PACKAGE# 3 | # 4 | # see: dh_installdeb(1) 5 | 6 | set -e 7 | 8 | # summary of how this script can be called: 9 | # * `remove' 10 | # * `purge' 11 | # * `upgrade' 12 | # * `failed-upgrade' 13 | # * `abort-install' 14 | # * `abort-install' 15 | # * `abort-upgrade' 16 | # * `disappear' 17 | # 18 | # for details, see http://www.debian.org/doc/debian-policy/ or 19 | # the debian-policy package 20 | 21 | 22 | case "$1" in 23 | purge) 24 | ;; 25 | 26 | remove) 27 | # handle various combinations of the symlink targets existing or not existing 28 | changed=false 29 | for m in skyaware978 skyaware978-statcache 30 | do 31 | f=/etc/lighttpd/conf-enabled/*-${m}.conf 32 | if [ -e $f ] 33 | then 34 | echo "Disabling lighttpd $m module" 35 | lighty-disable-mod $m || true 36 | changed=true 37 | fi 38 | 39 | if [ -h $f ] && [ ! -e $f ] 40 | then 41 | # dangling symlink that lighty-disable-mod didn't deal with 42 | echo "Removing $f.." >&2 43 | rm $f 44 | changed=true 45 | fi 46 | done 47 | 48 | if $changed 49 | then 50 | echo "Restarting lighttpd.." >&2 51 | invoke-rc.d lighttpd restart || echo "Warning: lighttpd failed to restart." >&2 52 | fi 53 | ;; 54 | 55 | upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) 56 | ;; 57 | 58 | *) 59 | echo "postrm called with unknown argument \`$1'" >&2 60 | exit 1 61 | ;; 62 | esac 63 | 64 | # dh_installdeb will replace this with shell code automatically 65 | # generated by other debhelper scripts. 66 | 67 | #DEBHELPER# 68 | 69 | exit 0 70 | -------------------------------------------------------------------------------- /debian/skyaware978.service: -------------------------------------------------------------------------------- 1 | # SkyAware978 service for systemd 2 | 3 | [Unit] 4 | Description=skyaware978 ADS-B UAT web display 5 | Documentation=https://flightaware.com/adsb/piaware/ 6 | Wants=network.target 7 | After=network.target 8 | After=dump978-fa.service 9 | 10 | [Service] 11 | User=skyaware 12 | RuntimeDirectory=skyaware978 13 | RuntimeDirectoryMode=0755 14 | ExecStart=/usr/share/skyaware978/start-skyaware978 --json-dir %t/skyaware978 15 | SyslogIdentifier=skyaware978 16 | Type=simple 17 | Restart=on-failure 18 | RestartSec=30 19 | RestartPreventExitStatus=64 20 | 21 | [Install] 22 | WantedBy=dump978-fa.service 23 | -------------------------------------------------------------------------------- /debian/source/format: -------------------------------------------------------------------------------- 1 | 3.0 (native) 2 | -------------------------------------------------------------------------------- /debian/start-dump978-fa: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Helper script that reads /etc/default/dump978-fa 4 | # and either starts dump1090-fa with the configured 5 | # arguments, or exits with status 64 to tell systemd 6 | # not to auto-restart the service. 7 | 8 | if [ -f /etc/default/dump978-fa ] 9 | then 10 | . /etc/default/dump978-fa 11 | fi 12 | 13 | if [ "x$ENABLED" != "xyes" ] 14 | then 15 | echo "dump978-fa not enabled in /etc/default/dump978-fa" >&2 16 | exit 64 17 | fi 18 | 19 | exec /usr/bin/dump978-fa \ 20 | $RECEIVER_OPTIONS $DECODER_OPTIONS $NET_OPTIONS \ 21 | "$@" 22 | # exec failed, do not restart 23 | exit 64 24 | -------------------------------------------------------------------------------- /debian/start-skyaware978: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Helper script that reads /etc/default/skyaware978 4 | # and either starts skyaware978 with the configured 5 | # arguments, or exits with status 64 to tell systemd 6 | # not to auto-restart the service. 7 | 8 | if [ -f /etc/default/skyaware978 ] 9 | then 10 | . /etc/default/skyaware978 11 | fi 12 | 13 | if [ -f /var/cache/piaware/location.env ] 14 | then 15 | . /var/cache/piaware/location.env 16 | fi 17 | 18 | if [ "x$ENABLED" != "xyes" ] 19 | then 20 | echo "skyaware978 not enabled in /etc/default/skyaware978" >&2 21 | exit 64 22 | fi 23 | 24 | if [ -n "$PIAWARE_LAT" -a -n "$PIAWARE_LON" ] 25 | then 26 | POSITION="--lat $PIAWARE_LAT --lon $PIAWARE_LON" 27 | fi 28 | 29 | exec /usr/bin/skyaware978 \ 30 | $NET_OPTIONS $HISTORY_OPTIONS $POSITION \ 31 | "$@" 32 | # exec failed, do not restart 33 | exit 64 34 | -------------------------------------------------------------------------------- /demodulator.h: -------------------------------------------------------------------------------- 1 | // -*- c++ -*- 2 | 3 | // Copyright (c) 2019, FlightAware LLC. 4 | // All rights reserved. 5 | // Licensed under the 2-clause BSD license; see the LICENSE file 6 | 7 | #ifndef DUMP978_DEMODULATOR_H 8 | #define DUMP978_DEMODULATOR_H 9 | 10 | #include 11 | #include 12 | 13 | #include "common.h" 14 | #include "convert.h" 15 | #include "fec.h" 16 | #include "message_source.h" 17 | #include "uat_message.h" 18 | 19 | namespace flightaware::uat { 20 | class Demodulator { 21 | public: 22 | // Return value of Demodulate 23 | struct Message { 24 | Bytes payload; 25 | unsigned corrected_errors; 26 | PhaseBuffer::const_iterator begin; 27 | PhaseBuffer::const_iterator end; 28 | }; 29 | 30 | virtual ~Demodulator() {} 31 | virtual std::vector Demodulate(PhaseBuffer::const_iterator begin, PhaseBuffer::const_iterator end) = 0; 32 | 33 | virtual unsigned NumTrailingSamples() = 0; 34 | 35 | protected: 36 | FEC fec_; 37 | }; 38 | 39 | class TwoMegDemodulator : public Demodulator { 40 | public: 41 | std::vector Demodulate(PhaseBuffer::const_iterator begin, PhaseBuffer::const_iterator end) override; 42 | unsigned NumTrailingSamples() override; 43 | 44 | private: 45 | boost::optional DemodBest(PhaseBuffer::const_iterator begin, bool downlink); 46 | boost::optional DemodOneDownlink(PhaseBuffer::const_iterator begin); 47 | boost::optional DemodOneUplink(PhaseBuffer::const_iterator begin); 48 | }; 49 | 50 | class Receiver : public MessageSource { 51 | public: 52 | virtual void HandleSamples(std::uint64_t timestamp, Bytes::const_iterator begin, Bytes::const_iterator end) = 0; 53 | 54 | virtual void HandleError(const boost::system::error_code &ec) { DispatchError(ec); } 55 | }; 56 | 57 | class SingleThreadReceiver : public Receiver { 58 | public: 59 | SingleThreadReceiver(SampleFormat format); 60 | 61 | void HandleSamples(std::uint64_t timestamp, Bytes::const_iterator begin, Bytes::const_iterator end) override; 62 | 63 | private: 64 | SampleConverter::Pointer converter_; 65 | std::unique_ptr demodulator_; 66 | 67 | Bytes samples_; 68 | std::size_t saved_samples_ = 0; 69 | 70 | PhaseBuffer phase_; 71 | }; 72 | 73 | }; // namespace flightaware::uat 74 | 75 | #endif 76 | -------------------------------------------------------------------------------- /exception.h: -------------------------------------------------------------------------------- 1 | // -*- c++ -*- 2 | 3 | // Copyright (c) 2019, FlightAware LLC. 4 | // All rights reserved. 5 | // Licensed under the 2-clause BSD license; see the LICENSE file 6 | 7 | #ifndef DUMP978_EXCEPTION_H 8 | #define DUMP978_EXCEPTION_H 9 | 10 | #include 11 | 12 | namespace flightaware::uat { 13 | class config_error : public std::runtime_error { 14 | public: 15 | explicit config_error(const std::string &what_arg) : runtime_error(what_arg) {} 16 | explicit config_error(const char *what_arg) : runtime_error(what_arg) {} 17 | }; 18 | }; // namespace flightaware::uat 19 | 20 | #endif 21 | -------------------------------------------------------------------------------- /faup978_main.cc: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019, FlightAware LLC. 2 | // All rights reserved. 3 | // Licensed under the 2-clause BSD license; see the LICENSE file 4 | 5 | #include 6 | #include 7 | #include 8 | 9 | #include 10 | #include 11 | 12 | #include "faup978_reporter.h" 13 | #include "message_source.h" 14 | #include "socket_input.h" 15 | #include "uat_message.h" 16 | 17 | using namespace flightaware::uat; 18 | using namespace flightaware::faup978; 19 | 20 | namespace po = boost::program_options; 21 | using boost::asio::ip::tcp; 22 | 23 | struct connect_option { 24 | std::string host; 25 | std::string port; 26 | }; 27 | 28 | // Specializations of validate for --connect 29 | void validate(boost::any &v, const std::vector &values, connect_option *target_type, int) { 30 | po::validators::check_first_occurrence(v); 31 | const std::string &s = po::validators::get_single_string(values); 32 | 33 | static const boost::regex r("(?:([^:]+):)?(\\d+)"); 34 | boost::smatch match; 35 | if (boost::regex_match(s, match, r)) { 36 | v = boost::any(connect_option{match[1], match[2]}); 37 | } else { 38 | throw po::validation_error(po::validation_error::invalid_option_value); 39 | } 40 | } 41 | 42 | #define EXIT_NO_RESTART (64) 43 | 44 | static int realmain(int argc, char **argv) { 45 | boost::asio::io_service io_service; 46 | 47 | // clang-format off 48 | po::options_description desc("Allowed options"); 49 | desc.add_options() 50 | ("help", "produce help message") 51 | ("version", "show version") 52 | ("connect", po::value(), "connect to host:port for raw UAT data"); 53 | // clang-format on 54 | 55 | po::variables_map opts; 56 | 57 | try { 58 | po::store(po::parse_command_line(argc, argv, desc), opts); 59 | po::notify(opts); 60 | } catch (boost::program_options::error &err) { 61 | std::cerr << err.what() << std::endl; 62 | std::cerr << desc << std::endl; 63 | return EXIT_NO_RESTART; 64 | } 65 | 66 | if (opts.count("help")) { 67 | std::cerr << "faup978 " << VERSION << std::endl; 68 | std::cerr << desc << std::endl; 69 | return EXIT_NO_RESTART; 70 | } 71 | 72 | if (opts.count("version")) { 73 | std::cerr << "faup978 " << VERSION << std::endl; 74 | return EXIT_NO_RESTART; 75 | } 76 | 77 | if (!opts.count("connect")) { 78 | std::cerr << "--connect option is required" << std::endl; 79 | return EXIT_NO_RESTART; 80 | } 81 | 82 | auto connect = opts["connect"].as(); 83 | auto input = RawInput::Create(io_service, connect.host, connect.port); 84 | auto reporter = Reporter::Create(io_service); 85 | 86 | input->SetConsumer(std::bind(&Reporter::HandleMessages, reporter, std::placeholders::_1)); 87 | input->SetErrorHandler([&io_service](const boost::system::error_code &ec) { 88 | std::cerr << "Connection failed: " << ec.message() << std::endl; 89 | io_service.stop(); 90 | }); 91 | 92 | reporter->Start(); 93 | input->Start(); 94 | 95 | io_service.run(); 96 | 97 | input->Stop(); 98 | reporter->Stop(); 99 | return 0; 100 | } 101 | 102 | int main(int argc, char **argv) { 103 | #ifndef DEBUG_EXCEPTIONS 104 | try { 105 | return realmain(argc, argv); 106 | } catch (...) { 107 | std::cerr << "Uncaught exception: " << boost::current_exception_diagnostic_information() << std::endl; 108 | return 2; 109 | } 110 | #else 111 | return realmain(argc, argv); 112 | #endif 113 | } 114 | -------------------------------------------------------------------------------- /faup978_reporter.h: -------------------------------------------------------------------------------- 1 | // -*- c++ -*- 2 | 3 | // Copyright (c) 2019, FlightAware LLC. 4 | // All rights reserved. 5 | // Licensed under the 2-clause BSD license; see the LICENSE file 6 | 7 | #ifndef FAUP978_REPORTER_H 8 | #define FAUP978_REPORTER_H 9 | 10 | #include 11 | #include 12 | 13 | #include 14 | #include 15 | #include 16 | 17 | #include "track.h" 18 | #include "uat_message.h" 19 | 20 | namespace flightaware::faup978 { 21 | struct ReportState { 22 | std::uint64_t slow_report_time = 0; 23 | std::uint64_t report_time = 0; 24 | flightaware::uat::AircraftState report_state; 25 | }; 26 | 27 | class Reporter : public std::enable_shared_from_this { 28 | public: 29 | typedef std::shared_ptr Pointer; 30 | 31 | static constexpr const char *TSV_VERSION_8U = "8U"; 32 | static constexpr const char *TSV_VERSION_8U_FIX = "8UF"; 33 | 34 | static Pointer Create(boost::asio::io_service &service, std::chrono::milliseconds interval = std::chrono::milliseconds(500), std::chrono::milliseconds timeout = std::chrono::seconds(300)) { return Pointer(new Reporter(service, interval, timeout)); } 35 | 36 | void Start(); 37 | void Stop(); 38 | 39 | void HandleMessages(flightaware::uat::SharedMessageVector messages); 40 | 41 | private: 42 | Reporter(boost::asio::io_service &service, std::chrono::milliseconds interval, std::chrono::milliseconds timeout) : service_(service), strand_(service), report_timer_(service), purge_timer_(service), interval_(interval), timeout_(timeout) { tracker_ = flightaware::uat::Tracker::Create(service, timeout); } 43 | 44 | void PeriodicReport(); 45 | void PurgeOld(); 46 | void ReportOneAircraft(const flightaware::uat::Tracker::AddressKey &key, const flightaware::uat::AircraftState &aircraft, std::uint64_t now); 47 | 48 | const char *TSVVersion() const { return fecfix_ ? TSV_VERSION_8U_FIX : TSV_VERSION_8U; } 49 | 50 | boost::asio::io_service &service_; 51 | boost::asio::io_service::strand strand_; 52 | boost::asio::steady_timer report_timer_; 53 | boost::asio::steady_timer purge_timer_; 54 | std::chrono::milliseconds interval_; 55 | std::chrono::milliseconds timeout_; 56 | flightaware::uat::Tracker::Pointer tracker_; 57 | std::map reported_; 58 | bool fecfix_ = false; 59 | }; 60 | } // namespace flightaware::faup978 61 | 62 | #endif 63 | -------------------------------------------------------------------------------- /fec.h: -------------------------------------------------------------------------------- 1 | // -*- c++ -*- 2 | 3 | // Copyright (c) 2019, FlightAware LLC. 4 | // All rights reserved. 5 | // Licensed under the 2-clause BSD license; see the LICENSE file 6 | 7 | #ifndef UAT_FEC_H 8 | #define UAT_FEC_H 9 | 10 | #include 11 | 12 | #include "common.h" 13 | 14 | namespace flightaware::uat { 15 | // Deinterleaving and error-correction of UAT messages. 16 | // This delegates to the "fec" library (in fec/) for the actual Reed-Solomon 17 | // error-correction work. 18 | class FEC { 19 | public: 20 | FEC(); 21 | ~FEC(); 22 | 23 | // Given DOWNLINK_LONG_BYTES of demodulated data, returns a tuple of: 24 | // bool - true if the message is good, false if it was uncorrectable. 25 | // Bytes - a buffer containing the corrected data with FEC bits removed; 26 | // this will be either DOWNLINK_SHORT_DATA_BYTES or 27 | // DOWNLINK_LONG_DATA_BYTES in size depending on the detected 28 | // message type. Empty if the message was uncorrectable. 29 | // unsigned - the number of errors corrected. 0 if the message was 30 | // uncorrectable 31 | // `erasures` is an optional vector of indexes into `raw` that should be 32 | // handled as erasures 33 | std::tuple CorrectDownlink(const Bytes &raw, const std::vector &erasures = {}); 34 | 35 | // Given UPLINK_BYTES of demodulated data, returns a tuple of: 36 | // bool - true if the message is good, false if it was uncorrectable. 37 | // Bytes - a buffer containing the deinterleaved, corrected data with 38 | // FEC bits removed; this will be exactly UPLINK_DATA_BYTES 39 | // in size. Empty if the message was uncorrectable. 40 | // unsigned - the number of errors corrected. 0 if the message was 41 | // uncorrectable 42 | // `erasures` is an optional vector of indexes into `raw` that should be 43 | // handled as erasures 44 | std::tuple CorrectUplink(const Bytes &raw, const std::vector &erasures = {}); 45 | 46 | private: 47 | void *rs_uplink_; 48 | void *rs_downlink_short_; 49 | void *rs_downlink_long_; 50 | }; 51 | }; // namespace flightaware::uat 52 | 53 | #endif 54 | -------------------------------------------------------------------------------- /legacy/Makefile: -------------------------------------------------------------------------------- 1 | CFLAGS+=-O2 -g -Wall -Werror -Ifec 2 | LDFLAGS= 3 | LIBS=-lm 4 | CC=gcc 5 | 6 | all: dump978 uat2json uat2text uat2esnt extract_nexrad 7 | 8 | %.o: %.c *.h 9 | $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@ 10 | 11 | dump978: dump978.o fec.o fec/decode_rs_char.o fec/init_rs_char.o 12 | $(CC) -g -o $@ $^ $(LDFLAGS) $(LIBS) 13 | 14 | uat2json: uat2json.o uat_decode.o reader.o 15 | $(CC) -g -o $@ $^ $(LDFLAGS) $(LIBS) 16 | 17 | uat2text: uat2text.o uat_decode.o reader.o 18 | $(CC) -g -o $@ $^ $(LDFLAGS) $(LIBS) 19 | 20 | uat2esnt: uat2esnt.o uat_decode.o reader.o 21 | $(CC) -g -o $@ $^ $(LDFLAGS) $(LIBS) 22 | 23 | extract_nexrad: extract_nexrad.o uat_decode.o reader.o 24 | $(CC) -g -o $@ $^ $(LDFLAGS) $(LIBS) 25 | 26 | fec_tests: fec_tests.o fec.o fec/decode_rs_char.o fec/init_rs_char.o 27 | $(CC) -g -o $@ $^ $(LDFLAGS) $(LIBS) 28 | 29 | test: fec_tests 30 | ./fec_tests 31 | 32 | clean: 33 | rm -f *~ *.o fec/*.o dump978 uat2json uat2text uat2esnt fec_tests 34 | -------------------------------------------------------------------------------- /legacy/README.md: -------------------------------------------------------------------------------- 1 | # dump978 2 | 3 | Experimental demodulator/decoder for 978MHz UAT signals. 4 | 5 | ## A note about future development 6 | 7 | I'm in Europe which doesn't use UAT, so there won't be much spontaneous 8 | development going on now that the demodulator is at a basic "it works" stage. 9 | 10 | I'm happy to look at signal or message captures and help with further 11 | development, but it really needs to be driven by whoever is actually using the 12 | code to receive UAT! 13 | 14 | ## Demodulator 15 | 16 | dump978 is the demodulator. It expects 8-bit I/Q samples on stdin at 17 | 2.083334MHz, for example: 18 | 19 | ```` 20 | $ rtl_sdr -f 978000000 -s 2083334 -g 48 - | ./dump978 21 | ```` 22 | 23 | It outputs one one line per demodulated message, in the form: 24 | 25 | ```` 26 | +012345678..; this is an uplink message 27 | -012345678..; this is a downlink message 28 | ```` 29 | 30 | For parsers: ignore everything between the first semicolon and newline that 31 | you don't understand, it will be used for metadata later. See reader.[ch] for 32 | a reference implementation. 33 | 34 | ## Decoder 35 | 36 | To decode messages into a readable form use uat2text: 37 | 38 | ```` 39 | $ rtl_sdr -f 978000000 -s 2083334 -g 48 - | ./dump978 | ./uat2text 40 | ```` 41 | 42 | ## Sample data 43 | 44 | Around 1100 sample messages are in the file sample-data.txt.gz. They are the 45 | output of the demodulator from various RF captures I have on hand. This file 46 | can be fed to uat2text etc: 47 | 48 | $ zcat sample-data.txt.gz | ./uat2text 49 | 50 | When testing, this is much easier on your CPU (and disk space!) than starting 51 | from the raw RF captures. 52 | 53 | ## Filtering for just uplink or downlink messages 54 | 55 | As the uplink and downlink messages start with different characters, you can 56 | filter for just one type of message very easily with grep: 57 | 58 | ```` 59 | # Uplink messages only: 60 | $ zcat sample-data.txt.gz | grep "^+" | ./uat2text 61 | # Downlink messages only: 62 | $ zcat sample-data.txt.gz | grep "^-" | ./uat2text 63 | ```` 64 | 65 | ## Map generation via uat2json 66 | 67 | uat2json writes aircraft.json files in the format expected by *my fork* of 68 | [dump1090](https://github.com/mutability/dump1090)'s map html/javascript. 69 | 70 | To set up a live map feed: 71 | 72 | 1) Get a copy of [this dump1090 repository](https://github.com/mutability/dump1090). 73 | We're going to reuse its mapping html/javascript: 74 | 75 | ```` 76 | $ git clone https://github.com/mutability/dump1090 dump1090-copy 77 | ```` 78 | 79 | 2) Put the html/javascript somewhere your webserver can reach: 80 | 81 | ```` 82 | $ mkdir /var/www/dump978map 83 | $ cp -a dump1090-copy/public_html/* /var/www/dump978map/ 84 | ```` 85 | 86 | 3) Create an empty "data" subdirectory 87 | 88 | ```` 89 | $ mkdir /var/www/dump978map/data 90 | ```` 91 | 92 | 4) Feed uat2json from dump978: 93 | 94 | ```` 95 | $ rtl_sdr -f 978000000 -s 2083334 -g 48 - | \ 96 | ./dump978 | \ 97 | ./uat2json /var/www/dump978map/data 98 | ```` 99 | 100 | 5) Go look at http://localhost/dump978map/ 101 | 102 | ## uat2esnt: convert UAT ADS-B messages to Mode S ADS-B messages. 103 | 104 | Warning: This one is particularly experimental. 105 | 106 | uat2esnt accepts 978MHz UAT downlink messages on stdin and 107 | generates 1090MHz Extended Squitter messages on stdout. 108 | 109 | The generated messages mostly use DF18 with CF=6, which is 110 | for rebroadcasts of ADS-B messages (ADS-R). 111 | 112 | The output format is the "AVR" text format; this can be 113 | fed to dump1090 on port 30001 by default. Other ADS-B tools 114 | may accept it too - e.g. VRS seems to accept most of it (though 115 | it ignores DF18 CF=5 messages which are generated for 116 | non-ICAO-address callsign/squawk information. 117 | 118 | You'll want a pipeline like this: 119 | 120 | ```` 121 | $ rtl_sdr -f 978000000 -s 2083334 -g 48 - | \ 122 | ./dump978 | \ 123 | ./uat2esnt | \ 124 | nc -q1 localhost 30001 125 | ```` 126 | -------------------------------------------------------------------------------- /legacy/fec.c: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright 2015, Oliver Jowett 3 | // 4 | 5 | // This file is free software: you may copy, redistribute and/or modify it 6 | // under the terms of the GNU General Public License as published by the 7 | // Free Software Foundation, either version 2 of the License, or (at your 8 | // option) any later version. 9 | // 10 | // This file is distributed in the hope that it will be useful, but 11 | // WITHOUT ANY WARRANTY; without even the implied warranty of 12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 | // General Public License for more details. 14 | // 15 | // You should have received a copy of the GNU General Public License 16 | // along with this program. If not, see . 17 | 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | 25 | #include "uat.h" 26 | #include "fec/rs.h" 27 | 28 | static void *rs_uplink; 29 | static void *rs_adsb_short; 30 | static void *rs_adsb_long; 31 | 32 | #define UPLINK_POLY 0x187 33 | #define ADSB_POLY 0x187 34 | 35 | void init_fec(void) 36 | { 37 | rs_adsb_short = init_rs_char(8, /* gfpoly */ ADSB_POLY, /* fcr */ 120, /* prim */ 1, /* nroots */ 12, /* pad */ 225); 38 | rs_adsb_long = init_rs_char(8, /* gfpoly */ ADSB_POLY, /* fcr */ 120, /* prim */ 1, /* nroots */ 14, /* pad */ 207); 39 | rs_uplink = init_rs_char(8, /* gfpoly */ UPLINK_POLY, /* fcr */ 120, /* prim */ 1, /* nroots */ 20, /* pad */ 163); 40 | } 41 | 42 | int correct_adsb_frame(uint8_t *to, int *rs_errors) 43 | { 44 | // Try decoding as a Long UAT. 45 | // We rely on decode_rs_char not modifying the data if there were 46 | // uncorrectable errors. 47 | int n_corrected = decode_rs_char(rs_adsb_long, to, NULL, 0); 48 | if (n_corrected >= 0 && n_corrected <= 7 && (to[0]>>3) != 0) { 49 | // Valid long frame. 50 | *rs_errors = n_corrected; 51 | return 2; 52 | } 53 | 54 | // Retry as Basic UAT 55 | n_corrected = decode_rs_char(rs_adsb_short, to, NULL, 0); 56 | if (n_corrected >= 0 && n_corrected <= 6 && (to[0]>>3) == 0) { 57 | // Valid short frame 58 | *rs_errors = n_corrected; 59 | return 1; 60 | } 61 | 62 | // Failed. 63 | *rs_errors = 9999; 64 | return -1; 65 | } 66 | 67 | int correct_uplink_frame(uint8_t *from, uint8_t *to, int *rs_errors) 68 | { 69 | int block; 70 | int total_corrected = 0; 71 | 72 | for (block = 0; block < UPLINK_FRAME_BLOCKS; ++block) { 73 | int i, n_corrected; 74 | uint8_t *blockdata = &to[block * UPLINK_BLOCK_DATA_BYTES]; 75 | 76 | for (i = 0; i < UPLINK_BLOCK_BYTES; ++i) 77 | blockdata[i] = from[i * UPLINK_FRAME_BLOCKS + block]; 78 | 79 | // error-correct in place 80 | n_corrected = decode_rs_char(rs_uplink, blockdata, NULL, 0); 81 | if (n_corrected < 0 || n_corrected > 10) { 82 | // Failed 83 | *rs_errors = 9999; 84 | return -1; 85 | } 86 | 87 | total_corrected += n_corrected; 88 | // next block (if there is one) will overwrite the ECC bytes. 89 | } 90 | 91 | *rs_errors = total_corrected; 92 | return 1; 93 | } 94 | -------------------------------------------------------------------------------- /legacy/fec.h: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright 2015, Oliver Jowett 3 | // 4 | 5 | // This file is free software: you may copy, redistribute and/or modify it 6 | // under the terms of the GNU General Public License as published by the 7 | // Free Software Foundation, either version 2 of the License, or (at your 8 | // option) any later version. 9 | // 10 | // This file is distributed in the hope that it will be useful, but 11 | // WITHOUT ANY WARRANTY; without even the implied warranty of 12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 | // General Public License for more details. 14 | // 15 | // You should have received a copy of the GNU General Public License 16 | // along with this program. If not, see . 17 | 18 | #ifndef DUMP978_FEC_H 19 | #define DUMP978_FEC_H 20 | 21 | /* Initialize. Must be called once before correct_* */ 22 | void init_fec(void); 23 | 24 | /* Correct a downlink frame. 25 | * 26 | * 'to' should contain LONG_FRAME_BYTES of data. 27 | * Errors are corrected in-place within 'to'. 28 | * Returns -1 on uncorrectable errors, 1 for a valid basic frame, 2 for a valid long frame. 29 | * Sets *rs_errors to the number of corrected errors, or 9999 if uncorrectable. 30 | */ 31 | int correct_adsb_frame(uint8_t *to, int *rs_errors); 32 | 33 | /* Deinterleave and correct an uplink frame. 34 | * 35 | * 'from' should point to UPLINK_FRAME_BYTES of interleaved input data 36 | * 'to' should point to UPLINK_FRAME_BYTES of space for output data 37 | * (only the first UPLINK_FRAME_DATA_BYTES will contain useful data) 38 | * Blocks are deinterleaved and corrected, and written to 'to'. 39 | * Returns -1 on uncorrectable errors, 1 for a valid uplink frame. 40 | * Sets *rs_errors to the number of corrected errors, or 9999 if uncorrectable. 41 | */ 42 | int correct_uplink_frame(uint8_t *from, uint8_t *to, int *rs_errors); 43 | 44 | #endif 45 | -------------------------------------------------------------------------------- /legacy/reader.h: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright 2015, Oliver Jowett 3 | // 4 | 5 | // This file is free software: you may copy, redistribute and/or modify it 6 | // under the terms of the GNU General Public License as published by the 7 | // Free Software Foundation, either version 2 of the License, or (at your 8 | // option) any later version. 9 | // 10 | // This file is distributed in the hope that it will be useful, but 11 | // WITHOUT ANY WARRANTY; without even the implied warranty of 12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 | // General Public License for more details. 14 | // 15 | // You should have received a copy of the GNU General Public License 16 | // along with this program. If not, see . 17 | 18 | #ifndef DUMP978_READER_H 19 | #define DUMP978_READER_H 20 | 21 | #include 22 | 23 | struct dump978_reader; 24 | 25 | typedef enum { UAT_UPLINK, UAT_DOWNLINK } frame_type_t; 26 | 27 | // Function pointer type for a handler called by dump978_read_frames(). 28 | // It is called with arguments: 29 | // t: frame type (UAT_UPLINK or UAT_DOWNLINK) 30 | // f: pointer to frame data buffer 31 | // l: length of frame data 32 | // d: value of handler_data passed to dump978_read_frames 33 | // The frame data buffer is a shared buffer owned by the caller 34 | // and may be reused after return; if the handler needs to 35 | // preserve the data after returning, it should take a copy. 36 | typedef void (*frame_handler_t)(frame_type_t t,uint8_t *f,int l,void *d); 37 | 38 | // Allocate a new reader that reads from file descriptor 'fd'. 39 | // If 'nonblock' is nonzero, the FD will be made nonblocking. 40 | // Returns the reader, or NULL on error with errno set. 41 | struct dump978_reader *dump978_reader_new(int fd, int nonblock); 42 | 43 | // Free a reader previously created by dump978_reader_new. 44 | // Does not close the underlying file descriptor. 45 | void dump978_reader_free(struct dump978_reader *reader); 46 | 47 | // Read frames from the given reader. 48 | // Pass complete frames to 'handler', passing 'handler_data' 49 | // as the 4th argument. 50 | // 51 | // Returns a positive number of frames read on success. 52 | // Returns 0 on EOF 53 | // Returns <0 on error with errno set. 54 | // If the underlying FD is nonblocking and no frames are 55 | // available, returns <0 with errno = EAGAIN/EINTR/EWOULDBLOCK. 56 | int dump978_read_frames(struct dump978_reader *reader, 57 | frame_handler_t handler, 58 | void *handler_data); 59 | 60 | #endif 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /legacy/uat.h: -------------------------------------------------------------------------------- 1 | // Part of dump978, a UAT decoder. 2 | // 3 | // Copyright 2015, Oliver Jowett 4 | // 5 | // This file is free software: you may copy, redistribute and/or modify it 6 | // under the terms of the GNU General Public License as published by the 7 | // Free Software Foundation, either version 2 of the License, or (at your 8 | // option) any later version. 9 | // 10 | // This file is distributed in the hope that it will be useful, but 11 | // WITHOUT ANY WARRANTY; without even the implied warranty of 12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 | // General Public License for more details. 14 | // 15 | // You should have received a copy of the GNU General Public License 16 | // along with this program. If not, see . 17 | 18 | #ifndef UAT_H 19 | #define UAT_H 20 | 21 | // Frame size constants 22 | 23 | #define SHORT_FRAME_DATA_BITS (144) 24 | #define SHORT_FRAME_BITS (SHORT_FRAME_DATA_BITS+96) 25 | #define SHORT_FRAME_DATA_BYTES (SHORT_FRAME_DATA_BITS/8) 26 | #define SHORT_FRAME_BYTES (SHORT_FRAME_BITS/8) 27 | 28 | #define LONG_FRAME_DATA_BITS (272) 29 | #define LONG_FRAME_BITS (LONG_FRAME_DATA_BITS+112) 30 | #define LONG_FRAME_DATA_BYTES (LONG_FRAME_DATA_BITS/8) 31 | #define LONG_FRAME_BYTES (LONG_FRAME_BITS/8) 32 | 33 | #define UPLINK_BLOCK_DATA_BITS (576) 34 | #define UPLINK_BLOCK_BITS (UPLINK_BLOCK_DATA_BITS+160) 35 | #define UPLINK_BLOCK_DATA_BYTES (UPLINK_BLOCK_DATA_BITS/8) 36 | #define UPLINK_BLOCK_BYTES (UPLINK_BLOCK_BITS/8) 37 | 38 | #define UPLINK_FRAME_BLOCKS (6) 39 | #define UPLINK_FRAME_DATA_BITS (UPLINK_FRAME_BLOCKS * UPLINK_BLOCK_DATA_BITS) 40 | #define UPLINK_FRAME_BITS (UPLINK_FRAME_BLOCKS * UPLINK_BLOCK_BITS) 41 | #define UPLINK_FRAME_DATA_BYTES (UPLINK_FRAME_DATA_BITS/8) 42 | #define UPLINK_FRAME_BYTES (UPLINK_FRAME_BITS/8) 43 | 44 | #endif 45 | -------------------------------------------------------------------------------- /legacy/uat2text.c: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright 2015, Oliver Jowett 3 | // 4 | 5 | // This file is free software: you may copy, redistribute and/or modify it 6 | // under the terms of the GNU General Public License as published by the 7 | // Free Software Foundation, either version 2 of the License, or (at your 8 | // option) any later version. 9 | // 10 | // This file is distributed in the hope that it will be useful, but 11 | // WITHOUT ANY WARRANTY; without even the implied warranty of 12 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 | // General Public License for more details. 14 | // 15 | // You should have received a copy of the GNU General Public License 16 | // along with this program. If not, see . 17 | 18 | #include 19 | 20 | #include "uat.h" 21 | #include "uat_decode.h" 22 | #include "reader.h" 23 | 24 | void handle_frame(frame_type_t type, uint8_t *frame, int len, void *extra) 25 | { 26 | if (type == UAT_DOWNLINK) { 27 | struct uat_adsb_mdb mdb; 28 | uat_decode_adsb_mdb(frame, &mdb); 29 | uat_display_adsb_mdb(&mdb, stdout); 30 | } else { 31 | struct uat_uplink_mdb mdb; 32 | uat_decode_uplink_mdb(frame, &mdb); 33 | uat_display_uplink_mdb(&mdb, stdout); 34 | } 35 | 36 | fprintf(stdout, "\n"); 37 | fflush(stdout); 38 | } 39 | 40 | int main(int argc, char **argv) 41 | { 42 | struct dump978_reader *reader; 43 | int framecount; 44 | 45 | reader = dump978_reader_new(0,0); 46 | if (!reader) { 47 | perror("dump978_reader_new"); 48 | return 1; 49 | } 50 | 51 | while ((framecount = dump978_read_frames(reader, handle_frame, NULL)) > 0) 52 | ; 53 | 54 | if (framecount < 0) { 55 | perror("dump978_read_frames"); 56 | return 1; 57 | } 58 | 59 | return 0; 60 | } 61 | 62 | -------------------------------------------------------------------------------- /libs/fec/README: -------------------------------------------------------------------------------- 1 | This directory contains just the Reed-Solomon decoder parts 2 | of the fec-3.0.1 library by Phil Karn. 3 | 4 | The full version of the library may be found at 5 | http://www.ka9q.net/code/fec/ 6 | 7 | It additionally includes some bugfixes cherry-picked from 8 | https://github.com/fblomqvi/libfec/ 9 | 10 | See README.fec for the original library README and license 11 | information. 12 | -------------------------------------------------------------------------------- /libs/fec/char.h: -------------------------------------------------------------------------------- 1 | /* Stuff specific to the 8-bit symbol version of the general purpose RS codecs 2 | * 3 | * Copyright 2003, Phil Karn, KA9Q 4 | * May be used under the terms of the GNU Lesser General Public License (LGPL) 5 | */ 6 | typedef unsigned char data_t; 7 | 8 | #define MODNN(x) modnn(rs,x) 9 | 10 | #define MM (rs->mm) 11 | #define NN (rs->nn) 12 | #define ALPHA_TO (rs->alpha_to) 13 | #define INDEX_OF (rs->index_of) 14 | #define GENPOLY (rs->genpoly) 15 | #define NROOTS (rs->nroots) 16 | #define FCR (rs->fcr) 17 | #define PRIM (rs->prim) 18 | #define IPRIM (rs->iprim) 19 | #define PAD (rs->pad) 20 | #define A0 (NN) 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /libs/fec/decode_rs_char.c: -------------------------------------------------------------------------------- 1 | /* General purpose Reed-Solomon decoder for 8-bit symbols or less 2 | * Copyright 2003 Phil Karn, KA9Q 3 | * May be used under the terms of the GNU Lesser General Public License (LGPL) 4 | */ 5 | 6 | #ifdef DEBUG 7 | #include 8 | #endif 9 | 10 | #include 11 | 12 | #include "char.h" 13 | #include "rs-common.h" 14 | 15 | int decode_rs_char(void *p, data_t *data, int *eras_pos, int no_eras){ 16 | int retval; 17 | struct rs *rs = (struct rs *)p; 18 | 19 | #include "decode_rs.h" 20 | 21 | return retval; 22 | } 23 | -------------------------------------------------------------------------------- /libs/fec/encode_rs.c: -------------------------------------------------------------------------------- 1 | /* Reed-Solomon encoder 2 | * Copyright 2002, Phil Karn, KA9Q 3 | * May be used under the terms of the GNU Lesser General Public License (LGPL) 4 | */ 5 | #include 6 | 7 | #ifdef FIXED 8 | #include "fixed.h" 9 | #elif defined(BIGSYM) 10 | #include "int.h" 11 | #else 12 | #include "char.h" 13 | #endif 14 | 15 | void ENCODE_RS( 16 | #ifdef FIXED 17 | data_t *data, data_t *bb,int pad){ 18 | #else 19 | void *p,data_t *data, data_t *bb){ 20 | struct rs *rs = (struct rs *)p; 21 | #endif 22 | int i, j; 23 | data_t feedback; 24 | 25 | #ifdef FIXED 26 | /* Check pad parameter for validity */ 27 | if(pad < 0 || pad >= NN) 28 | return; 29 | #endif 30 | 31 | memset(bb,0,NROOTS*sizeof(data_t)); 32 | 33 | for(i=0;i) must be included by the calling 23 | * program. 24 | 25 | * Copyright 2004, Phil Karn, KA9Q 26 | * May be used under the terms of the GNU Lesser General Public License (LGPL) 27 | */ 28 | 29 | 30 | #undef A0 31 | #define A0 (NN) /* Special reserved value encoding zero in index form */ 32 | 33 | { 34 | int i, j; 35 | data_t feedback; 36 | 37 | memset(parity,0,NROOTS*sizeof(data_t)); 38 | 39 | for(i=0;i 6 | 7 | #include "char.h" 8 | #include "rs-common.h" 9 | 10 | void encode_rs_char(void *p,data_t *data, data_t *parity){ 11 | struct rs *rs = (struct rs *)p; 12 | 13 | #include "encode_rs.h" 14 | 15 | } 16 | -------------------------------------------------------------------------------- /libs/fec/init_rs.h: -------------------------------------------------------------------------------- 1 | /* Common code for intializing a Reed-Solomon control block (char or int symbols) 2 | * Copyright 2004 Phil Karn, KA9Q 3 | * May be used under the terms of the GNU Lesser General Public License (LGPL) 4 | */ 5 | #undef NULL 6 | #define NULL ((void *)0) 7 | 8 | { 9 | int i, j, sr,root,iprim; 10 | 11 | rs = NULL; 12 | /* Check parameter ranges */ 13 | if(symsize < 0 || symsize > 8*sizeof(data_t)){ 14 | goto done; 15 | } 16 | 17 | if(fcr < 0 || fcr >= (1<= (1<= (1<= ((1<mm = symsize; 31 | rs->nn = (1<pad = pad; 33 | 34 | rs->alpha_to = (data_t *)malloc(sizeof(data_t)*(rs->nn+1)); 35 | if(rs->alpha_to == NULL){ 36 | free(rs); 37 | rs = NULL; 38 | goto done; 39 | } 40 | rs->index_of = (data_t *)malloc(sizeof(data_t)*(rs->nn+1)); 41 | if(rs->index_of == NULL){ 42 | free(rs->alpha_to); 43 | free(rs); 44 | rs = NULL; 45 | goto done; 46 | } 47 | 48 | /* Generate Galois field lookup tables */ 49 | rs->index_of[0] = A0; /* log(zero) = -inf */ 50 | rs->alpha_to[A0] = 0; /* alpha**-inf = 0 */ 51 | sr = 1; 52 | for(i=0;inn;i++){ 53 | rs->index_of[sr] = i; 54 | rs->alpha_to[i] = sr; 55 | sr <<= 1; 56 | if(sr & (1<nn; 59 | } 60 | if(sr != 1){ 61 | /* field generator polynomial is not primitive! */ 62 | free(rs->alpha_to); 63 | free(rs->index_of); 64 | free(rs); 65 | rs = NULL; 66 | goto done; 67 | } 68 | 69 | /* Form RS code generator polynomial from its roots */ 70 | rs->genpoly = (data_t *)malloc(sizeof(data_t)*(nroots+1)); 71 | if(rs->genpoly == NULL){ 72 | free(rs->alpha_to); 73 | free(rs->index_of); 74 | free(rs); 75 | rs = NULL; 76 | goto done; 77 | } 78 | rs->fcr = fcr; 79 | rs->prim = prim; 80 | rs->nroots = nroots; 81 | 82 | /* Find prim-th root of 1, used in decoding */ 83 | for(iprim=1;(iprim % prim) != 0;iprim += rs->nn) 84 | ; 85 | rs->iprim = iprim / prim; 86 | 87 | rs->genpoly[0] = 1; 88 | for (i = 0,root=fcr*prim; i < nroots; i++,root += prim) { 89 | rs->genpoly[i+1] = 1; 90 | 91 | /* Multiply rs->genpoly[] by @**(root + x) */ 92 | for (j = i; j > 0; j--){ 93 | if (rs->genpoly[j] != 0) 94 | rs->genpoly[j] = rs->genpoly[j-1] ^ rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[j]] + root)]; 95 | else 96 | rs->genpoly[j] = rs->genpoly[j-1]; 97 | } 98 | /* rs->genpoly[0] can never be zero */ 99 | rs->genpoly[0] = rs->alpha_to[modnn(rs,rs->index_of[rs->genpoly[0]] + root)]; 100 | } 101 | /* convert rs->genpoly[] to index form for quicker encoding */ 102 | for (i = 0; i <= nroots; i++) 103 | rs->genpoly[i] = rs->index_of[rs->genpoly[i]]; 104 | done:; 105 | 106 | } 107 | -------------------------------------------------------------------------------- /libs/fec/init_rs_char.c: -------------------------------------------------------------------------------- 1 | /* Initialize a RS codec 2 | * 3 | * Copyright 2002 Phil Karn, KA9Q 4 | * May be used under the terms of the GNU Lesser General Public License (LGPL) 5 | */ 6 | #include 7 | 8 | #include "char.h" 9 | #include "rs-common.h" 10 | 11 | void free_rs_char(void *p){ 12 | struct rs *rs = (struct rs *)p; 13 | 14 | free(rs->alpha_to); 15 | free(rs->index_of); 16 | free(rs->genpoly); 17 | free(rs); 18 | } 19 | 20 | /* Initialize a Reed-Solomon codec 21 | * symsize = symbol size, bits 22 | * gfpoly = Field generator polynomial coefficients 23 | * fcr = first root of RS code generator polynomial, index form 24 | * prim = primitive element to generate polynomial roots 25 | * nroots = RS code generator polynomial degree (number of roots) 26 | * pad = padding bytes at front of shortened block 27 | */ 28 | void *init_rs_char(int symsize,int gfpoly,int fcr,int prim, 29 | int nroots,int pad){ 30 | struct rs *rs; 31 | 32 | #include "init_rs.h" 33 | 34 | return rs; 35 | } 36 | -------------------------------------------------------------------------------- /libs/fec/rs-common.h: -------------------------------------------------------------------------------- 1 | /* Stuff common to all the general-purpose Reed-Solomon codecs 2 | * Copyright 2004 Phil Karn, KA9Q 3 | * May be used under the terms of the GNU Lesser General Public License (LGPL) 4 | */ 5 | 6 | #define RS_ERROR_DEG_LAMBDA_ZERO -1 7 | #define RS_ERROR_IMPOSSIBLE_ERR_POS -2 8 | #define RS_ERROR_DEG_LAMBDA_NEQ_COUNT -3 9 | #define RS_ERROR_NOT_A_CODEWORD -4 10 | 11 | /* Reed-Solomon codec control block */ 12 | struct rs { 13 | int mm; /* Bits per symbol */ 14 | int nn; /* Symbols per block (= (1<= rs->nn) { 27 | x -= rs->nn; 28 | x = (x >> rs->mm) + (x & rs->nn); 29 | } 30 | return x; 31 | } 32 | -------------------------------------------------------------------------------- /libs/fec/rs.h: -------------------------------------------------------------------------------- 1 | /* User include file for libfec 2 | * Copyright 2004, Phil Karn, KA9Q 3 | * May be used under the terms of the GNU Lesser General Public License (LGPL) 4 | */ 5 | 6 | #ifndef _FEC_RS_H_ 7 | #define _FEC_RS_H_ 8 | 9 | /* General purpose RS codec, 8-bit symbols */ 10 | void encode_rs_char(void *rs,unsigned char *data,unsigned char *parity); 11 | int decode_rs_char(void *rs,unsigned char *data,int *eras_pos, 12 | int no_eras); 13 | void *init_rs_char(int symsize,int gfpoly, 14 | int fcr,int prim,int nroots, 15 | int pad); 16 | void free_rs_char(void *rs); 17 | 18 | #endif 19 | -------------------------------------------------------------------------------- /message_dispatch.cc: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019, FlightAware LLC. 2 | // All rights reserved. 3 | // Licensed under the 2-clause BSD license; see the LICENSE file 4 | 5 | #include "message_dispatch.h" 6 | 7 | #include 8 | #include 9 | 10 | using namespace flightaware::uat; 11 | 12 | MessageDispatch::MessageDispatch() : next_handle_(0), busy_(0) {} 13 | 14 | MessageDispatch::Handle MessageDispatch::AddClient(MessageHandler handler) { 15 | std::unique_lock lock(mutex_); 16 | 17 | Handle h = next_handle_++; 18 | clients_[h] = {handler, false}; 19 | return h; 20 | } 21 | 22 | void MessageDispatch::RemoveClient(Handle h) { 23 | std::unique_lock lock(mutex_); 24 | 25 | auto i = clients_.find(h); 26 | if (i == clients_.end()) 27 | return; 28 | 29 | i->second.deleted = true; 30 | PurgeDeadClients(); 31 | } 32 | 33 | template class BusyCounter { 34 | public: 35 | BusyCounter(T &var) : var_(var), owned_(true) { ++var_; } 36 | 37 | BusyCounter(const T &) = delete; 38 | BusyCounter &operator=(const T &) = delete; 39 | 40 | ~BusyCounter() { release(); } 41 | 42 | void release() { 43 | if (owned_) { 44 | --var_; 45 | owned_ = false; 46 | } 47 | } 48 | 49 | private: 50 | T &var_; 51 | bool owned_; 52 | }; 53 | 54 | void MessageDispatch::Dispatch(SharedMessageVector messages) { 55 | std::unique_lock lock(mutex_); 56 | 57 | BusyCounter counter(busy_); 58 | for (auto i = clients_.begin(); i != clients_.end(); ++i) { 59 | Client &c = i->second; 60 | if (!c.deleted) 61 | c.handler(messages); 62 | } 63 | counter.release(); 64 | 65 | PurgeDeadClients(); 66 | } 67 | 68 | void MessageDispatch::PurgeDeadClients() { 69 | // caller must lock! 70 | if (busy_) 71 | return; 72 | 73 | for (auto i = clients_.begin(); i != clients_.end();) { 74 | Client &c = i->second; 75 | if (c.deleted) 76 | clients_.erase(i++); 77 | else 78 | ++i; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /message_dispatch.h: -------------------------------------------------------------------------------- 1 | // -*- c++ -*- 2 | 3 | // Copyright (c) 2019, FlightAware LLC. 4 | // All rights reserved. 5 | // Licensed under the 2-clause BSD license; see the LICENSE file 6 | 7 | #ifndef MESSAGE_DISPATCH_H 8 | #define MESSAGE_DISPATCH_H 9 | 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | #include "uat_message.h" 16 | 17 | namespace flightaware::uat { 18 | class MessageDispatch { 19 | public: 20 | typedef unsigned Handle; 21 | typedef std::function MessageHandler; 22 | 23 | MessageDispatch(); 24 | MessageDispatch(const MessageDispatch &) = delete; 25 | MessageDispatch &operator=(const MessageDispatch &) = delete; 26 | 27 | Handle AddClient(MessageHandler handler); 28 | void RemoveClient(Handle client); 29 | 30 | void Dispatch(SharedMessageVector messages); 31 | 32 | protected: 33 | void PurgeDeadClients(); 34 | 35 | private: 36 | std::recursive_mutex mutex_; 37 | Handle next_handle_; 38 | unsigned busy_; 39 | 40 | struct Client { 41 | MessageHandler handler; 42 | bool deleted; 43 | }; 44 | 45 | std::map clients_; 46 | }; 47 | }; // namespace flightaware::uat 48 | 49 | #endif 50 | -------------------------------------------------------------------------------- /message_source.h: -------------------------------------------------------------------------------- 1 | // -*- c++ -*- 2 | 3 | // Copyright (c) 2019, FlightAware LLC. 4 | // All rights reserved. 5 | // Licensed under the 2-clause BSD license; see the LICENSE file 6 | 7 | #ifndef DUMP978_MESSAGE_SOURCE_H 8 | #define DUMP978_MESSAGE_SOURCE_H 9 | 10 | #include 11 | 12 | #include "uat_message.h" 13 | 14 | namespace flightaware::uat { 15 | class MessageSource { 16 | public: 17 | typedef std::shared_ptr Pointer; 18 | typedef std::function Consumer; 19 | typedef std::function ErrorHandler; 20 | 21 | virtual ~MessageSource() {} 22 | 23 | void SetConsumer(Consumer consumer) { consumer_ = consumer; } 24 | void SetErrorHandler(ErrorHandler handler) { error_handler_ = handler; } 25 | 26 | virtual void Start() {} 27 | virtual void Stop() {} 28 | 29 | protected: 30 | void DispatchMessages(SharedMessageVector messages) { 31 | if (consumer_) { 32 | consumer_(messages); 33 | } 34 | } 35 | 36 | void DispatchError(const boost::system::error_code &ec) { 37 | if (error_handler_) { 38 | error_handler_(ec); 39 | } 40 | } 41 | 42 | private: 43 | Consumer consumer_; 44 | ErrorHandler error_handler_; 45 | }; 46 | }; // namespace flightaware::uat 47 | 48 | #endif 49 | -------------------------------------------------------------------------------- /prepare-build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # This script prepares a package tree for building on different target 4 | # distributions 5 | 6 | if [ $# -lt 1 ] 7 | then 8 | echo "Syntax: $0 [target]" >&2 9 | echo "" >&2 10 | echo "Prepares a package tree in (default package-) ready for building" >&2 11 | exit 1 12 | fi 13 | 14 | export DEBFULLNAME=${DEBFULLNAME:-FlightAware build automation} 15 | export DEBEMAIL=${DEBEMAIL:-adsb-devs@flightaware.com} 16 | 17 | TOP=`dirname $0` 18 | DIST=$1 19 | OUT=$2 20 | 21 | if [ -n "$OUT" ] 22 | then 23 | OUT=$(realpath $OUT) 24 | else 25 | OUT=$(realpath package-$DIST) 26 | fi 27 | 28 | if [ -e $OUT ] 29 | then 30 | echo "$OUT already exists, refusing to overwrite it" >&2 31 | exit 1 32 | fi 33 | 34 | FILES=$(find $TOP -mindepth 1 -maxdepth 1 -name .git -prune -o -name 'debian*' -prune -o -name 'package-*' -prune -o -print) 35 | mkdir -p $OUT 36 | cp -a $FILES $OUT 37 | cp -a $TOP/debian $OUT 38 | [ -d $TOP/debian-$DIST ] && cp -a $TOP/debian-$DIST/* $OUT/debian/ 39 | 40 | case "$DIST" in 41 | buster) 42 | echo "Updating changelog for buster backport build" >&2 43 | dch --changelog $OUT/debian/changelog --local ~bpo10+ --force-distribution --distribution buster-backports "Automated backport build for buster" 44 | ;; 45 | 46 | bullseye) 47 | echo "Updating changelog for bullseye backport build" >&2 48 | dch --changelog $OUT/debian/changelog --local ~bpo11+ --force-distribution --distribution bullseye-backports "Automated backport build for bullseye" 49 | ;; 50 | 51 | bookworm) 52 | ;; 53 | 54 | *) 55 | echo "Don't know how to build for a distribution named $DIST" >&2 56 | exit 1 57 | esac 58 | 59 | echo "Package tree prepared in $OUT" >&2 60 | -------------------------------------------------------------------------------- /sample-data.txt.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/sample-data.txt.gz -------------------------------------------------------------------------------- /sample_source.cc: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2019, FlightAware LLC. 2 | // All rights reserved. 3 | // Licensed under the 2-clause BSD license; see the LICENSE file 4 | 5 | #include "sample_source.h" 6 | 7 | #include 8 | #include 9 | 10 | using namespace flightaware::uat; 11 | 12 | void FileSampleSource::Start() { 13 | stream_.open(path_.native()); 14 | if (!stream_.good()) { 15 | auto ec = boost::system::error_code(errno, boost::system::system_category()); 16 | stream_.close(); 17 | DispatchError(ec); 18 | return; 19 | } 20 | 21 | next_block_ = std::chrono::steady_clock::now(); 22 | timestamp_ = 1; // always use synthetic timestamps for file sources 23 | 24 | auto self = std::static_pointer_cast(shared_from_this()); 25 | service_.post(std::bind(&FileSampleSource::ReadBlock, self, boost::system::error_code())); 26 | } 27 | 28 | void FileSampleSource::Stop() { 29 | timer_.cancel(); 30 | if (stream_.is_open()) { 31 | stream_.close(); 32 | DispatchError(boost::asio::error::eof); 33 | } 34 | } 35 | 36 | void FileSampleSource::ReadBlock(const boost::system::error_code &ec) { 37 | if (ec) { 38 | if (ec == boost::asio::error::operation_aborted) { 39 | return; 40 | } 41 | 42 | stream_.close(); 43 | DispatchError(ec); 44 | return; 45 | } 46 | 47 | if (!stream_.is_open()) { 48 | return; 49 | } 50 | 51 | block_.resize(block_.capacity()); 52 | stream_.read(reinterpret_cast(block_.data()), block_.size()); 53 | 54 | if (stream_.bad()) { 55 | auto ec = boost::system::error_code(errno, boost::system::system_category()); 56 | stream_.close(); 57 | DispatchError(ec); 58 | return; 59 | } 60 | 61 | block_.resize(stream_.gcount() - (stream_.gcount() % alignment_)); 62 | if (!block_.empty()) { 63 | DispatchBuffer(timestamp_, block_); 64 | timestamp_ += (block_.size() * 1000ULL / bytes_per_second_); 65 | } 66 | 67 | if (stream_.eof()) { 68 | stream_.close(); 69 | DispatchError(boost::asio::error::eof); 70 | return; 71 | } 72 | 73 | auto self = std::static_pointer_cast(shared_from_this()); 74 | if (throttle_) { 75 | auto delay = std::chrono::nanoseconds(1000000000ULL * block_.size() / bytes_per_second_); 76 | next_block_ += delay; 77 | timer_.expires_at(next_block_); 78 | timer_.async_wait(std::bind(&FileSampleSource::ReadBlock, self, std::placeholders::_1)); 79 | } else { 80 | service_.post(std::bind(&FileSampleSource::ReadBlock, self, boost::system::error_code())); 81 | } 82 | } 83 | 84 | // 85 | // 86 | // 87 | 88 | void StdinSampleSource::Start() { 89 | stream_.assign(::dup(STDIN_FILENO)); 90 | ScheduleRead(); 91 | } 92 | 93 | void StdinSampleSource::Stop() { 94 | if (stream_.is_open()) { 95 | stream_.close(); 96 | DispatchError(boost::asio::error::eof); 97 | } 98 | } 99 | 100 | void StdinSampleSource::ScheduleRead() { 101 | if (!stream_.is_open()) { 102 | return; 103 | } 104 | 105 | block_.resize(block_.capacity()); 106 | 107 | auto self = shared_from_this(); 108 | stream_.async_read_some(boost::asio::buffer(block_.data() + used_, block_.size() - used_), [this, self](const boost::system::error_code &ec, std::size_t bytes_transferred) { 109 | if (ec) { 110 | if (ec == boost::asio::error::operation_aborted) { 111 | return; 112 | } 113 | 114 | stream_.close(); 115 | DispatchError(ec); 116 | return; 117 | } 118 | 119 | used_ += bytes_transferred; 120 | 121 | // work out a starting timestamp 122 | static auto unix_epoch = std::chrono::system_clock::from_time_t(0); 123 | auto end_of_block = std::chrono::system_clock::now(); 124 | auto start_of_block = end_of_block - (std::chrono::milliseconds(1000) * bytes_transferred / samples_per_second_ / alignment_); 125 | std::uint64_t timestamp = std::chrono::duration_cast(start_of_block - unix_epoch).count(); 126 | 127 | // fixme, don't copy! 128 | auto trailing_bytes = used_ % alignment_; 129 | auto leading_bytes = used_ - trailing_bytes; 130 | 131 | Bytes buffer; 132 | buffer.resize(leading_bytes); 133 | std::copy(block_.begin(), block_.begin() + leading_bytes, buffer.begin()); 134 | std::copy(block_.begin() + leading_bytes, block_.end(), block_.begin()); 135 | used_ = trailing_bytes; 136 | DispatchBuffer(timestamp, buffer); 137 | ScheduleRead(); 138 | }); 139 | } 140 | -------------------------------------------------------------------------------- /skyaware/db/1.json: -------------------------------------------------------------------------------- 1 | {"02A28":{"r":"21512","t":"BER2"},"17AED":{"r":"RA-97005","t":"SU95"},"40AF1":{"t":"H25B"},"40AF2":{"t":"H25B"},"40AF3":{"t":"H25B"},"40AF4":{"t":"H25B"},"40AF6":{"t":"H25B"},"40AF8":{"t":"H25B"},"42328":{"t":"F900"},"42329":{"t":"F900"},"4232B":{"t":"F900"},"42330":{"t":"F900"},"42B11":{"t":"AN12"},"42C2D":{"t":"AN12"},"42FA3":{"t":"AN12"},"432BC":{"t":"AN12"},"4661E":{"t":"AN26"},"4A55A":{"t":"YK42"},"4A567":{"t":"YK42"},"4A571":{"t":"YK42"},"4A580":{"t":"YK42"},"4A591":{"t":"YK42"},"4A593":{"t":"YK42"},"4A594":{"t":"YK42"},"4A5AB":{"t":"YK42"},"4A5AC":{"t":"YK42"},"4A5B2":{"t":"YK42"},"4A5B8":{"t":"YK42"},"4A5B9":{"t":"YK42"},"4A5C0":{"t":"YK42"},"4A5C9":{"t":"YK42"},"4A5CA":{"t":"YK42"},"4A5CE":{"t":"YK42"},"4F105":{"t":"A148"},"4F106":{"t":"A148"},"4F107":{"t":"A148"},"4F108":{"t":"A148"},"4F109":{"t":"A148"},"4F10A":{"t":"A148"},"4F10D":{"t":"A148"},"4F10E":{"t":"A148"},"4FA0A":{"t":"T204"},"4FA11":{"t":"T204"},"4FA12":{"t":"T204"},"4FA13":{"t":"T204"},"4FA14":{"t":"T204"},"4FA15":{"t":"T204"},"4FA18":{"t":"T204"},"4FA20":{"t":"T204"},"4FA26":{"t":"T204"},"4FA27":{"t":"T204"},"4FA28":{"t":"T204"},"4FA2B":{"t":"T204"},"4FA2C":{"t":"T204"},"4FA2D":{"t":"T204"},"4FA2E":{"t":"T204"},"4FA2F":{"t":"T204"},"4FA31":{"t":"T204"},"4FA32":{"t":"T204"},"4FA39":{"t":"T204"},"4FA3A":{"t":"T204"},"4FBF8":{"t":"T204"},"4FBFD":{"t":"T204"},"4FC03":{"t":"T204"},"4FC04":{"t":"T204"},"4FC05":{"t":"T204"},"4FC06":{"t":"T204"},"4FC08":{"t":"T204"},"4FC09":{"t":"T204"},"4FC0A":{"t":"T204"},"4FC25":{"t":"T204"},"50690":{"t":"CL60"},"50691":{"t":"CL30"},"50692":{"t":"CRJ2"},"50693":{"t":"CRJ2"},"50694":{"t":"CRJ2"},"50695":{"t":"CL30"},"50696":{"t":"CL60"},"50697":{"t":"CL30"},"51D28":{"t":"B737"},"51D2C":{"t":"B737"},"51D30":{"t":"B752"},"51D31":{"t":"B752"},"51D32":{"t":"B752"},"51D33":{"t":"B752"},"51D34":{"t":"B752"},"51D36":{"t":"B752"},"51D37":{"t":"B752"},"51D38":{"t":"B752"},"51D39":{"t":"B752"},"51D3A":{"t":"B752"},"51D41":{"t":"A319"},"51D42":{"t":"A319"},"52A4A":{"t":"IL76"},"52A4B":{"t":"IL76"},"52A52":{"t":"IL76"},"52A62":{"t":"IL76"},"52A8D":{"t":"IL76"},"52AD7":{"t":"IL76"},"52ADF":{"t":"IL76"},"52BEF":{"t":"IL76"},"52C28":{"t":"IL76"},"52C29":{"t":"IL76"},"52C96":{"t":"IL76"},"52C97":{"t":"IL76"},"52C98":{"t":"IL76"},"533AD":{"t":"IL76"},"5405E":{"t":"A124"},"54077":{"t":"A124"},"54078":{"t":"A124"},"5407A":{"t":"A124"},"5407B":{"t":"A124"},"5407C":{"t":"A124"},"5407D":{"t":"A124"},"5407E":{"t":"A124"},"5407F":{"t":"A124"},"54094":{"t":"A124"},"5409A":{"t":"A124"},"5409B":{"t":"A124"},"5409D":{"t":"A124"},"5409E":{"t":"A124"},"5409F":{"t":"A124"},"540A0":{"t":"A124"},"540A1":{"t":"A124"},"54C15":{"t":"T154"},"54C18":{"t":"T154"},"54C1A":{"t":"T154"},"54C31":{"t":"T154"},"54CA3":{"t":"T154"},"54E7D":{"t":"T154"},"54E96":{"t":"T154"},"54E9B":{"t":"T154"},"54EAB":{"t":"T154"},"54EB6":{"t":"T154"},"54EE0":{"t":"T154"},"54F16":{"t":"T154"},"54F53":{"t":"T154"},"551C2":{"t":"IL62"},"551C4":{"t":"IL62"},"5521F":{"t":"IL62"},"55221":{"t":"IL62"},"5522A":{"t":"IL62"},"5522C":{"t":"IL62"},"55BA9":{"t":"SU95"},"55BAA":{"t":"SU95"},"55BAB":{"t":"SU95"},"55BAC":{"t":"SU95"},"55BAD":{"t":"SU95"},"55BAE":{"t":"SU95"},"55BAF":{"t":"SU95"},"55BB0":{"t":"SU95"},"55BB1":{"t":"SU95"},"55BB2":{"t":"SU95"},"57705":{"t":"IL96"},"57707":{"t":"IL96"},"57708":{"t":"IL96"},"5770A":{"t":"IL96"},"5770B":{"t":"IL96"},"5770F":{"t":"IL96"},"57710":{"t":"IL96"},"57712":{"t":"IL96"},"57714":{"t":"IL96"},"57765":{"t":"IL96"},"57766":{"t":"IL96"},"57767":{"t":"IL96"}} -------------------------------------------------------------------------------- /skyaware/db/2.json: -------------------------------------------------------------------------------- 1 | {"01001":{"r":"V5-NAM","t":"F900"},"01028":{"r":"V5-NMF","t":"A343"},"01029":{"r":"V5-NME","t":"A343"},"0103F":{"r":"V5-GON"},"02031":{"r":"E3-AAQ","t":"B762"}} -------------------------------------------------------------------------------- /skyaware/db/6.json: -------------------------------------------------------------------------------- 1 | {"00001":{"r":"EK-YRB","t":"A320"},"00003":{"r":"EK-YRC","t":"A320"},"00004":{"r":"EK-FOA","t":"A319"},"00005":{"r":"EK-73740","t":"B733"},"00006":{"r":"EK-73730","t":"B733"},"00007":{"r":"EK-32011","t":"A319"},"00009":{"r":"EK222","t":"TBM9"},"0000C":{"r":"EK32008","t":"A320"},"00012":{"r":"EK-SHC","t":"B735"},"00013":{"r":"EK-11001","t":"AN12"},"00015":{"r":"EK-AAB","t":"A321"},"00018":{"r":"EK-AAD","t":"A321"},"0002F":{"r":"EK-12104","t":"AN12"},"00031":{"r":"EK-FOB","t":"A320"},"0003C":{"r":"EK-RA01","t":"A319"},"00043":{"r":"EK-SBS","t":"TBM9"},"00044":{"r":"EK-TBM","t":"TBM9"},"0004A":{"r":"EK-32007","t":"A319"},"00059":{"r":"EK-95015","t":"SU95"},"0005A":{"r":"EK-95016","t":"SU95"},"0005F":{"r":"EW-412TH","t":"IL76"},"00076":{"r":"EK-74723","t":"B742"},"00079":{"r":"EK-74798","t":"B742"},"00087":{"r":"EK-74799","t":"B742"},"0009D":{"r":"EK-73775","t":"B735"},"0009F":{"r":"EK-73772","t":"B735"},"000A2":{"r":"EK-SHA","t":"B735"},"00801":{"r":"4K8888","t":"A319"},"00803":{"r":"4KAZ03","t":"A319"},"00804":{"r":"4KAZ04","t":"A319"},"00805":{"r":"4KAZ05","t":"A319"},"00806":{"r":"4KAI06","t":"GLF5"},"00807":{"r":"4KAI07","t":"A320"},"00808":{"r":"4KJJ8","t":"G280"},"0080C":{"r":"4KAZ12","t":"B752"},"00826":{"r":"4K-AZ38","t":"B752"},"00828":{"r":"4KAZ40","t":"IL76"},"00829":{"r":"4KAZ41","t":"IL76"},"0082B":{"r":"4K-AZ43","t":"B752"},"00836":{"r":"4K-AZ54","t":"A320"},"00838":{"r":"4K-AZ56","t":"AN12"},"0083C":{"r":"4KAZ60","t":"IL76"},"00840":{"r":"4KAZ64","t":"E190"},"00841":{"r":"4KAZ65","t":"E190"},"00842":{"r":"4KAZ66","t":"E190"},"00843":{"r":"4KAZ67","t":"E190"},"0084D":{"r":"4KAZ77","t":"A320"},"0084E":{"r":"4KAZ78","t":"A320"},"0084F":{"r":"4KAZ79","t":"A320"},"00850":{"r":"4KAZ80","t":"A320"},"00851":{"r":"4KAZ81","t":"B763"},"00852":{"r":"4KAZ82","t":"B763"},"00853":{"r":"4KAZ83","t":"A320"},"00854":{"r":"4KAZ84","t":"A320"},"00855":{"r":"4KAZ85","t":"A345"},"00856":{"r":"4KAZ86","t":"A345"},"00858":{"r":"4K-AZ88","t":"GALX"},"00864":{"r":"4KAZ100","t":"IL76"},"00865":{"r":"4KAZ101","t":"IL76"},"00866":{"r":"4KAZ102","t":"IL76"},"008D0":{"r":"4K-AZ208","t":"G280"},"00918":{"r":"4K-AZ280","t":"G280"},"00A2B":{"r":"4K5555","t":"A20N"},"00B20":{"r":"4KSW800","t":"B744"},"00B21":{"r":"4KSW888","t":"B744"},"00B22":{"r":"4K-BCH","t":"B744"},"00B23":{"r":"4K-BCI","t":"B744"},"00B24":{"r":"4K-BCR","t":"B744"},"00B25":{"r":"4K-BCV","t":"B744"},"00B26":{"r":"4K-BBH","t":"B748"},"00B70":{"r":"4K-SW880","t":"B763"},"00B78":{"r":"4KAZ888","t":"GLF4"},"00BB9":{"r":"4K-SW808","t":"B763"},"00BBE":{"r":"4KSW008","t":"B744"},"00BBF":{"r":"4KAZ11","t":"B752"},"00BC0":{"r":"4KAI08","t":"A346"},"00BC4":{"r":"4KAI88","t":"GLF6"},"00BC6":{"r":"4K-LAR","t":"GLF4"},"00BC7":{"r":"4KJJ888","t":"GLF5"},"00BC8":{"r":"4K-ASG","t":"GLF6"},"00BE8":{"r":"4KAI01","t":"B763"},"00BE9":{"r":"4KAI001","t":"B77L"},"01097":{"r":"EX-37008"},"010F2":{"r":"EX-32001","t":"A320"},"010F4":{"r":"EX-37001","t":"B733"},"010F9":{"r":"EX-73401","t":"B734"},"01839":{"r":"EZ-A779","t":"B77L"},"0183A":{"r":"EZ-A778","t":"B77L"},"0183B":{"r":"EZ-A017","t":"B738"},"0183C":{"r":"EZ-A016","t":"B738"},"0183D":{"r":"EZ-A015","t":"B738"},"01842":{"r":"EZ-A010","t":"B752"},"01846":{"r":"EZ-A011","t":"B752"},"01847":{"r":"EZ-A012","t":"B752"},"01849":{"r":"EZ-A014","t":"B752"},"01854":{"r":"EZ-A106","t":"B712"},"01855":{"r":"EZ-A107","t":"B712"},"01858":{"r":"EZ-A004","t":"B738"},"01859":{"r":"EZ-A005","t":"B738"},"0185A":{"r":"EZ-A007","t":"B737"},"0185E":{"r":"EZ-A006","t":"B737"},"0185F":{"r":"EZ-A008","t":"B737"},"01860":{"r":"EZ-A009","t":"B737"},"01861":{"r":"EZ-A777","t":"B772"},"80001":{"r":"A5-RGF","t":"A319"},"80002":{"r":"A5-RGG","t":"A319"},"82209":{"r":"JU-1011","t":"B763"},"8220A":{"r":"JU-1012","t":"B763"},"83037":{"r":"UP-B5701","t":"B752"},"83065":{"r":"UP-Y4204","t":"YK42"},"83088":{"r":"UP-I7620","t":"IL76"},"830A5":{"r":"UP-A2001","t":"A320"},"830BD":{"r":"UP-CS302","t":"C25B"},"830C2":{"r":"UP-K3501","t":"B350"},"830ED":{"r":"UP-A3001","t":"A332"},"830FE":{"r":"UP-K3502","t":"B350"},"831E8":{"r":"UP-T5409","t":"T154"}} -------------------------------------------------------------------------------- /skyaware/db/9.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /skyaware/db/B.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /skyaware/db/D.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /skyaware/db/F.json: -------------------------------------------------------------------------------- 1 | {"A0001":{"r":"FAV0001","t":"A319"}} -------------------------------------------------------------------------------- /skyaware/db/README: -------------------------------------------------------------------------------- 1 | This directory contains static data on some aircraft (registrations, etc) 2 | originally derived from Virtual Radar Server's BasicAircraftLookup.sqb 3 | (see tools/vrs-basicaircraft-to-json.py). As that database is no longer being 4 | updated, the data is directly included here rather than periodically refreshing 5 | from the online copy. 6 | -------------------------------------------------------------------------------- /skyaware/db/aircraft_types/README: -------------------------------------------------------------------------------- 1 | Aircraft type data was retrieved from http://www.icao.int/publications/DOC8643/ and converted to JSON format. 2 | 3 | Data was last updated on 2016-03-23 and retrieved on 2016-08-25. 4 | -------------------------------------------------------------------------------- /skyaware/flags-tiny/Afghanistan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Afghanistan.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Albania.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Albania.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Algeria.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Algeria.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/American_Samoa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/American_Samoa.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Andorra.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Andorra.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Angola.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Angola.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Anguilla.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Anguilla.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Antigua_and_Barbuda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Antigua_and_Barbuda.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Argentina.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Argentina.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Armenia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Armenia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Aruba.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Aruba.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Australia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Australia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Austria.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Austria.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Azerbaijan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Azerbaijan.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Bahamas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Bahamas.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Bahrain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Bahrain.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Bangladesh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Bangladesh.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Barbados.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Barbados.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Belarus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Belarus.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Belgium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Belgium.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Belize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Belize.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Benin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Benin.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Bermuda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Bermuda.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Bhutan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Bhutan.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Bolivia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Bolivia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Bosnia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Bosnia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Botswana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Botswana.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Brazil.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Brazil.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/British_Virgin_Islands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/British_Virgin_Islands.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Brunei.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Brunei.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Bulgaria.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Bulgaria.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Burkina_Faso.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Burkina_Faso.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Burundi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Burundi.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Cambodia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Cambodia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Cameroon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Cameroon.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Canada.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Canada.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Cape_Verde.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Cape_Verde.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Cayman_Islands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Cayman_Islands.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Central_African_Republic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Central_African_Republic.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Chad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Chad.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Chile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Chile.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/China.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/China.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Christmas_Island.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Christmas_Island.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Colombia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Colombia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Comoros.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Comoros.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Cook_Islands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Cook_Islands.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Costa_Rica.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Costa_Rica.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Cote_d_Ivoire.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Cote_d_Ivoire.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Croatia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Croatia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Cuba.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Cuba.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Cyprus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Cyprus.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Cyprus_Northern.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Cyprus_Northern.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Czech_Republic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Czech_Republic.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Democratic_Republic_of_the_Congo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Democratic_Republic_of_the_Congo.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Denmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Denmark.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Djibouti.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Djibouti.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Dominica.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Dominica.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Dominican_Republic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Dominican_Republic.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Ecuador.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Ecuador.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Egypt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Egypt.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/El_Salvador.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/El_Salvador.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Equatorial_Guinea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Equatorial_Guinea.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Eritrea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Eritrea.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Estonia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Estonia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Ethiopia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Ethiopia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Falkland_Islands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Falkland_Islands.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Faroe_Islands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Faroe_Islands.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Fiji.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Fiji.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Finland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Finland.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/France.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/France.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/French_Polynesia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/French_Polynesia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Gabon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Gabon.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Gambia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Gambia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Georgia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Georgia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Germany.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Germany.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Ghana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Ghana.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Gibraltar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Gibraltar.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Greece.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Greece.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Greenland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Greenland.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Grenada.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Grenada.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Guam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Guam.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Guatemala.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Guatemala.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Guinea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Guinea.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Guinea_Bissau.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Guinea_Bissau.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Guyana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Guyana.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Haiti.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Haiti.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Honduras.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Honduras.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Hong_Kong.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Hong_Kong.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Hungary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Hungary.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Iceland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Iceland.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/India.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/India.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Indonesia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Indonesia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Iran.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Iran.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Iraq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Iraq.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Ireland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Ireland.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Israel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Israel.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Italy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Italy.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Jamaica.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Jamaica.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Japan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Japan.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Jordan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Jordan.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Kazakhstan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Kazakhstan.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Kenya.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Kenya.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Kiribati.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Kiribati.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Kuwait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Kuwait.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Kyrgyzstan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Kyrgyzstan.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Laos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Laos.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Latvia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Latvia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Lebanon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Lebanon.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Lesotho.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Lesotho.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Liberia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Liberia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Libya.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Libya.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Liechtenstein.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Liechtenstein.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Lithuania.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Lithuania.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Luxembourg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Luxembourg.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Macao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Macao.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Macedonia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Macedonia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Madagascar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Madagascar.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Malawi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Malawi.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Malaysia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Malaysia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Maldives.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Maldives.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Mali.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Mali.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Malta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Malta.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Marshall_Islands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Marshall_Islands.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Martinique.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Martinique.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Mauritania.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Mauritania.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Mauritius.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Mauritius.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Mexico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Mexico.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Micronesia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Micronesia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Moldova.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Moldova.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Monaco.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Monaco.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Mongolia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Mongolia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Montenegro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Montenegro.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Montserrat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Montserrat.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Morocco.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Morocco.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Mozambique.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Mozambique.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Myanmar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Myanmar.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Namibia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Namibia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Nauru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Nauru.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Nepal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Nepal.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Netherlands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Netherlands.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Netherlands_Antilles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Netherlands_Antilles.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/New_Zealand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/New_Zealand.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Nicaragua.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Nicaragua.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Niger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Niger.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Nigeria.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Nigeria.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Niue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Niue.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Norfolk_Island.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Norfolk_Island.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/North_Korea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/North_Korea.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Norway.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Norway.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Oman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Oman.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Pakistan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Pakistan.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Palau.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Palau.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Panama.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Panama.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Papua_New_Guinea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Papua_New_Guinea.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Paraguay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Paraguay.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Peru.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Peru.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Philippines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Philippines.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Pitcairn_Islands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Pitcairn_Islands.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Poland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Poland.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Portugal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Portugal.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Puerto_Rico.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Puerto_Rico.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Qatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Qatar.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/README.txt: -------------------------------------------------------------------------------- 1 | This directory contains flag icons for use to display country flags in the DUMP1090 web interface. 2 | 3 | Country flag functionality submitted by Dino Moriello 4 | 5 | The flags are supplied by 6 | Free Country Flags by Gang of the Coconuts and is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. 7 | 8 | Free Country Flags: 9 | http://www.free-country-flags.com/ 10 | 11 | Creative Commons Attribution-ShareAlike 3.0 Unported License 12 | http://creativecommons.org/licenses/by-sa/3.0/ 13 | -------------------------------------------------------------------------------- /skyaware/flags-tiny/Republic_of_the_Congo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Republic_of_the_Congo.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Romania.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Romania.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Russian_Federation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Russian_Federation.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Rwanda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Rwanda.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Saint_Kitts_and_Nevis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Saint_Kitts_and_Nevis.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Saint_Lucia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Saint_Lucia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Saint_Pierre.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Saint_Pierre.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Saint_Vicent_and_the_Grenadines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Saint_Vicent_and_the_Grenadines.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Samoa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Samoa.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/San_Marino.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/San_Marino.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Sao_Tome_and_Principe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Sao_Tome_and_Principe.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Saudi_Arabia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Saudi_Arabia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Senegal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Senegal.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Serbia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Serbia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Seychelles.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Seychelles.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Sierra_Leone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Sierra_Leone.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Singapore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Singapore.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Slovakia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Slovakia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Slovenia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Slovenia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Soloman_Islands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Soloman_Islands.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Somalia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Somalia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/South_Africa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/South_Africa.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/South_Georgia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/South_Georgia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/South_Korea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/South_Korea.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Soviet_Union.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Soviet_Union.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Spain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Spain.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Sri_Lanka.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Sri_Lanka.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Sudan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Sudan.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Suriname.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Suriname.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Swaziland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Swaziland.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Sweden.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Sweden.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Switzerland.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Switzerland.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Syria.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Syria.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Taiwan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Taiwan.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Tajikistan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Tajikistan.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Tanzania.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Tanzania.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Thailand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Thailand.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Tibet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Tibet.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Timor-Leste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Timor-Leste.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Togo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Togo.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Tonga.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Tonga.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Trinidad_and_Tobago.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Trinidad_and_Tobago.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Tunisia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Tunisia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Turkey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Turkey.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Turkmenistan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Turkmenistan.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Turks_and_Caicos_Islands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Turks_and_Caicos_Islands.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Tuvalu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Tuvalu.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/UAE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/UAE.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/US_Virgin_Islands.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/US_Virgin_Islands.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Uganda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Uganda.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Ukraine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Ukraine.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/United_Kingdom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/United_Kingdom.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/United_States_of_America.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/United_States_of_America.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Uruguay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Uruguay.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Uzbekistan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Uzbekistan.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Vanuatu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Vanuatu.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Vatican_City.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Vatican_City.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Venezuela.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Venezuela.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Vietnam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Vietnam.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Wallis_and_Futuna.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Wallis_and_Futuna.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Yemen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Yemen.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Yugoslavia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Yugoslavia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Zambia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Zambia.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/Zimbabwe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/Zimbabwe.png -------------------------------------------------------------------------------- /skyaware/flags-tiny/blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/flags-tiny/blank.png -------------------------------------------------------------------------------- /skyaware/images/box-checked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/box-checked.png -------------------------------------------------------------------------------- /skyaware/images/box-checked@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/box-checked@2x.png -------------------------------------------------------------------------------- /skyaware/images/box-checked@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/box-checked@3x.png -------------------------------------------------------------------------------- /skyaware/images/box-empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/box-empty.png -------------------------------------------------------------------------------- /skyaware/images/box-empty@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/box-empty@2x.png -------------------------------------------------------------------------------- /skyaware/images/box-empty@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/box-empty@3x.png -------------------------------------------------------------------------------- /skyaware/images/close-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/close-settings.png -------------------------------------------------------------------------------- /skyaware/images/close-settings@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/close-settings@2x.png -------------------------------------------------------------------------------- /skyaware/images/close-settings@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/close-settings@3x.png -------------------------------------------------------------------------------- /skyaware/images/column-adjust.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/column-adjust.png -------------------------------------------------------------------------------- /skyaware/images/column-adjust@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/column-adjust@2x.png -------------------------------------------------------------------------------- /skyaware/images/column-adjust@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/column-adjust@3x.png -------------------------------------------------------------------------------- /skyaware/images/fa_logo_color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/fa_logo_color.png -------------------------------------------------------------------------------- /skyaware/images/fa_logo_color@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/fa_logo_color@2x.png -------------------------------------------------------------------------------- /skyaware/images/fa_logo_color@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/fa_logo_color@3x.png -------------------------------------------------------------------------------- /skyaware/images/ff-sa-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/ff-sa-logo.png -------------------------------------------------------------------------------- /skyaware/images/ff-sa-logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/ff-sa-logo@2x.png -------------------------------------------------------------------------------- /skyaware/images/ff-sa-logo@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/ff-sa-logo@3x.png -------------------------------------------------------------------------------- /skyaware/images/ff-sv-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/ff-sv-logo.png -------------------------------------------------------------------------------- /skyaware/images/ff-sv-logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/ff-sv-logo@2x.png -------------------------------------------------------------------------------- /skyaware/images/ff-sv-logo@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/ff-sv-logo@3x.png -------------------------------------------------------------------------------- /skyaware/images/hide_sidebar_active_48x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/hide_sidebar_active_48x40.png -------------------------------------------------------------------------------- /skyaware/images/hide_sidebar_inactive_48x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/hide_sidebar_inactive_48x40.png -------------------------------------------------------------------------------- /skyaware/images/icon-information@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/icon-information@2x.png -------------------------------------------------------------------------------- /skyaware/images/map-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/map-icon.png -------------------------------------------------------------------------------- /skyaware/images/map-icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/map-icon@2x.png -------------------------------------------------------------------------------- /skyaware/images/map-icon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/map-icon@3x.png -------------------------------------------------------------------------------- /skyaware/images/pa-sa-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/pa-sa-logo.png -------------------------------------------------------------------------------- /skyaware/images/pa-sa-logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/pa-sa-logo@2x.png -------------------------------------------------------------------------------- /skyaware/images/pa-sa-logo@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/pa-sa-logo@3x.png -------------------------------------------------------------------------------- /skyaware/images/pa-sv-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/pa-sv-logo.png -------------------------------------------------------------------------------- /skyaware/images/pa-sv-logo@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/pa-sv-logo@2x.png -------------------------------------------------------------------------------- /skyaware/images/pa-sv-logo@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/pa-sv-logo@3x.png -------------------------------------------------------------------------------- /skyaware/images/settings-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/settings-icon.png -------------------------------------------------------------------------------- /skyaware/images/settings-icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/settings-icon@2x.png -------------------------------------------------------------------------------- /skyaware/images/settings-icon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/settings-icon@3x.png -------------------------------------------------------------------------------- /skyaware/images/show_sidebar_active_48x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/show_sidebar_active_48x40.png -------------------------------------------------------------------------------- /skyaware/images/show_sidebar_inactive_48x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/show_sidebar_inactive_48x40.png -------------------------------------------------------------------------------- /skyaware/images/table-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/table-icon.png -------------------------------------------------------------------------------- /skyaware/images/table-icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/table-icon@2x.png -------------------------------------------------------------------------------- /skyaware/images/table-icon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/table-icon@3x.png -------------------------------------------------------------------------------- /skyaware/images/toggle-height@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/toggle-height@2x.png -------------------------------------------------------------------------------- /skyaware/images/toggle-width@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/toggle-width@2x.png -------------------------------------------------------------------------------- /skyaware/images/zoom-in.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/zoom-in.png -------------------------------------------------------------------------------- /skyaware/images/zoom-in@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/zoom-in@2x.png -------------------------------------------------------------------------------- /skyaware/images/zoom-in@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/zoom-in@3x.png -------------------------------------------------------------------------------- /skyaware/images/zoom-out.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/zoom-out.png -------------------------------------------------------------------------------- /skyaware/images/zoom-out@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/zoom-out@2x.png -------------------------------------------------------------------------------- /skyaware/images/zoom-out@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/images/zoom-out@3x.png -------------------------------------------------------------------------------- /skyaware/jquery/README: -------------------------------------------------------------------------------- 1 | This directory contains local copies of jQuery / jQuery UI; 2 | the original versions are available from jquery.com under 3 | a MIT-style license. 4 | -------------------------------------------------------------------------------- /skyaware/noUiSlider/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Issues 2 | Please, only use the issue tracker for **problems, bugs and feature requests**. 3 | 4 | For help with _implementing_ noUiSlider, please ask your question on [stackoverflow](https://stackoverflow.com/questions/tagged/nouislider). I try to look at questions posted there daily, and you will get you an answer much faster. Make sure to follow the [guidelines](https://stackoverflow.com/help/how-to-ask) of the platform. 5 | 6 | While I'm happy to help if you can't figure something out, please note that I: 7 | - Can't go and debug problems just based on screenshots; 8 | - Can't help with issues that do not include **an example with code** that reproduces it; 9 | - Won't dig through your production site or huge chunks of unrelated code; 10 | - Won't implement your business requirements for you; 11 | 12 | # Tooling 13 | 14 | Please run the following tooling before submitting a pull request: 15 | 16 | ```bash 17 | npm run lint 18 | npm run format 19 | ``` 20 | 21 | # Pull requests 22 | - Detail (in the pull request comment) what your changes do. 23 | - When applicable, include new unit tests, and make sure existing ones pass. 24 | - If you are introducing a new feature, update the **documentation**. 25 | - Please don't commit `/distribute/*` files, I'll do that upon release. 26 | -------------------------------------------------------------------------------- /skyaware/noUiSlider/LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Léon Gersen 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /skyaware/noUiSlider/README.md: -------------------------------------------------------------------------------- 1 | # noUiSlider 2 | 3 | noUiSlider is a lightweight JavaScript range slider. 4 | 5 | - **No dependencies** 6 | - All modern browsers and IE > 9 are supported 7 | - Fully **responsive** 8 | - **Multi-touch support** on Android, iOS and Windows devices 9 | - Accessible with `aria` and keyboard support 10 | - Tons of [examples](https://refreshless.com/nouislider/examples) and answered [Stack Overflow questions](https://stackoverflow.com/questions/tagged/nouislider) 11 | 12 | License 13 | ------- 14 | noUiSlider is licensed [MIT](https://choosealicense.com/licenses/mit/). 15 | 16 | It can be used **for free** and **without any attribution**, in any personal or commercial project. 17 | 18 | [Documentation](https://refreshless.com/nouislider/) 19 | ------- 20 | An extensive documentation, including **examples**, **options** and **configuration details**, is available here: 21 | 22 | [noUiSlider documentation](https://refreshless.com/nouislider/). 23 | 24 | Contributing 25 | ------------ 26 | 27 | See [Contributing](CONTRIBUTING.md). 28 | 29 | Sponsorship 30 | ----------- 31 | 32 | noUiSlider is a stable project that still receives a lot of feature requests. A lot of these are interesting, but require a good amount of effort to implement, test and document. Sponsorship of this project will allow me to spend some more of my time on these feature requests. 33 | 34 | Please consider sponsoring the project by clicking the "❤ Sponsor" button above. Thanks! 35 | 36 | Tooling 37 | ------- 38 | 39 | Cross-browser testing kindly provided by BrowserStack. 40 | 41 | [![Tested with BrowserStack](documentation/assets/browserstack-logo-380x90.png)](http://browserstack.com/) 42 | -------------------------------------------------------------------------------- /skyaware/noUiSlider/distribute/nouislider.min.css: -------------------------------------------------------------------------------- 1 | /*! nouislider - 14.6.3 - 11/19/2020 */ 2 | .noUi-target,.noUi-target *{-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-ms-touch-action:none;touch-action:none;-ms-user-select:none;-moz-user-select:none;user-select:none;-moz-box-sizing:border-box;box-sizing:border-box}.noUi-target{position:relative}.noUi-base,.noUi-connects{width:100%;height:100%;position:relative;z-index:1}.noUi-connects{overflow:hidden;z-index:0}.noUi-connect,.noUi-origin{will-change:transform;position:absolute;z-index:1;top:0;right:0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;-webkit-transform-style:preserve-3d;transform-origin:0 0;transform-style:flat}.noUi-connect{height:100%;width:100%}.noUi-origin{height:10%;width:10%}.noUi-txt-dir-rtl.noUi-horizontal .noUi-origin{left:0;right:auto}.noUi-vertical .noUi-origin{width:0}.noUi-horizontal .noUi-origin{height:0}.noUi-handle{-webkit-backface-visibility:hidden;backface-visibility:hidden;position:absolute}.noUi-touch-area{height:100%;width:100%}.noUi-state-tap .noUi-connect,.noUi-state-tap .noUi-origin{-webkit-transition:transform .3s;transition:transform .3s}.noUi-state-drag *{cursor:inherit!important}.noUi-horizontal{height:18px}.noUi-horizontal .noUi-handle{width:34px;height:28px;right:-17px;top:-6px}.noUi-vertical{width:18px}.noUi-vertical .noUi-handle{width:28px;height:34px;right:-6px;top:-17px}.noUi-txt-dir-rtl.noUi-horizontal .noUi-handle{left:-17px;right:auto}.noUi-target{background:#FAFAFA;border-radius:4px;border:1px solid #D3D3D3;box-shadow:inset 0 1px 1px #F0F0F0,0 3px 6px -5px #BBB}.noUi-connects{border-radius:3px}.noUi-connect{background:#3FB8AF}.noUi-draggable{cursor:ew-resize}.noUi-vertical .noUi-draggable{cursor:ns-resize}.noUi-handle{border:1px solid #D9D9D9;border-radius:3px;background:#FFF;cursor:default;box-shadow:inset 0 0 1px #FFF,inset 0 1px 7px #EBEBEB,0 3px 6px -3px #BBB}.noUi-active{box-shadow:inset 0 0 1px #FFF,inset 0 1px 7px #DDD,0 3px 6px -3px #BBB}.noUi-handle:after,.noUi-handle:before{content:"";display:block;position:absolute;height:14px;width:1px;background:#E8E7E6;left:14px;top:6px}.noUi-handle:after{left:17px}.noUi-vertical .noUi-handle:after,.noUi-vertical .noUi-handle:before{width:14px;height:1px;left:6px;top:14px}.noUi-vertical .noUi-handle:after{top:17px}[disabled] .noUi-connect{background:#B8B8B8}[disabled] .noUi-handle,[disabled].noUi-handle,[disabled].noUi-target{cursor:not-allowed}.noUi-pips,.noUi-pips *{-moz-box-sizing:border-box;box-sizing:border-box}.noUi-pips{position:absolute;color:#999}.noUi-value{position:absolute;white-space:nowrap;text-align:center}.noUi-value-sub{color:#ccc;font-size:10px}.noUi-marker{position:absolute;background:#CCC}.noUi-marker-sub{background:#AAA}.noUi-marker-large{background:#AAA}.noUi-pips-horizontal{padding:10px 0;height:80px;top:100%;left:0;width:100%}.noUi-value-horizontal{-webkit-transform:translate(-50%,50%);transform:translate(-50%,50%)}.noUi-rtl .noUi-value-horizontal{-webkit-transform:translate(50%,50%);transform:translate(50%,50%)}.noUi-marker-horizontal.noUi-marker{margin-left:-1px;width:2px;height:5px}.noUi-marker-horizontal.noUi-marker-sub{height:10px}.noUi-marker-horizontal.noUi-marker-large{height:15px}.noUi-pips-vertical{padding:0 10px;height:100%;top:0;left:100%}.noUi-value-vertical{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);padding-left:25px}.noUi-rtl .noUi-value-vertical{-webkit-transform:translate(0,50%);transform:translate(0,50%)}.noUi-marker-vertical.noUi-marker{width:5px;height:2px;margin-top:-1px}.noUi-marker-vertical.noUi-marker-sub{width:10px}.noUi-marker-vertical.noUi-marker-large{width:15px}.noUi-tooltip{display:block;position:absolute;border:1px solid #D9D9D9;border-radius:3px;background:#fff;color:#000;padding:5px;text-align:center;white-space:nowrap}.noUi-horizontal .noUi-tooltip{-webkit-transform:translate(-50%,0);transform:translate(-50%,0);left:50%;bottom:120%}.noUi-vertical .noUi-tooltip{-webkit-transform:translate(0,-50%);transform:translate(0,-50%);top:50%;right:120%}.noUi-horizontal .noUi-origin>.noUi-tooltip{-webkit-transform:translate(50%,0);transform:translate(50%,0);left:auto;bottom:10px}.noUi-vertical .noUi-origin>.noUi-tooltip{-webkit-transform:translate(0,-18px);transform:translate(0,-18px);top:auto;right:28px} -------------------------------------------------------------------------------- /skyaware/ol/ol-layerswitcher.css: -------------------------------------------------------------------------------- 1 | .layer-switcher.shown.ol-control { 2 | background-color: transparent; 3 | } 4 | 5 | .layer-switcher.shown.ol-control:hover { 6 | background-color: transparent; 7 | } 8 | 9 | .layer-switcher { 10 | position: absolute; 11 | top: 3.5em; 12 | right: 0.5em; 13 | text-align: left; 14 | } 15 | 16 | .layer-switcher.shown { 17 | bottom: 3em; 18 | } 19 | 20 | .layer-switcher .panel { 21 | padding: 0 1em 0 0; 22 | margin: 0; 23 | border: 4px solid #eee; 24 | border-radius: 4px; 25 | background-color: white; 26 | display: none; 27 | max-height: 100%; 28 | overflow-y: auto; 29 | } 30 | 31 | .layer-switcher.shown .panel { 32 | display: block; 33 | } 34 | 35 | .layer-switcher button { 36 | float: right; 37 | width: 38px; 38 | height: 38px; 39 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACE1BMVEX///8A//8AgICA//8AVVVAQID///8rVVVJtttgv98nTmJ2xNgkW1ttyNsmWWZmzNZYxM4gWGgeU2JmzNNr0N1Rwc0eU2VXxdEhV2JqytQeVmMhVmNoydUfVGUgVGQfVGQfVmVqy9hqy9dWw9AfVWRpydVry9YhVmMgVGNUw9BrytchVWRexdGw294gVWQgVmUhVWPd4N6HoaZsy9cfVmQgVGRrytZsy9cgVWQgVWMgVWRsy9YfVWNsy9YgVWVty9YgVWVry9UgVWRsy9Zsy9UfVWRsy9YgVWVty9YgVWRty9Vsy9aM09sgVWRTws/AzM0gVWRtzNYgVWRuy9Zsy9cgVWRGcHxty9bb5ORbxdEgVWRty9bn6OZTws9mydRfxtLX3Nva5eRix9NFcXxOd4JPeINQeIMiVmVUws9Vws9Vw9BXw9BYxNBaxNBbxNBcxdJexdElWWgmWmhjyNRlx9IqXGtoipNpytVqytVryNNrytZsjZUuX210k5t1y9R2zNR3y9V4lp57zth9zdaAnKOGoaeK0NiNpquV09mesrag1tuitbmj1tuj19uktrqr2d2svcCu2d2xwMO63N+7x8nA3uDC3uDFz9DK4eHL4eLN4eIyYnDX5OM5Z3Tb397e4uDf4uHf5uXi5ePi5+Xj5+Xk5+Xm5+Xm6OY6aHXQ19fT4+NfhI1Ww89gx9Nhx9Nsy9ZWw9Dpj2abAAAAWnRSTlMAAQICAwQEBgcIDQ0ODhQZGiAiIyYpKywvNTs+QklPUlNUWWJjaGt0dnd+hIWFh4mNjZCSm6CpsbW2t7nDzNDT1dje5efr7PHy9PT29/j4+Pn5+vr8/f39/f6DPtKwAAABTklEQVR4Xr3QVWPbMBSAUTVFZmZmhhSXMjNvkhwqMzMzMzPDeD+xASvObKePPa+ffHVl8PlsnE0+qPpBuQjVJjno6pZpSKXYl7/bZyFaQxhf98hHDKEppwdWIW1frFnrxSOWHFfWesSEWC6R/P4zOFrix3TzDFLlXRTR8c0fEEJ1/itpo7SVO9Jdr1DVxZ0USyjZsEY5vZfiiAC0UoTGOrm9PZLuRl8X+Dq1HQtoFbJZbv61i+Poblh/97TC7n0neCcK0ETNUrz1/xPHf+DNAW9Ac6t8O8WH3Vp98f5lCaYKAOFZMLyHL4Y0fe319idMNgMMp+zWVSybUed/+/h7I4wRAG1W6XDy4XmjR9HnzvDRZXUAYDFOhC1S/Hh+fIXxen+eO+AKqbs+wAo30zDTDvDxKoJN88sjUzDFAvBzEUGFsnADoIvAJzoh2BZ8sner+Ke/vwECuQAAAABJRU5ErkJggg==') /*logo.png*/; 40 | background-repeat: no-repeat; 41 | background-position: 2px; 42 | background-color: white; 43 | border: none; 44 | } 45 | 46 | .layer-switcher.shown button { 47 | display: none; 48 | } 49 | 50 | .layer-switcher.shown.activationModeClick > button { 51 | display: block; 52 | background-image: unset; 53 | color: black; 54 | right: 2px; 55 | position: absolute; 56 | } 57 | 58 | .layer-switcher button:focus, .layer-switcher button:hover { 59 | background-color: white; 60 | } 61 | 62 | .layer-switcher ul { 63 | padding-left: 2em; 64 | list-style: none; 65 | } 66 | 67 | .layer-switcher li.group > label { 68 | font-weight: bold; 69 | } 70 | 71 | .layer-switcher li.layer { 72 | display: table; 73 | } 74 | 75 | .layer-switcher li.layer label, .layer-switcher li.layer input { 76 | display: table-cell; 77 | vertical-align: middle; 78 | } 79 | 80 | .layer-switcher label.disabled { 81 | opacity:0.4; 82 | } 83 | 84 | .layer-switcher input { 85 | margin: 4px; 86 | } 87 | 88 | .layer-switcher.touch ::-webkit-scrollbar { 89 | width: 4px; 90 | } 91 | 92 | .layer-switcher.touch ::-webkit-scrollbar-track { 93 | -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3); 94 | border-radius: 10px; 95 | } 96 | 97 | .layer-switcher.touch ::-webkit-scrollbar-thumb { 98 | border-radius: 10px; 99 | -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5); 100 | } 101 | 102 | .layer-switcher .group button { 103 | display: inline-block; 104 | vertical-align: top; 105 | float: none; 106 | width: 16px; 107 | height: 16px; 108 | background-position: center 2px; 109 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAW0lEQVR4nGNgGAWMyBwXFxcGBgaGeii3EU0tXHzPnj1wQRYsihqQ+I0ExDEMQAYNONgoAN0AmMkNaDSyQSheY8JiaCMOGzE04zIAmyFYNTMw4A+DRhzsUUBtAADw4BCeIZkGdwAAAABJRU5ErkJggg=='); 110 | -webkit-transition: -webkit-transform .2s ease-in-out; 111 | -ms-transition: -ms-transform .2s ease-in-out; 112 | transition: transform .2s ease-in-out; 113 | } 114 | 115 | .layer-switcher .group.layer-switcher-close button { 116 | transform: rotate(-90deg); 117 | -webkit-transform: rotate(-90deg); 118 | } 119 | 120 | li.group.layer-switcher-fold { 121 | margin-left: -18px; 122 | } 123 | 124 | .layer-switcher .group.layer-switcher-fold > ul { 125 | padding-left: 3em; 126 | } 127 | 128 | .layer-switcher .group.layer-switcher-fold.layer-switcher-close > ul { 129 | overflow: hidden; 130 | height: 0; 131 | } 132 | -------------------------------------------------------------------------------- /skyaware/ol/ol3-layerswitcher.css: -------------------------------------------------------------------------------- 1 | .layer-switcher.shown.ol-control { 2 | background-color: transparent; 3 | } 4 | 5 | .layer-switcher.shown.ol-control:hover { 6 | background-color: transparent; 7 | } 8 | 9 | .layer-switcher { 10 | position: absolute; 11 | top: 3.5em; 12 | right: 0.5em; 13 | text-align: left; 14 | } 15 | 16 | .layer-switcher.shown { 17 | bottom: 3em; 18 | } 19 | 20 | .layer-switcher .panel { 21 | padding: 0 1em 0 0; 22 | margin: 0; 23 | border: 4px solid #eee; 24 | border-radius: 4px; 25 | background-color: white; 26 | display: none; 27 | max-height: 100%; 28 | overflow-y: auto; 29 | } 30 | 31 | .layer-switcher.shown .panel { 32 | display: block; 33 | } 34 | 35 | .layer-switcher button { 36 | float: right; 37 | width: 32px; 38 | height: 32px; 39 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAACE1BMVEX///8A//8AgICA//8AVVVAQID///8rVVVJtttgv98nTmJ2xNgkW1ttyNsmWWZmzNZYxM4gWGgeU2JmzNNr0N1Rwc0eU2VXxdEhV2JqytQeVmMhVmNoydUfVGUgVGQfVGQfVmVqy9hqy9dWw9AfVWRpydVry9YhVmMgVGNUw9BrytchVWRexdGw294gVWQgVmUhVWPd4N6HoaZsy9cfVmQgVGRrytZsy9cgVWQgVWMgVWRsy9YfVWNsy9YgVWVty9YgVWVry9UgVWRsy9Zsy9UfVWRsy9YgVWVty9YgVWRty9Vsy9aM09sgVWRTws/AzM0gVWRtzNYgVWRuy9Zsy9cgVWRGcHxty9bb5ORbxdEgVWRty9bn6OZTws9mydRfxtLX3Nva5eRix9NFcXxOd4JPeINQeIMiVmVUws9Vws9Vw9BXw9BYxNBaxNBbxNBcxdJexdElWWgmWmhjyNRlx9IqXGtoipNpytVqytVryNNrytZsjZUuX210k5t1y9R2zNR3y9V4lp57zth9zdaAnKOGoaeK0NiNpquV09mesrag1tuitbmj1tuj19uktrqr2d2svcCu2d2xwMO63N+7x8nA3uDC3uDFz9DK4eHL4eLN4eIyYnDX5OM5Z3Tb397e4uDf4uHf5uXi5ePi5+Xj5+Xk5+Xm5+Xm6OY6aHXQ19fT4+NfhI1Ww89gx9Nhx9Nsy9ZWw9Dpj2abAAAAWnRSTlMAAQICAwQEBgcIDQ0ODhQZGiAiIyYpKywvNTs+QklPUlNUWWJjaGt0dnd+hIWFh4mNjZCSm6CpsbW2t7nDzNDT1dje5efr7PHy9PT29/j4+Pn5+vr8/f39/f6DPtKwAAABTklEQVR4Xr3QVWPbMBSAUTVFZmZmhhSXMjNvkhwqMzMzMzPDeD+xASvObKePPa+ffHVl8PlsnE0+qPpBuQjVJjno6pZpSKXYl7/bZyFaQxhf98hHDKEppwdWIW1frFnrxSOWHFfWesSEWC6R/P4zOFrix3TzDFLlXRTR8c0fEEJ1/itpo7SVO9Jdr1DVxZ0USyjZsEY5vZfiiAC0UoTGOrm9PZLuRl8X+Dq1HQtoFbJZbv61i+Poblh/97TC7n0neCcK0ETNUrz1/xPHf+DNAW9Ac6t8O8WH3Vp98f5lCaYKAOFZMLyHL4Y0fe319idMNgMMp+zWVSybUed/+/h7I4wRAG1W6XDy4XmjR9HnzvDRZXUAYDFOhC1S/Hh+fIXxen+eO+AKqbs+wAo30zDTDvDxKoJN88sjUzDFAvBzEUGFsnADoIvAJzoh2BZ8sner+Ke/vwECuQAAAABJRU5ErkJggg==') /*logo.png*/; 40 | background-repeat: no-repeat; 41 | background-position: 0px; 42 | background-color: transparent; 43 | border: none; 44 | } 45 | 46 | .layer-switcher.shown button { 47 | display: none; 48 | } 49 | 50 | .layer-switcher button:focus, .layer-switcher button:hover { 51 | background-color: white; 52 | } 53 | 54 | .layer-switcher ul { 55 | padding-left: 1em; 56 | list-style: none; 57 | } 58 | 59 | .layer-switcher li.group { 60 | padding-top: 5px; 61 | } 62 | 63 | .layer-switcher li.group > label { 64 | font-weight: bold; 65 | } 66 | 67 | .layer-switcher li.layer { 68 | display: table; 69 | } 70 | 71 | .layer-switcher li.layer label, .layer-switcher li.layer input { 72 | display: table-cell; 73 | vertical-align: sub; 74 | } 75 | 76 | .layer-switcher input { 77 | margin: 4px; 78 | } 79 | 80 | .layer-switcher.touch ::-webkit-scrollbar { 81 | width: 4px; 82 | } 83 | 84 | .layer-switcher.touch ::-webkit-scrollbar-track { 85 | -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3); 86 | border-radius: 10px; 87 | } 88 | 89 | .layer-switcher.touch ::-webkit-scrollbar-thumb { 90 | border-radius: 10px; 91 | -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.5); 92 | } 93 | -------------------------------------------------------------------------------- /skyaware/ol/v4.4.2/ol-4.4.2.css: -------------------------------------------------------------------------------- 1 | .ol-box{box-sizing:border-box;border-radius:2px;border:2px solid #00f}.ol-mouse-position{top:8px;right:8px;position:absolute}.ol-scale-line{background:rgba(0,60,136,.3);border-radius:4px;bottom:8px;left:8px;padding:2px;position:absolute}.ol-scale-line-inner{border:1px solid #eee;border-top:none;color:#eee;font-size:10px;text-align:center;margin:1px;will-change:contents,width}.ol-overlay-container{will-change:left,right,top,bottom}.ol-unsupported{display:none}.ol-unselectable,.ol-viewport{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.ol-selectable{-webkit-touch-callout:default;-webkit-user-select:auto;-moz-user-select:auto;-ms-user-select:auto;user-select:auto}.ol-grabbing{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.ol-grab{cursor:move;cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.ol-control{position:absolute;background-color:rgba(255,255,255,.4);border-radius:4px;padding:2px}.ol-control:hover{background-color:rgba(255,255,255,.6)}.ol-zoom{top:.5em;left:.5em}.ol-rotate{top:.5em;right:.5em;transition:opacity .25s linear,visibility 0s linear}.ol-rotate.ol-hidden{opacity:0;visibility:hidden;transition:opacity .25s linear,visibility 0s linear .25s}.ol-zoom-extent{top:4.643em;left:.5em}.ol-full-screen{right:.5em;top:.5em}@media print{.ol-control{display:none}}.ol-control button{display:block;margin:1px;padding:0;color:#fff;font-size:1.14em;font-weight:700;text-decoration:none;text-align:center;height:1.375em;width:1.375em;line-height:.4em;background-color:rgba(0,60,136,.5);border:none;border-radius:2px}.ol-control button::-moz-focus-inner{border:none;padding:0}.ol-zoom-extent button{line-height:1.4em}.ol-compass{display:block;font-weight:400;font-size:1.2em;will-change:transform}.ol-touch .ol-control button{font-size:1.5em}.ol-touch .ol-zoom-extent{top:5.5em}.ol-control button:focus,.ol-control button:hover{text-decoration:none;background-color:rgba(0,60,136,.7)}.ol-zoom .ol-zoom-in{border-radius:2px 2px 0 0}.ol-zoom .ol-zoom-out{border-radius:0 0 2px 2px}.ol-attribution{text-align:right;bottom:.5em;right:.5em;max-width:calc(100% - 1.3em)}.ol-attribution ul{margin:0;padding:0 .5em;font-size:.7rem;line-height:1.375em;color:#000;text-shadow:0 0 2px #fff}.ol-attribution li{display:inline;list-style:none;line-height:inherit}.ol-attribution li:not(:last-child):after{content:" "}.ol-attribution img{max-height:2em;max-width:inherit;vertical-align:middle}.ol-attribution button,.ol-attribution ul{display:inline-block}.ol-attribution.ol-collapsed ul{display:none}.ol-attribution.ol-logo-only ul{display:block}.ol-attribution:not(.ol-collapsed){background:rgba(255,255,255,.8)}.ol-attribution.ol-uncollapsible{bottom:0;right:0;border-radius:4px 0 0;height:1.1em;line-height:1em}.ol-attribution.ol-logo-only{background:0 0;bottom:.4em;height:1.1em;line-height:1em}.ol-attribution.ol-uncollapsible img{margin-top:-.2em;max-height:1.6em}.ol-attribution.ol-logo-only button,.ol-attribution.ol-uncollapsible button{display:none}.ol-zoomslider{top:4.5em;left:.5em;height:200px}.ol-zoomslider button{position:relative;height:10px}.ol-touch .ol-zoomslider{top:5.5em}.ol-overviewmap{left:.5em;bottom:.5em}.ol-overviewmap.ol-uncollapsible{bottom:0;left:0;border-radius:0 4px 0 0}.ol-overviewmap .ol-overviewmap-map,.ol-overviewmap button{display:inline-block}.ol-overviewmap .ol-overviewmap-map{border:1px solid #7b98bc;height:150px;margin:2px;width:150px}.ol-overviewmap:not(.ol-collapsed) button{bottom:1px;left:2px;position:absolute}.ol-overviewmap.ol-collapsed .ol-overviewmap-map,.ol-overviewmap.ol-uncollapsible button{display:none}.ol-overviewmap:not(.ol-collapsed){background:rgba(255,255,255,.8)}.ol-overviewmap-box{border:2px dotted rgba(0,60,136,.7)}.ol-overviewmap .ol-overviewmap-box:hover{cursor:move} -------------------------------------------------------------------------------- /skyaware/ol/v6.3.1/ol.css: -------------------------------------------------------------------------------- 1 | .ol-box{box-sizing:border-box;border-radius:2px;border:2px solid #00f}.ol-mouse-position{top:8px;right:8px;position:absolute}.ol-scale-line{background:rgba(0,60,136,.3);border-radius:4px;bottom:8px;left:8px;padding:2px;position:absolute}.ol-scale-line-inner{border:1px solid #eee;border-top:none;color:#eee;font-size:10px;text-align:center;margin:1px;will-change:contents,width;transition:all .25s}.ol-scale-bar{position:absolute;bottom:8px;left:8px}.ol-scale-step-marker{width:1px;height:15px;background-color:#000;float:right;z-Index:10}.ol-scale-step-text{position:absolute;bottom:-5px;font-size:12px;z-Index:11;color:#000;text-shadow:-2px 0 #fff,0 2px #fff,2px 0 #fff,0 -2px #fff}.ol-scale-text{position:absolute;font-size:14px;text-align:center;bottom:25px;color:#000;text-shadow:-2px 0 #fff,0 2px #fff,2px 0 #fff,0 -2px #fff}.ol-scale-singlebar{position:relative;height:10px;z-Index:9;border:1px solid #000}.ol-unsupported{display:none}.ol-unselectable,.ol-viewport{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.ol-overlaycontainer,.ol-overlaycontainer-stopevent{pointer-events:none}.ol-overlaycontainer-stopevent>*,.ol-overlaycontainer>*{pointer-events:auto}.ol-selectable{-webkit-touch-callout:default;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.ol-grabbing{cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.ol-grab{cursor:move;cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.ol-control{position:absolute;background-color:rgba(255,255,255,.4);border-radius:4px;padding:2px}.ol-control:hover{background-color:rgba(255,255,255,.6)}.ol-zoom{top:.5em;left:.5em}.ol-rotate{top:.5em;right:.5em;transition:opacity .25s linear,visibility 0s linear}.ol-rotate.ol-hidden{opacity:0;visibility:hidden;transition:opacity .25s linear,visibility 0s linear .25s}.ol-zoom-extent{top:4.643em;left:.5em}.ol-full-screen{right:.5em;top:.5em}.ol-control button{display:block;margin:1px;padding:0;color:#fff;font-size:1.14em;font-weight:700;text-decoration:none;text-align:center;height:1.375em;width:1.375em;line-height:.4em;background-color:rgba(0,60,136,.5);border:none;border-radius:2px}.ol-control button::-moz-focus-inner{border:none;padding:0}.ol-control button span{pointer-events:none}.ol-zoom-extent button{line-height:1.4em}.ol-compass{display:block;font-weight:400;font-size:1.2em;will-change:transform}.ol-touch .ol-control button{font-size:1.5em}.ol-touch .ol-zoom-extent{top:5.5em}.ol-control button:focus,.ol-control button:hover{text-decoration:none;background-color:rgba(0,60,136,.7)}.ol-zoom .ol-zoom-in{border-radius:2px 2px 0 0}.ol-zoom .ol-zoom-out{border-radius:0 0 2px 2px}.ol-attribution{text-align:right;bottom:.5em;right:.5em;max-width:calc(100% - 1.3em)}.ol-attribution ul{margin:0;padding:0 .5em;color:#000;text-shadow:0 0 2px #fff}.ol-attribution li{display:inline;list-style:none}.ol-attribution li:not(:last-child):after{content:" "}.ol-attribution img{max-height:2em;max-width:inherit;vertical-align:middle}.ol-attribution button,.ol-attribution ul{display:inline-block}.ol-attribution.ol-collapsed ul{display:none}.ol-attribution:not(.ol-collapsed){background:rgba(255,255,255,.8)}.ol-attribution.ol-uncollapsible{bottom:0;right:0;border-radius:4px 0 0}.ol-attribution.ol-uncollapsible img{margin-top:-.2em;max-height:1.6em}.ol-attribution.ol-uncollapsible button{display:none}.ol-zoomslider{top:4.5em;left:.5em;height:200px}.ol-zoomslider button{position:relative;height:10px}.ol-touch .ol-zoomslider{top:5.5em}.ol-overviewmap{left:.5em;bottom:.5em}.ol-overviewmap.ol-uncollapsible{bottom:0;left:0;border-radius:0 4px 0 0}.ol-overviewmap .ol-overviewmap-map,.ol-overviewmap button{display:inline-block}.ol-overviewmap .ol-overviewmap-map{border:1px solid #7b98bc;height:150px;margin:2px;width:150px}.ol-overviewmap:not(.ol-collapsed) button{bottom:1px;left:2px;position:absolute}.ol-overviewmap.ol-collapsed .ol-overviewmap-map,.ol-overviewmap.ol-uncollapsible button{display:none}.ol-overviewmap:not(.ol-collapsed){background:rgba(255,255,255,.8)}.ol-overviewmap-box{border:2px dotted rgba(0,60,136,.7)}.ol-overviewmap .ol-overviewmap-box:hover{cursor:move} 2 | /*# sourceMappingURL=ol.css.map */ -------------------------------------------------------------------------------- /skyaware/ol/v6.3.1/ol.css.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["src/ol/ol.css"],"names":[],"mappings":"AAAA,QACE,WAAY,WACZ,cAAe,IACf,OAAQ,IAAI,MAAM,KAGpB,mBACE,IAAK,IACL,MAAO,IACP,SAAU,SAGZ,eACE,WAAY,kBACZ,cAAe,IACf,OAAQ,IACR,KAAM,IACN,QAAS,IACT,SAAU,SAEZ,qBACE,OAAQ,IAAI,MAAM,KAClB,WAAY,KACZ,MAAO,KACP,UAAW,KACX,WAAY,OACZ,OAAQ,IACR,YAAa,QAAQ,CAAE,MACvB,WAAY,IAAI,KAElB,cACE,SAAU,SACV,OAAQ,IACR,KAAM,IAER,sBACE,MAAO,IACP,OAAQ,KACR,iBAAkB,KAClB,MAAO,MACP,QAAS,GAEX,oBACE,SAAU,SACV,OAAQ,KACR,UAAW,KACX,QAAS,GACT,MAAO,KACP,YAAa,KAAK,EAAE,IAAO,CAAE,EAAE,IAAI,IAAO,CAAE,IAAI,EAAE,IAAO,CAAE,EAAE,KAAK,KAEpE,eACE,SAAU,SACV,UAAW,KACX,WAAY,OACZ,OAAQ,KACR,MAAO,KACP,YAAa,KAAK,EAAE,IAAO,CAAE,EAAE,IAAI,IAAO,CAAE,IAAI,EAAE,IAAO,CAAE,EAAE,KAAK,KAEpE,oBACE,SAAU,SACV,OAAQ,KACR,QAAS,EACT,OAAQ,IAAI,MAAM,KAGpB,gBACE,QAAS,KAEG,iBAAd,aACE,sBAAuB,KACvB,oBAAqB,KACrB,iBAAkB,KAClB,gBAAiB,KACjB,YAAa,KACb,4BAA6B,YAE/B,qBAAsB,+BACpB,eAAgB,KAEQ,iCAA1B,uBACE,eAAgB,KAElB,eACE,sBAAuB,QACvB,oBAAqB,KACrB,iBAAkB,KAClB,gBAAiB,KACjB,YAAa,KAEf,aACE,OAAQ,iBACR,OAAQ,cACR,OAAQ,SAEV,SACE,OAAQ,KACR,OAAQ,aACR,OAAQ,UACR,OAAQ,KAEV,YACE,SAAU,SACV,iBAAkB,qBAClB,cAAe,IACf,QAAS,IAEX,kBACE,iBAAkB,qBAEpB,SACE,IAAK,KACL,KAAM,KAER,WACE,IAAK,KACL,MAAO,KACP,WAAY,QAAQ,KAAK,MAAM,CAAE,WAAW,GAAG,OAEjD,qBACE,QAAS,EACT,WAAY,OACZ,WAAY,QAAQ,KAAK,MAAM,CAAE,WAAW,GAAG,OAAO,KAExD,gBACE,IAAK,QACL,KAAM,KAER,gBACE,MAAO,KACP,IAAK,KAGP,mBACE,QAAS,MACT,OAAQ,IACR,QAAS,EACT,MAAO,KACP,UAAW,OACX,YAAa,IACb,gBAAiB,KACjB,WAAY,OACZ,OAAQ,QACR,MAAO,QACP,YAAa,KACb,iBAAkB,kBAClB,OAAQ,KACR,cAAe,IAEjB,qCACE,OAAQ,KACR,QAAS,EAEX,wBACE,eAAgB,KAElB,uBACE,YAAa,MAEf,YACE,QAAS,MACT,YAAa,IACb,UAAW,MACX,YAAa,UAEf,6BACE,UAAW,MAEb,0BACE,IAAK,MAGP,yBADA,yBAEE,gBAAiB,KACjB,iBAAkB,kBAEpB,qBACE,cAAe,IAAI,IAAI,EAAE,EAE3B,sBACE,cAAe,EAAE,EAAE,IAAI,IAIzB,gBACE,WAAY,MACZ,OAAQ,KACR,MAAO,KACP,UAAW,mBAGb,mBACE,OAAQ,EACR,QAAS,EAAE,KACX,MAAO,KACP,YAAa,EAAE,EAAE,IAAI,KAEvB,mBACE,QAAS,OACT,WAAY,KAEd,0CACE,QAAS,IAEX,oBACE,WAAY,IACZ,UAAW,QACX,eAAgB,OAEE,uBAApB,mBACE,QAAS,aAEX,gCACE,QAAS,KAEX,mCACE,WAAY,qBAEd,iCACE,OAAQ,EACR,MAAO,EACP,cAAe,IAAI,EAAE,EAEvB,qCACE,WAAY,MACZ,WAAY,MAEd,wCACE,QAAS,KAGX,eACE,IAAK,MACL,KAAM,KACN,OAAQ,MAEV,sBACE,SAAU,SACV,OAAQ,KAGV,yBACE,IAAK,MAGP,gBACE,KAAM,KACN,OAAQ,KAEV,iCACE,OAAQ,EACR,KAAM,EACN,cAAe,EAAE,IAAI,EAAE,EAEzB,oCACA,uBACE,QAAS,aAEX,oCACE,OAAQ,IAAI,MAAM,QAClB,OAAQ,MACR,OAAQ,IACR,MAAO,MAET,0CACE,OAAQ,IACR,KAAM,IACN,SAAU,SAEZ,iDACA,wCACE,QAAS,KAEX,mCACE,WAAY,qBAEd,oBACE,OAAQ,IAAI,OAAO,kBAGrB,0CACE,OAAQ"} -------------------------------------------------------------------------------- /skyaware/spinny.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/flightaware/dump978/0998638d7ae10bdf44a2297c7b8ba855723c8f11/skyaware/spinny.gif -------------------------------------------------------------------------------- /skyaware/test/markers_test.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | DUMP1090 MARKERS TEST 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /skyaware/test/markers_test.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var MarkerLayer; 4 | var NextLon = 0; 5 | var NextLat = 0; 6 | 7 | function setup_markers_test() { 8 | MarkerLayer = new ol.layer.Vector({ 9 | source: new ol.source.Vector(), 10 | }); 11 | 12 | var map = new ol.Map({ 13 | target: 'map_canvas', 14 | layers: [ 15 | MarkerLayer 16 | ], 17 | view: new ol.View({ 18 | center: ol.proj.fromLonLat([5, 0]), 19 | zoom: 7 20 | }), 21 | controls: [new ol.control.Zoom(), 22 | new ol.control.Rotate()], 23 | loadTilesWhileAnimating: true, 24 | loadTilesWhileInteracting: true 25 | }); 26 | 27 | for (var type in TypeDesignatorIcons) { 28 | add_marker(type, TypeDesignatorIcons[type]); 29 | } 30 | 31 | for (var type in TypeDescriptionIcons) { 32 | add_marker(type, TypeDescriptionIcons[type]); 33 | } 34 | 35 | for (var category in CategoryIcons) { 36 | add_marker("Cat " + category, CategoryIcons[category]); 37 | } 38 | 39 | add_marker("Default", DefaultIcon); 40 | 41 | map.getView().setCenter(ol.proj.fromLonLat([5, NextLat/2])); 42 | } 43 | 44 | function add_marker(title, baseMarker) { 45 | var weight = (1 / baseMarker.scale).toFixed(1); 46 | var icon = new ol.style.Icon({ 47 | anchor: baseMarker.anchor, 48 | anchorXUnits: 'pixels', 49 | anchorYUnits: 'pixels', 50 | scale: baseMarker.scale, 51 | imgSize: baseMarker.size, 52 | src: svgPathToURI(baseMarker.path, baseMarker.size, '#000000', weight, '#00C000'), 53 | rotation: 0, 54 | opacity: 1.0, 55 | rotateWithView: (baseMarker.noRotate ? false : true) 56 | }); 57 | 58 | var markerStyle = new ol.style.Style({ 59 | image: icon, 60 | text: new ol.style.Text({ 61 | textAlign: 'center', 62 | textBaseline: 'top', 63 | offsetY: 30, 64 | text: title, 65 | scale: 1.5 66 | }) 67 | }); 68 | 69 | var pos = [NextLon, NextLat]; 70 | var marker = new ol.Feature(new ol.geom.Point(ol.proj.fromLonLat(pos))); 71 | marker.setStyle(markerStyle); 72 | MarkerLayer.getSource().addFeature(marker); 73 | 74 | NextLon += 1; 75 | if (NextLon >= 10) { 76 | NextLon -= 10; 77 | NextLat -= 1; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /skyaware_writer.h: -------------------------------------------------------------------------------- 1 | // -*- c++ -*- 2 | 3 | // Copyright (c) 2019, FlightAware LLC. 4 | // All rights reserved. 5 | // Licensed under the 2-clause BSD license; see the LICENSE file 6 | 7 | #ifndef SKYAWARE_WRITER_H 8 | #define SKYAWARE_WRITER_H 9 | 10 | #include 11 | #include 12 | 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | #include "track.h" 19 | #include "uat_message.h" 20 | 21 | namespace flightaware::skyaware { 22 | class SkyAwareWriter : public std::enable_shared_from_this { 23 | public: 24 | typedef std::shared_ptr Pointer; 25 | 26 | static Pointer Create(boost::asio::io_service &service, flightaware::uat::Tracker::Pointer tracker, const boost::filesystem::path &dir, std::chrono::milliseconds interval, unsigned history_count, std::chrono::milliseconds history_interval, boost::optional> location) { return Pointer(new SkyAwareWriter(service, tracker, dir, interval, history_count, history_interval, location)); } 27 | 28 | void Start(); 29 | void Stop(); 30 | 31 | private: 32 | SkyAwareWriter(boost::asio::io_service &service, flightaware::uat::Tracker::Pointer tracker, const boost::filesystem::path &dir, std::chrono::milliseconds interval, unsigned history_count, std::chrono::milliseconds history_interval, boost::optional> location) : service_(service), strand_(service), timer_(service), tracker_(tracker), dir_(dir), interval_(interval), history_count_(history_count), history_interval_(history_interval), location_(location) {} 33 | 34 | void PeriodicWrite(); 35 | 36 | boost::asio::io_service &service_; 37 | boost::asio::io_service::strand strand_; 38 | boost::asio::steady_timer timer_; 39 | flightaware::uat::Tracker::Pointer tracker_; 40 | boost::filesystem::path dir_; 41 | std::chrono::milliseconds interval_; 42 | unsigned history_count_; 43 | std::chrono::milliseconds history_interval_; 44 | boost::optional> location_; 45 | unsigned next_history_index_ = 0; 46 | std::uint64_t next_history_time_ = 0; 47 | }; 48 | } // namespace flightaware::skyaware 49 | 50 | #endif 51 | -------------------------------------------------------------------------------- /soapy_source.h: -------------------------------------------------------------------------------- 1 | // -*- c++ -*- 2 | 3 | // Copyright (c) 2019, FlightAware LLC. 4 | // All rights reserved. 5 | // Licensed under the 2-clause BSD license; see the LICENSE file 6 | 7 | #ifndef DUMP978_SOAPY_SOURCE_H 8 | #define DUMP978_SOAPY_SOURCE_H 9 | 10 | #include 11 | #include 12 | #include 13 | 14 | #include 15 | 16 | #include "sample_source.h" 17 | 18 | namespace flightaware::uat { 19 | class SoapySampleSource : public SampleSource { 20 | public: 21 | static SampleSource::Pointer Create(boost::asio::io_service &service, const std::string &device_name, const boost::program_options::variables_map &options) { return Pointer(new SoapySampleSource(service, device_name, options)); } 22 | 23 | virtual ~SoapySampleSource(); 24 | 25 | void Init() override; 26 | void Start() override; 27 | void Stop() override; 28 | SampleFormat Format() override { return format_; } 29 | 30 | private: 31 | SoapySampleSource(boost::asio::io_service &service, const std::string &device_name, const boost::program_options::variables_map &options); 32 | 33 | void Run(); 34 | void Keepalive(); 35 | 36 | boost::asio::steady_timer timer_; 37 | SampleFormat format_ = SampleFormat::UNKNOWN; 38 | std::string device_name_; 39 | boost::program_options::variables_map options_; 40 | 41 | std::shared_ptr device_; 42 | std::shared_ptr stream_; 43 | std::unique_ptr rx_thread_; 44 | bool halt_ = false; 45 | 46 | static std::atomic_bool log_handler_registered_; 47 | }; 48 | }; // namespace flightaware::uat 49 | 50 | #endif 51 | -------------------------------------------------------------------------------- /socket_input.h: -------------------------------------------------------------------------------- 1 | // -*- c++ -*- 2 | 3 | // Copyright (c) 2019, FlightAware LLC. 4 | // All rights reserved. 5 | // Licensed under the 2-clause BSD license; see the LICENSE file 6 | 7 | #ifndef SOCKET_INPUT_H 8 | #define SOCKET_INPUT_H 9 | 10 | #include 11 | #include 12 | 13 | #include 14 | #include 15 | #include 16 | 17 | #include "message_source.h" 18 | 19 | namespace flightaware::uat { 20 | class RawInput : public MessageSource, public std::enable_shared_from_this { 21 | public: 22 | typedef std::shared_ptr Pointer; 23 | typedef std::function ErrorHandler; 24 | 25 | static Pointer Create(boost::asio::io_service &service, const std::string &host, const std::string &port_or_service, std::chrono::milliseconds reconnect_interval = std::chrono::milliseconds(0)) { return Pointer(new RawInput(service, host, port_or_service, reconnect_interval)); } 26 | 27 | void Start(); 28 | void Stop(); 29 | 30 | void SetErrorHandler(ErrorHandler handler) { error_handler_ = handler; } 31 | 32 | private: 33 | RawInput(boost::asio::io_service &service, const std::string &host, const std::string &port_or_service, std::chrono::milliseconds reconnect_interval); 34 | 35 | void TryNextEndpoint(const boost::system::error_code &last_error); 36 | void ScheduleRead(); 37 | void ParseBuffer(); 38 | boost::optional ParseLine(const std::string &line); 39 | boost::optional ParseMetadataLine(const std::string &line); 40 | void HandleError(const boost::system::error_code &ec); 41 | 42 | boost::asio::io_service &service_; 43 | std::string host_; 44 | std::string port_or_service_; 45 | std::chrono::milliseconds reconnect_interval_; 46 | 47 | boost::asio::ip::tcp::resolver resolver_; 48 | boost::asio::ip::tcp::socket socket_; 49 | boost::asio::ip::tcp::resolver::iterator next_endpoint_; 50 | boost::asio::steady_timer reconnect_timer_; 51 | 52 | ErrorHandler error_handler_; 53 | 54 | std::vector readbuf_; 55 | std::size_t used_; 56 | }; 57 | }; // namespace flightaware::uat 58 | 59 | #endif 60 | -------------------------------------------------------------------------------- /socket_output.h: -------------------------------------------------------------------------------- 1 | // -*- c++ -*- 2 | 3 | // Copyright (c) 2019, FlightAware LLC. 4 | // All rights reserved. 5 | // Licensed under the 2-clause BSD license; see the LICENSE file 6 | 7 | #ifndef SOCKET_OUTPUT_H 8 | #define SOCKET_OUTPUT_H 9 | 10 | #include 11 | #include 12 | 13 | #include 14 | #include 15 | #include 16 | 17 | #include "message_dispatch.h" 18 | #include "uat_message.h" 19 | 20 | namespace flightaware::uat { 21 | class SocketOutput : public std::enable_shared_from_this { 22 | public: 23 | typedef std::shared_ptr Pointer; 24 | 25 | virtual void Start(); 26 | void Write(SharedMessageVector messages); 27 | virtual void Close(); 28 | 29 | void SetCloseNotifier(std::function notifier) { close_notifier_ = notifier; } 30 | 31 | bool IsOpen() const { return socket_.is_open(); } 32 | 33 | protected: 34 | SocketOutput(boost::asio::io_service &service_, boost::asio::ip::tcp::socket &&socket_); 35 | std::ostringstream &Buf() { return outbuf_; } 36 | 37 | virtual void InternalWrite(SharedMessageVector messages) = 0; 38 | 39 | private: 40 | void HandleError(const boost::system::error_code &ec); 41 | void Flush(); 42 | void ReadAndDiscard(); 43 | 44 | boost::asio::io_service &service_; 45 | boost::asio::io_service::strand strand_; 46 | boost::asio::ip::tcp::socket socket_; 47 | boost::asio::ip::tcp::endpoint peer_; 48 | 49 | std::ostringstream outbuf_; 50 | bool flush_pending_; 51 | 52 | std::function close_notifier_; 53 | }; 54 | 55 | class RawOutput : public SocketOutput { 56 | public: 57 | // factory method, this class must always be constructed via make_shared 58 | static Pointer Create(boost::asio::io_service &service, boost::asio::ip::tcp::socket &&socket, SharedMessageVector header) { return Pointer(new RawOutput(service, std::move(socket), header)); } 59 | 60 | void Start() override; 61 | 62 | protected: 63 | void InternalWrite(SharedMessageVector messages) override; 64 | 65 | private: 66 | RawOutput(boost::asio::io_service &service_, boost::asio::ip::tcp::socket &&socket_, SharedMessageVector header) : SocketOutput(service_, std::move(socket_)) { header_ = header; } 67 | 68 | SharedMessageVector header_; 69 | }; 70 | 71 | class JsonOutput : public SocketOutput { 72 | public: 73 | // factory method, this class must always be constructed via make_shared 74 | static Pointer Create(boost::asio::io_service &service, boost::asio::ip::tcp::socket &&socket) { return Pointer(new JsonOutput(service, std::move(socket))); } 75 | 76 | protected: 77 | void InternalWrite(SharedMessageVector messages) override; 78 | 79 | private: 80 | JsonOutput(boost::asio::io_service &service_, boost::asio::ip::tcp::socket &&socket_) : SocketOutput(service_, std::move(socket_)) {} 81 | }; 82 | 83 | class SocketListener : public std::enable_shared_from_this { 84 | public: 85 | typedef std::shared_ptr Pointer; 86 | typedef std::function ConnectionFactory; 87 | 88 | // factory method, this class must always be constructed via make_shared 89 | static Pointer Create(boost::asio::io_service &service, const boost::asio::ip::tcp::endpoint &endpoint, MessageDispatch &dispatch, ConnectionFactory factory) { return Pointer(new SocketListener(service, endpoint, dispatch, factory)); } 90 | 91 | void Start(); 92 | void Close(); 93 | 94 | private: 95 | SocketListener(boost::asio::io_service &service, const boost::asio::ip::tcp::endpoint &endpoint, MessageDispatch &dispatch, ConnectionFactory factory); 96 | 97 | void Accept(); 98 | 99 | boost::asio::io_service &service_; 100 | boost::asio::ip::tcp::acceptor acceptor_; 101 | boost::asio::ip::tcp::endpoint endpoint_; 102 | boost::asio::ip::tcp::socket socket_; 103 | boost::asio::ip::tcp::endpoint peer_; 104 | MessageDispatch &dispatch_; 105 | ConnectionFactory factory_; 106 | }; 107 | }; // namespace flightaware::uat 108 | 109 | #endif 110 | -------------------------------------------------------------------------------- /stratux_serial.h: -------------------------------------------------------------------------------- 1 | // -*- c++ -*- 2 | 3 | // Copyright (c) 2019, FlightAware LLC. 4 | // All rights reserved. 5 | // Licensed under the 2-clause BSD license; see the LICENSE file 6 | 7 | #ifndef DUMP978_STRATUX_SERIAL_H 8 | #define DUMP978_STRATUX_SERIAL_H 9 | 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | 21 | #include "common.h" 22 | #include "fec.h" 23 | #include "message_source.h" 24 | 25 | namespace flightaware::uat { 26 | class StratuxSerial : public MessageSource, public std::enable_shared_from_this { 27 | public: 28 | typedef std::shared_ptr Pointer; 29 | 30 | virtual ~StratuxSerial() {} 31 | 32 | virtual void Start(); 33 | virtual void Stop(); 34 | 35 | static Pointer Create(boost::asio::io_service &io_service, const std::string &path) { return Pointer(new StratuxSerial(io_service, path)); } 36 | 37 | protected: 38 | StratuxSerial(boost::asio::io_service &io_service, const std::string &path); 39 | 40 | private: 41 | void StartReading(); 42 | void ParseInput(const Bytes &buf); 43 | boost::optional ParseMessage(const Bytes &message, std::uint64_t sys_timestamp); 44 | void HandleError(const boost::system::error_code &ec); 45 | 46 | // the size of the read buffer 47 | const std::size_t read_buffer_size = 1024 * 16; 48 | // how long to wait between scheduling reads (to reduce the spinning on short messages) 49 | const std::chrono::milliseconds read_interval = std::chrono::milliseconds(50); 50 | 51 | boost::asio::io_service &io_service_; 52 | std::string path_; 53 | boost::asio::serial_port port_; 54 | boost::asio::steady_timer read_timer_; 55 | std::shared_ptr readbuf_; 56 | FEC fec_; 57 | 58 | enum class ParserState; 59 | ParserState parser_state_; 60 | unsigned preamble_index_; 61 | std::uint32_t message_length_; 62 | Bytes message_; 63 | std::uint64_t message_start_timestamp_; 64 | }; 65 | }; // namespace flightaware::uat 66 | 67 | #endif 68 | -------------------------------------------------------------------------------- /uat_protocol.h: -------------------------------------------------------------------------------- 1 | // -*- c++ -*- 2 | 3 | // Copyright (c) 2019, FlightAware LLC. 4 | // All rights reserved. 5 | // Licensed under the 2-clause BSD license; see the LICENSE file 6 | 7 | #ifndef UAT_PROTOCOL_H 8 | #define UAT_PROTOCOL_H 9 | 10 | #include 11 | 12 | namespace flightaware::uat { 13 | enum class MessageType { DOWNLINK_SHORT, DOWNLINK_LONG, UPLINK, METADATA, INVALID }; 14 | 15 | const unsigned SYNC_BITS = 36; 16 | const std::uint64_t DOWNLINK_SYNC_WORD = 0xEACDDA4E2UL; 17 | const std::uint64_t UPLINK_SYNC_WORD = 0x153225B1DUL; 18 | 19 | const unsigned DOWNLINK_SHORT_DATA_BITS = 144; 20 | const unsigned DOWNLINK_SHORT_DATA_BYTES = DOWNLINK_SHORT_DATA_BITS / 8; 21 | const unsigned DOWNLINK_SHORT_BITS = DOWNLINK_SHORT_DATA_BITS + 96; 22 | const unsigned DOWNLINK_SHORT_BYTES = DOWNLINK_SHORT_BITS / 8; 23 | 24 | const unsigned DOWNLINK_LONG_DATA_BITS = 272; 25 | const unsigned DOWNLINK_LONG_DATA_BYTES = DOWNLINK_LONG_DATA_BITS / 8; 26 | const unsigned DOWNLINK_LONG_BITS = 272 + 112; 27 | const unsigned DOWNLINK_LONG_BYTES = DOWNLINK_LONG_BITS / 8; 28 | 29 | const unsigned UPLINK_BLOCK_DATA_BITS = 576; 30 | const unsigned UPLINK_BLOCK_DATA_BYTES = UPLINK_BLOCK_DATA_BITS / 8; 31 | const unsigned UPLINK_BLOCK_BITS = UPLINK_BLOCK_DATA_BITS + 160; 32 | const unsigned UPLINK_BLOCK_BYTES = UPLINK_BLOCK_BITS / 8; 33 | 34 | const unsigned UPLINK_BLOCKS_PER_FRAME = 6; 35 | const unsigned UPLINK_DATA_BITS = UPLINK_BLOCK_DATA_BITS * UPLINK_BLOCKS_PER_FRAME; 36 | const unsigned UPLINK_DATA_BYTES = UPLINK_DATA_BITS / 8; 37 | const unsigned UPLINK_BITS = UPLINK_BLOCK_BITS * UPLINK_BLOCKS_PER_FRAME; 38 | const unsigned UPLINK_BYTES = UPLINK_BITS / 8; 39 | 40 | // FEC parameters 41 | namespace fec { 42 | const unsigned DOWNLINK_SHORT_POLY = 0x187; 43 | const unsigned DOWNLINK_LONG_POLY = 0x187; 44 | const unsigned UPLINK_BLOCK_POLY = 0x187; 45 | 46 | const int DOWNLINK_SHORT_ROOTS = 12; 47 | const int DOWNLINK_LONG_ROOTS = 14; 48 | const int UPLINK_BLOCK_ROOTS = 20; 49 | const int DOWNLINK_SHORT_PAD = 255 - DOWNLINK_SHORT_BYTES; 50 | const int DOWNLINK_LONG_PAD = 255 - DOWNLINK_LONG_BYTES; 51 | const int UPLINK_BLOCK_PAD = 255 - UPLINK_BLOCK_BYTES; 52 | }; // namespace fec 53 | }; // namespace flightaware::uat 54 | 55 | #endif 56 | --------------------------------------------------------------------------------