mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-11-26 17:58:43 -05:00
423 lines
11 KiB
C++
423 lines
11 KiB
C++
///////////////////////////////////////////////////////////////////////////////////
|
|
// Copyright (C) 2023 Jon Beniston, M7RCE <jon@beniston.com> //
|
|
// //
|
|
// This program is free software; you can redistribute it and/or modify //
|
|
// it under the terms of the GNU General Public License as published by //
|
|
// the Free Software Foundation as version 3 of the License, or //
|
|
// (at your option) any later version. //
|
|
// //
|
|
// This program is distributed in the hope that it will be useful, //
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
|
|
// GNU General Public License V3 for more details. //
|
|
// //
|
|
// You should have received a copy of the GNU General Public License //
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
|
|
///////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include <QResource>
|
|
#include <QDebug>
|
|
|
|
#include "util/mmsi.h"
|
|
#include "util/osndb.h"
|
|
|
|
// https://www.itu.int/en/ITU-R/terrestrial/fmd/Pages/mid.aspx
|
|
// Names used match up with names used for flags in ADS-B directory
|
|
QMap<int, QString> MMSI::m_mid = {
|
|
{201, "albania"},
|
|
{202, "andorra"},
|
|
{203, "austria"},
|
|
{204, "portugal"},
|
|
{205, "belgium"},
|
|
{206, "belarus"},
|
|
{207, "bulgaria"},
|
|
{208, "vatican_city"},
|
|
{209, "cyprus"},
|
|
{210, "cyprus"},
|
|
{211, "germany"},
|
|
{212, "cyprus"},
|
|
{213, "georgia"},
|
|
{214, "moldova"},
|
|
{215, "malta"},
|
|
{216, "armenia"},
|
|
{218, "germany"},
|
|
{219, "denmark"},
|
|
{220, "denmark"},
|
|
{224, "spain"},
|
|
{225, "spain"},
|
|
{226, "france"},
|
|
{227, "france"},
|
|
{228, "france"},
|
|
{229, "malta"},
|
|
{230, "finland"},
|
|
{231, "denmark"},
|
|
{232, "united_kingdom"},
|
|
{233, "united_kingdom"},
|
|
{234, "united_kingdom"},
|
|
{235, "united_kingdom"},
|
|
{236, "united_kingdom"},
|
|
{237, "greece"},
|
|
{238, "croatia"},
|
|
{239, "greece"},
|
|
{240, "greece"},
|
|
{241, "greece"},
|
|
{242, "morocco"},
|
|
{243, "hungary"},
|
|
{244, "netherlands"},
|
|
{245, "netherlands"},
|
|
{246, "netherlands"},
|
|
{247, "italy"},
|
|
{248, "malta"},
|
|
{249, "malta"},
|
|
{250, "ireland"},
|
|
{251, "iceland"},
|
|
{252, "liechtenstein"},
|
|
{253, "luxembourg"},
|
|
{254, "monaco"},
|
|
{255, "portugal"},
|
|
{256, "malta"},
|
|
{257, "norway"},
|
|
{258, "norway"},
|
|
{259, "norway"},
|
|
{261, "poland"},
|
|
{262, "montenegro"},
|
|
{263, "portugal"},
|
|
{264, "romania"},
|
|
{265, "sweden"},
|
|
{266, "sweden"},
|
|
{267, "slovakia"},
|
|
{268, "san_marino"},
|
|
{269, "switzerland"},
|
|
{270, "czech_republic"},
|
|
{271, "turkey"},
|
|
{272, "ukraine"},
|
|
{273, "russia"},
|
|
{274, "macedonia"},
|
|
{275, "latvia"},
|
|
{276, "estonia"},
|
|
{277, "slovenia"},
|
|
{279, "serbia"},
|
|
{301, "united_kingdom"},
|
|
{303, "united_states"},
|
|
{304, "antigua_and_barbuda"},
|
|
{305, "antigua_and_barbuda"},
|
|
{306, "netherlands"},
|
|
{307, "netherlands"},
|
|
{308, "bahamas"},
|
|
{309, "bahamas"},
|
|
{310, "bermuda"},
|
|
{311, "bahamas"},
|
|
{312, "belize"},
|
|
{314, "barbados"},
|
|
{316, "canada"},
|
|
{319, "cayman_isles"},
|
|
{321, "costa_rica"},
|
|
{323, "cuba"},
|
|
{325, "dominica"},
|
|
{327, "dominican_republic"},
|
|
{329, "france"},
|
|
{330, "grenada"},
|
|
{331, "denmark"}, // greenland
|
|
{332, "guatemala"},
|
|
{334, "honduras"},
|
|
{336, "haiti"},
|
|
{338, "united_states"},
|
|
{339, "jamaica"},
|
|
{341, "st_kitts_and_nevis"},
|
|
{343, "st_lucia"},
|
|
{345, "mexico"},
|
|
{347, "france"}, // martinique
|
|
{348, "united_kingdom"}, // montserrat
|
|
{350, "nicaragua"},
|
|
{351, "panama"},
|
|
{352, "panama"},
|
|
{353, "panama"},
|
|
{354, "panama"},
|
|
{355, "panama"},
|
|
{356, "panama"},
|
|
{357, "panama"},
|
|
{358, "united_states"}, // puerto_rico
|
|
{359, "el_salvador"},
|
|
{361, "france"},
|
|
{362, "trinidad_and_tobago"},
|
|
{364, "turks_and_caicos"},
|
|
{366, "united_states"},
|
|
{367, "united_states"},
|
|
{368, "united_states"},
|
|
{369, "united_states"},
|
|
{370, "panama"},
|
|
{371, "panama"},
|
|
{372, "panama"},
|
|
{373, "panama"},
|
|
{374, "panama"},
|
|
{375, "st_vincent"},
|
|
{376, "st_vincent"},
|
|
{377, "st_vincent"},
|
|
{378, "virgin_isles"},
|
|
{401, "afghanistan"},
|
|
{403, "saudi_arabia"},
|
|
{405, "bangladesh"},
|
|
{408, "bahrain"},
|
|
{410, "bhutan"},
|
|
{412, "china"},
|
|
{413, "china"},
|
|
{414, "china"},
|
|
{416, "taiwan"},
|
|
{417, "sri_lanka"},
|
|
{419, "india"},
|
|
{422, "iran"},
|
|
{423, "azerbaijan"},
|
|
{425, "iraq"},
|
|
{428, "israel"},
|
|
{431, "japan"},
|
|
{432, "japan"},
|
|
{434, "turkmenistan"},
|
|
{436, "kazakhstan"},
|
|
{437, "uzbekistan"},
|
|
{438, "jordan"},
|
|
{440, "korea_south"},
|
|
{441, "korea_south"},
|
|
{443, "palestine"},
|
|
{445, "korea_north"},
|
|
{447, "kuwait"},
|
|
{450, "lebanon"},
|
|
{451, "kyrgyzstan"},
|
|
{453, "china"}, // macao
|
|
{455, "maldives"},
|
|
{457, "mongolia"},
|
|
{459, "nepal"},
|
|
{461, "oman"},
|
|
{463, "pakistan"},
|
|
{466, "qatar"},
|
|
{468, "syria"},
|
|
{470, "united_arab_emirates"},
|
|
{471, "united_arab_emirates"},
|
|
{472, "tajikistan"},
|
|
{473, "yemen"},
|
|
{474, "yemen"},
|
|
{477, "hong_kong"},
|
|
{478, "bosnia"},
|
|
{501, "france"},
|
|
{503, "australia"},
|
|
{506, "myanmar"},
|
|
{508, "brunei"},
|
|
{510, "micronesia"},
|
|
{511, "palau"},
|
|
{512, "new_zealand"},
|
|
{514, "cambodia"},
|
|
{515, "cambodia"},
|
|
{516, "australia"},
|
|
{518, "cook_islands"},
|
|
{520, "fiji"},
|
|
{523, "australia"},
|
|
{525, "indonesia"},
|
|
{529, "kiribati"},
|
|
{531, "laos"},
|
|
{533, "malaysia"},
|
|
{536, "united_states"},
|
|
{538, "marshall islands"},
|
|
{540, "france"},
|
|
{542, "new_zealand"},
|
|
{544, "nauru"},
|
|
{546, "france"},
|
|
{548, "philippines"},
|
|
{550, "timorleste"},
|
|
{553, "papua_new_guinea"},
|
|
{555, "united_kingdom"},
|
|
{557, "solomon_islands"},
|
|
{559, "united_states"}, // american_samoa
|
|
{561, "samoa"},
|
|
{563, "singapore"},
|
|
{564, "singapore"},
|
|
{565, "singapore"},
|
|
{566, "singapore"},
|
|
{567, "thailand"},
|
|
{570, "tonga"},
|
|
{572, "tuvalu"},
|
|
{574, "vietnam"},
|
|
{576, "vanuatu"},
|
|
{577, "vanuatu"},
|
|
{578, "france"},
|
|
{601, "south_africa"},
|
|
{603, "angola"},
|
|
{605, "algeria"},
|
|
{607, "france"},
|
|
{608, "united_kingdom"}, // ascension_island
|
|
{609, "burundi"},
|
|
{610, "benin"},
|
|
{611, "botswana"},
|
|
{612, "central_african_republic"},
|
|
{613, "cameroun"}, // cameroon
|
|
{615, "congoroc"},
|
|
{616, "comoros"},
|
|
{617, "cape_verde"},
|
|
{618, "france"},
|
|
{619, "ivory_coast"},
|
|
{620, "comoros"},
|
|
{621, "djibouti"},
|
|
{622, "egypt"},
|
|
{624, "ethiopia"},
|
|
{625, "eritrea"},
|
|
{626, "gabon"},
|
|
{627, "ghana"},
|
|
{629, "gambia"},
|
|
{630, "guinea_bissau"},
|
|
{631, "equatorial_guinea"},
|
|
{632, "guinea"},
|
|
{633, "burkina_faso"},
|
|
{634, "kenya"},
|
|
{635, "france"},
|
|
{636, "liberia"},
|
|
{637, "liberia"},
|
|
{638, "south_sudan"},
|
|
{642, "libya"},
|
|
{644, "lesotho"},
|
|
{645, "mauritius"},
|
|
{647, "madagascar"},
|
|
{649, "mali"},
|
|
{650, "mozambique"},
|
|
{654, "mauritania"},
|
|
{655, "malawi"},
|
|
{656, "niger"},
|
|
{657, "nigeria"},
|
|
{659, "namibia"},
|
|
{660, "france"}, // reunion
|
|
{661, "rwanda"},
|
|
{662, "sudan"},
|
|
{663, "senegal"},
|
|
{664, "seychelles"},
|
|
{665, "united_kingdom"}, // saint_helena
|
|
{666, "somalia"},
|
|
{667, "sierra_leone"},
|
|
{668, "sao_tome_principe"},
|
|
{669, "swaziland"}, // eswatini
|
|
{670, "chad"},
|
|
{671, "togo"},
|
|
{672, "tunisia"},
|
|
{674, "tanzania"},
|
|
{675, "uganda"},
|
|
{676, "congodrc"},
|
|
{677, "tanzania"},
|
|
{678, "zambia"},
|
|
{679, "zimbabwe"},
|
|
{701, "argentina"},
|
|
{710, "brazil"},
|
|
{720, "bolivia"},
|
|
{725, "chile"},
|
|
{730, "colombia"},
|
|
{735, "ecuador"},
|
|
{740, "falkland_isles"},
|
|
{745, "france"}, // guiana
|
|
{750, "guyana"},
|
|
{755, "paraguay"},
|
|
{760, "peru"},
|
|
{765, "suriname"},
|
|
{770, "uruguay"},
|
|
{775, "venezuela"},
|
|
};
|
|
|
|
QString MMSI::getMID(const QString &mmsi)
|
|
{
|
|
if (mmsi.startsWith("00") || mmsi.startsWith("99") || mmsi.startsWith("98")) {
|
|
return mmsi.mid(2, 3);
|
|
} else if (mmsi.startsWith("0") || mmsi.startsWith("8")) {
|
|
return mmsi.mid(1, 3);
|
|
} else if (mmsi.startsWith("111")) {
|
|
return mmsi.mid(3, 3);
|
|
} else {
|
|
return mmsi.left(3);
|
|
}
|
|
}
|
|
|
|
QString MMSI::getCountry(const QString &mmsi)
|
|
{
|
|
return m_mid[MMSI::getMID(mmsi).toInt()];
|
|
}
|
|
|
|
void MMSI::checkFlags()
|
|
{
|
|
// Loop through all MIDs and check to see if we have a flag icon
|
|
for (auto id : m_mid.keys())
|
|
{
|
|
QString country = m_mid.value(id);
|
|
QString path = QString(":/flags/%1.bmp").arg(country);
|
|
QResource res(path);
|
|
if (!res.isValid()) {
|
|
qDebug() << "MMSI::checkFlags: Resource invalid " << path;
|
|
}
|
|
}
|
|
}
|
|
|
|
QIcon *MMSI::getFlagIcon(const QString &mmsi)
|
|
{
|
|
QString country = getCountry(mmsi);
|
|
return AircraftInformation::getFlagIcon(country);
|
|
}
|
|
|
|
QString MMSI::getFlagIconURL(const QString &mmsi)
|
|
{
|
|
QString country = getCountry(mmsi);
|
|
return AircraftInformation::getFlagIconURL(country);
|
|
}
|
|
|
|
QString MMSI::getCategory(const QString &mmsi)
|
|
{
|
|
switch (mmsi[0].toLatin1())
|
|
{
|
|
case '0':
|
|
if (mmsi.startsWith("00")) {
|
|
return "Coast";
|
|
} else {
|
|
return "Group"; // Group of ships
|
|
}
|
|
case '1':
|
|
// Search and rescue
|
|
if (mmsi[6] == '1') {
|
|
return "SAR Aircraft";
|
|
} else if (mmsi[6] == '5') {
|
|
return "SAR Helicopter";
|
|
} else {
|
|
return "SAR";
|
|
}
|
|
case '8':
|
|
return "Handheld";
|
|
case '9':
|
|
if (mmsi.startsWith("970"))
|
|
{
|
|
return "SAR";
|
|
}
|
|
else if (mmsi.startsWith("972"))
|
|
{
|
|
return "Man overboard";
|
|
}
|
|
else if (mmsi.startsWith("974"))
|
|
{
|
|
return "EPIRB"; // Emergency Becaon
|
|
}
|
|
else if (mmsi.startsWith("979"))
|
|
{
|
|
return "AMRD"; // Autonomous
|
|
}
|
|
else if (mmsi.startsWith("98"))
|
|
{
|
|
return "Craft with parent ship";
|
|
}
|
|
else if (mmsi.startsWith("99"))
|
|
{
|
|
if (mmsi[5] == '1') {
|
|
return "Physical AtoN";
|
|
} else if (mmsi[5] == '6') {
|
|
return "Virtual AtoN";
|
|
} else if (mmsi[5] == '8') {
|
|
return "Mobile AtoN";
|
|
} else {
|
|
return "AtoN"; // Aid-to-navigation
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
return "Ship"; // Vessel better?
|
|
}
|
|
return "Unknown";
|
|
}
|