From 84f799da66d95c395948895426e7037e9d199a0b Mon Sep 17 00:00:00 2001 From: Fabian Hartung Date: Wed, 1 Mar 2023 07:47:39 +0100 Subject: [PATCH] IMDSimulator: Add C++ simulation module This C++ module replaces JsIMDSimulator. Co-authored-by: Cornelius Claussen Co-authored-by: Fabian Hartung Co-authored-by: Moritz Barsnick Signed-off-by: Fabian Hartung Signed-off-by: Moritz Barsnick --- config/config-sil-dc-sae-v2g.yaml | 2 +- config/config-sil-dc-sae-v2h.yaml | 2 +- config/config-sil-dc.yaml | 2 +- config/config-sil-two-evse-dc.yaml | 2 +- modules/simulation/CMakeLists.txt | 2 +- .../simulation/IMDSimulator/CMakeLists.txt | 21 +++++ .../simulation/IMDSimulator/IMDSimulator.cpp | 15 ++++ .../simulation/IMDSimulator/IMDSimulator.hpp | 58 ++++++++++++++ .../main/isolation_monitorImpl.cpp | 55 +++++++++++++ .../main/isolation_monitorImpl.hpp | 77 +++++++++++++++++++ .../manifest.yaml | 2 +- .../simulation/JsIMDSimulator/CMakeLists.txt | 0 modules/simulation/JsIMDSimulator/index.js | 39 ---------- 13 files changed, 232 insertions(+), 45 deletions(-) create mode 100644 modules/simulation/IMDSimulator/CMakeLists.txt create mode 100644 modules/simulation/IMDSimulator/IMDSimulator.cpp create mode 100644 modules/simulation/IMDSimulator/IMDSimulator.hpp create mode 100644 modules/simulation/IMDSimulator/main/isolation_monitorImpl.cpp create mode 100644 modules/simulation/IMDSimulator/main/isolation_monitorImpl.hpp rename modules/simulation/{JsIMDSimulator => IMDSimulator}/manifest.yaml (93%) delete mode 100644 modules/simulation/JsIMDSimulator/CMakeLists.txt delete mode 100644 modules/simulation/JsIMDSimulator/index.js diff --git a/config/config-sil-dc-sae-v2g.yaml b/config/config-sil-dc-sae-v2g.yaml index 0e56b1238..7820d7d5e 100644 --- a/config/config-sil-dc-sae-v2g.yaml +++ b/config/config-sil-dc-sae-v2g.yaml @@ -57,7 +57,7 @@ active_modules: slac: module: JsSlacSimulator imd: - module: JsIMDSimulator + module: IMDSimulator car_simulator: module: JsCarSimulator config_module: diff --git a/config/config-sil-dc-sae-v2h.yaml b/config/config-sil-dc-sae-v2h.yaml index 476a25a75..9817ab4a4 100644 --- a/config/config-sil-dc-sae-v2h.yaml +++ b/config/config-sil-dc-sae-v2h.yaml @@ -57,7 +57,7 @@ active_modules: slac: module: JsSlacSimulator imd: - module: JsIMDSimulator + module: IMDSimulator car_simulator: module: JsCarSimulator config_module: diff --git a/config/config-sil-dc.yaml b/config/config-sil-dc.yaml index 07566523c..14f3a6eb9 100644 --- a/config/config-sil-dc.yaml +++ b/config/config-sil-dc.yaml @@ -54,7 +54,7 @@ active_modules: slac: module: JsSlacSimulator imd: - module: JsIMDSimulator + module: IMDSimulator car_simulator: module: JsCarSimulator config_module: diff --git a/config/config-sil-two-evse-dc.yaml b/config/config-sil-two-evse-dc.yaml index 90f284590..eeb50b186 100644 --- a/config/config-sil-two-evse-dc.yaml +++ b/config/config-sil-two-evse-dc.yaml @@ -78,7 +78,7 @@ active_modules: powersupply_dc: module: JsDCSupplySimulator imd: - module: JsIMDSimulator + module: IMDSimulator car_simulator_1: module: JsCarSimulator config_module: diff --git a/modules/simulation/CMakeLists.txt b/modules/simulation/CMakeLists.txt index f0894f160..2c71cd31e 100644 --- a/modules/simulation/CMakeLists.txt +++ b/modules/simulation/CMakeLists.txt @@ -1,6 +1,6 @@ ev_add_module(DCSupplySimulator) +ev_add_module(IMDSimulator) ev_add_module(JsCarSimulator) ev_add_module(JsDCSupplySimulator) -ev_add_module(JsIMDSimulator) ev_add_module(JsSlacSimulator) ev_add_module(JsYetiSimulator) diff --git a/modules/simulation/IMDSimulator/CMakeLists.txt b/modules/simulation/IMDSimulator/CMakeLists.txt new file mode 100644 index 000000000..7b7f3e9f7 --- /dev/null +++ b/modules/simulation/IMDSimulator/CMakeLists.txt @@ -0,0 +1,21 @@ +# +# AUTO GENERATED - MARKED REGIONS WILL BE KEPT +# template version 3 +# + +# module setup: +# - ${MODULE_NAME}: module name +ev_setup_cpp_module() + +# ev@bcc62523-e22b-41d7-ba2f-825b493a3c97:v1 +# insert your custom targets and additional config variables here +# ev@bcc62523-e22b-41d7-ba2f-825b493a3c97:v1 + +target_sources(${MODULE_NAME} + PRIVATE + "main/isolation_monitorImpl.cpp" +) + +# ev@c55432ab-152c-45a9-9d2e-7281d50c69c3:v1 +# insert other things like install cmds etc here +# ev@c55432ab-152c-45a9-9d2e-7281d50c69c3:v1 diff --git a/modules/simulation/IMDSimulator/IMDSimulator.cpp b/modules/simulation/IMDSimulator/IMDSimulator.cpp new file mode 100644 index 000000000..df235c2b5 --- /dev/null +++ b/modules/simulation/IMDSimulator/IMDSimulator.cpp @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright Pionix GmbH and Contributors to EVerest +#include "IMDSimulator.hpp" + +namespace module { + +void IMDSimulator::init() { + invoke_init(*p_main); +} + +void IMDSimulator::ready() { + invoke_ready(*p_main); +} + +} // namespace module diff --git a/modules/simulation/IMDSimulator/IMDSimulator.hpp b/modules/simulation/IMDSimulator/IMDSimulator.hpp new file mode 100644 index 000000000..a4f5f124c --- /dev/null +++ b/modules/simulation/IMDSimulator/IMDSimulator.hpp @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright Pionix GmbH and Contributors to EVerest +#ifndef IMDSIMULATOR_HPP +#define IMDSIMULATOR_HPP + +// +// AUTO GENERATED - MARKED REGIONS WILL BE KEPT +// template version 2 +// + +#include "ld-ev.hpp" + +// headers for provided interface implementations +#include + +// ev@4bf81b14-a215-475c-a1d3-0a484ae48918:v1 +// insert your custom include headers here +// ev@4bf81b14-a215-475c-a1d3-0a484ae48918:v1 + +namespace module { + +struct Conf {}; + +class IMDSimulator : public Everest::ModuleBase { +public: + IMDSimulator() = delete; + IMDSimulator(const ModuleInfo& info, std::unique_ptr p_main, Conf& config) : + ModuleBase(info), p_main(std::move(p_main)), config(config){}; + + const std::unique_ptr p_main; + const Conf& config; + + // ev@1fce4c5e-0ab8-41bb-90f7-14277703d2ac:v1 + // insert your public definitions here + // ev@1fce4c5e-0ab8-41bb-90f7-14277703d2ac:v1 + +protected: + // ev@4714b2ab-a24f-4b95-ab81-36439e1478de:v1 + // insert your protected definitions here + // ev@4714b2ab-a24f-4b95-ab81-36439e1478de:v1 + +private: + friend class LdEverest; + void init(); + void ready(); + + // ev@211cfdbe-f69a-4cd6-a4ec-f8aaa3d1b6c8:v1 + // insert your private definitions here + // ev@211cfdbe-f69a-4cd6-a4ec-f8aaa3d1b6c8:v1 +}; + +// ev@087e516b-124c-48df-94fb-109508c7cda9:v1 +// insert other definitions here +// ev@087e516b-124c-48df-94fb-109508c7cda9:v1 + +} // namespace module + +#endif // IMDSIMULATOR_HPP diff --git a/modules/simulation/IMDSimulator/main/isolation_monitorImpl.cpp b/modules/simulation/IMDSimulator/main/isolation_monitorImpl.cpp new file mode 100644 index 000000000..862f94b02 --- /dev/null +++ b/modules/simulation/IMDSimulator/main/isolation_monitorImpl.cpp @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright (C) 2023 chargebyte GmbH +// Copyright (C) 2023 Contributors to EVerest +#include "isolation_monitorImpl.hpp" +#include +#include +namespace module { +namespace main { + +void isolation_monitorImpl::init() { + this->isolation_monitoring_active = false; + this->isolation_measurement.resistance_F_Ohm = this->config.resistance_F_Ohm; + this->config_interval = this->config.interval; + + this->isolation_measurement_thread_handle = std::thread(&isolation_monitorImpl::isolation_measurement_worker, this); +} + +void isolation_monitorImpl::ready() { +} + +isolation_monitorImpl::~isolation_monitorImpl() { +} + +void isolation_monitorImpl::handle_start() { + if (this->isolation_monitoring_active == false) { + this->isolation_monitoring_active = true; + EVLOG_info << "Started simulated isolation monitoring with " << this->config_interval << " ms interval"; + } +}; + +void isolation_monitorImpl::isolation_measurement_worker() { + while (true) { + if (this->isolation_measurement_thread_handle.shouldExit()) { + break; + } + + if (this->isolation_monitoring_active == true) { + this->mod->p_main->publish_IsolationMeasurement(this->isolation_measurement); + EVLOG_debug << "Simulated isolation measurement finished"; + std::this_thread::sleep_for(std::chrono::milliseconds(this->config_interval - this->LOOP_SLEEP_MS)); + } + + std::this_thread::sleep_for(std::chrono::milliseconds(this->LOOP_SLEEP_MS)); + } +} + +void isolation_monitorImpl::handle_stop() { + if (this->isolation_monitoring_active == true) { + EVLOG_info << "Stopped simulated isolation monitoring"; + this->isolation_monitoring_active = false; + } +}; + +} // namespace main +} // namespace module diff --git a/modules/simulation/IMDSimulator/main/isolation_monitorImpl.hpp b/modules/simulation/IMDSimulator/main/isolation_monitorImpl.hpp new file mode 100644 index 000000000..106caa497 --- /dev/null +++ b/modules/simulation/IMDSimulator/main/isolation_monitorImpl.hpp @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: Apache-2.0 +// Copyright (C) 2023 chargebyte GmbH +// Copyright (C) 2023 Contributors to EVerest +#ifndef MAIN_ISOLATION_MONITOR_IMPL_HPP +#define MAIN_ISOLATION_MONITOR_IMPL_HPP + +// +// AUTO GENERATED - MARKED REGIONS WILL BE KEPT +// template version 3 +// + +#include + +#include "../IMDSimulator.hpp" + +// ev@75ac1216-19eb-4182-a85c-820f1fc2c091:v1 +// insert your custom include headers here +#include +#include +#include +// ev@75ac1216-19eb-4182-a85c-820f1fc2c091:v1 + +namespace module { +namespace main { + +struct Conf { + double resistance_F_Ohm; + int interval; +}; + +class isolation_monitorImpl : public isolation_monitorImplBase { +public: + isolation_monitorImpl() = delete; + isolation_monitorImpl(Everest::ModuleAdapter* ev, const Everest::PtrContainer& mod, Conf& config) : + isolation_monitorImplBase(ev, "main"), mod(mod), config(config){}; + ~isolation_monitorImpl(); + + // ev@8ea32d28-373f-4c90-ae5e-b4fcc74e2a61:v1 + // insert your public definitions here + // ev@8ea32d28-373f-4c90-ae5e-b4fcc74e2a61:v1 + +protected: + // command handler functions (virtual) + virtual void handle_start() override; + virtual void handle_stop() override; + + // ev@d2d1847a-7b88-41dd-ad07-92785f06f5c4:v1 + // insert your protected definitions here + // ev@d2d1847a-7b88-41dd-ad07-92785f06f5c4:v1 + +private: + const Everest::PtrContainer& mod; + const Conf& config; + + virtual void init() override; + virtual void ready() override; + + // ev@3370e4dd-95f4-47a9-aaec-ea76f34a66c9:v1 + // insert your private definitions here + types::isolation_monitor::IsolationMeasurement isolation_measurement; + std::atomic isolation_monitoring_active; + int config_interval; + static constexpr int LOOP_SLEEP_MS{20}; + + Everest::Thread isolation_measurement_thread_handle; + void isolation_measurement_worker(void); + // ev@3370e4dd-95f4-47a9-aaec-ea76f34a66c9:v1 +}; + +// ev@3d7da0ad-02c2-493d-9920-0bbbd56b9876:v1 +// insert other definitions here +// ev@3d7da0ad-02c2-493d-9920-0bbbd56b9876:v1 + +} // namespace main +} // namespace module + +#endif // MAIN_ISOLATION_MONITOR_IMPL_HPP diff --git a/modules/simulation/JsIMDSimulator/manifest.yaml b/modules/simulation/IMDSimulator/manifest.yaml similarity index 93% rename from modules/simulation/JsIMDSimulator/manifest.yaml rename to modules/simulation/IMDSimulator/manifest.yaml index 387f64674..df1bf9c28 100644 --- a/modules/simulation/JsIMDSimulator/manifest.yaml +++ b/modules/simulation/IMDSimulator/manifest.yaml @@ -12,8 +12,8 @@ provides: description: Measurement update interval in milliseconds type: integer default: 1000 -enable_external_mqtt: true metadata: license: https://opensource.org/licenses/Apache-2.0 authors: + - Fabian Hartung (chargebyte GmbH) - Cornelius Claussen (Pionix GmbH) diff --git a/modules/simulation/JsIMDSimulator/CMakeLists.txt b/modules/simulation/JsIMDSimulator/CMakeLists.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/modules/simulation/JsIMDSimulator/index.js b/modules/simulation/JsIMDSimulator/index.js deleted file mode 100644 index c81987277..000000000 --- a/modules/simulation/JsIMDSimulator/index.js +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -// Copyright 2020 - 2022 Pionix GmbH and Contributors to EVerest -const { evlog, boot_module } = require('everestjs'); -const { setInterval } = require('timers'); - -let config_resistance_F_Ohm; -let config_interval; -let intervalID; -let interval_running = false; - -boot_module(async ({ - setup, config, -}) => { - config_resistance_F_Ohm = config.impl.main.resistance_F_Ohm; - config_interval = config.impl.main.interval; - - // register commands - setup.provides.main.register.start((mod) => { - if (interval_running) return; - evlog.debug(`Started simulated isolation monitoring with ${config_interval}ms interval`); - - intervalID = setInterval(() => { - evlog.debug('Simulated isolation test finished'); - mod.provides.main.publish.IsolationMeasurement({ - resistance_F_Ohm: config_resistance_F_Ohm, - }); - }, config_interval, mod); - interval_running = true; - }); - - // register commands - setup.provides.main.register.stop(() => { - if (interval_running) { - evlog.debug('Stopped simulated isolation monitoring.'); - clearInterval(intervalID); - interval_running = false; - } - }); -}).then(() => { });