16 const daq::PacketHeader& header,
const daq::BoardHeartbeatPacket& heartbeat,
17 uint8_t board_type_wire, uint64_t receive_ts_ns,
int elodin_board_id_if_known) {
18 uint8_t logical_id = heartbeat.board_id;
19 if (elodin_board_id_if_known >= 0 && elodin_board_id_if_known <= 255) {
20 logical_id =
static_cast<uint8_t
>(elodin_board_id_if_known);
22 const auto now = std::chrono::steady_clock::now();
28 if (!
state.seen_before) {
29 state.seen_before =
true;
30 std::cout <<
"[HeartbeatRouter] New board seen: id=" << (int)logical_id
31 <<
" type_wire=" << (
int)board_type_wire;
32 if (logical_id != heartbeat.board_id) {
33 std::cout <<
" (wire board_id=" << (int)heartbeat.board_id <<
" -> config board_id)";
35 std::cout << std::endl;
37 auto gap = std::chrono::duration_cast<std::chrono::milliseconds>(now -
state.last_seen);
40 std::cout <<
"[HeartbeatRouter] Board " << (int)logical_id <<
" reconnected after "
41 << gap.count() <<
"ms" << std::endl;
45 std::cout <<
"[HeartbeatRouter] Board " << (int)logical_id <<
" re-entered SETUP state"
50 state.last_seen = now;
51 state.last_board_state = heartbeat.board_state;
59 msg.
setField<3>(
static_cast<uint8_t
>(heartbeat.engine_state));
60 msg.
setField<4>(
static_cast<uint8_t
>(heartbeat.board_state));
63 std::array<uint8_t, 2> pkt_id = {0x10, logical_id};
BoardEvent process_heartbeat(const daq::PacketHeader &header, const daq::BoardHeartbeatPacket &heartbeat, uint8_t board_type_wire, uint64_t receive_ts_ns, int elodin_board_id_if_known=-1)
Process one BOARD_HEARTBEAT and publish to Elodin.
static ActuatorControllerState state
CommsMessage< uint64_t, uint8_t, uint8_t, uint8_t, uint8_t, uint32_t > BoardHeartbeatElodinMessage
Board heartbeat status record for Elodin.