Program Listing for File device.cc

Return to documentation for file (devices/device.cc)

#include "lupnt/devices/device.h"

#include <fmt/format.h>

#include "lupnt/agents/agent.h"
#include "lupnt/core/asset_factory.h"
#include "lupnt/core/definitions.h"
#include "lupnt/core/event.h"
#include "lupnt/core/logger.h"
#include "lupnt/core/simulation.h"
#include "lupnt/measurements/channel.h"

namespace lupnt {

  Device::Device(Config& config) {
    config_ = config;
    name_ = config["name"] ? config["name"].as<std::string>() : "device";
    Logger::Debug(fmt::format("Creating {}", name_), "Device");
    if (config["frequency"]) {
      frequency_ = config["frequency"].as<double>();
    }
  }
  void Device::Step(Real t) { Logger::Debug(fmt::format("Step {}", name_), "Device", t); }

  void Device::Setup() {
    // Step
    if (frequency_ > 0.0) {
      agent_->GetSimulation()->Schedule(
          0.0, [this](Real t) { Step(t); }, frequency_, Event::Priority::DEVICE);
      Logger::Debug(fmt::format("Scheduled {}, t={} s, f={} Hz", name_, 0.0, frequency_), "Device");
    }
  }

  // Define the GetRegistry function for this specialization (must come before explicit
  // instantiation)
  template <> std::unordered_map<std::string, AssetFactory<Device, Config&>::Creator>&
  AssetFactory<Device, Config&>::GetRegistry() {
    return Registry();
  }

  // Explicit template instantiation to ensure single registry across library boundaries
  template class AssetFactory<Device, Config&>;

}  // namespace lupnt