sdrangel/sdrbase/util/mmsi.cpp

422 wiersze
11 KiB
C++

///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2023 Jon Beniston, M7RCE //
// //
// 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
}
}
default:
return "Ship"; // Vessel better?
}
return "Unknown";
}