264 lines
8.4 KiB
C++
264 lines
8.4 KiB
C++
#ifdef _USE_GTEST
|
|
#ifndef TEST_ADSB_H
|
|
#define TEST_ADSB_H
|
|
#include "global.h"
|
|
|
|
// === TEST ADS-B package ===
|
|
// === TEST ADS-B package ===
|
|
|
|
// 8DAABB04482380B0B458CB3C4B5F
|
|
// 8DAABB044823845899AC759ABFCB
|
|
|
|
|
|
|
|
using namespace ADS_B;
|
|
using namespace CPR;
|
|
|
|
|
|
|
|
TEST(ADSBTest, Icao2) {
|
|
// std::string msg1 = hex2bin("8DAABB04482380B0B458CB3C4B5F");
|
|
// std::string msg2 = hex2bin("8DAABB044823845899AC759ABFCB");
|
|
//
|
|
// // TODO 改成测 CPR
|
|
// auto it = airborne_position(msg1, msg2, 0 , 1).value();
|
|
//
|
|
//
|
|
// std::cout<< it.lat << " " << it.lon << std::endl;
|
|
//
|
|
|
|
EXPECT_EQ(decode_icao(hex2bin("8D406B902015A678D4D220AA4BDA")), "406B90");
|
|
|
|
}
|
|
TEST(ADSBTest, Category) {
|
|
std::string msg = hex2bin("8D406B902015A678D4D220AA4BDA");
|
|
EXPECT_EQ(category(msg), 0);
|
|
set_category(msg, 5);
|
|
EXPECT_EQ(category(msg), 5);
|
|
}
|
|
|
|
TEST(ADSBTest, Callsign) {
|
|
std::string msg = hex2bin("8D406B902015A678D4D220AA4BDA");
|
|
EXPECT_EQ(get_call_sign(msg), "EZY85MH ");
|
|
set_call_sign(msg, "ADS12345");
|
|
EXPECT_EQ(get_call_sign(msg), "ADS12345");
|
|
set_call_sign(msg, "ADS");
|
|
EXPECT_EQ(get_call_sign(msg), "ADS");
|
|
}
|
|
TEST(ADSBTest, Position) {
|
|
// auto pos = position(hex2bin("8D40058B58C901375147EFD09357"), hex2bin("8D40058B58C904A87F402D3B8C59"), 1446332400, 1446332405, -1, -1).value();
|
|
// EXPECT_NEAR(pos.latitude, 49.81755, 0.001);
|
|
// EXPECT_NEAR(pos.longitude, 6.08442, 0.001);
|
|
}
|
|
TEST(ADSBTest, PositionSwapOddEven) {
|
|
// auto pos = position(hex2bin("8D40058B58C904A87F402D3B8C59"), hex2bin("8D40058B58C901375147EFD09357"), 1446332405, 1446332400, -1, -1).value();
|
|
// EXPECT_NEAR(pos.latitude, 49.81755, 0.001);
|
|
// EXPECT_NEAR(pos.longitude, 6.08442, 0.001);
|
|
}
|
|
|
|
TEST(ADSBTest, Altitude) {
|
|
Altitude_type altitude_type;
|
|
auto msg_bin = hex2bin("8D40058B58C901375147EFD09357");
|
|
auto tc = get_type_code(msg_bin);
|
|
if (tc >= 9 && tc <= 18) {
|
|
altitude_type = Altitude_type::Baro;
|
|
}
|
|
if (tc >= 20 && tc <= 22) {
|
|
altitude_type = Altitude_type::GNSS;
|
|
}
|
|
|
|
// 40 在版本1 2的区别中
|
|
auto alt_baro = decode_altitude_12_meter(msg_bin.substr(40, 12), altitude_type) / aero::ft;
|
|
|
|
EXPECT_EQ(alt_baro, 39000);
|
|
}
|
|
|
|
|
|
|
|
TEST(ADSBTest, Velocity) {
|
|
auto vgs = airborne_velocity(hex2bin("8D485020994409940838175B284F"));
|
|
EXPECT_NEAR(vgs.speed, 159.0, 0.1);
|
|
EXPECT_NEAR(vgs.angle, 182.88, 0.1);
|
|
EXPECT_NEAR(vgs.vertical_rate, -832, 0.1);
|
|
EXPECT_STREQ(vgs.speed_type.c_str(), "GS");
|
|
|
|
auto vas = airborne_velocity(hex2bin("8DA05F219B06B6AF189400CBC33F"));
|
|
EXPECT_NEAR(vas.speed, 375.0, 0.1);
|
|
EXPECT_NEAR(vas.angle, 243.98, 0.1);
|
|
EXPECT_NEAR(vas.vertical_rate, -2304, 0.1);
|
|
EXPECT_STREQ(vas.speed_type.c_str(), "TAS");
|
|
|
|
|
|
auto mb = hex2bin("8FC8200A3AB8F5F893096B000000");
|
|
auto subtype = static_cast<int>(bin2<int>(mb.substr(5, 3)));
|
|
Ground_Speed_Type type;
|
|
if (subtype == 3) {
|
|
type = Ground_Speed_Type::Ground_Normal;
|
|
} else if (subtype == 4) {
|
|
type = Ground_Speed_Type::Ground_Supersonic;
|
|
}
|
|
|
|
// TODO: 感觉源码是错的 这个地方文档和源码对不上
|
|
// C:\Users\wyc\AppData\Roaming\Python\Python312\site-packages\pyModeS\decoder\bds\bds06.py 141 surface_velocity
|
|
// auto vgs_surface = surface_velocity(mb, type);
|
|
// EXPECT_NEAR(vgs_surface.speed, 19.0, 0.1);
|
|
// EXPECT_NEAR(vgs_surface.angle, 42.2, 0.1);
|
|
// std::cout << vas.toString() << std::endl;
|
|
// std::cout << vgs_surface.toString();
|
|
}
|
|
TEST(ADSBTest, Emergency) {
|
|
// 检查是否紧急状态
|
|
EXPECT_FALSE(is_emergency(hex2bin("8DA2C1B6E112B600000000760759")));
|
|
// 检查紧急状态代码
|
|
EXPECT_EQ(emergency_state(hex2bin("8DA2C1B6E112B600000000760759")), 0);
|
|
// 检查紧急Squawk代码
|
|
EXPECT_EQ(emergency_squawk(hex2bin("8DA2C1B6E112B600000000760759")), "6513");
|
|
}
|
|
TEST(ADSBTest, TargetStateStatus) {
|
|
// 测试 selected_altitude 函数
|
|
auto sel_alt = selected_altitude(hex2bin("8DA05629EA21485CBF3F8CADAEEB"));
|
|
EXPECT_EQ(std::get<0>(sel_alt), 16992); // 高度选择
|
|
EXPECT_EQ(std::get<1>(sel_alt), "MCP/FCU"); // 模式控制面板或飞行管理单元
|
|
EXPECT_NEAR(baro_pressure_setting(hex2bin("8DA05629EA21485CBF3F8CADAEEB")), 1012.8, 0.1);
|
|
EXPECT_NEAR(selected_heading(hex2bin("8DA05629EA21485CBF3F8CADAEEB")), 66.8, 0.1);
|
|
EXPECT_TRUE(autopilot(hex2bin("8DA05629EA21485CBF3F8CADAEEB")));
|
|
EXPECT_TRUE(vnav_mode(hex2bin("8DA05629EA21485CBF3F8CADAEEB")));
|
|
EXPECT_FALSE(altitude_hold_mode(hex2bin("8DA05629EA21485CBF3F8CADAEEB")));
|
|
EXPECT_FALSE(approach_mode(hex2bin("8DA05629EA21485CBF3F8CADAEEB")));
|
|
EXPECT_TRUE(tcas_operational(hex2bin("8DA05629EA21485CBF3F8CADAEEB")));
|
|
EXPECT_TRUE(lnav_mode(hex2bin("8DA05629EA21485CBF3F8CADAEEB")));
|
|
|
|
// std::cout << altitude_hold_mode(hex2bin("8DA05629EA21485CBF3F8CADAEEB")).value();
|
|
// std::cout << lnav_mode(hex2bin("8DA05629EA21485CBF3F8CADAEEB")).value();
|
|
}
|
|
|
|
TEST(ADSBTest, Aircraft_identification_BDS08) {
|
|
|
|
}
|
|
|
|
TEST(ADSBTest, Airborne_Position_BDS05) {
|
|
// auto BDS08 = Aircraft_identification_BDS08::Builder(
|
|
// "406B90",
|
|
// "ADS12345",
|
|
// Vortex_Type::Glider)
|
|
// .build();
|
|
//
|
|
//
|
|
// //std::cout << bin2hex(BDS08.msg) << std::endl;
|
|
//
|
|
// //std::cout << tell(BDS08.msg);
|
|
//
|
|
// double lat = 37, lon = 102;
|
|
// auto BDS05 = Airborne_Position_BDS05_v01::Builder(
|
|
// "406B90",
|
|
// lat,
|
|
// lon,
|
|
// Altitude_type::GNSS,
|
|
// 900,
|
|
// CPR_Format::odd_frame
|
|
// ).build();
|
|
// //std::cout << tell(BDS05.msg) << std::endl;
|
|
//
|
|
// auto BDS052 = Airborne_Position_BDS05_v01::Builder(
|
|
// "406B90",
|
|
// lat,
|
|
// lon,
|
|
// Altitude_type::Baro,
|
|
// 900,
|
|
// CPR_Format::even_frame
|
|
// ).build();
|
|
|
|
//std::cout << tell(BDS052.msg) << std::endl;
|
|
|
|
// auto [rlat, rlon] = airborne_position(BDS05.msg, BDS052.msg, 0, 1);
|
|
//
|
|
// EXPECT_NEAR(rlat, lat, 10);
|
|
// EXPECT_NEAR(rlon, lon, 10);
|
|
}
|
|
|
|
TEST(ADSBTest, PositionWithRef) {
|
|
auto pos = CPR::airborne_position_with_ref(hex2bin("8D40058B58C901375147EFD09357"), 50.0, 6.0, 0, 1).value();
|
|
EXPECT_NEAR(pos.lat, 49.82410, 0.1);
|
|
EXPECT_NEAR(pos.lon, 6.06785, 0.1);
|
|
// 这个和python的结果有浮点误差
|
|
pos = surface_position_with_ref(hex2bin("8FC8200A3AB8F5F893096B000000"), -43.5, 172.5, 0, 1).value();
|
|
EXPECT_NEAR(pos.lat, -43.48564, 0.3);
|
|
EXPECT_NEAR(pos.lon, 172.53942, 0.3);
|
|
|
|
std::string msg1 = hex2bin("8C4841753AAB238733C8CD4020B1");
|
|
std::string msg2 = hex2bin("8C4841753A8A35323FAEBDAC702D");
|
|
//double lat_cef = 51.990, lon_cef = 4.375;
|
|
double lat_cef = 51.990, lon_cef = 4.375;
|
|
CPR::Position pos_ref(lat_cef, lon_cef);
|
|
|
|
auto p = surface_position(msg1, msg2, 1457996410, 1457996412, pos_ref).value();
|
|
double rlat = p.lat;
|
|
double rlon = p.lon;
|
|
|
|
//std::cout << rlat << " " << rlon << std::endl;
|
|
EXPECT_NEAR(52.3206, rlat, 5);
|
|
EXPECT_NEAR(4.73473, rlon, 5);
|
|
|
|
}
|
|
|
|
TEST(ADSBTest, Surface_Position_BDS06) {
|
|
// double lat = 52.320607, lon = 4.734735;
|
|
// auto t = Surface_Position_BDS06::Builder(
|
|
// "406B90",
|
|
// lat,
|
|
// lon,
|
|
// CPR_Format::even_frame,
|
|
// 100).set_track(100).build();
|
|
// auto t2 = Surface_Position_BDS06::Builder(
|
|
// "406B90",
|
|
// lat,
|
|
// lon,
|
|
// CPR_Format::odd_frame,
|
|
// 100).set_track(100).build();
|
|
|
|
|
|
|
|
//std::cout << tell(t.msg) << std::endl;
|
|
|
|
//std::cout << tell(BDS052.msg) << std::endl;
|
|
|
|
// std::cout << bin2hex(t.msg) << std::endl;
|
|
// std::cout << bin2hex(t2.msg) << std::endl;
|
|
|
|
|
|
// auto [rlat, rlon] = surface_position(t.msg, t2.msg, 1457996410, 1457996412, 51.990, 4.375);
|
|
//
|
|
// // std::cout << rlat << " " << rlon << std::endl;
|
|
// EXPECT_NEAR(rlat, lat, 52.320607);
|
|
// EXPECT_NEAR(rlon, lon, 4.734735);
|
|
}
|
|
|
|
TEST(ADSBTest, Ground_Speed_BDS_BDS09) {
|
|
// auto Ground_Speed = Ground_Speed_BDS09_v0::Builder("ABCDEF", 45, 640)
|
|
// .set_vertical_rate(448)
|
|
// .set_GNSS_barometric_altitudes_difference(20)
|
|
// .build().msg;
|
|
// std::cout << tell(Ground_Speed) << std::endl;
|
|
}
|
|
|
|
TEST(ADSBTest, Airspeed_BDS_BDS09) {
|
|
// auto Airspeed = Airspeed_BDS09_v12::Builder("ABCDEF", 45, 1000)
|
|
// .set_vertical_rate(1000)
|
|
// .set_GNSS_barometric_altitudes_difference(20)
|
|
// .build().msg;
|
|
//std::cout << tell(Airspeed) << std::endl;
|
|
}
|
|
|
|
|
|
TEST(ADSBTest, Surface_Operation_Status_Ver2_BDS65) {
|
|
|
|
// auto sops = Surface_Operation_Status_Ver2_BDS65::Builder("ABCDEF")
|
|
// .build();
|
|
|
|
//std::cout << tell(sops.msg) << std::endl;
|
|
}
|
|
|
|
#endif
|
|
|
|
#endif
|