Matter SDK Coverage Report
Current view: top level - app - EventLoggingTypes.h (source / functions) Coverage Total Hit
Test: SHA:b879ecb8e99e175eea0a293a888bda853da2b19c Lines: 86.7 % 15 13
Test Date: 2025-01-17 19:00:11 Functions: 77.8 % 9 7

            Line data    Source code
       1              : /**
       2              :  *
       3              :  *    Copyright (c) 2021 Project CHIP Authors
       4              :  *
       5              :  *    Licensed under the Apache License, Version 2.0 (the "License");
       6              :  *    you may not use this file except in compliance with the License.
       7              :  *    You may obtain a copy of the License at
       8              :  *
       9              :  *        http://www.apache.org/licenses/LICENSE-2.0
      10              :  *
      11              :  *    Unless required by applicable law or agreed to in writing, software
      12              :  *    distributed under the License is distributed on an "AS IS" BASIS,
      13              :  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      14              :  *    See the License for the specific language governing permissions and
      15              :  *    limitations under the License.
      16              :  */
      17              : 
      18              : #pragma once
      19              : 
      20              : #include <access/SubjectDescriptor.h>
      21              : #include <app/EventPathParams.h>
      22              : #include <app/util/basic-types.h>
      23              : #include <lib/core/CHIPCore.h>
      24              : #include <lib/core/Optional.h>
      25              : #include <lib/core/TLV.h>
      26              : #include <lib/support/LinkedList.h>
      27              : #include <system/SystemPacketBuffer.h>
      28              : 
      29              : inline constexpr size_t kNumPriorityLevel = 3;
      30              : namespace chip {
      31              : namespace app {
      32              : 
      33              : /**
      34              :  * @brief
      35              :  *   The Priority of the log entry.
      36              :  *
      37              :  * @details
      38              :  * Priority is used as a way to filter events before they are
      39              :  * actually emitted into the log. After the event is in the log, we
      40              :  * make no further provisions to expunge it from the log.
      41              :  * The priority level serves to prioritize event storage. If an
      42              :  * event of high priority is added to a full buffer, events are
      43              :  * dropped in order of priority (and age) to accommodate it. As such,
      44              :  * priority levels only have relative value. If a system is
      45              :  * using only one priority level, events are dropped only in order
      46              :  * of age, like a ring buffer.
      47              :  */
      48              : 
      49              : enum class PriorityLevel : uint8_t
      50              : {
      51              : 
      52              :     First = 0,
      53              :     /**
      54              :      *  Debug priority denotes log entries of interest to the
      55              :      *  developers of the system and is used primarily in the
      56              :      *  development phase. Debug priority logs are
      57              :      *  not accounted for in the bandwidth or power budgets of the
      58              :      *  constrained devices; as a result, they must be used only over
      59              :      *  a limited time span in production systems.
      60              :      */
      61              : 
      62              :     Debug = First,
      63              :     /**
      64              :      * Info priority denotes log entries that provide extra insight
      65              :      * and diagnostics into the running system. Info logging level may
      66              :      * be used over an extended period of time in a production system,
      67              :      * or may be used as the default log level in a field trial. On
      68              :      * the constrained devices, the entries logged with Info level must
      69              :      * be accounted for in the bandwidth and memory budget, but not in
      70              :      * the power budget.
      71              :      */
      72              :     Info = 1,
      73              : 
      74              :     /**
      75              :      * Critical priority denotes events whose loss would
      76              :      * directly impact customer-facing features. Applications may use
      77              :      * loss of Production Critical events to indicate system failure.
      78              :      * On constrained devices, entries logged with Critical
      79              :      * priority must be accounted for in the power and memory budget,
      80              :      * as it is expected that they are always logged and offloaded
      81              :      * from the device.
      82              :      */
      83              :     Critical = 2,
      84              :     Last     = Critical,
      85              :     Invalid  = Last + 1,
      86              : 
      87              : };
      88              : 
      89              : static_assert(sizeof(std::underlying_type_t<PriorityLevel>) <= sizeof(unsigned),
      90              :               "Logging that converts PriorityLevel to unsigned will be lossy");
      91              : 
      92              : /**
      93              :  * @brief
      94              :  *   The struct that provides an application set System or Epoch timestamp.
      95              :  */
      96              : struct Timestamp
      97              : {
      98              :     enum class Type : uint8_t
      99              :     {
     100              :         kSystem = 0,
     101              :         kEpoch
     102              :     };
     103          676 :     Timestamp() {}
     104         5010 :     Timestamp(Type aType, uint64_t aValue) : mType(aType), mValue(aValue) {}
     105              :     Timestamp(System::Clock::Timestamp aValue) : mType(Type::kSystem), mValue(aValue.count()) {}
     106         4998 :     static Timestamp Epoch(System::Clock::Timestamp aValue)
     107              :     {
     108         4998 :         Timestamp timestamp(Type::kEpoch, aValue.count());
     109         4998 :         return timestamp;
     110              :     }
     111           12 :     static Timestamp System(System::Clock::Timestamp aValue)
     112              :     {
     113           12 :         Timestamp timestamp(Type::kSystem, aValue.count());
     114           12 :         return timestamp;
     115              :     }
     116              : 
     117         1324 :     bool IsSystem() const { return mType == Type::kSystem; }
     118            0 :     bool IsEpoch() const { return mType == Type::kEpoch; }
     119              : 
     120              :     Type mType      = Type::kSystem;
     121              :     uint64_t mValue = 0;
     122              : };
     123              : 
     124              : /**
     125              :  *   The structure that provides options for the different event fields.
     126              :  */
     127              : class EventOptions
     128              : {
     129              : public:
     130            0 :     EventOptions() : mPriority(PriorityLevel::Invalid) {}
     131          662 :     EventOptions(Timestamp aTimestamp) : mTimestamp(aTimestamp), mPriority(PriorityLevel::Invalid) {}
     132              :     ConcreteEventPath mPath;
     133              :     Timestamp mTimestamp;
     134              :     PriorityLevel mPriority = PriorityLevel::Invalid;
     135              :     // kUndefinedFabricIndex 0 means not fabric associated at all
     136              :     FabricIndex mFabricIndex = kUndefinedFabricIndex;
     137              : };
     138              : 
     139              : /**
     140              :  * @brief
     141              :  *   Structure for copying event lists on output.
     142              :  */
     143              : struct EventLoadOutContext
     144              : {
     145         2216 :     EventLoadOutContext(TLV::TLVWriter & aWriter, PriorityLevel aPriority, EventNumber aStartingEventNumber) :
     146         2216 :         mWriter(aWriter), mPriority(aPriority), mStartingEventNumber(aStartingEventNumber), mCurrentEventNumber(0), mFirst(true)
     147         2216 :     {}
     148              : 
     149              :     TLV::TLVWriter & mWriter;
     150              :     PriorityLevel mPriority          = PriorityLevel::Invalid;
     151              :     EventNumber mStartingEventNumber = 0;
     152              :     Timestamp mPreviousTime;
     153              :     Timestamp mCurrentTime;
     154              :     EventNumber mCurrentEventNumber                                      = 0;
     155              :     size_t mEventCount                                                   = 0;
     156              :     const SingleLinkedListNode<EventPathParams> * mpInterestedEventPaths = nullptr;
     157              :     bool mFirst                                                          = true;
     158              :     Access::SubjectDescriptor mSubjectDescriptor;
     159              : };
     160              : } // namespace app
     161              : } // namespace chip
        

Generated by: LCOV version 2.0-1