Program Listing for File register_device_interface.hpp
↰ Return to documentation for file (register_device_interface.hpp)
#ifndef REGISTER_DEVICE_MANAGER_H_
#define REGISTER_DEVICE_MANAGER_H_
#include <memory>
#include <stdint.h>
#include <string>
#include "log.hpp"
#include "device.hpp"
#include "regmap_manager.hpp"
template <class DEV>
class RegisterDeviceInterface
{
public:
RegisterDeviceInterface(RegmapManager & regmap, std::shared_ptr<DEV> main, std::shared_ptr<DEV> primary)
: m_regmap(regmap), m_main(main), m_primary(primary){}
uint64_t get_register(const std::string& reg_name);
void set_register(const std::string& reg_name, uint64_t value);
bool can_read(const std::string& reg_name){ return m_regmap.can_read(reg_name); };
bool can_write(const std::string& reg_name){ return m_regmap.can_write(reg_name); };
private:
RegmapManager & m_regmap;
std::shared_ptr<DEV> m_main;
std::shared_ptr<DEV> m_primary;
DEV* select_device(const std::string& reg_name);
};
template <class DEV>
DEV* RegisterDeviceInterface<DEV>::select_device(const std::string& reg_name)
{
DEV* device = nullptr;
unsigned dev_no = m_main->get_device_number();
if (not m_regmap.has_endpoint_1(reg_name) and not m_main->is_primary())
{
if (!m_primary.get()){
LOG_ERR("Cannot access register %s. Primary endpoint for device %u not initiliazed", dev_no, reg_name.c_str());
}
else if (!m_primary->is_primary()) {
unsigned primary_dev_no = m_primary->get_device_number();
LOG_ERR("Cannot access register %s. Neither devices %u and %u are primary ", reg_name.c_str(), dev_no, primary_dev_no);
} else {
device = m_primary.get();
}
} else {
device = m_main.get();
if (!device){
LOG_ERR("Cannot access register %s. Device %u not initialized", dev_no, reg_name.c_str());
}
}
return device;
}
template <class DEV>
uint64_t RegisterDeviceInterface<DEV>::get_register(const std::string& reg_name)
{
DEV* device = select_device(reg_name);
if (device) {
return device->get_register(reg_name.c_str());
}
return 0;
}
template <class DEV>
void RegisterDeviceInterface<DEV>::set_register(const std::string& reg_name, uint64_t value)
{
DEV* device = select_device(reg_name);
if (device) {
device->set_register(reg_name.c_str(), value);
}
}
#endif /* REGISTER_DEVICE_MANAGER_H_ */