STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
daq_bridge_main.cpp File Reference
#include <arpa/inet.h>
#include <netinet/in.h>
#include <signal.h>
#include <sys/socket.h>
#include <unistd.h>
#include <algorithm>
#include <array>
#include <atomic>
#include <chrono>
#include <cstring>
#include <fstream>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <set>
#include <sstream>
#include <string>
#include <thread>
#include <vector>
#include "comms/messages/board/BoardHeartbeatMessage.hpp"
#include "comms/messages/sensor/CalibratedSensorMessages.hpp"
#include "comms/messages/sensor/EnvironmentalMessage.hpp"
#include "comms/messages/sensor/SensorMessages.hpp"
#include "daq-protocol.h"
#include "fsw/BoardTypeWire.hpp"
#include "calibration/PTCalibration.hpp"
#include "calibration/SensorCalibration.hpp"
#include "config/BoardDiscovery.hpp"
#include "config/Config.hpp"
#include "config/LoadActiveBoards.hpp"
#include "elodin/DatabaseConfig.hpp"
#include "elodin/ElodinClient.hpp"
#include "fsw/FSWConfigManager.hpp"
#include "net/DaqInterface.hpp"
#include "routing/HeartbeatRouter.hpp"
#include "routing/SensorRouter.hpp"
#include "streams/SensorFramePipeline.hpp"
#include "time/BoardClockSync.hpp"
Include dependency graph for daq_bridge_main.cpp:

Go to the source code of this file.

Classes

class  anonymous_namespace{daq_bridge_main.cpp}::BackendLogForwarder
struct  BoardConfig
struct  ServerHeartbeatConfig

Namespaces

namespace  anonymous_namespace{daq_bridge_main.cpp}

Typedefs

using BoardType = fsw::config::ActiveBoardKind
using BoardByOctet = std::map<int, BoardConfig>

Functions

std::vector< uint8_t > anonymous_namespace{daq_bridge_main.cpp}::build_server_heartbeat_packet ()
std::atomic< bool > running (true)
void signal_handler (int)
static int ipv4_host_octet (const std::string &ip)
 Last octet of a dotted IPv4 string (e.g.
static void load_board_map_from_config (const std::string &config_path, std::map< std::string, BoardConfig > &board_map, BoardByOctet *out_board_by_octet, std::string &db_host, uint16_t &db_port, uint16_t *out_sensor_port=nullptr, std::string *out_bind_ip=nullptr, ServerHeartbeatConfig *out_hb=nullptr, fsw::time::TimeSyncConfig *out_ts=nullptr, uint16_t *out_log_port=nullptr)
static BoardType discovery_board_type_to_enum (uint8_t t)
static uint8_t config_board_type_to_wire_u8 (BoardType t)
static const BoardConfig * resolve_board_config_by_source_ip (const std::string &source_ip, const std::map< std::string, BoardConfig > &board_map, const BoardByOctet &board_by_octet)
 Resolve a packet's source IP to its config board.
int main (int argc, char *argv[])

Variables

constexpr uint8_t anonymous_namespace{daq_bridge_main.cpp}::SERVER_HEARTBEAT_PACKET_TYPE = 2

Typedef Documentation

◆ BoardByOctet

using BoardByOctet = std::map<int, BoardConfig>

Definition at line 137 of file daq_bridge_main.cpp.

◆ BoardType

Definition at line 114 of file daq_bridge_main.cpp.

Function Documentation

◆ config_board_type_to_wire_u8()

◆ discovery_board_type_to_enum()

◆ ipv4_host_octet()

int ipv4_host_octet ( const std::string & ip)
static

Last octet of a dotted IPv4 string (e.g.

"192.168.2.51" -> 51), or -1 if not parseable.

Definition at line 140 of file daq_bridge_main.cpp.

References tail.

Referenced by load_board_map_from_config(), and resolve_board_config_by_source_ip().

◆ load_board_map_from_config()

◆ main()

int main ( int argc,
char * argv[] )

Definition at line 307 of file daq_bridge_main.cpp.

References anonymous_namespace{daq_bridge_main.cpp}::BackendLogForwarder::BackendLogForwarder(), fsw::elodin::ElodinClient::begin_batch(), board(), daq::BOARD_HEARTBEAT, board_id, BoardConfig::board_id, fsw::time::TimeSyncConfig::BoardClock, fsw::time::BoardClockSync::boards(), ServerHeartbeatConfig::broadcast_ip, ServerHeartbeatConfig::broadcast_port, anonymous_namespace{daq_bridge_main.cpp}::build_server_heartbeat_packet(), config_board_type_to_wire_u8(), fsw::elodin::ElodinClient::connect(), count(), DIABLO_COMMS_VERSION, discovery_board_type_to_enum(), elapsed(), fsw::config::FLIGHT, fsw::elodin::ElodinClient::flush_batch(), fsw::config::BoardDiscovery::get_board_by_ip(), fsw::calibration::PTCalibrationManager::get_calibrated_count(), fsw::config::BoardDiscovery::get_discovered_boards(), fsw::streams::SensorFramePipeline::get_last_environmental(), fsw::streams::SensorFramePipeline::get_last_heartbeat(), fsw::streams::SensorFramePipeline::get_last_log(), fsw::config::GSE, fsw::config::BoardDiscovery::HYBRID, fsw::config::BoardDiscovery::initialize(), ServerHeartbeatConfig::interval_ms, fsw::elodin::ElodinClient::is_connected(), fsw::streams::SensorFramePipeline::is_ready(), fsw::daq_wire::kUnknown, fsw::streams::SensorFramePipeline::last_error(), fsw::streams::SensorFramePipeline::last_source_ip(), fsw::config::load(), fsw::config::load_active_boards(), fsw::config::DynamicConfigManager::load_base_config(), load_board_map_from_config(), fsw::calibration::PTCalibrationManager::load_calibration(), fsw::calibration::SensorCalibrationManager::load_calibration(), fsw::time::TimeSyncConfig::log_interval_s, mac, fsw::time::TimeSyncConfig::mode, daq::parse_board_heartbeat_packet(), daq::parse_log_packet(), fsw::streams::SensorFramePipeline::poll(), fsw::config::BoardDiscovery::process_board_announcement(), fsw::routing::HeartbeatRouter::process_heartbeat(), fsw::elodin::ElodinClient::publish(), fsw::elodin::ElodinClient::read_data(), fsw::elodin::ElodinClient::reconnect(), fsw::elodin::DatabaseConfig::register_ball_valve_tables(), fsw::elodin::DatabaseConfig::register_calibrated_tables(), fsw::elodin::DatabaseConfig::register_environmental_tables(), fsw::elodin::DatabaseConfig::register_heartbeat_tables(), fsw::elodin::DatabaseConfig::register_self_test_tables(), fsw::elodin::DatabaseConfig::register_tables(), res, resolve_board_config_by_source_ip(), fsw::net::resolveDaqBindAddress(), running, daq::SAFE, ServerHeartbeatConfig::send_from_daq_bridge, fsw::streams::SensorFramePipeline::send_to(), fsw::streams::SensorFramePipeline::set_broadcast(), fsw::config::BoardDiscovery::set_static_ip_for_board(), comms::CommsMessage< Fields >::setField(), daq::SETUP, signal_handler(), fsw::time::BoardClockSync::stamp_packet(), fsw::config::BoardDiscovery::start_discovery(), fsw::time::BoardClockSync::stats(), BoardConfig::type, and fsw::time::TimeSyncConfig::window_seconds.

◆ resolve_board_config_by_source_ip()

const BoardConfig * resolve_board_config_by_source_ip ( const std::string & source_ip,
const std::map< std::string, BoardConfig > & board_map,
const BoardByOctet & board_by_octet )
static

Resolve a packet's source IP to its config board.

Real deployments send from the config IP, so the direct board_map lookup hits. The integration test can't bind the 192.168.2.* config IPs, so the simulator binds each board to 127.0.0.<host-octet> (the last octet of its config IP); those packets resolve by that octet via board_by_octet. This is identity-based — unlike the old index-based scheme it does NOT depend on the bridge and the sim iterating [boards] in the same order, which they don't (toml++ sorts alphabetically; the Python sim uses file order).

Definition at line 290 of file daq_bridge_main.cpp.

References ipv4_host_octet().

Referenced by main().

◆ running()

std::atomic< bool > running ( true )

◆ signal_handler()

void signal_handler ( int )

Definition at line 108 of file daq_bridge_main.cpp.

References running.

Referenced by main().