- CitrineOS core extracted (CSMS OCPP 2.0.1) - OpenOCPP extracted (firmware OCPP 1.6J/2.0.1) - ShapeShifter library installed (pip install -e) - ShapeShifter specification extracted - EVerest extracted TODO updated with progress
70 lines
2.3 KiB
C++
70 lines
2.3 KiB
C++
// SPDX-License-Identifier: Apache-2.0
|
|
// Copyright Pionix GmbH and Contributors to EVerest
|
|
|
|
#pragma once
|
|
|
|
// headers for provided interface implementations
|
|
#include <generated/interfaces/energy_manager/Implementation.hpp>
|
|
// headers for required interface implementations
|
|
#include <generated/interfaces/energy/Interface.hpp>
|
|
|
|
#include <mutex>
|
|
|
|
#include <Broker.hpp>
|
|
|
|
namespace module {
|
|
|
|
struct EnergyManagerConfig {
|
|
double nominal_ac_voltage;
|
|
int update_interval;
|
|
int schedule_interval_duration;
|
|
int schedule_total_duration;
|
|
double slice_ampere;
|
|
double slice_watt;
|
|
bool debug;
|
|
std::string switch_3ph1ph_while_charging_mode;
|
|
int switch_3ph1ph_max_nr_of_switches_per_session;
|
|
std::string switch_3ph1ph_switch_limit_stickyness;
|
|
int switch_3ph1ph_power_hysteresis_W;
|
|
int switch_3ph1ph_time_hysteresis_s;
|
|
};
|
|
|
|
class EnergyManagerImpl {
|
|
|
|
public:
|
|
EnergyManagerImpl(
|
|
const EnergyManagerConfig& config,
|
|
const std::function<void(const std::vector<types::energy::EnforcedLimits>& limits)>& enforced_limits_callback);
|
|
|
|
/// \brief Starts and detaches worker thread that runs run_optimizer periodically or when energy flow request is
|
|
/// updated
|
|
void start();
|
|
|
|
/// \brief Updates the energy_flow_request and notifies the worker thread
|
|
/// \param e
|
|
void on_energy_flow_request(const types::energy::EnergyFlowRequest& e);
|
|
|
|
/// \brief Runs optimization on the given \p request
|
|
/// \param request
|
|
/// \param start_time
|
|
/// \return a vector of limits to enforce at the individual nodes of the \p request
|
|
std::vector<types::energy::EnforcedLimits> run_optimizer(const types::energy::EnergyFlowRequest& request,
|
|
date::utc_clock::time_point start_time,
|
|
const std::string& test_name = "");
|
|
|
|
private:
|
|
EnergyManagerConfig config;
|
|
std::function<void(const std::vector<types::energy::EnforcedLimits>& limits)> enforced_limits_callback;
|
|
|
|
std::mutex energy_mutex;
|
|
std::condition_variable mainloop_sleep_condvar;
|
|
std::mutex mainloop_sleep_mutex;
|
|
|
|
// complete energy tree request
|
|
types::energy::EnergyFlowRequest energy_flow_request;
|
|
|
|
std::map<std::string, BrokerContext> contexts;
|
|
};
|
|
|
|
} // namespace module
|