namespace simgrid::plugins {
+/** @ingroup plugin_solar_panel */
class SolarPanel;
+/** @ingroup plugin_solar_panel */
using SolarPanelPtr = boost::intrusive_ptr<SolarPanel>;
XBT_PUBLIC void intrusive_ptr_release(SolarPanel* o);
XBT_PUBLIC void intrusive_ptr_add_ref(SolarPanel* o);
-class SolarPanelModel : public kernel::resource::Model {
- std::vector<SolarPanelPtr> solar_panels_;
-
-public:
- explicit SolarPanelModel();
-
- void add_solar_panel(SolarPanelPtr b);
- void update_actions_state(double now, double delta) override;
- double next_occurring_event(double now) override;
-};
-
class SolarPanel {
- friend SolarPanelModel;
-
-private:
- static std::shared_ptr<SolarPanelModel> solar_panel_model_;
-
std::string name_;
double area_m2_;
double conversion_efficiency_;
double solar_irradiance_w_per_m2_;
double min_power_w_;
double max_power_w_;
-
- double power_w_ = 0;
- double last_updated_ = 0;
+ double power_w_ = -1;
explicit SolarPanel(std::string name, double area_m2, double conversion_efficiency, double solar_irradiance_w_per_m2,
double min_power_w, double max_power_w);
- static void init_plugin();
void update();
std::atomic_int_fast32_t refcount_{0};
friend void intrusive_ptr_add_ref(SolarPanel* o) { o->refcount_.fetch_add(1, std::memory_order_relaxed); }
#endif
+ static xbt::signal<void(SolarPanel*)> on_power_change;
+ xbt::signal<void(SolarPanel*)> on_this_power_change;
+
public:
static SolarPanelPtr init(const std::string& name, double area_m2, double conversion_efficiency,
double solar_irradiance_w_per_m2, double min_power_w, double max_power_w);
SolarPanelPtr set_min_power(double power_w);
SolarPanelPtr set_max_power(double power_w);
- std::string get_name() { return name_; }
- const char* get_cname() { return name_.c_str(); }
- double get_area() { return area_m2_; }
- double get_conversion_efficiency() { return conversion_efficiency_; }
- double get_solar_irradiance() { return solar_irradiance_w_per_m2_; }
- double get_min_power() { return min_power_w_; }
- double get_max_power() { return max_power_w_; }
- double get_power() { return power_w_; }
+ std::string get_name() const { return name_; }
+ const char* get_cname() const { return name_.c_str(); }
+ double get_area() const { return area_m2_; }
+ double get_conversion_efficiency() const { return conversion_efficiency_; }
+ double get_solar_irradiance() const { return solar_irradiance_w_per_m2_; }
+ double get_min_power() const { return min_power_w_; }
+ double get_max_power() const { return max_power_w_; }
+ double get_power() const { return power_w_; }
+
+ /** Add a callback fired after this solar panel power changed. */
+ void on_this_power_change_cb(const std::function<void(SolarPanel*)>& func) { on_this_power_change.connect(func); };
+ /** Add a callback fired after a solar panel power changed.
+ * Triggered after the on_this_power_change function.**/
+ static void on_power_change_cb(const std::function<void(SolarPanel*)>& cb) { on_power_change.connect(cb); }
};
} // namespace simgrid::plugins
#endif