Skip to content

Commit a9213ec

Browse files
authored
Correct MV PreBoot year 1970 timestamps (#354)
* fix MeterValues PreBoot year 1970 timestamps * update changelog
1 parent 032672b commit a9213ec

File tree

5 files changed

+21
-11
lines changed

5 files changed

+21
-11
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
- Reject DataTransfer by default ([#344](https://github.com/matth-x/MicroOcpp/pull/344))
4242
- UnlockConnector NotSupported if connectorId invalid ([#344](https://github.com/matth-x/MicroOcpp/pull/344))
4343
- Fix regression bug of [#345](https://github.com/matth-x/MicroOcpp/pull/345) ([#353](https://github.com/matth-x/MicroOcpp/pull/353))
44+
- Correct MeterValue PreBoot timestamp ([#354](https://github.com/matth-x/MicroOcpp/pull/354))
4445

4546
## [1.1.0] - 2024-05-21
4647

src/MicroOcpp/Model/Metering/MeteringConnector.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ std::unique_ptr<Operation> MeteringConnector::loop() {
5757
}
5858

5959
if ((txBreak || meterData.size() >= (size_t) meterValueCacheSizeInt->getInt()) && !meterData.empty()) {
60-
auto meterValues = std::unique_ptr<MeterValues>(new MeterValues(std::move(meterData), connectorId, transaction));
60+
auto meterValues = std::unique_ptr<MeterValues>(new MeterValues(model, std::move(meterData), connectorId, transaction));
6161
meterData = makeVector<std::unique_ptr<MeterValue>>(getMemoryTag());
6262
return std::move(meterValues); //std::move is required for some compilers even if it's not mandated by standard C++
6363
}
@@ -168,7 +168,7 @@ std::unique_ptr<Operation> MeteringConnector::takeTriggeredMeterValues() {
168168
transaction = model.getConnector(connectorId)->getTransaction();
169169
}
170170

171-
return std::unique_ptr<MeterValues>(new MeterValues(std::move(mv_now), connectorId, transaction));
171+
return std::unique_ptr<MeterValues>(new MeterValues(model, std::move(mv_now), connectorId, transaction));
172172
}
173173

174174
void MeteringConnector::addMeterValueSampler(std::unique_ptr<SampledValueSampler> meterValueSampler) {

src/MicroOcpp/Model/Metering/MeteringService.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ MeteringService::MeteringService(Context& context, int numConn, std::shared_ptr<
7878
* is connected with a WebSocket echo server, let it reply to its own requests.
7979
* Mocking an OCPP Server on the same device makes running (unit) tests easier.
8080
*/
81-
context.getOperationRegistry().registerOperation("MeterValues", [] () {
82-
return new Ocpp16::MeterValues();});
81+
context.getOperationRegistry().registerOperation("MeterValues", [this] () {
82+
return new Ocpp16::MeterValues(this->context.getModel());});
8383
}
8484

8585
void MeteringService::loop(){

src/MicroOcpp/Operations/MeterValues.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ using MicroOcpp::JsonDoc;
1414
#define ENERGY_METER_TIMEOUT_MS 30 * 1000 //after waiting for 30s, send MeterValues without missing readings
1515

1616
//can only be used for echo server debugging
17-
MeterValues::MeterValues() : MemoryManaged("v16.Operation.", "MeterValues") {
17+
MeterValues::MeterValues(Model& model) : MemoryManaged("v16.Operation.", "MeterValues"), model(model) {
1818

1919
}
2020

21-
MeterValues::MeterValues(Vector<std::unique_ptr<MeterValue>>&& meterValue, unsigned int connectorId, std::shared_ptr<Transaction> transaction)
22-
: MemoryManaged("v16.Operation.", "MeterValues"), meterValue{std::move(meterValue)}, connectorId{connectorId}, transaction{transaction} {
21+
MeterValues::MeterValues(Model& model, Vector<std::unique_ptr<MeterValue>>&& meterValue, unsigned int connectorId, std::shared_ptr<Transaction> transaction)
22+
: MemoryManaged("v16.Operation.", "MeterValues"), model(model), meterValue{std::move(meterValue)}, connectorId{connectorId}, transaction{transaction} {
2323

2424
}
2525

@@ -36,8 +36,15 @@ std::unique_ptr<JsonDoc> MeterValues::createReq() {
3636
size_t capacity = 0;
3737

3838
auto entries = makeVector<std::unique_ptr<JsonDoc>>(getMemoryTag());
39-
for (auto value = meterValue.begin(); value != meterValue.end(); value++) {
40-
auto entry = (*value)->toJson();
39+
for (auto mv = meterValue.begin(); mv != meterValue.end(); mv++) {
40+
41+
if ((*mv)->getTimestamp() < MIN_TIME) {
42+
MO_DBG_DEBUG("adjust preboot MeterValue timestamp");
43+
Timestamp adjusted = model.getClock().adjustPrebootTimestamp((*mv)->getTimestamp());
44+
(*mv)->setTimestamp(adjusted);
45+
}
46+
47+
auto entry = (*mv)->toJson();
4148
if (entry) {
4249
capacity += entry->capacity();
4350
entries.push_back(std::move(entry));

src/MicroOcpp/Operations/MeterValues.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,25 @@
1111

1212
namespace MicroOcpp {
1313

14+
class Model;
1415
class MeterValue;
1516
class Transaction;
1617

1718
namespace Ocpp16 {
1819

1920
class MeterValues : public Operation, public MemoryManaged {
2021
private:
22+
Model& model; //for adjusting the timestamp if MeterValue has been created before BootNotification
2123
Vector<std::unique_ptr<MeterValue>> meterValue;
2224

2325
unsigned int connectorId = 0;
2426

2527
std::shared_ptr<Transaction> transaction;
2628

2729
public:
28-
MeterValues(Vector<std::unique_ptr<MeterValue>>&& meterValue, unsigned int connectorId, std::shared_ptr<Transaction> transaction = nullptr);
30+
MeterValues(Model& model, Vector<std::unique_ptr<MeterValue>>&& meterValue, unsigned int connectorId, std::shared_ptr<Transaction> transaction = nullptr);
2931

30-
MeterValues(); //for debugging only. Make this for the server pendant
32+
MeterValues(Model& model); //for debugging only. Make this for the server pendant
3133

3234
~MeterValues();
3335

0 commit comments

Comments
 (0)