fix the delta time init and event number calculation (#12862)
diff --git a/src/app/EventLoggingTypes.h b/src/app/EventLoggingTypes.h
index 8ef91c4..742c2c7 100644
--- a/src/app/EventLoggingTypes.h
+++ b/src/app/EventLoggingTypes.h
@@ -149,7 +149,8 @@
struct EventLoadOutContext
{
EventLoadOutContext(TLV::TLVWriter & aWriter, PriorityLevel aPriority, EventNumber aStartingEventNumber) :
- mWriter(aWriter), mPriority(aPriority), mStartingEventNumber(aStartingEventNumber), mCurrentEventNumber(0), mFirst(true)
+ mWriter(aWriter), mPriority(aPriority), mStartingEventNumber(aStartingEventNumber), mCurrentEventNumber(0), mFirst(true),
+ mSamePriorityEvent(false)
{}
TLV::TLVWriter & mWriter;
@@ -161,6 +162,7 @@
size_t mEventCount = 0;
ClusterInfo * mpInterestedEventPaths = nullptr;
bool mFirst = true;
+ bool mSamePriorityEvent = false;
};
} // namespace app
} // namespace chip
diff --git a/src/app/EventManagement.cpp b/src/app/EventManagement.cpp
index 1455ad4..0f52283 100644
--- a/src/app/EventManagement.cpp
+++ b/src/app/EventManagement.cpp
@@ -659,6 +659,10 @@
if (event.mPriority == apEventLoadOutContext->mPriority)
{
apEventLoadOutContext->mCurrentTime.mValue += event.mDeltaTime.mValue;
+ // If the retrieved event has the same priority as the one set by FetchEventSince, we need to use mSamePriorityEvent to
+ // increase the event number after encoding the current event number. Then this updated event number will be used by
+ // FetchEventSince for next use
+ apEventLoadOutContext->mSamePriorityEvent = true;
if (IsInterestedEventPaths(apEventLoadOutContext, event))
{
return CHIP_EVENT_ID_FOUND;
@@ -692,7 +696,13 @@
loadOutContext->mFirst = false;
loadOutContext->mEventCount++;
}
- loadOutContext->mCurrentEventNumber++;
+ if (loadOutContext->mSamePriorityEvent)
+ {
+ // Update to next Event Number
+ loadOutContext->mCurrentEventNumber++;
+ loadOutContext->mSamePriorityEvent = false;
+ }
+
return err;
}
@@ -771,6 +781,21 @@
envelope->mFieldsToRead |= 1 << to_underlying(EventDataIB::Tag::kPriority);
}
+ if (reader.GetTag() == TLV::ContextTag(to_underlying(EventDataIB::Tag::kDeltaSystemTimestamp)))
+ {
+ uint64_t deltaSystemTime;
+ ReturnErrorOnFailure(reader.Get(deltaSystemTime));
+ envelope->mDeltaTime.mType = Timestamp::Type::kSystem;
+ envelope->mDeltaTime.mValue = deltaSystemTime;
+ }
+
+ if (reader.GetTag() == TLV::ContextTag(to_underlying(EventDataIB::Tag::kDeltaEpochTimestamp)))
+ {
+ uint64_t deltaEpochTime;
+ ReturnErrorOnFailure(reader.Get(deltaEpochTime));
+ envelope->mDeltaTime.mType = Timestamp::Type::kEpoch;
+ envelope->mDeltaTime.mValue = deltaEpochTime;
+ }
return CHIP_NO_ERROR;
}
diff --git a/src/app/reporting/Engine.cpp b/src/app/reporting/Engine.cpp
index 7c29750..8baa297 100644
--- a/src/app/reporting/Engine.cpp
+++ b/src/app/reporting/Engine.cpp
@@ -235,8 +235,7 @@
CHIP_ERROR err = CHIP_NO_ERROR;
size_t eventCount = 0;
TLV::TLVWriter backup;
- bool eventClean = true;
- EventNumber initialEvents[kNumPriorityLevel];
+ bool eventClean = true;
ClusterInfo * clusterInfoList = apReadHandler->GetEventClusterInfolist();
EventNumber * eventNumberList = apReadHandler->GetVendedEventNumberList();
EventManagement & eventManager = EventManagement::GetInstance();
@@ -250,17 +249,6 @@
// skip the rest of processing
VerifyOrExit(eventManager.IsValid(), ChipLogError(DataManagement, "EventManagement has not yet initialized"));
- memcpy(initialEvents, eventNumberList, sizeof(initialEvents));
-
- for (size_t index = 0; index < kNumPriorityLevel; index++)
- {
- EventNumber tmpNumber = eventManager.GetFirstEventNumber(static_cast<PriorityLevel>(index));
- if (tmpNumber > initialEvents[index])
- {
- initialEvents[index] = tmpNumber;
- }
- }
-
eventClean = apReadHandler->CheckEventClean(eventManager);
// proceed only if there are new events.
@@ -438,26 +426,6 @@
err = reportDataWriter.Finalize(&bufHandle);
SuccessOrExit(err);
-#if CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
- {
- ChipLogDetail(DataManagement, "<RE> Dumping report data...");
- chip::System::PacketBufferTLVReader reader;
- ReportDataMessage::Parser report;
-
- reader.Init(bufHandle.Retain());
- reader.Next();
-
- err = report.Init(reader);
- SuccessOrExit(err);
-
- if ((err = report.CheckSchemaValidity()) != CHIP_NO_ERROR)
- {
- ChipLogError(DataManagement, "<RE> Schema check failed: %s", chip::ErrorStr(err));
- }
- SuccessOrExit(err);
- }
-#endif // CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
-
ChipLogDetail(DataManagement, "<RE> Sending report (payload has %" PRIu32 " bytes)...", reportDataWriter.GetLengthWritten());
err = SendReport(apReadHandler, std::move(bufHandle), hasMoreChunks);
VerifyOrExit(err == CHIP_NO_ERROR,