Skip to content

Commit

Permalink
avoid sending messages before BootNotification Accepted
Browse files Browse the repository at this point in the history
  • Loading branch information
matth-x committed Aug 14, 2024
1 parent 94e0918 commit ae5940b
Show file tree
Hide file tree
Showing 7 changed files with 365 additions and 9 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ set(MO_SRC_UNIT
tests/Certificates.cpp
tests/FirmwareManagement.cpp
tests/ChargePointError.cpp
tests/Boot.cpp
)

add_executable(mo_unit_tests
Expand Down
17 changes: 12 additions & 5 deletions src/MicroOcpp/Core/RequestQueue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ size_t removePayload(const char *src, size_t src_size, char *dst, size_t dst_siz

using namespace MicroOcpp;

VolatileRequestQueue::VolatileRequestQueue(unsigned int priority) : MemoryManaged("VolatileRequestQueue"), priority{priority} {
VolatileRequestQueue::VolatileRequestQueue() : MemoryManaged("VolatileRequestQueue") {

}

Expand Down Expand Up @@ -59,7 +59,7 @@ unsigned int VolatileRequestQueue::getFrontRequestOpNr() {
return NoOperation;
}

return priority;
return 1; //return OpNr 1 to grant PreBoot queue higher priority (=0), but send messages before tx-msg queue (starting with 10)
}

std::unique_ptr<Request> VolatileRequestQueue::fetchFrontRequest() {
Expand Down Expand Up @@ -128,7 +128,6 @@ RequestQueue::RequestQueue(Connection& connection, OperationRegistry& operationR

memset(sendQueues, 0, sizeof(sendQueues));
addSendQueue(&defaultSendQueue);
addSendQueue(&preBootSendQueue);
}

void RequestQueue::loop() {
Expand All @@ -149,7 +148,6 @@ void RequestQueue::loop() {
}

defaultSendQueue.loop();
preBootSendQueue.loop();

if (!connection.isConnected()) {
return;
Expand Down Expand Up @@ -234,7 +232,11 @@ void RequestQueue::sendRequest(std::unique_ptr<Request> op){
}

void RequestQueue::sendRequestPreBoot(std::unique_ptr<Request> op){
preBootSendQueue.pushRequestBack(std::move(op));
if (!preBootSendQueue) {
MO_DBG_ERR("did not set PreBoot queue");
return;
}
preBootSendQueue->pushRequestBack(std::move(op));
}

void RequestQueue::addSendQueue(RequestEmitter* sendQueue) {
Expand All @@ -247,6 +249,11 @@ void RequestQueue::addSendQueue(RequestEmitter* sendQueue) {
MO_DBG_ERR("exceeded sendQueue capacity");
}

void RequestQueue::setPreBootSendQueue(VolatileRequestQueue *preBootQueue) {
this->preBootSendQueue = preBootQueue;
addSendQueue(preBootQueue);
}

unsigned int RequestQueue::getNextOpNr() {
return nextOpNr++;
}
Expand Down
8 changes: 4 additions & 4 deletions src/MicroOcpp/Core/RequestQueue.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,8 @@ class VolatileRequestQueue : public RequestEmitter, public MemoryManaged {
private:
std::unique_ptr<Request> requests [MO_REQUEST_CACHE_MAXSIZE];
size_t front = 0, len = 0;
const unsigned int priority;
public:
VolatileRequestQueue(unsigned int priority = 1);
VolatileRequestQueue();
~VolatileRequestQueue();
void loop();

Expand All @@ -57,8 +56,8 @@ class RequestQueue : public MemoryManaged {
OperationRegistry& operationRegistry;

RequestEmitter* sendQueues [MO_NUM_REQUEST_QUEUES];
VolatileRequestQueue defaultSendQueue {1};
VolatileRequestQueue preBootSendQueue {0};
VolatileRequestQueue defaultSendQueue;
VolatileRequestQueue *preBootSendQueue = nullptr;
std::unique_ptr<Request> sendReqFront;

VolatileRequestQueue recvQueue;
Expand All @@ -85,6 +84,7 @@ class RequestQueue : public MemoryManaged {
void sendRequestPreBoot(std::unique_ptr<Request> request); //send an OCPP operation request to the server; adds request to preBootQueue

void addSendQueue(RequestEmitter* sendQueue);
void setPreBootSendQueue(VolatileRequestQueue *preBootQueue);

unsigned int getNextOpNr();
};
Expand Down
21 changes: 21 additions & 0 deletions src/MicroOcpp/Model/Boot/BootService.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,18 @@

using namespace MicroOcpp;

unsigned int PreBootQueue::getFrontRequestOpNr() {
if (!activatedPostBootCommunication) {
return 0;
}

return VolatileRequestQueue::getFrontRequestOpNr();
}

void PreBootQueue::activatePostBootCommunication() {
activatedPostBootCommunication = true;
}

RegistrationStatus MicroOcpp::deserializeRegistrationStatus(const char *serialized) {
if (!strcmp(serialized, "Accepted")) {
return RegistrationStatus::Accepted;
Expand All @@ -35,6 +47,8 @@ RegistrationStatus MicroOcpp::deserializeRegistrationStatus(const char *serializ

BootService::BootService(Context& context, std::shared_ptr<FilesystemAdapter> filesystem) : MemoryManaged("v16.Boot.BootService"), context(context), filesystem(filesystem), cpCredentials{makeString(getMemoryTag())} {

context.getRequestQueue().setPreBootSendQueue(&preBootQueue); //register PreBootQueue in RequestQueue module

//if transactions can start before the BootNotification succeeds
preBootTransactionsBool = declareConfiguration<bool>(MO_CONFIG_EXT_PREFIX "PreBootTransactions", false);

Expand Down Expand Up @@ -63,6 +77,13 @@ void BootService::loop() {
storeBootStats(filesystem, bootstats);
}

preBootQueue.loop();

if (!activatedPostBootCommunication && status == RegistrationStatus::Accepted) {
preBootQueue.activatePostBootCommunication();
activatedPostBootCommunication = true;
}

if (!activatedModel && (status == RegistrationStatus::Accepted || preBootTransactionsBool->getBool())) {
context.getModel().activateTasks();
activatedModel = true;
Expand Down
13 changes: 13 additions & 0 deletions src/MicroOcpp/Model/Boot/BootService.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include <MicroOcpp/Core/ConfigurationKeyValue.h>
#include <MicroOcpp/Core/FilesystemAdapter.h>
#include <MicroOcpp/Core/RequestQueue.h>
#include <MicroOcpp/Core/Memory.h>
#include <memory>

Expand All @@ -32,13 +33,24 @@ enum class RegistrationStatus {

RegistrationStatus deserializeRegistrationStatus(const char *serialized);

class PreBootQueue : public VolatileRequestQueue {
private:
bool activatedPostBootCommunication = false;
public:
unsigned int getFrontRequestOpNr() override; //override FrontRequestOpNr behavior: in PreBoot mode, always return 0 to avoid other RequestEmitters from sending msgs

void activatePostBootCommunication(); //end PreBoot mode, now send Requests normally
};

class Context;

class BootService : public MemoryManaged {
private:
Context& context;
std::shared_ptr<FilesystemAdapter> filesystem;

PreBootQueue preBootQueue;

unsigned long interval_s = MO_BOOT_INTERVAL_DEFAULT;
unsigned long lastBootNotification = -1UL / 2;

Expand All @@ -49,6 +61,7 @@ class BootService : public MemoryManaged {
std::shared_ptr<Configuration> preBootTransactionsBool;

bool activatedModel = false;
bool activatedPostBootCommunication = false;

unsigned long firstExecutionTimestamp = 0;
bool executedFirstTime = false;
Expand Down
Loading

0 comments on commit ae5940b

Please sign in to comment.