From e6b7bc829f282e2fefc5f473c4c450f4dd055a0c Mon Sep 17 00:00:00 2001 From: Matthias Akstaller Date: Mon, 20 Jan 2025 13:59:01 +0100 Subject: [PATCH 1/4] Fix SConscript file * Previously, the SConscript added all MO subfolders to the global include paths. However, MO expects only ./src to be on include and the superfluous folders may lead to filename conflicts. * Remove ArduinoJson from the sources as it's a header-only library and only needs to be on the include path * Add .c files to the list of source objects --- SConscript.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/SConscript.py b/SConscript.py index 5bccda82..a33ab3f6 100644 --- a/SConscript.py +++ b/SConscript.py @@ -7,7 +7,7 @@ # Use this file as a starting point for writing your own SCons integration. And as always, any # contributions are highly welcome! -Import("env", "ARDUINOJSON_DIR") +Import("env") import os, pathlib @@ -17,16 +17,15 @@ def getAllDirs(root_dir): dir_list.append(Dir(root)) return dir_list -SOURCE_DIR = Dir(".").srcnode() +SOURCE_DIR = Dir(".").srcnode().Dir("src") -source_dirs = getAllDirs(SOURCE_DIR.Dir("src")) -source_dirs += getAllDirs(ARDUINOJSON_DIR.Dir("src")) +source_dirs = getAllDirs(SOURCE_DIR) source_files = [] for folder in source_dirs: + source_files += folder.glob("*.c") source_files += folder.glob("*.cpp") - env["CPPPATH"].append(folder) compiled_objects = [] for source_file in source_files: @@ -44,7 +43,7 @@ def getAllDirs(root_dir): exports = { 'library': libmicroocpp, - 'CPPPATH': source_dirs.copy() + 'CPPPATH': SOURCE_DIR } Return("exports") From 92764c2a3dc003bc4ef6162a3c20a84e3ec8dbb3 Mon Sep 17 00:00:00 2001 From: Matthias Akstaller Date: Mon, 20 Jan 2025 14:01:06 +0100 Subject: [PATCH 2/4] Add Config write-only option The "AuthorizationKey" config is specified as write-only and thus, may be updated by the server but not reported through the GetConfiguration option. --- src/MicroOcpp/Core/ConfigurationKeyValue.cpp | 20 +++++++++++++++++-- src/MicroOcpp/Core/ConfigurationKeyValue.h | 13 +++++++++++- src/MicroOcpp/Operations/GetConfiguration.cpp | 5 ++++- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/MicroOcpp/Core/ConfigurationKeyValue.cpp b/src/MicroOcpp/Core/ConfigurationKeyValue.cpp index 033e371a..77e8ad85 100644 --- a/src/MicroOcpp/Core/ConfigurationKeyValue.cpp +++ b/src/MicroOcpp/Core/ConfigurationKeyValue.cpp @@ -75,11 +75,27 @@ bool Configuration::isRebootRequired() { } void Configuration::setReadOnly() { - readOnly = true; + if (mutability == Mutability::ReadWrite) { + mutability = Mutability::ReadOnly; + } else { + mutability = Mutability::None; + } } bool Configuration::isReadOnly() { - return readOnly; + return mutability == Mutability::ReadOnly; +} + +bool Configuration::isReadable() { + return mutability == Mutability::ReadWrite || mutability == Mutability::ReadOnly; +} + +void Configuration::setWriteOnly() { + if (mutability == Mutability::ReadWrite) { + mutability = Mutability::WriteOnly; + } else { + mutability = Mutability::None; + } } /* diff --git a/src/MicroOcpp/Core/ConfigurationKeyValue.h b/src/MicroOcpp/Core/ConfigurationKeyValue.h index e11a0484..3e631c1e 100644 --- a/src/MicroOcpp/Core/ConfigurationKeyValue.h +++ b/src/MicroOcpp/Core/ConfigurationKeyValue.h @@ -36,7 +36,15 @@ class Configuration { revision_t value_revision = 0; //write access counter; used to check if this config has been changed private: bool rebootRequired = false; - bool readOnly = false; + + enum class Mutability : uint8_t { + ReadWrite, + ReadOnly, + WriteOnly, + None + }; + Mutability mutability = Mutability::ReadWrite; + public: virtual ~Configuration(); @@ -60,6 +68,9 @@ class Configuration { void setReadOnly(); bool isReadOnly(); + bool isReadable(); + + void setWriteOnly(); }; /* diff --git a/src/MicroOcpp/Operations/GetConfiguration.cpp b/src/MicroOcpp/Operations/GetConfiguration.cpp index 1ba7ef0a..8146bba1 100644 --- a/src/MicroOcpp/Operations/GetConfiguration.cpp +++ b/src/MicroOcpp/Operations/GetConfiguration.cpp @@ -40,6 +40,9 @@ std::unique_ptr GetConfiguration::createConf(){ MO_DBG_ERR("invalid config"); continue; } + if (!container->getConfiguration(i)->isReadable()) { + continue; + } configurations.push_back(container->getConfiguration(i)); } } @@ -53,7 +56,7 @@ std::unique_ptr GetConfiguration::createConf(){ } } - if (res) { + if (res && res->isReadable()) { configurations.push_back(res); } else { unknownKeys.push_back(key.c_str()); From ef8e771c443805f24a516f38952a2d0a3b2e5e58 Mon Sep 17 00:00:00 2001 From: Matthias Akstaller Date: Mon, 20 Jan 2025 14:05:12 +0100 Subject: [PATCH 3/4] Update C-APIs * Remove Platform setup functions from MicroOcpp_c.h /.cpp which can be found in Platform.h * Add FilesystemAdapter C-handle * Expose library lifecycle through `ocpp_is_initialized()` * Update Configuration C-API * Update Transaction C-API --- src/MicroOcpp/Core/Configuration_c.cpp | 138 ++++++++++++++++-- src/MicroOcpp/Core/Configuration_c.h | 13 ++ .../Model/Transactions/Transaction.cpp | 10 ++ .../Model/Transactions/Transaction.h | 4 +- src/MicroOcpp/Platform.h | 32 ++-- src/MicroOcpp_c.cpp | 55 +++++-- src/MicroOcpp_c.h | 31 ++-- 7 files changed, 230 insertions(+), 53 deletions(-) diff --git a/src/MicroOcpp/Core/Configuration_c.cpp b/src/MicroOcpp/Core/Configuration_c.cpp index a85a1edd..6b6998e1 100644 --- a/src/MicroOcpp/Core/Configuration_c.cpp +++ b/src/MicroOcpp/Core/Configuration_c.cpp @@ -15,7 +15,15 @@ class ConfigurationC : public Configuration, public MemoryManaged { public: ConfigurationC(ocpp_configuration *config) : config(config) { - config->mo_data = this; + if (config->read_only) { + setReadOnly(); + } + if (config->write_only) { + setWriteOnly(); + } + if (config->reboot_required) { + setRebootRequired(); + } } bool setKey(const char *key) override { @@ -116,6 +124,59 @@ class ConfigurationC : public Configuration, public MemoryManaged { } }; +namespace MicroOcpp { + +ConfigurationC *getConfigurationC(ocpp_configuration *config) { + if (!config->mo_data) { + return nullptr; + } + return reinterpret_cast*>(config->mo_data)->get(); +} + +} + +using namespace MicroOcpp; + + +void ocpp_setRebootRequired(ocpp_configuration *config) { + if (auto c = getConfigurationC(config)) { + c->setRebootRequired(); + } + config->reboot_required = true; +} +bool ocpp_isRebootRequired(ocpp_configuration *config) { + if (auto c = getConfigurationC(config)) { + return c->isRebootRequired(); + } + return config->reboot_required; +} + +void ocpp_setReadOnly(ocpp_configuration *config) { + if (auto c = getConfigurationC(config)) { + c->setReadOnly(); + } + config->read_only = true; +} +bool ocpp_isReadOnly(ocpp_configuration *config) { + if (auto c = getConfigurationC(config)) { + return c->isReadOnly(); + } + return config->read_only; +} +bool ocpp_isReadable(ocpp_configuration *config) { + if (auto c = getConfigurationC(config)) { + return c->isReadable(); + } + return !config->write_only; +} + +void ocpp_setWriteOnly(ocpp_configuration *config) { + if (auto c = getConfigurationC(config)) { + c->setWriteOnly(); + } + config->write_only = true; +} + class ConfigurationContainerC : public ConfigurationContainer, public MemoryManaged { private: ocpp_configuration_container *container; @@ -125,15 +186,41 @@ class ConfigurationContainerC : public ConfigurationContainer, public MemoryMana } + ~ConfigurationContainerC() { + for (size_t i = 0; i < container->size(container->user_data); i++) { + if (auto config = container->get_configuration(container->user_data, i)) { + if (config->mo_data) { + delete reinterpret_cast*>(config->mo_data); + config->mo_data = nullptr; + } + } + } + } + bool load() override { - return container->load(container->user_data); + if (container->load) { + return container->load(container->user_data); + } else { + return true; + } } bool save() override { - return container->save(container->user_data); + if (container->save) { + return container->save(container->user_data); + } else { + return true; + } } std::shared_ptr createConfiguration(TConfig type, const char *key) override { + + auto result = std::shared_ptr(nullptr, std::default_delete(), makeAllocator(getMemoryTag())); + + if (!container->create_configuration) { + return result; + } + ocpp_config_datatype dt; switch (type) { case TConfig::Int: @@ -147,19 +234,38 @@ class ConfigurationContainerC : public ConfigurationContainer, public MemoryMana break; default: MO_DBG_ERR("internal error"); - return nullptr; + return result; } ocpp_configuration *config = container->create_configuration(container->user_data, dt, key); + if (!config) { + return result; + } + + result.reset(new ConfigurationC(config)); - if (config) { - return std::allocate_shared(makeAllocator(getMemoryTag()), config); + if (result) { + auto captureConfigC = new std::shared_ptr(result); + config->mo_data = reinterpret_cast(captureConfigC); } else { MO_DBG_ERR("could not create config: %s", key); - return nullptr; + if (container->remove) { + container->remove(container->user_data, key); + } } + + return result; } void remove(Configuration *config) override { + if (!container->remove) { + return; + } + + if (auto c = container->get_configuration_by_key(container->user_data, config->getKey())) { + delete reinterpret_cast*>(c->mo_data); + c->mo_data = nullptr; + } + container->remove(container->user_data, config->getKey()); } @@ -170,16 +276,28 @@ class ConfigurationContainerC : public ConfigurationContainer, public MemoryMana Configuration *getConfiguration(size_t i) override { auto config = container->get_configuration(container->user_data, i); if (config) { - return static_cast(config->mo_data); + if (!config->mo_data) { + auto c = new ConfigurationC(config); + if (c) { + config->mo_data = reinterpret_cast(new std::shared_ptr(c, std::default_delete(), makeAllocator(getMemoryTag()))); + } + } + return static_cast(config->mo_data ? reinterpret_cast*>(config->mo_data)->get() : nullptr); } else { return nullptr; } } std::shared_ptr getConfiguration(const char *key) override { - ocpp_configuration *config = container->get_configuration_by_key(container->user_data, key); + auto config = container->get_configuration_by_key(container->user_data, key); if (config) { - return std::allocate_shared(makeAllocator(getMemoryTag()), config); + if (!config->mo_data) { + auto c = new ConfigurationC(config); + if (c) { + config->mo_data = reinterpret_cast(new std::shared_ptr(c, std::default_delete(), makeAllocator(getMemoryTag()))); + } + } + return config->mo_data ? *reinterpret_cast*>(config->mo_data) : nullptr; } else { return nullptr; } diff --git a/src/MicroOcpp/Core/Configuration_c.h b/src/MicroOcpp/Core/Configuration_c.h index 8dd47ad1..94172d07 100644 --- a/src/MicroOcpp/Core/Configuration_c.h +++ b/src/MicroOcpp/Core/Configuration_c.h @@ -42,9 +42,22 @@ typedef struct ocpp_configuration { uint16_t (*get_write_count) (void *user_data); // Return number of changes of the value. MO uses this to detect if the firmware has updated the config + bool read_only; + bool write_only; + bool reboot_required; + void *mo_data; // Reserved for MO } ocpp_configuration; +void ocpp_setRebootRequired(ocpp_configuration *config); +bool ocpp_isRebootRequired(ocpp_configuration *config); + +void ocpp_setReadOnly(ocpp_configuration *config); +bool ocpp_isReadOnly(ocpp_configuration *config); +bool ocpp_isReadable(ocpp_configuration *config); + +void ocpp_setWriteOnly(ocpp_configuration *config); + typedef struct ocpp_configuration_container { void *user_data; //set this at your choice. MO passes it back to the functions below diff --git a/src/MicroOcpp/Model/Transactions/Transaction.cpp b/src/MicroOcpp/Model/Transactions/Transaction.cpp index 7a48a7da..a53b68f1 100644 --- a/src/MicroOcpp/Model/Transactions/Transaction.cpp +++ b/src/MicroOcpp/Model/Transactions/Transaction.cpp @@ -444,6 +444,16 @@ const char *ocpp_tx_getIdTag(OCPP_Transaction *tx) { return reinterpret_cast(tx)->getIdTag(); } +const char *ocpp_tx_getParentIdTag(OCPP_Transaction *tx) { + #if MO_ENABLE_V201 + if (g_ocpp_tx_compat_v201) { + MO_DBG_ERR("only supported in v16"); + return nullptr; + } + #endif //MO_ENABLE_V201 + return reinterpret_cast(tx)->getParentIdTag(); +} + bool ocpp_tx_getBeginTimestamp(OCPP_Transaction *tx, char *buf, size_t len) { #if MO_ENABLE_V201 if (g_ocpp_tx_compat_v201) { diff --git a/src/MicroOcpp/Model/Transactions/Transaction.h b/src/MicroOcpp/Model/Transactions/Transaction.h index 877ccc4c..5dc3e869 100644 --- a/src/MicroOcpp/Model/Transactions/Transaction.h +++ b/src/MicroOcpp/Model/Transactions/Transaction.h @@ -14,7 +14,7 @@ extern "C" { //TxNotification - event from MO to the main firmware to notify it about transaction state changes typedef enum { - UNDEFINED, + TxNotification_UNDEFINED, //Authorization events TxNotification_Authorized, //success @@ -473,6 +473,8 @@ bool ocpp_tx_isCompleted(OCPP_Transaction *tx); const char *ocpp_tx_getIdTag(OCPP_Transaction *tx); +const char *ocpp_tx_getParentIdTag(OCPP_Transaction *tx); + bool ocpp_tx_getBeginTimestamp(OCPP_Transaction *tx, char *buf, size_t len); int32_t ocpp_tx_getMeterStart(OCPP_Transaction *tx); diff --git a/src/MicroOcpp/Platform.h b/src/MicroOcpp/Platform.h index 5582dc2a..a3da99ea 100644 --- a/src/MicroOcpp/Platform.h +++ b/src/MicroOcpp/Platform.h @@ -16,6 +16,12 @@ #define MO_PLATFORM MO_PLATFORM_ARDUINO #endif +#ifdef __cplusplus +#define MO_EXTERN_C extern "C" +#else +#define MO_EXTERN_C +#endif + #if MO_PLATFORM == MO_PLATFORM_NONE #ifndef MO_CUSTOM_CONSOLE #define MO_CUSTOM_CONSOLE @@ -32,18 +38,10 @@ #define MO_CUSTOM_CONSOLE_MAXMSGSIZE 256 #endif -#ifdef __cplusplus -extern "C" { -#endif - extern char _mo_console_msg_buf [MO_CUSTOM_CONSOLE_MAXMSGSIZE]; //define msg_buf in data section to save memory (see https://github.com/matth-x/MicroOcpp/pull/304) -void _mo_console_out(const char *msg); - -void mocpp_set_console_out(void (*console_out)(const char *msg)); +MO_EXTERN_C void _mo_console_out(const char *msg); -#ifdef __cplusplus -} -#endif +MO_EXTERN_C void mocpp_set_console_out(void (*console_out)(const char *msg)); #define MO_CONSOLE_PRINTF(X, ...) \ do { \ @@ -79,9 +77,9 @@ void mocpp_set_console_out(void (*console_out)(const char *msg)); #endif #ifdef MO_CUSTOM_TIMER -extern "C" void mocpp_set_timer(unsigned long (*get_ms)()); +MO_EXTERN_C void mocpp_set_timer(unsigned long (*get_ms)()); -extern "C" unsigned long mocpp_tick_ms_custom(); +MO_EXTERN_C unsigned long mocpp_tick_ms_custom(); #define mocpp_tick_ms mocpp_tick_ms_custom #else @@ -89,20 +87,20 @@ extern "C" unsigned long mocpp_tick_ms_custom(); #include #define mocpp_tick_ms millis #elif MO_PLATFORM == MO_PLATFORM_ESPIDF -extern "C" unsigned long mocpp_tick_ms_espidf(); +MO_EXTERN_C unsigned long mocpp_tick_ms_espidf(); #define mocpp_tick_ms mocpp_tick_ms_espidf #elif MO_PLATFORM == MO_PLATFORM_UNIX -extern "C" unsigned long mocpp_tick_ms_unix(); +MO_EXTERN_C unsigned long mocpp_tick_ms_unix(); #define mocpp_tick_ms mocpp_tick_ms_unix #endif #endif #ifdef MO_CUSTOM_RNG -void mocpp_set_rng(uint32_t (*rng)()); -uint32_t mocpp_rng_custom(); +MO_EXTERN_C void mocpp_set_rng(uint32_t (*rng)()); +MO_EXTERN_C uint32_t mocpp_rng_custom(); #define mocpp_rng mocpp_rng_custom #else -uint32_t mocpp_time_based_prng(void); +MO_EXTERN_C uint32_t mocpp_time_based_prng(void); #define mocpp_rng mocpp_time_based_prng #endif diff --git a/src/MicroOcpp_c.cpp b/src/MicroOcpp_c.cpp index 6771d0ae..381084b0 100644 --- a/src/MicroOcpp_c.cpp +++ b/src/MicroOcpp_c.cpp @@ -38,10 +38,27 @@ void ocpp_initialize_full(OCPP_Connection *conn, const char *bootNotificationCre MicroOcpp::ProtocolVersion(1,6)); } +void ocpp_initialize_full2(OCPP_Connection *conn, const char *bootNotificationCredentials, FilesystemAdapterC *filesystem, bool autoRecover, bool ocpp201) { + if (!conn) { + MO_DBG_ERR("conn is null"); + } + + ocppSocket = reinterpret_cast(conn); + + mocpp_initialize(*ocppSocket, bootNotificationCredentials, *reinterpret_cast*>(filesystem), autoRecover, + ocpp201 ? + MicroOcpp::ProtocolVersion(2,0,1) : + MicroOcpp::ProtocolVersion(1,6)); +} + void ocpp_deinitialize() { mocpp_deinitialize(); } +bool ocpp_is_initialized() { + return getOcppContext() != nullptr; +} + void ocpp_loop() { mocpp_loop(); } @@ -302,6 +319,33 @@ void ocpp_addMeterValueInputFloat_m(unsigned int connectorId, InputFloat_m value addMeterValueInput(adaptFn(connectorId, valueInput), measurand, unit, location, phase, connectorId); } +void ocpp_addMeterValueInputIntTx(int (*valueInput)(ReadingContext), const char *measurand, const char *unit, const char *location, const char *phase) { + MicroOcpp::SampledValueProperties props; + props.setMeasurand(measurand); + props.setUnit(unit); + props.setLocation(location); + props.setPhase(phase); + auto mvs = std::unique_ptr>>( + new MicroOcpp::SampledValueSamplerConcrete>( + props, + [valueInput] (ReadingContext readingContext) {return valueInput(readingContext);} + )); + addMeterValueInput(std::move(mvs)); +} +void ocpp_addMeterValueInputIntTx_m(unsigned int connectorId, int (*valueInput)(unsigned int cId, ReadingContext), const char *measurand, const char *unit, const char *location, const char *phase) { + MicroOcpp::SampledValueProperties props; + props.setMeasurand(measurand); + props.setUnit(unit); + props.setLocation(location); + props.setPhase(phase); + auto mvs = std::unique_ptr>>( + new MicroOcpp::SampledValueSamplerConcrete>( + props, + [valueInput, connectorId] (ReadingContext readingContext) {return valueInput(connectorId, readingContext);} + )); + addMeterValueInput(std::move(mvs), connectorId); +} + void ocpp_addMeterValueInput(MeterValueInput *meterValueInput) { ocpp_addMeterValueInput_m(1, meterValueInput); } @@ -386,17 +430,6 @@ void ocpp_setOnSendConf(const char *operationType, OnMessage onConfirmation) { setOnSendConf(operationType, adaptFn(onConfirmation)); } -void ocpp_set_console_out_c(void (*console_out)(const char *msg)) { - mocpp_set_console_out(console_out); -} - -#ifdef MO_CUSTOM_RNG -void ocpp_set_rng_c(uint32_t (*rng)(void)) -{ - mocpp_set_rng(rng); -} -#endif - void ocpp_authorize(const char *idTag, AuthorizeConfCallback onConfirmation, AuthorizeAbortCallback onAbort, AuthorizeTimeoutCallback onTimeout, AuthorizeErrorCallback onError, void *user_data) { auto idTag_capture = MicroOcpp::makeString("MicroOcpp_c.cpp", idTag); diff --git a/src/MicroOcpp_c.h b/src/MicroOcpp_c.h index 6477b6d6..a517ff1d 100644 --- a/src/MicroOcpp_c.h +++ b/src/MicroOcpp_c.h @@ -12,6 +12,7 @@ #include #include #include +#include struct OCPP_Connection; typedef struct OCPP_Connection OCPP_Connection; @@ -19,6 +20,9 @@ typedef struct OCPP_Connection OCPP_Connection; struct MeterValueInput; typedef struct MeterValueInput MeterValueInput; +struct FilesystemAdapterC; +typedef struct FilesystemAdapterC FilesystemAdapterC; + typedef void (*OnMessage) (const char *payload, size_t len); typedef void (*OnAbort) (); typedef void (*OnTimeout) (); @@ -71,8 +75,18 @@ void ocpp_initialize_full( bool autoRecover, //automatically sanitize the local data store when the lib detects recurring crashes. During development, `false` is recommended bool ocpp201); //true to select OCPP 2.0.1, false for OCPP 1.6 +//same as above, but pass FS handle instead of FS options +void ocpp_initialize_full2( + OCPP_Connection *conn, //WebSocket adapter for MicroOcpp + const char *bootNotificationCredentials, //e.g. '{"chargePointModel":"Demo Charger","chargePointVendor":"My Company Ltd."}' (refer to OCPP 1.6 Specification - Edition 2 p. 60) + FilesystemAdapterC *filesystem, //FilesystemAdapter handle initialized by client. MO takes ownership and deletes it during deinitialization + bool autoRecover, //automatically sanitize the local data store when the lib detects recurring crashes. During development, `false` is recommended + bool ocpp201); //true to select OCPP 2.0.1, false for OCPP 1.6 + void ocpp_deinitialize(); +bool ocpp_is_initialized(); + void ocpp_loop(); /* @@ -145,6 +159,9 @@ void ocpp_addErrorCodeInput_m(unsigned int connectorId, InputString_m errorCodeI void ocpp_addMeterValueInputFloat(InputFloat valueInput, const char *measurand, const char *unit, const char *location, const char *phase); //measurand, unit, location and phase can be NULL void ocpp_addMeterValueInputFloat_m(unsigned int connectorId, InputFloat_m valueInput, const char *measurand, const char *unit, const char *location, const char *phase); //measurand, unit, location and phase can be NULL +void ocpp_addMeterValueInputIntTx(int (*valueInput)(ReadingContext), const char *measurand, const char *unit, const char *location, const char *phase); //measurand, unit, location and phase can be NULL +void ocpp_addMeterValueInputIntTx_m(unsigned int connectorId, int (*valueInput)(unsigned int cId, ReadingContext), const char *measurand, const char *unit, const char *location, const char *phase); //measurand, unit, location and phase can be NULL + void ocpp_addMeterValueInput(MeterValueInput *meterValueInput); //takes ownership of meterValueInput void ocpp_addMeterValueInput_m(unsigned int connectorId, MeterValueInput *meterValueInput); //takes ownership of meterValueInput @@ -184,20 +201,6 @@ void ocpp_setOnReceiveRequest(const char *operationType, OnMessage onRequest); void ocpp_setOnSendConf(const char *operationType, OnMessage onConfirmation); -/* - * If build flag MO_CUSTOM_CONSOLE is set, all console output will be forwarded to the print - * function given by this setter. The parameter msg will also by null-terminated c-strings. - */ -void ocpp_set_console_out_c(void (*console_out)(const char *msg)); - -#ifdef MO_CUSTOM_RNG -/** - * If build flag MO_CUSTOM_RNG is set, calls to get random numbers shall be - * forwarded to the function provided through this setter. - */ -void ocpp_set_rng_c( uint32_t (*rng)(void)); -#endif - /* * Send OCPP operations */ From bb88b167c9c0bd26c461252724a417c1c2796c2e Mon Sep 17 00:00:00 2001 From: matth-x <63792403+matth-x@users.noreply.github.com> Date: Sun, 2 Feb 2025 19:53:01 +0100 Subject: [PATCH 4/4] Clean up PR (#400) * update changelog * fix CI/CD errors --- .github/workflows/documentation.yml | 2 +- .github/workflows/tests.yml | 2 +- CHANGELOG.md | 4 ++++ tests/Api.cpp | 2 ++ tests/ChargingSessions.cpp | 2 ++ 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index a861ed91..7fc6acd6 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -158,7 +158,7 @@ jobs: uses: actions/checkout@v3 with: repository: google/bloaty - ref: 379d5305670c00c36a57e608079fd253f13bde63 + ref: e1155149d54bb09b81e86f0e4e5cb7fbd2a318eb path: tools/bloaty submodules: recursive - name: Install bloaty diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e086761f..3288a443 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -52,7 +52,7 @@ jobs: run: ./build/mo_unit_tests --abort - name: Create coverage report run: | - lcov --directory . --capture --output-file coverage.info + lcov --directory . --capture --output-file coverage.info --ignore-errors mismatch lcov --remove coverage.info '/usr/*' '*/tests/*' '*/ArduinoJson.h' --output-file coverage.info lcov --list coverage.info - name: Upload coverage reports to Codecov diff --git a/CHANGELOG.md b/CHANGELOG.md index 588beea3..3b7759aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,17 +7,21 @@ - Change `MicroOcpp::TxNotification` into C-style enum, replace `OCPP_TxNotication` ([#386](https://github.com/matth-x/MicroOcpp/pull/386)) - Improved UUID generation ([#383](https://github.com/matth-x/MicroOcpp/pull/383)) - `beginTransaction()` returns bool for better v2.0.1 interop ([#386](https://github.com/matth-x/MicroOcpp/pull/386)) +- Configurations C-API updates ([#400](https://github.com/matth-x/MicroOcpp/pull/400)) +- Platform integrations C-API upates ([#400](https://github.com/matth-x/MicroOcpp/pull/400)) ### Added - `getTransactionV201()` exposes v201 Tx in API ([#386](https://github.com/matth-x/MicroOcpp/pull/386)) - v201 support in Transaction.h C-API ([#386](https://github.com/matth-x/MicroOcpp/pull/386)) +- Write-only Configurations ([#400](https://github.com/matth-x/MicroOcpp/pull/400)) ### Fixed - Timing issues for OCTT test cases ([#383](https://github.com/matth-x/MicroOcpp/pull/383)) - Misleading Reset failure dbg msg ([#388](https://github.com/matth-x/MicroOcpp/pull/388)) - Reject negative ints in ChangeConfig ([#388](https://github.com/matth-x/MicroOcpp/pull/388)) +- Revised SCons integration ([#400](https://github.com/matth-x/MicroOcpp/pull/400)) ## [1.2.0] - 2024-11-03 diff --git a/tests/Api.cpp b/tests/Api.cpp index 41f9f8a6..c2470172 100644 --- a/tests/Api.cpp +++ b/tests/Api.cpp @@ -13,6 +13,8 @@ #include #include "./helpers/testHelper.h" +#include + #define BASE_TIME "2023-01-01T00:00:00.000Z" #define SCPROFILE "[2,\"testmsg\",\"SetChargingProfile\",{\"connectorId\":0,\"csChargingProfiles\":{\"chargingProfileId\":0,\"stackLevel\":0,\"chargingProfilePurpose\":\"ChargePointMaxProfile\",\"chargingProfileKind\":\"Absolute\",\"chargingSchedule\":{\"duration\":1000000,\"startSchedule\":\"2023-01-01T00:00:00.000Z\",\"chargingRateUnit\":\"W\",\"chargingSchedulePeriod\":[{\"startPeriod\":0,\"limit\":16,\"numberPhases\":3}]}}}]" diff --git a/tests/ChargingSessions.cpp b/tests/ChargingSessions.cpp index 1ac9bdef..82090f16 100644 --- a/tests/ChargingSessions.cpp +++ b/tests/ChargingSessions.cpp @@ -16,6 +16,8 @@ #include #include "./helpers/testHelper.h" +#include + #define BASE_TIME "2023-01-01T00:00:00.000Z" using namespace MicroOcpp;