#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(bin2(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