Files
SSR/test/test_adsb.h
T
2026-06-16 11:04:03 +08:00

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