#include "tdoa_sync.h" #include "sync_time/sync_time_message.h" #include "sync_manager.h" #include #include extern config_file config; struct tdoa_sync_impl:tdoa_sync { virtual void on_message(message_tdoasync&msg) { host_server::sync_time_message _sync_msg; _sync_msg.set_local_id((unsigned long long)(msg.m_local_site_id)); _sync_msg.set_local_id((unsigned long long)((_sync_msg.get_local_id() << 8) + msg.m_local_ant_id)); _sync_msg.set_upper_id((unsigned long long)(msg.m_parent_site_id)); _sync_msg.set_upper_id((unsigned long long)((_sync_msg.get_upper_id() << 8) + msg.m_parent_ant_id)); _sync_msg.set_root_id((unsigned long long)(msg.m_root_site_id)); _sync_msg.set_root_id((unsigned long long)((_sync_msg.get_root_id() << 8) + msg.m_root_ant_id)); _sync_msg.set_sync_num(msg.m_sync_num); _sync_msg.set_sync_level(msg.m_local_level); _sync_msg.set_local_send_time(msg.m_send_time); _sync_msg.set_local_receive_time(msg.m_recv_time); auto _sync_msg_tmp = _sync_msg; for (auto iter = ssync_manager.map_id_manager.begin(); iter != ssync_manager.map_id_manager.end(); iter++) iter->second.analyze_sync_msg(_sync_msg); //ssync_manager.analyze_sync_msg(_sync_msg); } virtual void translate(message_tdoa_locinfo& tdoa_msg) { host_server::tag_message _tag_msg; _tag_msg.m_receive_time = tdoa_msg.m_card_msg.m_loc_stamp; _tag_msg.m_local_id = host_server::sync_helper::parse_id((unsigned long long)tdoa_msg.m_site_msg.m_site_id, (unsigned long long)(tdoa_msg.m_card_msg.m_ant_id + 1)); _tag_msg.m_sync_num = tdoa_msg.m_card_msg.m_sync_num; _tag_msg.m_sync_root_id = ssync_manager.sRootIdCode; unsigned long long rootIdCode = ssync_manager.sRootIdCode; if (ssync_manager.map_id_manager.count(tdoa_msg.m_card_msg.m_id) == 0) { ssync_manager.map_id_manager[tdoa_msg.m_card_msg.m_id].sRootIdCode = ssync_manager.sRootIdCode; //ssync_manager.map_id_manager[loc.m_card_msg.m_id].m_mu_sync_time = m_mu_sync_time; ssync_manager.map_id_manager[tdoa_msg.m_card_msg.m_id].m_log_status = ssync_manager.m_log_status; ssync_manager.map_id_manager[tdoa_msg.m_card_msg.m_id].ump_anchors = ssync_manager.ump_anchors; ssync_manager.map_id_manager[tdoa_msg.m_card_msg.m_id].ump_distance = ssync_manager.ump_distance; ssync_manager.map_id_manager[tdoa_msg.m_card_msg.m_id].ump_sync_time_msg = ssync_manager.ump_sync_time_msg; ssync_manager.map_id_manager[tdoa_msg.m_card_msg.m_id].ump_history_sync = ssync_manager.ump_history_sync; } int idx = ssync_manager.map_id_manager[tdoa_msg.m_card_msg.m_id].find_sync_time_msg(rootIdCode, _tag_msg.m_sync_num); if (idx >= 0) { ssync_manager.map_id_manager[tdoa_msg.m_card_msg.m_id].ump_sync_time_msg[rootIdCode][idx].ump_sync_time_msg_item[_tag_msg.m_local_id].tag = _tag_msg; tdoa_msg.m_interpolation = ssync_manager.map_id_manager[tdoa_msg.m_card_msg.m_id].ump_sync_time_msg[rootIdCode][idx].ump_sync_time_msg_item[_tag_msg.m_local_id].map_tdoa_msg[tdoa_msg.m_card_msg.m_id].m_interpolation; ssync_manager.map_id_manager[tdoa_msg.m_card_msg.m_id].ump_sync_time_msg[rootIdCode][idx].ump_sync_time_msg_item[_tag_msg.m_local_id].map_tdoa_msg[tdoa_msg.m_card_msg.m_id] = tdoa_msg; ssync_manager.map_id_manager[tdoa_msg.m_card_msg.m_id].ump_sync_time_msg[rootIdCode][idx].nDataCount++; /*if (ssync_manager.ump_sync_time_msg[rootIdCode][idx].nCardCount< ssync_manager.ump_sync_time_msg[rootIdCode][idx].ump_sync_time_msg[_tag_msg.m_local_id].map_tdoa_msg.size()) { ssync_manager.ump_sync_time_msg[rootIdCode][idx].nCardCount = ssync_manager.ump_sync_time_msg[rootIdCode][idx].ump_sync_time_msg[_tag_msg.m_local_id].map_tdoa_msg.size(); }*/ int nDataCount = ssync_manager.map_id_manager[tdoa_msg.m_card_msg.m_id].ump_sync_time_msg[rootIdCode][idx].nDataCount; int nSize = ssync_manager.map_id_manager[tdoa_msg.m_card_msg.m_id].ump_sync_time_msg[rootIdCode][idx].ump_sync_time_msg_item.size(); //if (nDataCount >= 3 && nDataCount >= nSize * ssync_manager.ump_sync_time_msg[rootIdCode][idx].nCardCount) if (nDataCount >= 8) { for (auto it = ssync_manager.map_id_manager[tdoa_msg.m_card_msg.m_id].ump_sync_time_msg[rootIdCode][idx].ump_sync_time_msg_item.begin(); it != ssync_manager.map_id_manager[tdoa_msg.m_card_msg.m_id].ump_sync_time_msg[rootIdCode][idx].ump_sync_time_msg_item.end(); it++) { // 线性插值后的值 uint64_t ip_value = 0; // 线性插值类型 int ip_type = config.get("service.interpolation", 0); switch (ip_type) { case 0: ip_value = ssync_manager.map_id_manager[tdoa_msg.m_card_msg.m_id].cal_time_by_linear(it->second.tag); break; case 1: ip_value = ssync_manager.map_id_manager[tdoa_msg.m_card_msg.m_id].cal_time_by_inter_linear(it->second.tag); break; default: break; } if (0 == ip_value) { ip_value = LONGLONG_MAX; } for (auto iter_tmp = it->second.map_tdoa_msg.begin(); iter_tmp != it->second.map_tdoa_msg.end(); iter_tmp++) iter_tmp->second.m_interpolation = ip_value; } } } } }; tdoa_sync*tdoa_sync::instance() { static tdoa_sync_impl _impl; return &_impl; }