Program Listing for File hardware_monitor.hpp

Return to documentation for file (hardware_monitor.hpp)

#ifndef HW_MON_FRONTEND_H_
#define HW_MON_FRONTEND_H_

#include <cstdint>
#include <memory>

#include "hardware_monitor_backend.hpp"
#include "bus.hpp"
#include "publisher.hpp"
#include "network/netio_buffered_publisher.hpp"
#include "network/utility.hpp"
#include "config/config_register.hpp"

using namespace std::chrono_literals;

template <class DEV>
class HwMonitor
{
    public:
        using device_pair = std::pair<std::shared_ptr<DEV>, std::shared_ptr<DEV>>;

        HwMonitor(const std::vector<device_pair> & device_pairs, const ConfigRegister & c);

        bool publish_monitor_info();

    private:
        HwMonBackend<DEV> m_backend;
        Bus m_bus;
        uint64_t m_fid;
        std::unique_ptr<Publisher> m_publisher;
};


template <class DEV>
HwMonitor<DEV>::HwMonitor(const std::vector<HwMonitor<DEV>::device_pair> & device_pairs, const ConfigRegister &c)
    : m_backend(device_pairs, c.extra_mon),
      m_bus{c.bus_dir, c.bus_group, "register-mon-"+std::to_string(c.dconfs.at(0).dev_no), c.verbose_bus},
      m_fid(c.fid_mon)
{
    constexpr int net_pages{16};
    constexpr int net_page_size{4096};
    constexpr int net_page_timeout{0};
    auto fid_mon = Elink(c.fid_mon);

    unsigned int mon_interval_us = 1e6*c.mon_interval;
    LOG_INFO("Hardware monitoring poll period %u s.", c.mon_interval);
    m_publisher = network::utility::create_buffered_publisher(c.evloop_type, c.local_ip, c.port_mon, m_bus,
        net_pages, net_page_size, net_page_size, net_page_timeout, UINT32_MAX);
    m_publisher->declare({fid_mon});
    m_publisher->set_periodic_callback(mon_interval_us, [this]{return publish_monitor_info();});
}


template <class DEV>
bool HwMonitor<DEV>::publish_monitor_info()
{
    std::string msg = m_backend.get_monitor_data();
    auto msg_ptr = reinterpret_cast<uint8_t*>(msg.data());
    iovec net_msg[2];
    uint8_t status = 0;
    net_msg[0].iov_len = 1;
    net_msg[0].iov_base = &status;
    net_msg[1].iov_len = msg.length();
    net_msg[1].iov_base = msg_ptr;
    //The publish function that takes a pointer to the data message
    //assumes that the first byte is the status byte.
    m_publisher->publish(m_fid, net_msg, 2, 0, 0, 0);
    m_publisher->flush(m_fid);
    //This function must return false otherwise the callback is invoked again.
    //TODO: the publisher set_periodic_callback is designed for felix-tohost.
    return false;
}


#endif /* HW_MON_FRONTEND_H_ */