@@ -34,7 +34,78 @@ namespace chip {
34
34
namespace Tracing {
35
35
namespace Silabs {
36
36
37
- // TODO add string mapping to log the operation names and types
37
+ const char * TimeTraceOperationToString (TimeTraceOperation operation)
38
+ {
39
+ switch (operation)
40
+ {
41
+ case TimeTraceOperation::kSpake2p :
42
+ return " Spake2p" ;
43
+ case TimeTraceOperation::kPake1 :
44
+ return " Pake1" ;
45
+ case TimeTraceOperation::kPake2 :
46
+ return " Pake2" ;
47
+ case TimeTraceOperation::kPake3 :
48
+ return " Pake3" ;
49
+ case TimeTraceOperation::kOperationalCredentials :
50
+ return " OperationalCredentials" ;
51
+ case TimeTraceOperation::kAttestationVerification :
52
+ return " AttestationVerification" ;
53
+ case TimeTraceOperation::kCSR :
54
+ return " CSR" ;
55
+ case TimeTraceOperation::kNOC :
56
+ return " NOC" ;
57
+ case TimeTraceOperation::kTransportLayer :
58
+ return " TransportLayer" ;
59
+ case TimeTraceOperation::kTransportSetup :
60
+ return " TransportSetup" ;
61
+ case TimeTraceOperation::kFindOperational :
62
+ return " FindOperational" ;
63
+ case TimeTraceOperation::kCaseSession :
64
+ return " CaseSession" ;
65
+ case TimeTraceOperation::kSigma1 :
66
+ return " Sigma1" ;
67
+ case TimeTraceOperation::kSigma2 :
68
+ return " Sigma2" ;
69
+ case TimeTraceOperation::kSigma3 :
70
+ return " Sigma3" ;
71
+ case TimeTraceOperation::kOTA :
72
+ return " OTA" ;
73
+ case TimeTraceOperation::kImageUpload :
74
+ return " ImageUpload" ;
75
+ case TimeTraceOperation::kImageVerification :
76
+ return " ImageVerification" ;
77
+ case TimeTraceOperation::kAppApplyTime :
78
+ return " AppApplyTime" ;
79
+ case TimeTraceOperation::kBootup :
80
+ return " Bootup" ;
81
+ case TimeTraceOperation::kSilabsInit :
82
+ return " SilabsInit" ;
83
+ case TimeTraceOperation::kMatterInit :
84
+ return " MatterInit" ;
85
+ case TimeTraceOperation::kNumTraces :
86
+ return " NumTraces" ;
87
+ case TimeTraceOperation::kBufferFull :
88
+ return " BufferFull" ;
89
+ default :
90
+ return " Unknown" ;
91
+ }
92
+ }
93
+
94
+ const char * OperationTypeToString (OperationType type)
95
+ {
96
+ switch (type)
97
+ {
98
+ case OperationType::kBegin :
99
+ return " Begin" ;
100
+ case OperationType::kEnd :
101
+ return " End" ;
102
+ case OperationType::kInstant :
103
+ return " Instant" ;
104
+ default :
105
+ return " Unknown" ;
106
+ }
107
+ }
108
+
38
109
namespace {
39
110
constexpr size_t kPersistentTimeTrackerBufferMax = SERIALIZED_TIME_TRACKERS_SIZE_BYTES;
40
111
} // namespace
@@ -43,6 +114,29 @@ struct TimeTrackerStorage : public TimeTracker, PersistentData<kPersistentTimeTr
43
114
// TODO implement the Persistent Array class and use it here for logging the watermark array
44
115
};
45
116
117
+ int TimeTracker::ToCharArray (MutableByteSpan & buffer) const
118
+ {
119
+ switch (mType )
120
+ {
121
+ case OperationType::kBegin :
122
+ return snprintf (reinterpret_cast <char *>(buffer.data ()), buffer.size (),
123
+ " TimeTracker - StartTime: %" PRIu32 " , Operation: %s, Type: %s, Error: 0x%" PRIx32, mStartTime .count (),
124
+ TimeTraceOperationToString (mOperation ), OperationTypeToString (mType ), mError .AsInteger ());
125
+ case OperationType::kEnd :
126
+ return snprintf (reinterpret_cast <char *>(buffer.data ()), buffer.size (),
127
+ " TimeTracker - StartTime: %" PRIu32 " , EndTime: %" PRIu32 " , Duration: %" PRIu32
128
+ " ms, Operation: %s, Type: %s, Error: 0x%" PRIx32,
129
+ mStartTime .count (), mEndTime .count (), (mEndTime - mStartTime ).count (),
130
+ TimeTraceOperationToString (mOperation ), OperationTypeToString (mType ), mError .AsInteger ());
131
+ case OperationType::kInstant :
132
+ return snprintf (reinterpret_cast <char *>(buffer.data ()), buffer.size (),
133
+ " TimeTracker - EventTime: %" PRIu32 " , Operation: %s, Type: %s, Error: 0x%" PRIx32, mStartTime .count (),
134
+ TimeTraceOperationToString (mOperation ), OperationTypeToString (mType ), mError .AsInteger ());
135
+ default :
136
+ return snprintf (reinterpret_cast <char *>(buffer.data ()), buffer.size (), " TimeTracker - Unknown operation type" );
137
+ }
138
+ }
139
+
46
140
SilabsTracer SilabsTracer::sInstance ;
47
141
48
142
SilabsTracer::SilabsTracer ()
@@ -78,7 +172,7 @@ CHIP_ERROR SilabsTracer::StartWatermarksStorage(PersistentStorageDelegate * stor
78
172
return CHIP_NO_ERROR;
79
173
}
80
174
81
- void SilabsTracer::TimeTraceBegin (TimeTraceOperation aOperation)
175
+ CHIP_ERROR SilabsTracer::TimeTraceBegin (TimeTraceOperation aOperation)
82
176
{
83
177
// Log the start time of the operation
84
178
auto & tracker = mLatestTimeTrackers [static_cast <size_t >(aOperation)];
@@ -90,10 +184,10 @@ void SilabsTracer::TimeTraceBegin(TimeTraceOperation aOperation)
90
184
auto & watermark = mWatermarks [static_cast <size_t >(aOperation)];
91
185
watermark.mTotalCount ++;
92
186
93
- OutputTrace (tracker);
187
+ return OutputTrace (tracker);
94
188
}
95
189
96
- void SilabsTracer::TimeTraceEnd (TimeTraceOperation aOperation, CHIP_ERROR error)
190
+ CHIP_ERROR SilabsTracer::TimeTraceEnd (TimeTraceOperation aOperation, CHIP_ERROR error)
97
191
{
98
192
auto & tracker = mLatestTimeTrackers [static_cast <size_t >(aOperation)];
99
193
tracker.mEndTime = System::SystemClock ().GetMonotonicTimestamp ();
@@ -127,28 +221,28 @@ void SilabsTracer::TimeTraceEnd(TimeTraceOperation aOperation, CHIP_ERROR error)
127
221
}
128
222
}
129
223
130
- OutputTrace (tracker);
224
+ return OutputTrace (tracker);
131
225
}
132
226
133
- void SilabsTracer::TimeTraceInstant (TimeTraceOperation aOperation, CHIP_ERROR error)
227
+ CHIP_ERROR SilabsTracer::TimeTraceInstant (TimeTraceOperation aOperation, CHIP_ERROR error)
134
228
{
135
229
TimeTracker tracker;
136
230
tracker.mStartTime = System::SystemClock ().GetMonotonicTimestamp ();
137
231
tracker.mEndTime = tracker.mStartTime ;
138
232
tracker.mOperation = aOperation;
139
233
tracker.mType = OperationType::kInstant ;
140
234
tracker.mError = error;
141
- OutputTrace (tracker);
235
+ return OutputTrace (tracker);
142
236
}
143
237
144
238
CHIP_ERROR SilabsTracer::OutputTimeTracker (const TimeTracker & tracker)
145
239
{
146
240
VerifyOrReturnError (isLogInitialized (), CHIP_ERROR_UNINITIALIZED);
147
- ChipLogProgress (DeviceLayer,
148
- " TimeTracker - StartTime: % " PRIu32 " , EndTime: % " PRIu32 " , Operation: % " PRIu8 " , Type: % " PRIu8
149
- " , Error: % " CHIP_ERROR_FORMAT,
150
- tracker.mStartTime . count (), tracker. mEndTime . count (), static_cast < uint8_t >(tracker. mOperation ),
151
- static_cast < uint8_t >(tracker. mType ), tracker. mError . Format ());
241
+ // Allocate a buffer to store the trace
242
+ uint8_t buffer[ kMaxTraceSize ];
243
+ MutableByteSpan span (buffer);
244
+ tracker.ToCharArray (span);
245
+ ChipLogProgress (DeviceLayer, " %s " , buffer); // Use format string literal
152
246
return CHIP_NO_ERROR;
153
247
}
154
248
@@ -168,10 +262,11 @@ CHIP_ERROR SilabsTracer::OutputTrace(const TimeTracker & tracker)
168
262
TimeTracker resourceExhaustedTracker = tracker;
169
263
resourceExhaustedTracker.mStartTime = System::SystemClock ().GetMonotonicTimestamp ();
170
264
resourceExhaustedTracker.mEndTime = resourceExhaustedTracker.mStartTime ;
171
- resourceExhaustedTracker.mOperation = TimeTraceOperation::kNumTraces ;
265
+ resourceExhaustedTracker.mOperation = TimeTraceOperation::kBufferFull ;
172
266
resourceExhaustedTracker.mType = OperationType::kInstant ;
173
267
resourceExhaustedTracker.mError = CHIP_ERROR_BUFFER_TOO_SMALL;
174
268
mTimeTrackerList .Insert (resourceExhaustedTracker);
269
+ mBufferedTrackerCount ++;
175
270
return CHIP_ERROR_BUFFER_TOO_SMALL;
176
271
}
177
272
else
@@ -189,10 +284,11 @@ CHIP_ERROR SilabsTracer::OutputWaterMark(TimeTraceOperation aOperation)
189
284
190
285
VerifyOrReturnError (isLogInitialized (), CHIP_ERROR_UNINITIALIZED);
191
286
ChipLogProgress (DeviceLayer,
192
- " Trace %zu: TotalCount=%" PRIu32 " , SuccessFullCount=%" PRIu32 " , MaxTime=%" PRIu32 " , MinTime=%" PRIu32
287
+ " Operation: %s, TotalCount=%" PRIu32 " , SuccessFullCount=%" PRIu32 " , MaxTime=%" PRIu32 " , MinTime=%" PRIu32
193
288
" , AvgTime=%" PRIu32 " , CountAboveAvg=%" PRIu32 " " ,
194
- index , watermark.mTotalCount , watermark.mSuccessfullCount , watermark.mMaxTimeMs .count (),
195
- watermark.mMinTimeMs .count (), watermark.mMovingAverage .count (), watermark.mCountAboveAvg );
289
+ TimeTraceOperationToString (aOperation), watermark.mTotalCount , watermark.mSuccessfullCount ,
290
+ watermark.mMaxTimeMs .count (), watermark.mMinTimeMs .count (), watermark.mMovingAverage .count (),
291
+ watermark.mCountAboveAvg );
196
292
197
293
return CHIP_NO_ERROR;
198
294
}
@@ -272,24 +368,33 @@ CHIP_ERROR SilabsTracer::LoadWatermarks()
272
368
return CHIP_NO_ERROR;
273
369
}
274
370
275
- #if CONFIG_BUILD_FOR_HOST_UNIT_TEST
276
- size_t SilabsTracer::GetTraceCount ()
277
- {
278
- return mBufferedTrackerCount ;
279
- }
280
-
281
- CHIP_ERROR SilabsTracer::GetTraceByIndex (size_t index, const char *& trace) const
371
+ CHIP_ERROR SilabsTracer::GetTraceByOperation (TimeTraceOperation aOperation, MutableByteSpan & buffer) const
282
372
{
283
373
auto * current = mTimeTrackerList .head ;
284
- for ( size_t i = 0 ; i < index && current != nullptr ; ++i )
374
+ while ( current != nullptr )
285
375
{
376
+ if (current->mValue .mOperation == aOperation)
377
+ {
378
+ // Check if the buffer is large enough
379
+ auto requiredSize = current->mValue .GetSize ();
380
+
381
+ if (requiredSize < 0 )
382
+ {
383
+ return CHIP_ERROR_INTERNAL;
384
+ }
385
+
386
+ if (static_cast <size_t >(requiredSize) >= buffer.size ())
387
+ {
388
+ return CHIP_ERROR_BUFFER_TOO_SMALL;
389
+ }
390
+
391
+ current->mValue .ToCharArray (buffer);
392
+ return CHIP_NO_ERROR;
393
+ }
286
394
current = current->mpNext ;
287
395
}
288
- VerifyOrReturnError (current != nullptr , CHIP_ERROR_INVALID_ARGUMENT);
289
- trace = reinterpret_cast <const char *>(¤t->mValue );
290
- return CHIP_NO_ERROR;
396
+ return CHIP_ERROR_NOT_FOUND;
291
397
}
292
- #endif
293
398
294
399
} // namespace Silabs
295
400
} // namespace Tracing
0 commit comments