Full Code of matth-x/MicroOcpp for AI

main ee1271b7e8d9 cached
276 files
2.2 MB
582.7k tokens
2227 symbols
1 requests
Download .txt
Showing preview only (2,329K chars total). Download the full file or copy to clipboard to get everything.
Repository: matth-x/MicroOcpp
Branch: main
Commit: ee1271b7e8d9
Files: 276
Total size: 2.2 MB

Directory structure:
gitextract_ls9b0kd7/

├── .github/
│   └── workflows/
│       ├── documentation.yml
│       ├── esp-idf.yml
│       ├── pio.yml
│       ├── platformless.yml
│       └── tests.yml
├── .gitignore
├── CHANGELOG.md
├── CMakeLists.txt
├── LICENSE
├── README.md
├── SConscript.py
├── docs/
│   ├── benchmarks.md
│   ├── index.md
│   ├── intro-tech.md
│   ├── migration.md
│   ├── modules.md
│   ├── prerequisites.md
│   ├── security.md
│   └── stylesheets/
│       └── extra.css
├── examples/
│   ├── ESP/
│   │   └── main.cpp
│   ├── ESP-IDF/
│   │   ├── CMakeLists.txt
│   │   ├── Makefile
│   │   ├── README.md
│   │   ├── components/
│   │   │   ├── ArduinoJson/
│   │   │   │   └── .gitkeep
│   │   │   ├── ArduinoOcpp/
│   │   │   │   └── .gitkeep
│   │   │   ├── ArduinoOcppMongoose/
│   │   │   │   └── .gitkeep
│   │   │   ├── README.md
│   │   │   └── mongoose/
│   │   │       └── .gitkeep
│   │   ├── main/
│   │   │   ├── CMakeLists.txt
│   │   │   ├── Kconfig.projbuild
│   │   │   ├── component.mk
│   │   │   └── main.c
│   │   ├── partitions.csv
│   │   └── sdkconfig
│   └── ESP-TLS/
│       └── main.cpp
├── library.json
├── library.properties
├── mkdocs.yml
├── platformio.ini
├── src/
│   ├── MicroOcpp/
│   │   ├── Core/
│   │   │   ├── Configuration.cpp
│   │   │   ├── Configuration.h
│   │   │   ├── ConfigurationContainer.cpp
│   │   │   ├── ConfigurationContainer.h
│   │   │   ├── ConfigurationContainerFlash.cpp
│   │   │   ├── ConfigurationContainerFlash.h
│   │   │   ├── ConfigurationKeyValue.cpp
│   │   │   ├── ConfigurationKeyValue.h
│   │   │   ├── ConfigurationOptions.h
│   │   │   ├── Configuration_c.cpp
│   │   │   ├── Configuration_c.h
│   │   │   ├── Connection.cpp
│   │   │   ├── Connection.h
│   │   │   ├── Context.cpp
│   │   │   ├── Context.h
│   │   │   ├── FilesystemAdapter.cpp
│   │   │   ├── FilesystemAdapter.h
│   │   │   ├── FilesystemUtils.cpp
│   │   │   ├── FilesystemUtils.h
│   │   │   ├── Ftp.h
│   │   │   ├── FtpMbedTLS.cpp
│   │   │   ├── FtpMbedTLS.h
│   │   │   ├── Memory.cpp
│   │   │   ├── Memory.h
│   │   │   ├── OcppError.h
│   │   │   ├── Operation.cpp
│   │   │   ├── Operation.h
│   │   │   ├── OperationRegistry.cpp
│   │   │   ├── OperationRegistry.h
│   │   │   ├── Request.cpp
│   │   │   ├── Request.h
│   │   │   ├── RequestCallbacks.h
│   │   │   ├── RequestQueue.cpp
│   │   │   ├── RequestQueue.h
│   │   │   ├── Time.cpp
│   │   │   ├── Time.h
│   │   │   ├── UuidUtils.cpp
│   │   │   └── UuidUtils.h
│   │   ├── Debug.cpp
│   │   ├── Debug.h
│   │   ├── Model/
│   │   │   ├── Authorization/
│   │   │   │   ├── AuthorizationData.cpp
│   │   │   │   ├── AuthorizationData.h
│   │   │   │   ├── AuthorizationList.cpp
│   │   │   │   ├── AuthorizationList.h
│   │   │   │   ├── AuthorizationService.cpp
│   │   │   │   ├── AuthorizationService.h
│   │   │   │   ├── IdToken.cpp
│   │   │   │   └── IdToken.h
│   │   │   ├── Availability/
│   │   │   │   ├── AvailabilityService.cpp
│   │   │   │   ├── AvailabilityService.h
│   │   │   │   └── ChangeAvailabilityStatus.h
│   │   │   ├── Boot/
│   │   │   │   ├── BootService.cpp
│   │   │   │   └── BootService.h
│   │   │   ├── Certificates/
│   │   │   │   ├── Certificate.cpp
│   │   │   │   ├── Certificate.h
│   │   │   │   ├── CertificateMbedTLS.cpp
│   │   │   │   ├── CertificateMbedTLS.h
│   │   │   │   ├── CertificateService.cpp
│   │   │   │   ├── CertificateService.h
│   │   │   │   ├── Certificate_c.cpp
│   │   │   │   └── Certificate_c.h
│   │   │   ├── ConnectorBase/
│   │   │   │   ├── ChargePointErrorData.h
│   │   │   │   ├── ChargePointStatus.h
│   │   │   │   ├── Connector.cpp
│   │   │   │   ├── Connector.h
│   │   │   │   ├── ConnectorsCommon.cpp
│   │   │   │   ├── ConnectorsCommon.h
│   │   │   │   ├── EvseId.h
│   │   │   │   └── UnlockConnectorResult.h
│   │   │   ├── Diagnostics/
│   │   │   │   ├── DiagnosticsService.cpp
│   │   │   │   ├── DiagnosticsService.h
│   │   │   │   └── DiagnosticsStatus.h
│   │   │   ├── FirmwareManagement/
│   │   │   │   ├── FirmwareService.cpp
│   │   │   │   ├── FirmwareService.h
│   │   │   │   └── FirmwareStatus.h
│   │   │   ├── Heartbeat/
│   │   │   │   ├── HeartbeatService.cpp
│   │   │   │   └── HeartbeatService.h
│   │   │   ├── Metering/
│   │   │   │   ├── MeterStore.cpp
│   │   │   │   ├── MeterStore.h
│   │   │   │   ├── MeterValue.cpp
│   │   │   │   ├── MeterValue.h
│   │   │   │   ├── MeterValuesV201.cpp
│   │   │   │   ├── MeterValuesV201.h
│   │   │   │   ├── MeteringConnector.cpp
│   │   │   │   ├── MeteringConnector.h
│   │   │   │   ├── MeteringService.cpp
│   │   │   │   ├── MeteringService.h
│   │   │   │   ├── ReadingContext.cpp
│   │   │   │   ├── ReadingContext.h
│   │   │   │   ├── SampledValue.cpp
│   │   │   │   └── SampledValue.h
│   │   │   ├── Model.cpp
│   │   │   ├── Model.h
│   │   │   ├── RemoteControl/
│   │   │   │   ├── RemoteControlDefs.h
│   │   │   │   ├── RemoteControlService.cpp
│   │   │   │   └── RemoteControlService.h
│   │   │   ├── Reservation/
│   │   │   │   ├── Reservation.cpp
│   │   │   │   ├── Reservation.h
│   │   │   │   ├── ReservationService.cpp
│   │   │   │   └── ReservationService.h
│   │   │   ├── Reset/
│   │   │   │   ├── ResetDefs.h
│   │   │   │   ├── ResetService.cpp
│   │   │   │   └── ResetService.h
│   │   │   ├── SmartCharging/
│   │   │   │   ├── SmartChargingModel.cpp
│   │   │   │   ├── SmartChargingModel.h
│   │   │   │   ├── SmartChargingService.cpp
│   │   │   │   └── SmartChargingService.h
│   │   │   ├── Transactions/
│   │   │   │   ├── Transaction.cpp
│   │   │   │   ├── Transaction.h
│   │   │   │   ├── TransactionDefs.h
│   │   │   │   ├── TransactionDeserialize.cpp
│   │   │   │   ├── TransactionDeserialize.h
│   │   │   │   ├── TransactionService.cpp
│   │   │   │   ├── TransactionService.h
│   │   │   │   ├── TransactionStore.cpp
│   │   │   │   └── TransactionStore.h
│   │   │   └── Variables/
│   │   │       ├── Variable.cpp
│   │   │       ├── Variable.h
│   │   │       ├── VariableContainer.cpp
│   │   │       ├── VariableContainer.h
│   │   │       ├── VariableService.cpp
│   │   │       └── VariableService.h
│   │   ├── Operations/
│   │   │   ├── Authorize.cpp
│   │   │   ├── Authorize.h
│   │   │   ├── BootNotification.cpp
│   │   │   ├── BootNotification.h
│   │   │   ├── CancelReservation.cpp
│   │   │   ├── CancelReservation.h
│   │   │   ├── ChangeAvailability.cpp
│   │   │   ├── ChangeAvailability.h
│   │   │   ├── ChangeConfiguration.cpp
│   │   │   ├── ChangeConfiguration.h
│   │   │   ├── CiStrings.h
│   │   │   ├── ClearCache.cpp
│   │   │   ├── ClearCache.h
│   │   │   ├── ClearChargingProfile.cpp
│   │   │   ├── ClearChargingProfile.h
│   │   │   ├── CustomOperation.cpp
│   │   │   ├── CustomOperation.h
│   │   │   ├── DataTransfer.cpp
│   │   │   ├── DataTransfer.h
│   │   │   ├── DeleteCertificate.cpp
│   │   │   ├── DeleteCertificate.h
│   │   │   ├── DiagnosticsStatusNotification.cpp
│   │   │   ├── DiagnosticsStatusNotification.h
│   │   │   ├── FirmwareStatusNotification.cpp
│   │   │   ├── FirmwareStatusNotification.h
│   │   │   ├── GetBaseReport.cpp
│   │   │   ├── GetBaseReport.h
│   │   │   ├── GetCompositeSchedule.cpp
│   │   │   ├── GetCompositeSchedule.h
│   │   │   ├── GetConfiguration.cpp
│   │   │   ├── GetConfiguration.h
│   │   │   ├── GetDiagnostics.cpp
│   │   │   ├── GetDiagnostics.h
│   │   │   ├── GetInstalledCertificateIds.cpp
│   │   │   ├── GetInstalledCertificateIds.h
│   │   │   ├── GetLocalListVersion.cpp
│   │   │   ├── GetLocalListVersion.h
│   │   │   ├── GetVariables.cpp
│   │   │   ├── GetVariables.h
│   │   │   ├── Heartbeat.cpp
│   │   │   ├── Heartbeat.h
│   │   │   ├── InstallCertificate.cpp
│   │   │   ├── InstallCertificate.h
│   │   │   ├── MeterValues.cpp
│   │   │   ├── MeterValues.h
│   │   │   ├── NotifyReport.cpp
│   │   │   ├── NotifyReport.h
│   │   │   ├── RemoteStartTransaction.cpp
│   │   │   ├── RemoteStartTransaction.h
│   │   │   ├── RemoteStopTransaction.cpp
│   │   │   ├── RemoteStopTransaction.h
│   │   │   ├── RequestStartTransaction.cpp
│   │   │   ├── RequestStartTransaction.h
│   │   │   ├── RequestStopTransaction.cpp
│   │   │   ├── RequestStopTransaction.h
│   │   │   ├── ReserveNow.cpp
│   │   │   ├── ReserveNow.h
│   │   │   ├── Reset.cpp
│   │   │   ├── Reset.h
│   │   │   ├── SecurityEventNotification.cpp
│   │   │   ├── SecurityEventNotification.h
│   │   │   ├── SendLocalList.cpp
│   │   │   ├── SendLocalList.h
│   │   │   ├── SetChargingProfile.cpp
│   │   │   ├── SetChargingProfile.h
│   │   │   ├── SetVariables.cpp
│   │   │   ├── SetVariables.h
│   │   │   ├── StartTransaction.cpp
│   │   │   ├── StartTransaction.h
│   │   │   ├── StatusNotification.cpp
│   │   │   ├── StatusNotification.h
│   │   │   ├── StopTransaction.cpp
│   │   │   ├── StopTransaction.h
│   │   │   ├── TransactionEvent.cpp
│   │   │   ├── TransactionEvent.h
│   │   │   ├── TriggerMessage.cpp
│   │   │   ├── TriggerMessage.h
│   │   │   ├── UnlockConnector.cpp
│   │   │   ├── UnlockConnector.h
│   │   │   ├── UpdateFirmware.cpp
│   │   │   └── UpdateFirmware.h
│   │   ├── Platform.cpp
│   │   ├── Platform.h
│   │   └── Version.h
│   ├── MicroOcpp.cpp
│   ├── MicroOcpp.h
│   ├── MicroOcpp_c.cpp
│   └── MicroOcpp_c.h
└── tests/
    ├── Api.cpp
    ├── Boot.cpp
    ├── Certificates.cpp
    ├── ChargePointError.cpp
    ├── ChargingSessions.cpp
    ├── Configuration.cpp
    ├── ConfigurationBehavior.cpp
    ├── FirmwareManagement.cpp
    ├── LocalAuthList.cpp
    ├── Metering.cpp
    ├── RemoteStartTransaction.cpp
    ├── Reservation.cpp
    ├── Reset.cpp
    ├── Security.cpp
    ├── SmartCharging.cpp
    ├── TransactionSafety.cpp
    ├── Transactions.cpp
    ├── Variables.cpp
    ├── benchmarks/
    │   ├── firmware_size/
    │   │   ├── main.cpp
    │   │   └── platformio.ini
    │   └── scripts/
    │       ├── eval_firmware_size.py
    │       └── measure_heap.py
    ├── catch2/
    │   ├── catch.hpp
    │   └── catchMain.cpp
    ├── helpers/
    │   ├── testHelper.cpp
    │   └── testHelper.h
    └── ocppEngineLifecycle.cpp

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/documentation.yml
================================================
# matth-x/MicroOcpp
# Copyright Matthias Akstaller 2019 - 2024
# MIT License

name: Documentation
on:
  push:
    branches:
      - main
  pull_request:

permissions:
  contents: write

jobs:
  build_simulator:
    name: Build Simulator
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - uses: actions/setup-python@v4
      with:
        python-version: 3.x
    - uses: actions/cache@v4
      with:
        key: ${{ github.ref }}
        path: .cache
    - name: Get build tools
      run: |
        sudo apt update
        sudo apt install cmake libssl-dev build-essential
    - name: Checkout Simulator
      uses: actions/checkout@v3
      with:
        repository: matth-x/MicroOcppSimulator
        path: MicroOcppSimulator
        ref: 2cb07cdbe53954a694a29336ab31eac2d2b48673
        submodules: 'recursive'
    - name: Clean MicroOcpp submodule
      run: |
        rm -rf MicroOcppSimulator/lib/MicroOcpp
    - name: Checkout MicroOcpp submodule
      uses: actions/checkout@v3
      with:
        path: MicroOcppSimulator/lib/MicroOcpp
    - name: Generate CMake files
      run: cmake -S ./MicroOcppSimulator -B ./MicroOcppSimulator/build -DCMAKE_CXX_FLAGS="-DMO_OVERRIDE_ALLOCATION=1 -DMO_ENABLE_HEAP_PROFILER=1"
    - name: Compile
      run: cmake --build ./MicroOcppSimulator/build -j 32 --target mo_simulator
    - name: Upload Simulator executable
      uses: actions/upload-artifact@v4
      with:
        name: Simulator executable
        path: |
          MicroOcppSimulator/build/mo_simulator
          MicroOcppSimulator/public/bundle.html.gz
        if-no-files-found: error
        retention-days: 1

  measure_heap:
    needs: build_simulator
    name: Heap measurements
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - uses: actions/setup-python@v4
      with:
        python-version: 3.x
    - name: Install Python dependencies
      run: pip install requests paramiko pandas
    - name: Get Simulator
      uses: actions/download-artifact@v4
      with:
        name: Simulator executable
        path: MicroOcppSimulator
    - name: Measure heap and create reports
      run: |
        mkdir -p docs/assets/tables
        python tests/benchmarks/scripts/measure_heap.py
      env:
        TEST_DRIVER_URL: ${{ secrets.TEST_DRIVER_URL }}
        TEST_DRIVER_CONFIG: ${{ secrets.TEST_DRIVER_CONFIG }}
        TEST_DRIVER_KEY: ${{ secrets.TEST_DRIVER_KEY }}
        MO_SIM_CONFIG: ${{ secrets.MO_SIM_CONFIG }}
        MO_SIM_OCPP_SERVER: ${{ secrets.MO_SIM_OCPP_SERVER }}
        MO_SIM_API_CERT: ${{ secrets.MO_SIM_API_CERT }}
        MO_SIM_API_KEY: ${{ secrets.MO_SIM_API_KEY }}
        MO_SIM_API_CONFIG: ${{ secrets.MO_SIM_API_CONFIG }}
        SSH_LOCAL_PRIV: ${{ secrets.SSH_LOCAL_PRIV }}
        SSH_HOST_PUB: ${{ secrets.SSH_HOST_PUB }}
    - name: Upload reports
      uses: actions/upload-artifact@v4
      with:
        name: Memory usage reports CSV
        path: docs/assets/tables
        if-no-files-found: error

  build_firmware_size:
    name: Build firmware
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Cache pip
      uses: actions/cache@v4
      with:
        path: ~/.cache/pip
        key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
        restore-keys: |
          ${{ runner.os }}-pip-
    - name: Cache PlatformIO
      uses: actions/cache@v4
      with:
        path: ~/.platformio
        key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
    - name: Set up Python
      uses: actions/setup-python@v4
    - name: Install PlatformIO
      run: |
        python -m pip install --upgrade pip
        pip install --upgrade platformio
    - name: Run PlatformIO
      run: pio ci --lib="." --build-dir="${{ github.workspace }}/../build" --keep-build-dir --project-conf="./tests/benchmarks/firmware_size/platformio.ini" ./tests/benchmarks/firmware_size/main.cpp
    - name: Move firmware files # change path to location without parent dir ('..') statement (to make upload-artifact happy)
      run: |
        mkdir firmware
        mv "${{ github.workspace }}/../build/.pio/build/v16/firmware.elf"  firmware/firmware_v16.elf
        mv "${{ github.workspace }}/../build/.pio/build/v201/firmware.elf" firmware/firmware_v201.elf
    - name: Upload firmware linker files
      uses: actions/upload-artifact@v4
      with:
        name: Firmware linker files
        path: firmware
        if-no-files-found: error
        retention-days: 1

  evaluate_firmware:
    needs: build_firmware_size
    name: Static firmware analysis
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - uses: actions/setup-python@v4
      with:
        python-version: 3.x
    - uses: actions/cache@v4
      with:
        key: ${{ github.ref }}
        path: .cache
    - name: Install Python dependencies
      run: pip install pandas 
    - name: Get build tools
      run: |
        sudo apt update
        sudo apt install build-essential cmake ninja-build
        sudo apt -y install gcc-9 g++-9
        g++ --version
    - name: Check out bloaty
      uses: actions/checkout@v3
      with:
        repository: google/bloaty
        ref: e1155149d54bb09b81e86f0e4e5cb7fbd2a318eb
        path: tools/bloaty
        submodules: recursive
    - name: Install bloaty
      run: |
        cmake -B tools/bloaty/build -G Ninja -S tools/bloaty
        cmake --build tools/bloaty/build -j 32
    - name: Get firmware linker files
      uses: actions/download-artifact@v4
      with:
        name: Firmware linker files
        path: firmware
    - name: Run bloaty
      run: |
        mkdir -p docs/assets/tables
        tools/bloaty/build/bloaty firmware/firmware_v16.elf  -d compileunits --csv -n 0 > docs/assets/tables/bloaty_v16.csv
        tools/bloaty/build/bloaty firmware/firmware_v201.elf -d compileunits --csv -n 0 > docs/assets/tables/bloaty_v201.csv
    - name: Evaluate and create reports
      run: python tests/benchmarks/scripts/eval_firmware_size.py
    - name: Upload reports
      uses: actions/upload-artifact@v4
      with:
        name: Firmware size reports CSV
        path: docs/assets/tables
        if-no-files-found: error

  deploy:
    needs: [evaluate_firmware, measure_heap]
    name: Deploy docs
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
    - uses: actions/checkout@v3
    - uses: actions/setup-python@v4
      with:
        python-version: 3.x
    - uses: actions/cache@v4
      with:
        key: ${{ github.ref }}
        path: .cache
    - name: Install Python dependencies
      run: pip install pandas mkdocs-material mkdocs-table-reader-plugin
    - name: Get firmware size reports
      uses: actions/download-artifact@v4
      with:
        name: Firmware size reports CSV
        path: docs/assets/tables
    - name: Get memory occupation reports
      uses: actions/download-artifact@v4
      with:
        name: Memory usage reports CSV
        path: docs/assets/tables
    - name: Run mkdocs
      run: mkdocs gh-deploy --force


================================================
FILE: .github/workflows/esp-idf.yml
================================================
# matth-x/MicroOcpp
# Copyright Matthias Akstaller 2019 - 2024
# MIT License

name: ESP-IDF CI

on:
  push:
    branches:
      - main

  pull_request:

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - name: Checkout ESP-IDF example folder structure
      uses: actions/checkout@v3
      with:
        sparse-checkout: examples/ESP-IDF
    - name: Clean sumodules folders template
      run: rm -r ./examples/ESP-IDF/components/*
    - name: Checkout main repo
      uses: actions/checkout@v3
      with:
        path: examples/ESP-IDF/components/MicroOcpp
    - name: Checkout Mongoose
      uses: actions/checkout@v3
      with:
        repository: cesanta/mongoose-esp-idf
        path: examples/ESP-IDF/components/mongoose
        submodules: 'recursive'
    - name: Checkout Mongoose WS adapter
      uses: actions/checkout@v3
      with:
        repository: matth-x/MicroOcppMongoose
        ref: v1.2.0
        path: examples/ESP-IDF/components/MicroOcppMongoose
    - name: Checkout ArduinoJson
      uses: actions/checkout@v3
      with:
        repository: bblanchon/ArduinoJson
        ref: 3e1be980d93e47b2a0073efeeb9a9396fd7a83be
        path: examples/ESP-IDF/components/ArduinoJson
    - name: esp-idf build
      uses: espressif/esp-idf-ci-action@v1
      with:
        esp_idf_version: v4.4
        target: esp32
        path: './examples/ESP-IDF'


================================================
FILE: .github/workflows/pio.yml
================================================
# matth-x/MicroOcpp
# Copyright Matthias Akstaller 2019 - 2024
# MIT License

name: PlatformIO CI

on:
  push:
    branches:
      - main

  pull_request:

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      matrix:
        example: [examples/ESP/main.cpp, examples/ESP-TLS/main.cpp]

    steps:
    - uses: actions/checkout@v4
    - name: Cache pip
      uses: actions/cache@v4
      with:
        path: ~/.cache/pip
        key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
        restore-keys: |
          ${{ runner.os }}-pip-
    - name: Cache PlatformIO
      uses: actions/cache@v4
      with:
        path: ~/.platformio
        key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
    - name: Set up Python
      uses: actions/setup-python@v4
    - name: Install PlatformIO
      run: |
        python -m pip install --upgrade pip
        pip install --upgrade platformio
    - name: Install library dependencies
      run: pio pkg install
    - name: Run PlatformIO
      run: pio ci --lib="." --project-conf=platformio.ini ${{ matrix.dashboard-extra }}
      env:
        PLATFORMIO_CI_SRC: ${{ matrix.example }}


================================================
FILE: .github/workflows/platformless.yml
================================================
# matth-x/MicroOcpp
# Copyright Matthias Akstaller 2019 - 2024
# MIT License

name: Default Compilation

on:
  push:
    branches:
      - main

  pull_request:

jobs:

  compile-platform:
    name: Compile (no linking)
    runs-on: ubuntu-latest
    steps:
    - name: Check out repository code
      uses: actions/checkout@v3
    - name: Get gcc compiler
      run: |
        sudo apt update
        sudo apt install build-essential
        sudo apt -y install gcc-9 g++-9
        g++ --version
        echo "g++ version must be 9.4.0"
    - name: Get ArduinoJson
      run: wget -Uri https://github.com/bblanchon/ArduinoJson/releases/download/v6.19.4/ArduinoJson-v6.19.4.h -O ./src/ArduinoJson.h
    - name: Compile
      run: g++ -c -std=c++11 -I ./src $(find ./src -type f -iregex ".*\.cpp") -DMO_PLATFORM=MO_PLATFORM_NONE -Wall -Wextra -Wno-unused-parameter -Wno-redundant-move -Werror


================================================
FILE: .github/workflows/tests.yml
================================================
# matth-x/MicroOcpp
# Copyright Matthias Akstaller 2019 - 2024
# MIT License

name: Unit tests

on:
  push:
    branches:
      - main

  pull_request:

jobs:

  compile-and-run:
    name: Automated Tests
    runs-on: ubuntu-latest
    steps:
    - name: Check out repository code
      uses: actions/checkout@v3
    - name: Check out MbedTLS
      uses: actions/checkout@v3
      with:
        repository: Mbed-TLS/mbedtls
        ref: v2.28.10
        path: lib/mbedtls
    - name: Get build tools
      run: |
        sudo apt update
        sudo apt install build-essential cmake lcov valgrind
        sudo apt -y install gcc-9 g++-9
        g++ --version
        echo "g++ version must be 9.4.0"
    - name: Get ArduinoJson
      run: wget -Uri https://github.com/bblanchon/ArduinoJson/releases/download/v6.21.3/ArduinoJson-v6.21.3.h -O ./src/ArduinoJson.h
    - name: Generate CMake build files
      run: cmake -S . -B ./build -DMO_BUILD_UNIT_MBEDTLS=True
    - name: Compile
      run: cmake --build ./build -j 32 --target mo_unit_tests
    - name: Configure FS
      run: mkdir mo_store
    - name: Run tests (valgrind)
      run: valgrind --error-exitcode=1 --leak-check=full ./build/mo_unit_tests --abort
    - name: Generate CMake build files (AddressSanitizer, UndefinedBehaviorSanitizer)
      run: |
        rm -r ./build
        cmake -S . -B ./build -DCMAKE_CXX_FLAGS="-fsanitize=address -fsanitize=undefined" -DCMAKE_EXE_LINKER_FLAGS="-fsanitize=address -fsanitize=undefined" -DMO_BUILD_UNIT_MBEDTLS=True
    - name: Compile (ASan, UBSan)
      run: cmake --build ./build -j 32 --target mo_unit_tests
    - name: Run tests (ASan, UBSan)
      run: ./build/mo_unit_tests --abort
    - name: Create coverage report
      run: |
        lcov --directory . --capture --output-file coverage.info --ignore-errors mismatch
        lcov --remove coverage.info '/usr/*' '*/tests/*' '*/ArduinoJson.h' --output-file coverage.info
        lcov --list coverage.info
    - name: Upload coverage reports to Codecov
      uses: codecov/codecov-action@v3
      env:
        CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}


================================================
FILE: .gitignore
================================================
.pio
.vscode
build
lib
mo_store
src/ArduinoJson*
src/main.cpp
tests/helpers/ArduinoJson*
coverage.info
docs/assets


================================================
FILE: CHANGELOG.md
================================================
# Changelog

## Unreleased

### Changed

- Change `MicroOcpp::TxNotification` into C-style enum, replace `OCPP_TxNotication` ([#386](https://github.com/matth-x/MicroOcpp/pull/386))
- Improved UUID generation ([#383](https://github.com/matth-x/MicroOcpp/pull/383))
- `beginTransaction()` returns bool for better v2.0.1 interop ([#386](https://github.com/matth-x/MicroOcpp/pull/386))
- Configurations C-API updates ([#400](https://github.com/matth-x/MicroOcpp/pull/400))
- Platform integrations C-API upates ([#400](https://github.com/matth-x/MicroOcpp/pull/400))

### Added

- `getTransactionV201()` exposes v201 Tx in API ([#386](https://github.com/matth-x/MicroOcpp/pull/386))
- v201 support in Transaction.h C-API ([#386](https://github.com/matth-x/MicroOcpp/pull/386))
- Write-only Configurations ([#400](https://github.com/matth-x/MicroOcpp/pull/400))

### Fixed

- Timing issues for OCTT test cases ([#383](https://github.com/matth-x/MicroOcpp/pull/383))
- Misleading Reset failure dbg msg ([#388](https://github.com/matth-x/MicroOcpp/pull/388))
- Reject negative ints in ChangeConfig ([#388](https://github.com/matth-x/MicroOcpp/pull/388))
- Revised SCons integration ([#400](https://github.com/matth-x/MicroOcpp/pull/400))

## [1.2.0] - 2024-11-03

### Changed

- Change `MicroOcpp::ChargePointStatus` into C-style enum ([#309](https://github.com/matth-x/MicroOcpp/pull/309))
- Connector lock disabled by default per `MO_ENABLE_CONNECTOR_LOCK` ([#312](https://github.com/matth-x/MicroOcpp/pull/312))
- Relaxed temporal order of non-tx-related operations ([#345](https://github.com/matth-x/MicroOcpp/pull/345))
- Use pseudo-GUIDs as messageId ([#345](https://github.com/matth-x/MicroOcpp/pull/345))
- ISO 8601 milliseconds omitted by default ([352](https://github.com/matth-x/MicroOcpp/pull/352))
- Rename `MO_NUM_EVSE` into `MO_NUM_EVSEID` (v2.0.1) ([#371](https://github.com/matth-x/MicroOcpp/pull/371))
- Change `MicroOcpp::ReadingContext` into C-style struct ([#371](https://github.com/matth-x/MicroOcpp/pull/371))
- Refactor RequestStartTransaction (v2.0.1) ([#371](https://github.com/matth-x/MicroOcpp/pull/371))

### Added

- Provide ChargePointStatus in API ([#309](https://github.com/matth-x/MicroOcpp/pull/309))
- Built-in OTA over FTP ([#313](https://github.com/matth-x/MicroOcpp/pull/313))
- Built-in Diagnostics over FTP ([#313](https://github.com/matth-x/MicroOcpp/pull/313))
- Error `severity` mechanism ([#331](https://github.com/matth-x/MicroOcpp/pull/331))
- Build flag `MO_REPORT_NOERROR` to report error recovery ([#331](https://github.com/matth-x/MicroOcpp/pull/331))
- Support for `parentIdTag` ([#344](https://github.com/matth-x/MicroOcpp/pull/344))
- Input validation for unsigned int Configs ([#344](https://github.com/matth-x/MicroOcpp/pull/344))
- Support for TransactionMessageAttempts/-RetryInterval ([#345](https://github.com/matth-x/MicroOcpp/pull/345), [#380](https://github.com/matth-x/MicroOcpp/pull/380))
- Heap profiler and custom allocator support ([#350](https://github.com/matth-x/MicroOcpp/pull/350))
- Migration of persistent storage ([#355](https://github.com/matth-x/MicroOcpp/pull/355))
- Benchmarks pipeline ([#369](https://github.com/matth-x/MicroOcpp/pull/369), [#376](https://github.com/matth-x/MicroOcpp/pull/376))
- MeterValues port for OCPP 2.0.1 ([#371](https://github.com/matth-x/MicroOcpp/pull/371))
- UnlockConnector port for OCPP 2.0.1 ([#371](https://github.com/matth-x/MicroOcpp/pull/371))
- More APIs ported to OCPP 2.0.1 ([#371](https://github.com/matth-x/MicroOcpp/pull/371))
- Support for AuthorizeRemoteTxRequests ([#373](https://github.com/matth-x/MicroOcpp/pull/373))
- Persistent Variable and Tx store for OCPP 2.0.1 ([#379](https://github.com/matth-x/MicroOcpp/pull/379))

### Removed

- ESP32 built-in HTTP OTA ([#313](https://github.com/matth-x/MicroOcpp/pull/313))
- Operation store (files op-*.jsn and opstore.jsn) ([#345](https://github.com/matth-x/MicroOcpp/pull/345))
- Explicit tracking of txNr (file txstore.jsn) ([#345](https://github.com/matth-x/MicroOcpp/pull/345))
- SimpleRequestFactory ([#351](https://github.com/matth-x/MicroOcpp/pull/351))

### Fixed

- Skip Unix files . and .. in ftw_root ([#313](https://github.com/matth-x/MicroOcpp/pull/313))
- Skip clock-aligned measurements when time not set
- Hold back error StatusNotifs when time not set ([#311](https://github.com/matth-x/MicroOcpp/issues/311))
- Don't send Available when tx occupies connector ([#315](https://github.com/matth-x/MicroOcpp/issues/315))
- Make ChargingScheduleAllowedChargingRateUnit read-only ([#328](https://github.com/matth-x/MicroOcpp/issues/328))
- ~Don't send StatusNotifs while offline ([#344](https://github.com/matth-x/MicroOcpp/pull/344))~ (see ([#371](https://github.com/matth-x/MicroOcpp/pull/371)))
- Don't change into Unavailable upon Reset ([#344](https://github.com/matth-x/MicroOcpp/pull/344))
- Reject DataTransfer by default ([#344](https://github.com/matth-x/MicroOcpp/pull/344))
- UnlockConnector NotSupported if connectorId invalid ([#344](https://github.com/matth-x/MicroOcpp/pull/344))
- Fix regression bug of [#345](https://github.com/matth-x/MicroOcpp/pull/345) ([#353](https://github.com/matth-x/MicroOcpp/pull/353), [#356](https://github.com/matth-x/MicroOcpp/pull/356))
- Correct MeterValue PreBoot timestamp ([#354](https://github.com/matth-x/MicroOcpp/pull/354))
- Send errorCode in triggered StatusNotif ([#359](https://github.com/matth-x/MicroOcpp/pull/359))
- Remove int to bool conversion in ChangeConfig ([#362](https://github.com/matth-x/MicroOcpp/pull/362))
- Multiple fixes of the OCPP 2.0.1 extension ([#371](https://github.com/matth-x/MicroOcpp/pull/371))

## [1.1.0] - 2024-05-21

### Changed

- Replace `PollResult<bool>` with enum `UnlockConnectorResult` ([#271](https://github.com/matth-x/MicroOcpp/pull/271))
- Rename master branch into main
- Tx logic directly checks if WebSocket is offline ([#282](https://github.com/matth-x/MicroOcpp/pull/282))
- `ocppPermitsCharge` ignores Faulted state ([#279](https://github.com/matth-x/MicroOcpp/pull/279))
- `setEnergyMeterInput` expects `int` input ([#301](https://github.com/matth-x/MicroOcpp/pull/301))

### Added

- File index ([#270](https://github.com/matth-x/MicroOcpp/pull/270))
- Config `Cst_TxStartOnPowerPathClosed` to put back TxStartPoint ([#271](https://github.com/matth-x/MicroOcpp/pull/271))
- Build flag `MO_ENABLE_RESERVATION=0` disables Reservation module ([#302](https://github.com/matth-x/MicroOcpp/pull/302))
- Build flag `MO_ENABLE_LOCAL_AUTH=0` disables LocalAuthList module ([#303](https://github.com/matth-x/MicroOcpp/pull/303))
- Function `bool isConnected()` in `Connection` interface ([#282](https://github.com/matth-x/MicroOcpp/pull/282))
- Build flags for customizing memory limits of SmartCharging ([#260](https://github.com/matth-x/MicroOcpp/pull/260))
- SConscript ([#287](https://github.com/matth-x/MicroOcpp/pull/287))
- C-API for custom Configs store ([297](https://github.com/matth-x/MicroOcpp/pull/297))
- Certificate Management, UCs M03 - M05 ([#262](https://github.com/matth-x/MicroOcpp/pull/262), [#274](https://github.com/matth-x/MicroOcpp/pull/274), [#292](https://github.com/matth-x/MicroOcpp/pull/292))
- FTP Client ([#291](https://github.com/matth-x/MicroOcpp/pull/291))
- `ProtocolVersion` selects v1.6 or v2.0.1 ([#247](https://github.com/matth-x/MicroOcpp/pull/247))
- Build flag `MO_ENABLE_V201=1` enables OCPP 2.0.1 features ([#247](https://github.com/matth-x/MicroOcpp/pull/247))
    - Variables (non-persistent), UCs B05 - B07 ([#247](https://github.com/matth-x/MicroOcpp/pull/247), [#284](https://github.com/matth-x/MicroOcpp/pull/284))
    - Transactions (preview only), UCs E01 - E12 ([#247](https://github.com/matth-x/MicroOcpp/pull/247))
    - StatusNotification compatibility ([#247](https://github.com/matth-x/MicroOcpp/pull/247))
    - ChangeAvailability compatibility ([#285](https://github.com/matth-x/MicroOcpp/pull/285))
    - Reset compatibility, UCs B11 - B12 ([#286](https://github.com/matth-x/MicroOcpp/pull/286))
    - RequestStart-/StopTransaction, UCs F01 - F02 ([#289](https://github.com/matth-x/MicroOcpp/pull/289))

### Fixed

- Fix defect idTag check in `endTransaction` ([#275](https://github.com/matth-x/MicroOcpp/pull/275))
- Make field localAuthorizationList in SendLocalList optional
- Update charging profiles when flash disabled (relates to [#260](https://github.com/matth-x/MicroOcpp/pull/260))
- Ignore UnlockConnector when handler not set ([#271](https://github.com/matth-x/MicroOcpp/pull/271))
- Reject ChargingProfile if unit not supported ([#271](https://github.com/matth-x/MicroOcpp/pull/271))
- Fix building with debug level warn and error
- Reduce debug output FW size overhead ([#304](https://github.com/matth-x/MicroOcpp/pull/304))
- Fix transaction freeze in offline mode ([#279](https://github.com/matth-x/MicroOcpp/pull/279), [#287](https://github.com/matth-x/MicroOcpp/pull/287))
- Fix compilation error caused by `PRId32` ([#279](https://github.com/matth-x/MicroOcpp/pull/279))
- Don't load FW-mngt. module when no handlers set ([#271](https://github.com/matth-x/MicroOcpp/pull/271))
- Change arduinoWebSockets URL param to path ([#278](https://github.com/matth-x/MicroOcpp/issues/278))
- Avoid creating conf when operation fails ([#290](https://github.com/matth-x/MicroOcpp/pull/290))
- Fix whitespaces in MeterValues ([#301](https://github.com/matth-x/MicroOcpp/pull/301))
- Make SmartChargingProfile txId field optional ([#348](https://github.com/matth-x/MicroOcpp/pull/348))

## [1.0.3] - 2024-04-06

### Fixed

- Fix nullptr access in endTransaction ([#275](https://github.com/matth-x/MicroOcpp/pull/275))
- Backport: Fix building with debug level warn and error

## [1.0.2] - 2024-03-24

### Fixed

- Correct MO version numbers in code (they were still `1.0.0`)

## [1.0.1] - 2024-02-27

### Fixed

- Allow `nullptr` as parameter for `mocpp_set_console_out` ([#224](https://github.com/matth-x/MicroOcpp/issues/224))
- Fix `mocpp_tick_ms()` on esp-idf roll-over after 12 hours
- Pin ArduinoJson to v6.21 ([#245](https://github.com/matth-x/MicroOcpp/issues/245))
- Fix bounds checking in SmartCharging module ([#260](https://github.com/matth-x/MicroOcpp/pull/260))

## [1.0.0] - 2023-10-22

_First release_

### Changed

- `mocpp_initialize` takes OCPP URL without explicit host, port ([#220](https://github.com/matth-x/MicroOcpp/pull/220))
- `endTransaction` checks authorization of `idTag`
- Update configurations API ([#195](https://github.com/matth-x/MicroOcpp/pull/195))
- Update Firmware- and DiagnosticsService API ([#207](https://github.com/matth-x/MicroOcpp/pull/207))
- Update Connection interface
- Update Authorization module functions ([#213](https://github.com/matth-x/MicroOcpp/pull/213))
- Reflect changes in C-API
- Change build flag prefix from `MOCPP_` to `MO_`
- Change `mo_set_console_out` to `mocpp_set_console_out`
- Revise README.md
- Revise misleading debug messages
- Update Arduino IDE manifest ([#206](https://github.com/matth-x/MicroOcpp/issues/206))

### Added

- Auto-recovery switch in `mocpp_initialize` params
- WebAssembly port
- Configurable `MO_PARTITION_LABEL` for the esp-idf SPIFFS integration ([#218](https://github.com/matth-x/MicroOcpp/pull/218))
- `MO_TX_CLEAN_ABORTED=0` keeps aborted txs in journal
- `MO_VERSION` specifier
- `MO_PLATFORM_NONE` for compilation on custom platforms
- `endTransaction_authorized` enforces the tx end
- Add valgrind, ASan, UBSan CI/CD steps ([#189](https://github.com/matth-x/MicroOcpp/pull/189))

### Fixed

- Reservation ([#196](https://github.com/matth-x/MicroOcpp/pull/196))
- Fix immediate FW-update Download phase abort ([#216](https://github.com/matth-x/MicroOcpp/pull/216))
- `stat` usage on arduino-esp32 LittleFS
- SetChargingProfile JSON capacity calculation
- Set correct idTag when Reset triggers StopTx
- Execute operations only once despite multiple .conf send attempts ([#207](https://github.com/matth-x/MicroOcpp/pull/207))
- ConnectionTimeOut only applies when connector is still unplugged
- Fix valgrind warnings

## [1eff6e5] - 23-08-23

_Previous point with breaking changes on master_

Renaming to MicroOcpp is completed since this commit. See the [migration guide](https://matth-x.github.io/MicroOcpp/migration/) for more details on what's changed. Changelogs and semantic versioning are adopted starting with v1.0.0

## [0.3.0] - 23-08-19

_Last version under the project name ArduinoOcpp_


================================================
FILE: CMakeLists.txt
================================================
# matth-x/MicroOcpp
# Copyright Matthias Akstaller 2019 - 2024
# MIT License

cmake_minimum_required(VERSION 3.15)

set(CMAKE_CXX_STANDARD 11)

set(MO_SRC
    src/MicroOcpp/Core/Configuration_c.cpp
    src/MicroOcpp/Core/Configuration.cpp
    src/MicroOcpp/Core/ConfigurationContainer.cpp
    src/MicroOcpp/Core/ConfigurationContainerFlash.cpp
    src/MicroOcpp/Core/ConfigurationKeyValue.cpp
    src/MicroOcpp/Core/FilesystemAdapter.cpp
    src/MicroOcpp/Core/FilesystemUtils.cpp
    src/MicroOcpp/Core/FtpMbedTLS.cpp
    src/MicroOcpp/Core/Memory.cpp
    src/MicroOcpp/Core/RequestQueue.cpp
    src/MicroOcpp/Core/Context.cpp
    src/MicroOcpp/Core/Operation.cpp
    src/MicroOcpp/Model/Model.cpp
    src/MicroOcpp/Core/Request.cpp
    src/MicroOcpp/Core/Connection.cpp
    src/MicroOcpp/Core/Time.cpp
    src/MicroOcpp/Core/UuidUtils.cpp
    src/MicroOcpp/Operations/Authorize.cpp
    src/MicroOcpp/Operations/BootNotification.cpp
    src/MicroOcpp/Operations/CancelReservation.cpp
    src/MicroOcpp/Operations/ChangeAvailability.cpp
    src/MicroOcpp/Operations/ChangeConfiguration.cpp
    src/MicroOcpp/Operations/ClearCache.cpp
    src/MicroOcpp/Operations/ClearChargingProfile.cpp
    src/MicroOcpp/Operations/CustomOperation.cpp
    src/MicroOcpp/Operations/DataTransfer.cpp
    src/MicroOcpp/Operations/DeleteCertificate.cpp
    src/MicroOcpp/Operations/DiagnosticsStatusNotification.cpp
    src/MicroOcpp/Operations/FirmwareStatusNotification.cpp
    src/MicroOcpp/Operations/GetBaseReport.cpp
    src/MicroOcpp/Operations/GetCompositeSchedule.cpp
    src/MicroOcpp/Operations/GetConfiguration.cpp
    src/MicroOcpp/Operations/GetDiagnostics.cpp
    src/MicroOcpp/Operations/GetInstalledCertificateIds.cpp
    src/MicroOcpp/Operations/GetLocalListVersion.cpp
    src/MicroOcpp/Operations/GetVariables.cpp
    src/MicroOcpp/Operations/Heartbeat.cpp
    src/MicroOcpp/Operations/MeterValues.cpp
    src/MicroOcpp/Operations/NotifyReport.cpp
    src/MicroOcpp/Operations/RemoteStartTransaction.cpp
    src/MicroOcpp/Operations/RemoteStopTransaction.cpp
    src/MicroOcpp/Operations/RequestStartTransaction.cpp
    src/MicroOcpp/Operations/RequestStopTransaction.cpp
    src/MicroOcpp/Operations/ReserveNow.cpp
    src/MicroOcpp/Operations/Reset.cpp
    src/MicroOcpp/Operations/SecurityEventNotification.cpp
    src/MicroOcpp/Operations/SendLocalList.cpp
    src/MicroOcpp/Operations/SetChargingProfile.cpp
    src/MicroOcpp/Operations/SetVariables.cpp
    src/MicroOcpp/Operations/StartTransaction.cpp
    src/MicroOcpp/Operations/StatusNotification.cpp
    src/MicroOcpp/Operations/StopTransaction.cpp
    src/MicroOcpp/Operations/TransactionEvent.cpp
    src/MicroOcpp/Operations/TriggerMessage.cpp
    src/MicroOcpp/Operations/InstallCertificate.cpp
    src/MicroOcpp/Operations/UnlockConnector.cpp
    src/MicroOcpp/Operations/UpdateFirmware.cpp
    src/MicroOcpp/Debug.cpp
    src/MicroOcpp/Platform.cpp
    src/MicroOcpp/Core/OperationRegistry.cpp
    src/MicroOcpp/Model/Availability/AvailabilityService.cpp
    src/MicroOcpp/Model/Authorization/AuthorizationData.cpp
    src/MicroOcpp/Model/Authorization/AuthorizationList.cpp
    src/MicroOcpp/Model/Authorization/AuthorizationService.cpp
    src/MicroOcpp/Model/Authorization/IdToken.cpp
    src/MicroOcpp/Model/Boot/BootService.cpp
    src/MicroOcpp/Model/Certificates/Certificate.cpp
    src/MicroOcpp/Model/Certificates/Certificate_c.cpp
    src/MicroOcpp/Model/Certificates/CertificateMbedTLS.cpp
    src/MicroOcpp/Model/Certificates/CertificateService.cpp
    src/MicroOcpp/Model/ConnectorBase/ConnectorsCommon.cpp
    src/MicroOcpp/Model/ConnectorBase/Connector.cpp
    src/MicroOcpp/Model/Diagnostics/DiagnosticsService.cpp
    src/MicroOcpp/Model/FirmwareManagement/FirmwareService.cpp
    src/MicroOcpp/Model/Heartbeat/HeartbeatService.cpp
    src/MicroOcpp/Model/Metering/MeteringConnector.cpp
    src/MicroOcpp/Model/Metering/MeteringService.cpp
    src/MicroOcpp/Model/Metering/MeterStore.cpp
    src/MicroOcpp/Model/Metering/MeterValue.cpp
    src/MicroOcpp/Model/Metering/MeterValuesV201.cpp
    src/MicroOcpp/Model/Metering/ReadingContext.cpp
    src/MicroOcpp/Model/Metering/SampledValue.cpp
    src/MicroOcpp/Model/RemoteControl/RemoteControlService.cpp
    src/MicroOcpp/Model/Reservation/Reservation.cpp
    src/MicroOcpp/Model/Reservation/ReservationService.cpp
    src/MicroOcpp/Model/Reset/ResetService.cpp
    src/MicroOcpp/Model/SmartCharging/SmartChargingModel.cpp
    src/MicroOcpp/Model/SmartCharging/SmartChargingService.cpp
    src/MicroOcpp/Model/Transactions/Transaction.cpp
    src/MicroOcpp/Model/Transactions/TransactionDeserialize.cpp
    src/MicroOcpp/Model/Transactions/TransactionService.cpp
    src/MicroOcpp/Model/Transactions/TransactionStore.cpp
    src/MicroOcpp/Model/Variables/Variable.cpp
    src/MicroOcpp/Model/Variables/VariableContainer.cpp
    src/MicroOcpp/Model/Variables/VariableService.cpp
    src/MicroOcpp.cpp
    src/MicroOcpp_c.cpp
)

if(ESP_PLATFORM)

    idf_component_register(SRCS ${MO_SRC}
        INCLUDE_DIRS "./src" "../ArduinoJson/src"
        PRIV_REQUIRES spiffs
    )

    target_compile_options(${COMPONENT_TARGET} PUBLIC
        -DMO_PLATFORM=MO_PLATFORM_ESPIDF
    )

    return()
endif()

project(MicroOcpp VERSION 1.2.0)

add_library(MicroOcpp ${MO_SRC})

target_include_directories(MicroOcpp PUBLIC
    "./src"
    "../ArduinoJson/src"
)

target_compile_definitions(MicroOcpp PUBLIC
    MO_PLATFORM=MO_PLATFORM_UNIX
)

# Unit tests

set(MO_SRC_UNIT
    tests/helpers/testHelper.cpp
    tests/ocppEngineLifecycle.cpp
    tests/TransactionSafety.cpp
    tests/ChargingSessions.cpp
    tests/ConfigurationBehavior.cpp
    tests/SmartCharging.cpp
    tests/Api.cpp
    tests/Metering.cpp
    tests/Configuration.cpp
    tests/Reservation.cpp
    tests/Reset.cpp
    tests/LocalAuthList.cpp
    tests/Variables.cpp
    tests/Transactions.cpp
    tests/RemoteStartTransaction.cpp
    tests/Certificates.cpp
    tests/FirmwareManagement.cpp
    tests/ChargePointError.cpp
    tests/Boot.cpp
    tests/Security.cpp
)

add_executable(mo_unit_tests
    ${MO_SRC}
    ${MO_SRC_UNIT}
    ./tests/catch2/catchMain.cpp
)

if (MO_BUILD_UNIT_MBEDTLS)
    add_subdirectory(lib/mbedtls)
    target_link_libraries(mo_unit_tests PUBLIC 
        mbedtls
        mbedcrypto
        mbedx509
    )

    target_compile_definitions(mo_unit_tests PUBLIC
        MO_ENABLE_MBEDTLS=1
    )
endif()

target_include_directories(mo_unit_tests PUBLIC
    "./tests"
    "./tests/helpers"
    "./src"
)

target_compile_definitions(mo_unit_tests PUBLIC
    MO_PLATFORM=MO_PLATFORM_UNIX
    MO_NUMCONNECTORS=3
    MO_CUSTOM_TIMER
    MO_DBG_LEVEL=MO_DL_INFO
    MO_TRAFFIC_OUT
    MO_FILENAME_PREFIX="./mo_store/"
    MO_LocalAuthListMaxLength=8
    MO_SendLocalListMaxLength=4
    MO_ENABLE_FILE_INDEX=1
    MO_ChargeProfileMaxStackLevel=2
    MO_ChargingScheduleMaxPeriods=4
    MO_MaxChargingProfilesInstalled=3
    MO_ENABLE_CERT_MGMT=1
    MO_ENABLE_CONNECTOR_LOCK=1
    MO_REPORT_NOERROR=1
    MO_ENABLE_V201=1
    MO_OVERRIDE_ALLOCATION=1
    MO_ENABLE_HEAP_PROFILER=1
    MO_HEAP_PROFILER_EXTERNAL_CONTROL=1
    CATCH_CONFIG_EXTERNAL_INTERFACES
)

target_compile_options(mo_unit_tests PUBLIC
    -Wall
    -O0
    -g
    --coverage
)

target_link_options(mo_unit_tests PUBLIC
    --coverage
)


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2019 - 2024 Matthias Akstaller

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# <img src="https://github.com/matth-x/MicroOcpp/assets/63792403/1c49d1ad-7afc-48d3-a54e-9aef2d4886db" alt="Icon" height="24"> &nbsp; MicroOCPP

[![Build Status]( https://github.com/matth-x/MicroOcpp/workflows/PlatformIO%20CI/badge.svg)](https://github.com/matth-x/MicroOcpp/actions)
[![Unit tests]( https://github.com/matth-x/MicroOcpp/workflows/Unit%20tests/badge.svg)](https://github.com/matth-x/MicroOcpp/actions)
[![codecov](https://codecov.io/github/matth-x/ArduinoOcpp/branch/develop/graph/badge.svg?token=UN6LO96HM7)](https://codecov.io/github/matth-x/ArduinoOcpp)

OCPP 1.6 / 2.0.1 client for microcontrollers. Portable C/C++. Compatible with Espressif, Arduino, NXP, STM, Linux and more.

:heavy_check_mark: Works with [15+ commercial Central Systems](https://www.micro-ocpp.com/#h.314525e8447cc93c_81)

:heavy_check_mark: Eligible for public chargers (Eichrecht-compliant)

:heavy_check_mark: Supports all OCPP 1.6 feature profiles and the [basic OCPP 2.0.1 UCs](https://github.com/matth-x/MicroOcpp/tree/feature/prepare-release?tab=readme-ov-file#ocpp-201-and-iso-15118)

Reference usage: [OpenEVSE](https://github.com/OpenEVSE/ESP32_WiFi_V4.x/blob/master/src/ocpp.cpp) | Technical introduction: [Docs](https://matth-x.github.io/MicroOcpp/intro-tech) | Website: [www.micro-ocpp.com](https://www.micro-ocpp.com)

## AI-friendly code

AI models perform extremely well with the MicroOCPP codebase. The upcoming new release of MO (v2.0) will further optimize the code for more reliable results with AI models (preview to be found in the `develop/remodel-api` branch). The hope is to allow integrating MO into an existing EV charger project with only a few queries.

Currently, the `develop/remodel-api` branch is not stable yet, but recommended for new developments. To get started, load `MicroOcpp.h` (now unified for C and C++) into the context window and ask what the AI model needs to know to integrate it into your codebase.

If your tools have issues with something in MicroOCPP, please open an issue on GitHub. Any feedback on how to further optimize the codebase is also highly appreciated.

## Tester / Demo App

*Main repository: [MicroOcppSimulator](https://github.com/matth-x/MicroOcppSimulator)*

The Simulator is a demo & development tool for MicroOCPP which allows to quickly assess the compatibility with different OCPP backends. It simulates a full charging station, adds a GUI and a mocked hardware binding to MicroOCPP and runs in the browser (using WebAssembly): [Try it](https://demo.micro-ocpp.com/)

<div align="center"><img src="https://github.com/matth-x/MicroOcpp/assets/63792403/27f2819b-41fd-41a7-88a8-9e673b8a88b8" alt="Screenshot" width="800em" href="https://demo.micro-ocpp.com/"></div>

#### Usage

**OCPP server setup**: Navigate to "Control Center". In the WebSocket options, add the OCPP backend URL, charge box ID and authorization key if existent. Press "Update WebSocket" to save. The Simulator should connect to the OCPP server. To check the connection status, it could be helpful to open the developer tools of the browser.

If you don't have an OCPP server at hand, leave the charge box ID blank and enter the following backend address: `wss://echo.websocket.events/` (this server is sponsored by Lob.com)

**RFID authentication**: Go to "Control Center" > "Connectors" > "Transaction" and update the idTag with the desired value.

## Benchmarks

*Full report: [MicroOCPP benchmarks](https://matth-x.github.io/MicroOcpp/benchmarks/)*

The following measurements were taken on the ESP32 @ 160MHz and represent the optimistic best case scenario for a charger with two physical connectors (i.e. compiled with `-Os`, disabled debug output and logs).

| Description | Value |
| :--- | ---: |
| Flash size (minimal) | 121,170 B |
| Heap occupation (idle) | 12,308 B |
| Heap occupation (peak) | 21,916 B |
| Initailization | 21 ms |
| `loop()` call (idle) | 0.05 ms |
| Large message sent | 5 ms |

In practical setups, the execution time is largely determined by IO delays and the heap occupation is significantly influenced by the configuration with reservation, local authorization and charging profile lists.

## Developers guide

PlatformIO package: [MicroOcpp](https://registry.platformio.org/libraries/matth-x/MicroOcpp)

MicroOCPP is an implementation of the OCPP communication behavior. It automatically initiates the corresponding OCPP operations once the hardware status changes or the RFID input is updated with a new value. Conversely it processes new data from the server, stores it locally and updates the hardware controls when applicable.

Please take `examples/ESP/main.cpp` as the starting point for the first project. It is a minimal example which shows how to establish an OCPP connection and how to start and stop charging sessions. The API documentation can be found in [`MicroOcpp.h`](https://github.com/matth-x/MicroOcpp/blob/main/src/MicroOcpp.h). Also check out the [Docs](https://matth-x.github.io/MicroOcpp).

### Dependencies

Mandatory:

- [bblanchon/ArduinoJSON](https://github.com/bblanchon/ArduinoJson) (version `6.21`)

If compiled with the Arduino integration:

- [Links2004/arduinoWebSockets](https://github.com/Links2004/arduinoWebSockets) (version `2.4.1`)

If using the built-in certificate store (to enable, set build flag `MO_ENABLE_MBEDTLS=1`):

- [Mbed-TLS/mbedtls](https://github.com/Mbed-TLS/mbedtls) (version `2.28.1`)

In case you use PlatformIO, you can copy all dependencies from `platformio.ini` into your own configuration file. Alternatively, you can install the full library with dependencies by adding `matth-x/MicroOcpp@1.2.0` in the PIO library manager.

## OCPP 2.0.1 and ISO 15118

The following OCPP 2.0.1 use cases are implemented:

| UC | Description | Note |
| :--- | :--- | :--- |
| B01 - B04<br>B11 - B12 | Provisioning | Ported from OCPP 1.6 |
| B05 - B07 | Variables | |
| C01 - C06 | Authorization options | |
| C15 | Offline Authorization | |
| E01 - E12 | Transactions | |
| F01 - F03<br>F05 - F06 | RemoteControl | |
| G01 - G04 | Availability | |
| J02 | Tx-related MeterValues | persistency not supported yet |
| M03 - M05 | Certificate management | Enable Mbed-TLS to use the built-in certificate store |
| P01 - P02 | Data transfer | |
| - | Protocol negotiation | The charger can select the OCPP version at runtime |

The OCPP 2.0.1 features are in an alpha development stage. By default, they are disabled and excluded from the build, so they have no impact on the firmware size. To enable, set the build flag `MO_ENABLE_V201=1` and initialize the library with the ProtocolVersion parameter `2.0.1`  (see [this example](https://github.com/matth-x/MicroOcppSimulator/blob/657e606c3b178d3add242935d413c72624130ff3/src/main.cpp#L43-L47) in the Simulator).

An integration of the library for OCPP 1.6 will also be functional with the 2.0.1 upgrade. It works with the same API in MicroOcpp.h.

ISO 15118 defines some use cases which include a message exchange between the charger and server. This library facilitates the integration of ISO 15118 by handling its OCPP-side communication.

## Contact

If you have any questions, or found a potential bug, feel free to open an issue. This type of interaction is highly appreciated, because it shows problems in the codebase and helps improve the project for clarity. For further questions which shouldn't stand in public, you can reach me via LinkedIn or the following email address:

:envelope: : matthias [A⊤] micro-ocpp [DО⊤] com


================================================
FILE: SConscript.py
================================================
# matth-x/MicroOcpp
# Copyright Matthias Akstaller 2019 - 2024
# MIT License

# NOTE: This SConscript is still WIP. It has thankfully been contributed from a project using SCons,
#       not necessarily considering full reusability in other projects though.
#       Use this file as a starting point for writing your own SCons integration. And as always, any
#       contributions are highly welcome!

Import("env")

import os, pathlib

def getAllDirs(root_dir):
    dir_list = []
    for root, subfolders, files in os.walk(root_dir.abspath):
        dir_list.append(Dir(root))
    return dir_list

SOURCE_DIR = Dir(".").srcnode().Dir("src")

source_dirs = getAllDirs(SOURCE_DIR)

source_files = []

for folder in source_dirs:
    source_files += folder.glob("*.c")
    source_files += folder.glob("*.cpp")

compiled_objects = []
for source_file in source_files:
    obj = env.Object(
        target = pathlib.Path(source_file.path).stem
        + ".o",
        source=source_file,
    )
    compiled_objects.append(obj)

libmicroocpp = env.StaticLibrary(
    target='libmicroocpp',
    source=sorted(compiled_objects)
)

exports = {
    'library': libmicroocpp,
    'CPPPATH': SOURCE_DIR
}

Return("exports")


================================================
FILE: docs/benchmarks.md
================================================
# Benchmarks

Microcontrollers have tight hardware constraints which affect how much resources the firmware can demand. It is important to make sure that the available resources are not depleted to allow for robust operation and that there is sufficient flash head room to allow for future software upgrades.

In general, microcontrollers have three relevant hardware constraints:

- Limited processing speed
- Limited memory size
- Limited flash size

For OCPP, the relevant bottlenecks are especially the memory and flash size. The processing speed is no concern, since OCPP is not computationally complex and does not include any extensive planning algorithms on the charger size. A previous [benchmark on the ESP-IDF](https://github.com/matth-x/MicroOcpp-benchmark) showed that the processing times are in the lower milliseconds range and are probably outweighed by IO times and network round trip times.

However, the memory and flash requirements are important figures, because the device model of OCPP has a significant size. The microcontroller needs to keep the model data in the heap memory for the largest part and the firmware which covers the corresponding processing routines needs to have sufficient space on flash.

This chapter presents benchmarks of the memory and flash requirements. They should help to determine the required microcontroller capabilities, or to give general insights for taking further action on optimizing the firmware.

## Firmware size

When compiling a firmware with MicroOCPP, the resulting binary will contain functionality which is not related to OCPP, like hardware drivers, modules which are shared, like MbedTLS and the actual MicroOCPP object files. The size of the latter is the final flash requirement of MicroOCPP.

For the flash benchmark, the profiler compiles a [dummy OCPP firmware](https://github.com/matth-x/MicroOcpp/tree/main/tests/benchmarks/firmware_size/main.cpp), analyzes the size of the compilation units using [bloaty](https://github.com/google/bloaty) and evaluates the bloaty report using a [Python script](https://github.com/matth-x/MicroOcpp/tree/main/tests/benchmarks/scripts/eval_firmware_size.py). To give realistic results, the firwmare is compiled with `-Os`, no RTTI or exceptions and newlib as the standard C library. The following tables show the results.

### OCPP 1.6

The following table shows the cumulated size of the objects files per module. The Module category consists of the OCPP 2.0.1 functional blocks, OCPP 1.6 feature profiles and general functionality which is shared accross the library. If a feature of the implementation falls under both an OCPP 2.0.1 functional block and OCPP 1.6 feature profile definition, it is preferrably assigned to the OCPP 2.0.1 category. This allows for better comparability between both OCPP versions.

**Table 1: Firmware size per Module**

{{ read_csv('modules_v16.csv') }}

### OCPP 2.0.1

**Table 2: Firmware size per Module**

{{ read_csv('modules_v201.csv') }}

## Memory usage

MicroOCPP uses the heap memory to process incoming messages, maintain the device model and create outgoing OCPP messages. The total heap usage should remain low enough to not risk a heap depletion which would not only affect the OCPP module, but the whole controller, because heap memory is typically shared on microcontrollers. To assess the heap usage of MicroOCPP, a test suite runs a variety of simulated charger use cases and measures the maximum occupied memory. Then, the maximum observed value is considered as the memory requirement of MicroOCPP.

Another important figure is the base level which is much closer to the average heap usage. The total heap usage consists of a base level and a dynamic part. Some memory objects are only initialized once during startup or as the device model is populated (e.g. Charging Schedules) and therefore belong to the base which changes only slowly over time. In contrast, objects for the JSON parsing and serialization and the internal execution of the operations are highly dynamic as they are instantiated for one operation and freed again after completion of the action. If the firmware contains multiple components besides MicroOCPP with this usage pattern, then the average total memory occupation of the device RAM is even closer to the base levels of the individual components.

The following table shows the dynamic heap usage for a variety of test cases, followed by the base level and resulting maximum memory occupation of MicroOCPP. At the time being, the measurements are limited to only OCPP 2.0.1 and a narrow set of test cases. They will be gradually extended over time.

**Table 3: Memory usage per use case and total**

{{ read_csv('heap_v201.csv') }}

## Full data sets

This section contains the raw data which is the basis for the evaluations above.

**Table 4: All compilation units for OCPP 1.6 firmware**

{{ read_csv('compile_units_v16.csv') }}

**Table 5: All compilation units for OCPP 2.0.1 firmware**

{{ read_csv('compile_units_v201.csv') }}


================================================
FILE: docs/index.md
================================================
MicroOCPP is an OCPP client which runs on microcontrollers and enables EVSEs to participate in OCPP charging networks. As a software library, it can be added to the firmware of the EVSE and will become a new part of it. If the EVSE has already an internet controller, then most likely, no extra hardware is required.

[Technical introduction](intro-tech)

[Migrating to v1.0](migration)

[Modules](modules)

[Development tools and basic prerequisites](prerequisites)

[Security whitepaper](security)

<!-- This chapter shows how to kick-start your OCPP project. -->

*Documentation WIP. See the [GitHub Readme](https://github.com/matth-x/MicroOcpp) or the [API description](https://github.com/matth-x/MicroOcpp/blob/main/src/MicroOcpp.h) as reference.*


================================================
FILE: docs/intro-tech.md
================================================
# Technical introduction

This chapter covers the technical concepts of MicroOCPP.

## Scope of MicroOCPP

The OCPP specification defines a charger data model, operations on the data model and the resulting physical behavior on the charger side. MicroOCPP implements the full scope of OCPP, i.e. a minimalistic data store for the data model, the OCPP operations and an interface to the surrounding firmware.

Another part of OCPP is its messaging mechanism, the so-called Remote Procedure Calls (RPC) framework. MicroOCPP also implements the specified RPC framework with the required guarantees of message delivery or the corresponding error handling.

At the lowest layer, OCPP relies on standard WebSockets. MicroOCPP works with any WebSocket library and has a lean interface to integrate them.

The high-level API in `MicroOcpp.h` bundles all touch points of the EVSE firmware with the OCPP library.

<p style="text-align:center">
    <img src="../img/components_overview.svg">
    <br />
    <em>Overview of the architecture</em>
</p>

## High-level OCPP support

Being a full implementation of OCPP, MicroOCPP handles the OCPP communication, i.e. it sends OCPP requests and processes incoming OCPP requests autonomously. The messages are triggered by the internal data model and by input from the high-level API. Incoming OCPP requests are used to update the internal data model and if an action on the charger is required, the library signals that to the main firmware through the high-level API.

In consequence, the high-level API decouples the main firmware from the OCPP communication and hides the operations. This has the following good reasons:

- The high-level API guarantees correctnes of the OCPP integration. As soon as the charger adopts it properly, it is fully OCPP-compliant
- The hardware-near design decreases the integration effort into the firmware hugely
- The API won't change substantially for the OCPP 2.0.1 upgrade. The EVSE will get OCPP 2.0.1 support on the fly by a later firmware update

## Customizability

One core principle of the architecture of MicroOCPP is the customizability and the selective usage of its components.

Selective usage of components means that the EVSE firmware can use parts of MicroOCPP and work with its own implementation for the rest. In that case only the selected parts of MicroOCPP will be compiled into the firmware. For example, the main firmware can use the RPC framework and build a custom implementation of the OCPP logic on top of it. This could be necessary if the OCPP behavior should be tightly coupled to other modules of the firmware. In a different scenario, the EVSE firmware could already contain an extensive RPC framework and the OCPP client should reuse it. Then, only the business logic and high-level API are of interest.

<p style="text-align:center">
    <img src="../img/components_selective.svg">
    <br />
    <em>Selective usage of MicroOCPP</em>
</p>

Customizations of the library allow to integrate use cases for which the high-level API is too restrictive. The high-level API is designed to provide a facade for the expected usage of the library, but since the charging sector is driven by innovation, new use cases for OCPP emerge every day. If a custom use case cannot be integrated on the API level, the main firmware can access the internal data structures of MicroOCPP and complement the required functionality or replace parts of the internal behavior with custom implementations which fits the concrete scenarios better.

## Main-loop paradigm

MicroOCPP works with the common main-loop execution model of microcontrollers. After initialization, the EVSE firmware most likely enters a main-loop and repeats it infinitely. To run MicroOCPP, a call to its loop function must be placed into the main loop of the firmware. Then at each main-loop iteration, MicroOCPP executes its internal routines, i.e. it processes input data, updates its data model, executes operations and creates new output data. The MicroOCPP loop function does not block the main loop but executes immediately. This library does not contain any delay functions. Some activities of the library spread over many loop iterations like the start of a charging session which needs to await the approval of an NFC card and a hardware diagnosis of the high power electronics for example. All activities in MicroOCPP support the distribution over many loop calls, leading to a pseudo-parallel execution behavior.

No separate RTOS task is needed and MicroOCPP does not have an internal mechanism for multi-task synchronization. However, it is of course possible to create a dedicated OCPP task, as long as extra care is taken of the synchronization.

## How the API works

The high-level API consists of four parts:

- **Library lifecycle**: The library has initialize functions with a few initialization options. Dynamic system components like the WebSocket adapter need to be set at initialization time. The deinitialize function reverts the library into an unitialized state. That's useful for memory inspection tools like valgrind or to disable the OCPP communication. The loop function also counts as part of the lifecycle management.
- **Sensor Inputs**: EVSEs are mechanical systems with a variety of sensor information. OCPP is used to send parts of the sensor readings to the server. The other part of the sensor data flows into the local charger model of MicroOCPP where it is further processed. To update MicroOCPP with the input data from the sensors, the firmware needs to bind the sensors to the library. An *Input-binding*, or in short *Input*, is a function which transfers the current sensor value to MicroOCPP. Inputs are callback functions which read a specific sensor value and pass the value in the return statement. The firmware defines those callback functions for each sensor and adds them to MicroOCPP during initialization. After initialization, MicroOCPP uses the callbacks and executes them to fetch the most recent sensor values. <br/>
This concept is reused for the data *Outputs* of the library to the firmware, where the callback applies output data from MicroOCPP to the firmware.
- **Transaction management**: OCPP considers EVSEs as vending machines. To enable payment processing and the billing of the EVSE usage, all charging activity is assigned to transactions. A big portion of OCPP is about transactions, their prerequisites, runtime and their termination scenarios. The MicroOCPP API breaks transactions down into an initiation and termination function and gives a transparent view on the current process status, authorization result and offline behavior strategy. For non-commercial setups, the transaction mechanism is the same but has only informational purposes.
- **Device management**: MicroOCPP implements the OCPP side of the device management operations. For the actual execution, the firmware needs to provide the charger-side implementations of the operations to MicroOCPP by passing handler functions to the API. For example, the OCPP server can restart the charger. Upon receipt of the request, MicroOCPP terminates the transactions and eventually triggers the system restart using the handler function which the firmware has provided through the high-level API.

## Transaction safety

Software in EVSEs needs to withstand hazardous operating conditions. EVSEs are located on the street or in garages where the WiFi or LTE signal strength is often weak, leading to long offline periods or where random power cuts can occur. In addition to that, the lack of process virtualization on microcontrollers means that a malfunction in one part of the firmware leads to the crash of all other parts.

The transaction process of MicroOCPP is robust against random failures or resets. A minimal transaction log on the flash storage ensures that each operation on a transaction is fully executed. It will always result in a consistent state between the EVSE and the OCPP server, even over resets of the microcontroller. The RPC queue facilitates this by tracking the delivery status of relevant messages. If the microcontroller is reset while the delivery status of a message is unknown, MicroOCPP takes up the message delivery again at the next start up and completes it.

A requirement for the transaction safety feature is the availability of a journaling file system. Examples include LittleFS, SPIFFS and the POSIX file API, but some microcontroller platforms don't support this natively, so an extension would be required.

## Unit testing

MicroOCPP includes a number of unit tests based on the [Catch2](https://github.com/catchorg/Catch2) framework. A [GitHub Action](https://github.com/matth-x/MicroOcpp/actions) runs the unit tests against each new commit in the MicroOCPP repository, which ensures that new features don't break old code.

The scope of the unit tests is to to ensure a correct implementation of OCPP and to validate the high-level API against its definition. For that, it is not necessary to establish an actual test connection to an OCPP server. In fact, real-world communication would disturb the tests and make them undeterministic. That's why the test suite is fully based on an integrated, tiny OCPP test server which the OCPP client reaches over a loopback connection. The test suite does not access the WebSocket library. When making the unit tests of the main firmware, it is not necessary to check the full OCPP communication, but only to validate correct usage of the high-level API. An example of how the library can be initialized with a loopback connection can be found in its test suite.

## Microcontroller optimization

As a library for microcontrollers, the design of MicroOCPP considers the strict memory limits and complies with the best practices of embedded software development. Also, a few measures were taken to optimize the memory usage which include the spare inclusion of external libraries, an optimization of the internal data structures and the exclusion of C++ run-time type information (RTTI) and exceptions. Features of C++ which may have a larger footprint are carefully used such as the standard template library (STL) and lambda functions. The STL increases the robustness of the code and lambdas prove to be a powerful tool to deal with the complexity of asynchronous data processing in embedded systems. That's also why the high-level API has many functional parameters.

Because of the high importance of C in the embedded world, MicroOCPP provides its high-level API in C too. It is typically simple to instruct the compiler to compile and link the C++-based library in a C-based firmware development. In case that the firmware requires custom features which are not part of the C-API, then the firmware can implement it in a new C++ source file, export the new functions to the C namespace and use it normally in the main source.

While memory constraints are of concern, the execution time generally is not. OCPP is rather uncomplex on the algorithmic side for clients, since there is no need for elaborate planning algorithms or complex data transformations.

Low resource requirements also allow new usage areas on top of EV charging. For example, MicroOCPP has been ported to ordinary IoT equipment such as Wi-Fi sockets to integrate further electric devices into OCPP networks.

Although MicroOCPP is optimized for the usage on microcontrollers, it is also suitable for embedded Linux systems. With more memory available, the upper limits of the internal data structures can be increased, leading to a more versatile support of charging use cases. Also, the separation of the charger firmware into multiple processes can lead to more robustness. MicroOCPP can be extended by an inter-process communication (IPC) interface to run in a separate process.


================================================
FILE: docs/migration.md
================================================
# Migrating to v1.1

As a new minor version, all features should work the same as in v1.0 and existing integrations are mostly backwards compatible. However, some fixes / cleanup steps in MicroOCPP require syntactic changes or special consideration when upgrading from v1.0 to v1.1. The known pitfalls are as follows:

- The default branch has been renamed from `master` into `main`
- Need to include extra headers: the transitive includes have been cleaned a bit. Probably it's necessary to add more includes next to `#include <MicroOcpp.h>`. E.g.<br/>`#include <MicroOcpp/Model/Diagnostics/DiagnosticsService.h>`<br/>`#include <MicroOcpp/Model/FirmwareManagement/FirmwareService.h>`
- `ocppPermitsCharge()` does not consider failures reported by the charger anymore. Before v1.1 it was possible to report failures to MicroOCPP using ErrorCodeInputs and then to rely on `ocppPermitsCharge()` becoming false when a failure occurs. For backwards compatibility, complement any occurence to `ocppPermitsCharge() && !isFaulted()`
- `setEnergyMeterInput` changed the expected return type of the callback function from `float` to `int` (see [#301](https://github.com/matth-x/MicroOcpp/pull/301))
- The return type of the UnlockConnector handler also changed from `PollResult<bool>` to enum `UnlockConnectorResult` (see [#271](https://github.com/matth-x/MicroOcpp/pull/271))

If upgrading MicroOcppMongoose at the same time, then the following changes are very important to consider:

- Certificates are no longer copied into heap memory, but the MO-Mongoose class takes the passed certificate pointer as a zero-copy parameter. The string behind the passed pointer must outlive the MO-Mongoose class (see [#10](https://github.com/matth-x/MicroOcppMongoose/pull/10))
- WebSocket authorization keys are no longer stored as c-strings, but as `unsigned char` buffers. For backwards compatibility, a null-byte is still appended and the buffer can be accessed as c-string, but this should be tested in existing deployments. Furtermore, MicroOCPP only accepts hex-encoded keys coming via ChangeConfiguration which is mandated by the standard. This also may break existing deployments (see [#4](https://github.com/matth-x/MicroOcppMongoose/pull/4)).

If accessing the MicroOCPP modules directly (i.e. not over `MicroOcpp.h` or `MicroOcpp_c.h`) then there are likely some more modifications to be done. See the history of pull requests where each change to the code is documented. However, if the existing integration compiles under the new MO version, then there shouldn't be too many unexpected incompatibilities.

## Migrating to v1.0

The API has been continously improved to best suit the common use cases for MicroOCPP. Moreover, the project has been given a new name to prevent confusion with the relation to the Arduino platform and to reflect the project goals properly. With the new project name, the API has been frozen for the v1.0 release.

### Adopting the new project name in existing projects

Find and replace the keywords in the following.

If using the C-facade (skip if you don't use anything from *ArduinoOcpp_c.h*):

- `AO_Connection` to `OCPP_Connection`
- `AO_Transaction` to `OCPP_Transaction`
- `AO_FilesystemOpt` to `OCPP_FilesystemOpt`
- `AO_TxNotification` to `OCPP_TxNotification`
- `ao_set_console_out_c` to `ocpp_set_console_out_c`

Change this in any case:

- `ArduinoOcpp` to `MicroOcpp`
- `"AO_` to `"Cst_` (define build flag `MO_CONFIG_EXT_PREFIX="AO_"` to keep old config keys)
- `AO_` to `MO_`
- `ocpp_` to `mocpp_`

Change this if used anywhere:

- `ao_set_console_out` to `mocpp_set_console_out`
- `ao_tick_ms` to `mocpp_tick_ms`

If using the C-facade, change this as the final step:

- `ao_` to `ocpp_`

### Further API changes to consider

In addition to the new project name, the API has also been reworked for more consistency. After renaming the existing project as described above, also take a look at the [changelogs](https://github.com/matth-x/MicroOcpp/blob/1.0.x/CHANGELOG.md) (see Section Changed for v1.0.0).

**If something is missing in this guide, please share the issue here:** [https://github.com/matth-x/MicroOcpp/issues/176](https://github.com/matth-x/MicroOcpp/issues/176)


================================================
FILE: docs/modules.md
================================================
# Modules

This chapter gives an overview of the class structure of MicroOCPP.

## Context

The *Context* contains all runtime data of MicroOCPP. Every data object which this library creates is stored in the Context instance, except only the Configuration. So it is the basic entry point to the internals of the library. The structure of the context follows the main architecture as described in [this introduction](intro-tech) and consists of the Request queue and message deserializer for the RPC framework and the Model object for the OCPP model and behavior (see below).

When the library is initialized, `getOcppContext()` returns the current Context object.

## Model

The *Model* represents the OCPP device model and behavior. OCPP defines a rough charger model, i.e. the hardware parts of the charger and their basic functionality in relation to the OCPP operations. Furthermore, OCPP specifies a few only software related features like the reservation of the charger. This charger model is implemented as straightforward C++ data structures and corresponding algorithms.

The implementation of the Model is structured into a top-level Model class and the subordinate Service classes. Each Service class represents a functional block of the OCPP specification and implements the corresponding data structures and functionality. The definition of the functional blocks in MicroOCPP is very similar to the feature profiles in OCPP. Only the Core profile is split into multiple functional blocks to keep a smaller module scope.

The following list contains the resulting functional blocks:

- **Authorization**: local information of user identifiers and their authorization status
- **Boot**: implementation of the *preboot* behavior, i.e. sending and processing the BootNotification message
- **ChargingSession**: management of charging sessions and control of the high power charging hardware
- **Diagnostics**: GetDiagnostics upload routine
- **FirmwareManagement**: UpdateFirmware download routine
- **Heartbeat**: periodic OCPP Heartbeats (not including WebSocket ping-pongs)
- **Metering**: periodic MeterValue messages and local caching
- **Reservation**: management of Reservation lists and their effect on the authorization routine
- **Reset**: execution of OCPP Reset message
- **Transactions**: transaction journal behind StartTransaction and StopTransaction messages and *Transaction* class for extensions of the transaction mechanism

## Requests

The *Request* class and all similarly named classes implement the Remote Procdure Call (RPC) framework of OCPP. A request executes an operation on the remote end of an OCPP connection. If a charger sends a request to a server, then the server will update its data base with the payload and vice versa. After receiving a request, each node replies with a confirmation, acknowledging the successful execution of the operation or notifying about an error.

When being offline, outgoing requests must be queued before sending which is implemented in *RequestQueue*. Queueing is especially challenging for longer offline periods when the number of cached messages exceeds the memory limit. To address this, messages are swapped to the flash memory when the queue limit is reached as implemented in the *RequestStore* and *RequestQueueStorageStrategy* class. Incoming messages can be processed directly and don't have an extensive queueing mechanism.

## Operations

Every OCPP operation (e.g. Heartbeat, BootNotification) has a dedicated class for creating outgoing messages, interpreting incoming messages, executing the specified OCPP action and handling responses. Operations work on the data structures of the Model layer.

To send operations to the OCPP server, they must be wrapped into a Request object. The RPC framework and operations are separated modules. While the RPC framework (including the Request class) deals with the messaging mechanism and transfering data to the other OCPP device, operations define the effect on the OCPP model and data structure and execute the desired action. The operation classes inherit from *Operation* which is the interface visible to the Request class.

Incoming messages are unmarshalled using the *OperationRegistry*. During the initialization phase of the library, the Model classes register all supported operations with their name and an instantiator. The instantiator, when executed, provides the Request interpreter with an instance of the corresponding Operation subclasses. It is possible to extend MicroOCPP by adding new Operation instantiators to the registry, or to modify the behavior by overriding the default Operation implementations. In addition to that, event handlers can be set which the RPC queue will notify with the payload once operations are sent or received.

## Configuration

Configurations like the HeartbeatInterval are managed by the *Configuration* module which consists of

- *AbstractConfiguration*: a single configuration as a key-value pair without value type
    - *Configuration*: a concrete configuration with a value type like `bool` or `const char*`. Inherits from AbstractConfiguration
- *ConfigurationContainer*: a collection of AbstractConfigurations and an optional storage implementation. Multiple containers can be set for a separation of the configurations and different storage strategies. Each container has a unique file name
    - *ConfigurationContainerVolatile*: no persistency and access to the file system
    - *ConfigurationContainerFlash*: persistency by storing JSON files on the flash

If another storage implementation is required (e.g. for syncing with an external configuration manager), then it's possible to add a custom ConfigurationContainer.

In the initialization phase, MicroOCPP loads the built-in Configurations with hard-coded factory defaults and a default storage structure. To customize the factory defaults or which ConfigurationContainers will be used, the Configuration module must be initialized before loading the library. To do so, call `configuration_init(...)`. Then the factory defaults can be applied by calling `declareConfiguration<T>(...)` with the desired default value. To use a custom ConfigurationContainer, call `addConfigurationContainer(...)` with the custom implementation. When the library is loaded afterwards, it will use the previously provided Configurations / Containers and create only the data structure which hasn't been set already.


================================================
FILE: docs/prerequisites.md
================================================
# Development tools and basic prerequisites

This page explains how to work with this library using the appropriate development tools. Skip it if your IDE is set up and you already have an OCPP test server.

## Development tools prerequisites

Throughout these document pages, it is assumed that you already have set up your development environment and that you are familiar with the corresponding building, flashing and (basic) debugging routines. MicroOCPP runs in many environments (from the Arduino-IDE to proprietary microcontroller IDEs like the Code Composer Studio). If you do not have any preferences yet, it is highly recommended to get started with VSCode + the PlatformIO add-on, since it is the favorite setup of the community and therefore you find the most related information in the Issues pages of the main repository.

There are many high-quality tutorials for out there for setting up VSCode + PIO. The following site covers everything you need to know:
[https://randomnerdtutorials.com/vs-code-platformio-ide-esp32-esp8266-arduino/](https://randomnerdtutorials.com/vs-code-platformio-ide-esp32-esp8266-arduino/)

Once that's done, adding MicroOCPP is no big deal anymore. However, let's discuss another very important tool for your project first.

## OCPP Server prerequisites

MicroOCPP is just a client, but all the magic of OCPP lives in the communication between a client and a server. Although it *is* possible to run MicroOCPP without a real server for testing purposes, the best approach for getting started is to get the hands on a real server. So you can always use the client in a practical setup, see immediate results and simplify development a lot.

Perhaps you were already given access to an OCPP server for your project. Then you can use that, it should work fine. If you don't have a server already, it is highly recommended to get
SteVe ([https://github.com/steve-community/steve](https://github.com/steve-community/steve)).
It allows to control every detail of the OCPP operations and shows detail-rich information about the results. And again, it is the favorite test server of the community, so you will find the most related information on the Web. For the installation instructions, please refer to the
[SteVe docs](https://github.com/steve-community/steve#configuration-and-installation).

In case you can't wait to get started, you can make the first connection test with a WebSocket echo server as a fake OCPP service. MicroOCPP supports that: it can send all messages to an echo server which reflects all traffic. MicroOCPP gets back its own messages and replies to itself with mocked responses. Complicated, but it does work and the console will show a valid OCPP communication. An example echo server is given in the following section. For the further development though, you will definitely need a real OCPP server.

## Project structure

MicroOCPP is a library, i.e. it is not a full firmware, but just solves one specific task in your project which is the OCPP connectivity. The project structure should reflect this: typically you download MicroOCPP into a libraries or dependencies subfolder, while the main part of the development takes place in a main source folder. All dependencies of MicroOCPP (i.e. ArduinoJson, see the dependencies sections) should be located in the same libraries or dependencies folder.

When the include paths are correctly set up, you should be able `#include <MicroOcpp.h>` at the top of your own source files. This setup keeps the OCPP library source separate from your integration and gives the project a clear structure.

## Dependency managers

Currently, the PlatformIO dependency manager is supported. In the `platformio.ini` manifest, you can add `matth-x/MicroOcpp` to the `lib_deps` section.


================================================
FILE: docs/security.md
================================================
# Security

MicroOCPP is designed to be compatible with IoT devices which leads to special considerations regarding cyber security. This section describes the challenges and security concepts of MicroOCPP.

## Challenges of using microcontrollers in safety-critical environments

The two challenges are as follows:

1. Lack of process virtualization in RTOS operating systems
2. Less attention for potential vulnerabilities in the used libraries

In a general purpose OS like Linux, the internet communication modules of an application typically run in a different process than the data base or the hardware supervision / control function. In contrast, on a typical RTOS, all modules are compiled into the same binary, sharing the same address space and lifecycle when being executed. This means that once the network stack crashes, all software on the chip is reset and a vulnerability on the network stack could be exploited to read or manipulate the data of the full runtime environment.

Challenge 2) is due to the fact that OCPP uses standard web technology (WebSocket over TLS), but microcontrollers are missing out the most widespread networking software like OpenSSL or the networking libraries of Linux. The available networking libraries for microcontrollers are also audited well (e.g. lwIP, mbedTLS), but in general there is more attention on potential vulnerabilites in the Linux world, because a huge share of commercial IT systems is based on Linux.

On the upside, an advantage of microcontrollers is their single purpose usage and thus, reduced complexity. Many security breaches are caused by misconfigured and often even superflous software components (e.g. due to overlooked open ports) which are not a regular part of a microcontroller firmware.

## Security measures of MicroOCPP

To address the challenges, the following measures were taken:

- Input sanitazion: MicroOCPP only accepts the JSON format for all input. It is validated by ArduinoJson. Every JSON value is checked against the expected format and for conformity with the OCPP specification before using it. The JSON object is discarded immediately after interpretation
- Transaction safety: to address crashes and random reboots of the microcontroller during operation, all activities of the OCPP library are programmed so that they will either be resumed or fully reverted after reboots, preventing inconsistent states. See also [Transaction safety](../intro-tech/#transaction-safety)
- Careful choice of the dependencies: the mandatory dependency, [ArduinoJson](https://github.com/bblanchon/ArduinoJson), has a test coverage of nearly 100% and is fuzzed. The same goes for the recommended WebSocket library, [Mongoose](https://github.com/cesanta/mongoose). Both projects are very relevant in their field with over 6k and 9k stars on GitHub

Two further measures would be beneficial and could be requested via support request:

- Precautious memory allocation: migrating memory management to the stack and where possible would simplify code analysis and reduce the potential of vulnerabilities
- OCPP fuzzer: as a stateful application protocol, there are specific challenges of developing a fuzzer. An open source fuzzing framework for OCPP could reveal vulnerabilities and be of use for other OCPP projects as well. MicroOCPP is a good foundation for trying new fuzzing approaches. The exposure of the main-loop function and the clock allow a fine-grained access to the program flow and facilitating random alterations of the environment conditions. Furthermore, all persistent data is stored in the JSON format and it is possible to develop a grammatic which contains both a device status and incoming OCPP messages. The Configuration interface could be reused for further status variables which don't need to be persistent in practice, but would improve fuzzing performance when being accessible by the fuzzer.
- Memory pool: object orientation is a very helpful programming paradigm for OCPP. The standard contains a lot of polymorphic entities and optional or variable length data fields. MicroOCPP makes use of the heap and allocates new chunks of memory as the device model is populated with data. On the upside this allows to save a lot of memory during normal operation, but it also entails the risk of memory depletion of the whole controller. A fixed memory pool for OCPP would encapsulate the heap usage to a certain address space and set a hard limit for the memory consumption and avoid polluting the shared heap area by heap fragmentation. To realize the memory pool, it would be necessary to make the allocate and deallocate functions configurable by the client code. Then appropriate (de)allocators can be injected limiting the memory use to a restricted address area. As a consequence, a more thorough allocation error handling in the MicroOCPP code is required and test cases which randomly suppress allocations to test if the library always reverts to a consistent state. A less invasive alternative to memory pools is to inject measured (de)allocators which just prevent the allocation of new memory chunks after a certain threshold has been exceeded. This programming technique would also allow to create much more fine-grained benchmarks of the library.

## Measures to be taken by the EVSE vendor

As a general rule, the communication controller which is exposed to the internet shouldn't be used for safety-critical tasks on the charging hardware. That's because the networking stack is a very complex piece of software which very likely still has open bugs which can crash the controller despite all the effort to improve it. Safety-critical tasks on the charging hardware shouldn't rely on a controller which could crash at any time because of incoming network traffic. To mitigate this, either the OCPP library and internet functionality should be placed onto a separate chip, or the most vital safety functionality should get a dedicated controller.

The recommended [Mongoose WebSocket adapter for MicroOCPP](https://github.com/matth-x/MicroOcppMongoose) supports the OCPP Security Profile 2 (TLS with Basic Authentication) and needs to be provided with the necessary TLS certificate.

Most IoT-controllers have built-in mechanisms to ensure the authenticity of their firmware. For example, the Espressif32 supports [Secure Boot](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/security/secure-boot-v2.html) which is a signature verification of the installed firmware before that firmware is executed. Many platforms also have a built-in signature verification for incoming OTA firmware updates. To prove the authenticity of the charger to the OCPP server, it is also important to keep the WebSocket key secret by [encrypting the flash memory](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/security/flash-encryption.html). These security mechanisms heavily depend on the host controller which runs MicroOCPP. It is the responsibility of the main firmware to make proper use of them.

## OCPP Security Whitepaper and ISO 15118

With MicroOCPP, the recommended way of handling certificates on microcontrollers is to compile them into the firmware binary and to rely on the built-in firmware signature checks of the host microcontroller platform. This lean approach results in a smaller attack vector compared to establishing a separate infrastructure for the server- and firmware certificate. It can be assumed that the OTA functionality of the microcontrollers is thoroughly tested and consequently, reaching a comparable level of robustness would require much effort.

In case the certificate handling mechanism of the Security Whitepaper is preferred, then the EVSE vendor needs to implement it via a custom extension. Unfortunately, this mechanism hasn't been requested yet and is not natively supported by MicroOCPP yet. The new custom operations can be implemented by extending the class `Operation`. A handler for incoming messages can be registered via `OperationRegistry::registerOperation(...)`. To send custom messages to the server, use `Context::initiateRequest(...)`.

A further challenge for microcontrollers is the relatively low processor speed which becomes relevant for a potential ISO 15118 integration. Some incoming message types (`AuthorizationReq` and `MeteringReceiptReq`) include a signature which needs to be verified on the communications controller of the EVSE. Moreover, messages in the ISO 15118 V2G protocol have a maximum round trip time (which is 2 seconds for the message types in question) and so the signature verification is time-contrained. [These benchmarks](https://web.archive.org/web/20230724184529/https://www.oryx-embedded.com/benchmark/espressif/crypto-esp32.html) for the Espressif32 show that for some signature algorithms, the verification time can get close or exceed the timing requirements of ISO 15118 if done on the processor only. As a consequence, hardware acceleration by the crypto-core is mandatory to ensure a robust communication between the EVSE and EV. Before making a communications controller with ISO 15118 support, the performance of the host controller should be benchmarked and checked against the requirements.

*Disclaimer: the outlined risks in this section are not a complete list. Also, every system has unique security challenges which require individual attention. In doubt, please consult an IT-security specialist.*


================================================
FILE: docs/stylesheets/extra.css
================================================
:root {
    --md-primary-fg-color:        #2984C7;
  }


================================================
FILE: examples/ESP/main.cpp
================================================
// matth-x/MicroOcpp
// Copyright Matthias Akstaller 2019 - 2024
// MIT License

#include <Arduino.h>
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti WiFiMulti;
#elif defined(ESP32)
#include <WiFi.h>
#else
#error only ESP32 or ESP8266 supported at the moment
#endif

#include <MicroOcpp.h>

#define STASSID "YOUR_WIFI_SSID"
#define STAPSK  "YOUR_WIFI_PW"

#define OCPP_BACKEND_URL   "ws://echo.websocket.events"
#define OCPP_CHARGE_BOX_ID ""

//
//  Settings which worked for my SteVe instance:
//
//#define OCPP_BACKEND_URL   "ws://192.168.178.100:8180/steve/websocket/CentralSystemService"
//#define OCPP_CHARGE_BOX_ID "esp-charger"

void setup() {

    /*
     * Initialize Serial and WiFi
     */ 

    Serial.begin(115200);

    Serial.print(F("[main] Wait for WiFi: "));

#if defined(ESP8266)
    WiFiMulti.addAP(STASSID, STAPSK);
    while (WiFiMulti.run() != WL_CONNECTED) {
        Serial.print('.');
        delay(1000);
    }
#elif defined(ESP32)
    WiFi.begin(STASSID, STAPSK);
    while (!WiFi.isConnected()) {
        Serial.print('.');
        delay(1000);
    }
#else
#error only ESP32 or ESP8266 supported at the moment
#endif

    Serial.println(F(" connected!"));

    /*
     * Initialize the OCPP library
     */
    mocpp_initialize(OCPP_BACKEND_URL, OCPP_CHARGE_BOX_ID, "My Charging Station", "My company name");

    /*
     * Integrate OCPP functionality. You can leave out the following part if your EVSE doesn't need it.
     */
    setEnergyMeterInput([]() {
        //take the energy register of the main electricity meter and return the value in watt-hours
        return 0.f;
    });

    setSmartChargingCurrentOutput([](float limit) {
        //set the SAE J1772 Control Pilot value here
        Serial.printf("[main] Smart Charging allows maximum charge rate: %.0f\n", limit);
    });

    setConnectorPluggedInput([]() {
        //return true if an EV is plugged to this EVSE
        return false;
    });

    //... see MicroOcpp.h for more settings
}

void loop() {

    /*
     * Do all OCPP stuff (process WebSocket input, send recorded meter values to Central System, etc.)
     */
    mocpp_loop();

    /*
     * Energize EV plug if OCPP transaction is up and running
     */
    if (ocppPermitsCharge()) {
        //OCPP set up and transaction running. Energize the EV plug here
    } else {
        //No transaction running at the moment. De-energize EV plug
    }

    /*
     * Use NFC reader to start and stop transactions
     */
    if (/* RFID chip detected? */ false) {
        String idTag = "0123456789ABCD"; //e.g. idTag = RFID.readIdTag();

        if (!getTransaction()) {
            //no transaction running or preparing. Begin a new transaction
            Serial.printf("[main] Begin Transaction with idTag %s\n", idTag.c_str());

            /*
             * Begin Transaction. The OCPP lib will prepare transaction by checking the Authorization
             * and listen to the ConnectorPlugged Input. When the Authorization succeeds and an EV
             * is plugged, the OCPP lib will send the StartTransaction
             */
            auto ret = beginTransaction(idTag.c_str());

            if (ret) {
                Serial.println(F("[main] Transaction initiated. OCPP lib will send a StartTransaction when" \
                                 "ConnectorPlugged Input becomes true and if the Authorization succeeds"));
            } else {
                Serial.println(F("[main] No transaction initiated"));
            }

        } else {
            //Transaction already initiated. Check if to stop current Tx by RFID card
            if (idTag.equals(getTransactionIdTag())) {
                //card matches -> user can stop Tx
                Serial.println(F("[main] End transaction by RFID card"));

                endTransaction(idTag.c_str());
            } else {
                Serial.println(F("[main] Cannot end transaction by RFID card (different card?)"));
            }
        }
    }

    //... see MicroOcpp.h for more possibilities
}


================================================
FILE: examples/ESP-IDF/CMakeLists.txt
================================================
# The following five lines of boilerplate have to be in your project's
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.5)

include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(mo_example)

idf_build_set_property(COMPILE_OPTIONS -DMO_TRAFFIC_OUT APPEND)
idf_build_set_property(COMPILE_OPTIONS -DMO_FILENAME_PREFIX="/mo_store/" APPEND)


================================================
FILE: examples/ESP-IDF/Makefile
================================================
#
# This is a project Makefile. It is assumed the directory this Makefile resides in is a
# project subdirectory.
#

PROJECT_NAME := mo_example

include $(IDF_PATH)/make/project.mk


================================================
FILE: examples/ESP-IDF/README.md
================================================
# ESP-IDF integration example

To run MicroOcpp on the ESP-IDF platform, please take this example as the starting point. It is widely based on the [Wi-Fi Station Example](https://github.com/espressif/esp-idf/tree/release/v4.4/examples/wifi/getting_started/station) of Espressif. This example works with the ESP-IDF version `4.4`. For a general guide how to setup and use the ESP-IDF, please refer to the documentation of Espressif.

## Setup guide

### Dependencies

Please clone the following repositories into the respective components-directories:

- [MicroOcpp](https://github.com/matth-x/MicroOcpp) into `components/MicroOcpp`
- [Mongoose (ESP-IDF integration)](https://github.com/cesanta/mongoose-esp-idf) into `components/mongoose`
- [Mongoose adapter for MicroOcpp](https://github.com/matth-x/MicroOcppMongoose) into `components/MicroOcppMongoose`
- [ArduinoJson (v6.21)](https://github.com/bblanchon/ArduinoJson) into `components/ArduinoJson`

For setup, the following commands could come handy (change to the root directory of the ESP-IDF project first):

```
rm components/mongoose/.gitkeep
rm components/MicroOcpp/.gitkeep
rm components/MicroOcppMongoose/.gitkeep
rm components/ArduinoJson/.gitkeep
git clone https://github.com/matth-x/MicroOcpp components/MicroOcpp
git clone --recurse-submodules https://github.com/cesanta/mongoose-esp-idf.git components/mongoose
git clone https://github.com/matth-x/MicroOcppMongoose components/MicroOcppMongoose
git clone https://github.com/bblanchon/ArduinoJson components/ArduinoJson
cd components/ArduinoJson
git checkout 3e1be980d93e47b2a0073efeeb9a9396fd7a83be
```

The setup is done if the following include statements work:

```cpp
#include <MicroOcpp.h>
#include <mongoose.h>
#include <MicroOcppMongooseClient.h>
#include <ArduinoJson.h>
```

### Configure the project

Open the project configuration menu (`idf.py menuconfig`). 

In the `Example Configuration` menu:

* Set the Wi-Fi configuration.
    * Set `WiFi SSID`.
    * Set `WiFi Password`.
    * Set `OCPP backend URL`. (e.g. `ws://ocpp.example.com/steve/websocket/CentralSystemService`)
    * Set `ChargeBoxId`. (e.g. `my-charger` - last part of the WebSocket URL
    * Set `AuthorizationKey`, or leave empty if not necessary

Optional: If you need, change the other options according to your requirements.


================================================
FILE: examples/ESP-IDF/components/ArduinoJson/.gitkeep
================================================


================================================
FILE: examples/ESP-IDF/components/ArduinoOcpp/.gitkeep
================================================


================================================
FILE: examples/ESP-IDF/components/ArduinoOcppMongoose/.gitkeep
================================================


================================================
FILE: examples/ESP-IDF/components/README.md
================================================
## Components folder structure

The ESP-IDF integration requires at least the following components:

- [MicroOcpp](https://github.com/matth-x/MicroOcpp)
- [Mongoose (ESP-IDF integration)](https://github.com/cesanta/mongoose-esp-idf)
- [Mongoose adapter for MicroOcpp](https://github.com/matth-x/MicroOcppMongoose)
- [ArduinoJson (v6.21)](https://github.com/bblanchon/ArduinoJson)

This example only provides the folder structure. You need to clone every project into it in order to run the example.


================================================
FILE: examples/ESP-IDF/components/mongoose/.gitkeep
================================================


================================================
FILE: examples/ESP-IDF/main/CMakeLists.txt
================================================
idf_component_register(SRCS "main.c"
                    INCLUDE_DIRS ".")


================================================
FILE: examples/ESP-IDF/main/Kconfig.projbuild
================================================
menu "Example Configuration"

    config ESP_WIFI_SSID
        string "WiFi SSID"
        default "myssid"
        help
            SSID (network name) for the example to connect to.

    config ESP_WIFI_PASSWORD
        string "WiFi Password"
        default "mypassword"
        help
            WiFi password (WPA or WPA2) for the example to use.

    config ESP_MAXIMUM_RETRY
        int "Maximum retry"
        default 5
        help
            Set the Maximum retry to avoid station reconnecting to the AP unlimited when the AP is really inexistent.
    
    config MO_OCPP_BACKEND
        string "OCPP backend URL"
        default "ws://echo.websocket.events/"
        help
            URL of the OCPP backend
    
    config MO_CHARGEBOXID
        string "ChargeBoxId"
        default ""
        help
            ChargeBoxId as it appears in the WebSocket connection URL

    config MO_AUTHORIZATIONKEY
        string "Authorization Key"
        default ""
        help
            Passphrase for connecting to the OCPP server
endmenu


================================================
FILE: examples/ESP-IDF/main/component.mk
================================================
#
# Main component makefile.
#
# This Makefile can be left empty. By default, it will take the sources in the
# src/ directory, compile them and link them into lib(subdirectory_name).a
# in the build directory. This behaviour is entirely configurable,
# please read the ESP-IDF documents if you need to do this.
#


================================================
FILE: examples/ESP-IDF/main/main.c
================================================
/* Based on the ESP-IDF WiFi station Example (see https://github.com/espressif/esp-idf/tree/release/v4.4/examples/wifi/getting_started/station/main)

   This example code extends the WiFi example with the necessary calls to establish an
   OCPP connection on the ESP-IDF. 
*/
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "nvs_flash.h"

#include "lwip/err.h"
#include "lwip/sys.h"

/* MicroOcpp includes */
#include <mongoose.h>
#include <MicroOcpp_c.h> //C-facade of MicroOcpp
#include <MicroOcppMongooseClient_c.h> //WebSocket integration for ESP-IDF

/* The examples use WiFi configuration that you can set via project configuration menu

   If you'd rather not, just change the below entries to strings with
   the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid"
*/
#define EXAMPLE_ESP_WIFI_SSID      CONFIG_ESP_WIFI_SSID
#define EXAMPLE_ESP_WIFI_PASS      CONFIG_ESP_WIFI_PASSWORD
#define EXAMPLE_ESP_MAXIMUM_RETRY  CONFIG_ESP_MAXIMUM_RETRY
#define EXAMPLE_MO_OCPP_BACKEND    CONFIG_MO_OCPP_BACKEND
#define EXAMPLE_MO_CHARGEBOXID     CONFIG_MO_CHARGEBOXID
#define EXAMPLE_MO_AUTHORIZATIONKEY CONFIG_MO_AUTHORIZATIONKEY

/* FreeRTOS event group to signal when we are connected*/
static EventGroupHandle_t s_wifi_event_group;

/* The event group allows multiple bits for each event, but we only care about two events:
 * - we are connected to the AP with an IP
 * - we failed to connect after the maximum amount of retries */
#define WIFI_CONNECTED_BIT BIT0
#define WIFI_FAIL_BIT      BIT1

static const char *TAG = "wifi station";

static int s_retry_num = 0;

static void event_handler(void* arg, esp_event_base_t event_base,
                                int32_t event_id, void* event_data)
{
    if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
        esp_wifi_connect();
    } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
        if (s_retry_num < EXAMPLE_ESP_MAXIMUM_RETRY) {
            esp_wifi_connect();
            s_retry_num++;
            ESP_LOGI(TAG, "retry to connect to the AP");
        } else {
            xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);
        }
        ESP_LOGI(TAG,"connect to the AP fail");
    } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
        ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
        ESP_LOGI(TAG, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
        s_retry_num = 0;
        xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);
    }
}

void wifi_init_sta(void)
{
    s_wifi_event_group = xEventGroupCreate();

    ESP_ERROR_CHECK(esp_netif_init());

    ESP_ERROR_CHECK(esp_event_loop_create_default());
    esp_netif_create_default_wifi_sta();

    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));

    esp_event_handler_instance_t instance_any_id;
    esp_event_handler_instance_t instance_got_ip;
    ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
                                                        ESP_EVENT_ANY_ID,
                                                        &event_handler,
                                                        NULL,
                                                        &instance_any_id));
    ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT,
                                                        IP_EVENT_STA_GOT_IP,
                                                        &event_handler,
                                                        NULL,
                                                        &instance_got_ip));

    wifi_config_t wifi_config = {
        .sta = {
            .ssid = EXAMPLE_ESP_WIFI_SSID,
            .password = EXAMPLE_ESP_WIFI_PASS,
            /* Setting a password implies station will connect to all security modes including WEP/WPA.
             * However these modes are deprecated and not advisable to be used. Incase your Access point
             * doesn't support WPA2, these mode can be enabled by commenting below line */
	     .threshold.authmode = WIFI_AUTH_WPA2_PSK,
        },
    };
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA) );
    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config) );
    ESP_ERROR_CHECK(esp_wifi_start() );

    ESP_LOGI(TAG, "wifi_init_sta finished.");

    /* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum
     * number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */
    EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,
            WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,
            pdFALSE,
            pdFALSE,
            portMAX_DELAY);

    /* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually
     * happened. */
    if (bits & WIFI_CONNECTED_BIT) {
        ESP_LOGI(TAG, "connected to ap SSID:%s password:%s",
                 EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
    } else if (bits & WIFI_FAIL_BIT) {
        ESP_LOGI(TAG, "Failed to connect to SSID:%s, password:%s",
                 EXAMPLE_ESP_WIFI_SSID, EXAMPLE_ESP_WIFI_PASS);
    } else {
        ESP_LOGE(TAG, "UNEXPECTED EVENT");
    }

    /* The event will not be processed after unregister */
    ESP_ERROR_CHECK(esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip));
    ESP_ERROR_CHECK(esp_event_handler_instance_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, instance_any_id));
    vEventGroupDelete(s_wifi_event_group);
}

void app_main(void)
{
    //Initialize NVS
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
      ESP_ERROR_CHECK(nvs_flash_erase());
      ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);

    ESP_LOGI(TAG, "ESP_WIFI_MODE_STA");
    wifi_init_sta();

    /* Initialize Mongoose (necessary for MicroOcpp)*/
    struct mg_mgr mgr;        // Event manager
    mg_mgr_init(&mgr);        // Initialise event manager
    mg_log_set(MG_LL_DEBUG);  // Set log level

    /* Initialize MicroOcpp */
    struct OCPP_FilesystemOpt fsopt = { .use = true, .mount = true, .formatFsOnFail = true};

    OCPP_Connection *osock = ocpp_makeConnection(&mgr,
            EXAMPLE_MO_OCPP_BACKEND, 
            EXAMPLE_MO_CHARGEBOXID, 
            EXAMPLE_MO_AUTHORIZATIONKEY, "", fsopt);
    ocpp_initialize(osock, "ESP-IDF charger", "Your brand name here", fsopt, false, false);

    /* Enter infinite loop */
    while (1) {
        mg_mgr_poll(&mgr, 10);
        ocpp_loop();
    }
    
    /* Deallocate ressources */
    ocpp_deinitialize();
    ocpp_deinitConnection(osock);
    mg_mgr_free(&mgr);
    return;
}


================================================
FILE: examples/ESP-IDF/partitions.csv
================================================
# Name,   Type, SubType, Offset,  Size, Flags
nvs,      data, nvs,     ,        0x4000,
otadata,  data, ota,     ,        0x2000,
phy_init, data, phy,     ,        0x1000,
ota_0,    app,  ota_0,   ,        0x190000,
ota_1,    app,  ota_1,   ,        0x190000,
mo,       data, spiffs,  ,        0xD0000,

================================================
FILE: examples/ESP-IDF/sdkconfig
================================================
#
# Automatically generated file. DO NOT EDIT.
# Espressif IoT Development Framework (ESP-IDF) Project Configuration
#
CONFIG_IDF_CMAKE=y
CONFIG_IDF_TARGET_ARCH_XTENSA=y
CONFIG_IDF_TARGET="esp32"
CONFIG_IDF_TARGET_ESP32=y
CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000

#
# SDK tool configuration
#
CONFIG_SDK_TOOLPREFIX="xtensa-esp32-elf-"
# CONFIG_SDK_TOOLCHAIN_SUPPORTS_TIME_WIDE_64_BITS is not set
# end of SDK tool configuration

#
# Build type
#
CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y
# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set
CONFIG_APP_BUILD_GENERATE_BINARIES=y
CONFIG_APP_BUILD_BOOTLOADER=y
CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y
# end of Build type

#
# Application manager
#
CONFIG_APP_COMPILE_TIME_DATE=y
# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set
# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set
# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set
CONFIG_APP_RETRIEVE_LEN_ELF_SHA=16
# end of Application manager

#
# Bootloader config
#
CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x1000
CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y
# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set
# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set
# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set
CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y
# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set
CONFIG_BOOTLOADER_LOG_LEVEL=3
# CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V is not set
CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y
# CONFIG_BOOTLOADER_FACTORY_RESET is not set
# CONFIG_BOOTLOADER_APP_TEST is not set
CONFIG_BOOTLOADER_WDT_ENABLE=y
# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set
CONFIG_BOOTLOADER_WDT_TIME_MS=9000
# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set
# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set
# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set
# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set
CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0
# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set
CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y
# end of Bootloader config

#
# Security features
#
# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set
# CONFIG_SECURE_BOOT is not set
# CONFIG_SECURE_FLASH_ENC_ENABLED is not set
# end of Security features

#
# Serial flasher config
#
CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200
# CONFIG_ESPTOOLPY_NO_STUB is not set
# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set
# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set
CONFIG_ESPTOOLPY_FLASHMODE_DIO=y
# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set
CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y
CONFIG_ESPTOOLPY_FLASHMODE="dio"
# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set
CONFIG_ESPTOOLPY_FLASHFREQ_40M=y
# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set
# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set
CONFIG_ESPTOOLPY_FLASHFREQ="40m"
# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set
# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set
# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set
# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set
# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set
# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set
CONFIG_ESPTOOLPY_FLASHSIZE="4MB"
CONFIG_ESPTOOLPY_FLASHSIZE_DETECT=y
CONFIG_ESPTOOLPY_BEFORE_RESET=y
# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set
CONFIG_ESPTOOLPY_BEFORE="default_reset"
CONFIG_ESPTOOLPY_AFTER_RESET=y
# CONFIG_ESPTOOLPY_AFTER_NORESET is not set
CONFIG_ESPTOOLPY_AFTER="hard_reset"
# CONFIG_ESPTOOLPY_MONITOR_BAUD_CONSOLE is not set
# CONFIG_ESPTOOLPY_MONITOR_BAUD_9600B is not set
# CONFIG_ESPTOOLPY_MONITOR_BAUD_57600B is not set
CONFIG_ESPTOOLPY_MONITOR_BAUD_115200B=y
# CONFIG_ESPTOOLPY_MONITOR_BAUD_230400B is not set
# CONFIG_ESPTOOLPY_MONITOR_BAUD_921600B is not set
# CONFIG_ESPTOOLPY_MONITOR_BAUD_2MB is not set
# CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER is not set
CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER_VAL=115200
CONFIG_ESPTOOLPY_MONITOR_BAUD=115200
# end of Serial flasher config

#
# Partition Table
#
# CONFIG_PARTITION_TABLE_SINGLE_APP is not set
# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set
# CONFIG_PARTITION_TABLE_TWO_OTA is not set
CONFIG_PARTITION_TABLE_CUSTOM=y
CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv"
CONFIG_PARTITION_TABLE_FILENAME="partitions.csv"
CONFIG_PARTITION_TABLE_OFFSET=0x8000
CONFIG_PARTITION_TABLE_MD5=y
# end of Partition Table

#
# Example Configuration
#
CONFIG_ESP_WIFI_SSID="myssid"
CONFIG_ESP_WIFI_PASSWORD="mypassword"
CONFIG_ESP_MAXIMUM_RETRY=5
CONFIG_MO_OCPP_BACKEND="ws://echo.websocket.events/"
CONFIG_MO_CHARGEBOXID=""
CONFIG_MO_AUTHORIZATIONKEY=""
# end of Example Configuration

#
# Compiler options
#
CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y
# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set
# CONFIG_COMPILER_OPTIMIZATION_PERF is not set
# CONFIG_COMPILER_OPTIMIZATION_NONE is not set
CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y
# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set
# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set
CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2
# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set
CONFIG_COMPILER_HIDE_PATHS_MACROS=y
# CONFIG_COMPILER_CXX_EXCEPTIONS is not set
# CONFIG_COMPILER_CXX_RTTI is not set
CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y
# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set
# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set
# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set
# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set
# CONFIG_COMPILER_DISABLE_GCC8_WARNINGS is not set
# CONFIG_COMPILER_DUMP_RTL_FILES is not set
# end of Compiler options

#
# Component config
#

#
# Application Level Tracing
#
# CONFIG_APPTRACE_DEST_JTAG is not set
CONFIG_APPTRACE_DEST_NONE=y
CONFIG_APPTRACE_LOCK_ENABLE=y
# end of Application Level Tracing

#
# ESP-ASIO
#
# CONFIG_ASIO_SSL_SUPPORT is not set
# end of ESP-ASIO

#
# Bluetooth
#
# CONFIG_BT_ENABLED is not set
# end of Bluetooth

#
# CoAP Configuration
#
CONFIG_COAP_MBEDTLS_PSK=y
# CONFIG_COAP_MBEDTLS_PKI is not set
# CONFIG_COAP_MBEDTLS_DEBUG is not set
CONFIG_COAP_LOG_DEFAULT_LEVEL=0
# end of CoAP Configuration

#
# Driver configurations
#

#
# ADC configuration
#
# CONFIG_ADC_FORCE_XPD_FSM is not set
CONFIG_ADC_DISABLE_DAC=y
# end of ADC configuration

#
# MCPWM configuration
#
# CONFIG_MCPWM_ISR_IN_IRAM is not set
# end of MCPWM configuration

#
# SPI configuration
#
# CONFIG_SPI_MASTER_IN_IRAM is not set
CONFIG_SPI_MASTER_ISR_IN_IRAM=y
# CONFIG_SPI_SLAVE_IN_IRAM is not set
CONFIG_SPI_SLAVE_ISR_IN_IRAM=y
# end of SPI configuration

#
# TWAI configuration
#
# CONFIG_TWAI_ISR_IN_IRAM is not set
# CONFIG_TWAI_ERRATA_FIX_BUS_OFF_REC is not set
# CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST is not set
# CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID is not set
# CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT is not set
# end of TWAI configuration

#
# UART configuration
#
# CONFIG_UART_ISR_IN_IRAM is not set
# end of UART configuration

#
# RTCIO configuration
#
# CONFIG_RTCIO_SUPPORT_RTC_GPIO_DESC is not set
# end of RTCIO configuration

#
# GPIO Configuration
#
# CONFIG_GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL is not set
# end of GPIO Configuration

#
# GDMA Configuration
#
# CONFIG_GDMA_CTRL_FUNC_IN_IRAM is not set
# CONFIG_GDMA_ISR_IRAM_SAFE is not set
# end of GDMA Configuration
# end of Driver configurations

#
# eFuse Bit Manager
#
# CONFIG_EFUSE_CUSTOM_TABLE is not set
# CONFIG_EFUSE_VIRTUAL is not set
# CONFIG_EFUSE_CODE_SCHEME_COMPAT_NONE is not set
CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4=y
# CONFIG_EFUSE_CODE_SCHEME_COMPAT_REPEAT is not set
CONFIG_EFUSE_MAX_BLK_LEN=192
# end of eFuse Bit Manager

#
# ESP-TLS
#
CONFIG_ESP_TLS_USING_MBEDTLS=y
# CONFIG_ESP_TLS_USE_SECURE_ELEMENT is not set
# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set
# CONFIG_ESP_TLS_SERVER is not set
# CONFIG_ESP_TLS_PSK_VERIFICATION is not set
# CONFIG_ESP_TLS_INSECURE is not set
# end of ESP-TLS

#
# ESP32-specific
#
CONFIG_ESP32_REV_MIN_0=y
# CONFIG_ESP32_REV_MIN_1 is not set
# CONFIG_ESP32_REV_MIN_2 is not set
# CONFIG_ESP32_REV_MIN_3 is not set
CONFIG_ESP32_REV_MIN=0
CONFIG_ESP32_DPORT_WORKAROUND=y
# CONFIG_ESP32_DEFAULT_CPU_FREQ_80 is not set
CONFIG_ESP32_DEFAULT_CPU_FREQ_160=y
# CONFIG_ESP32_DEFAULT_CPU_FREQ_240 is not set
CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=160
# CONFIG_ESP32_SPIRAM_SUPPORT is not set
# CONFIG_ESP32_TRAX is not set
CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0
# CONFIG_ESP32_ULP_COPROC_ENABLED is not set
CONFIG_ESP32_ULP_COPROC_RESERVE_MEM=0
CONFIG_ESP32_DEBUG_OCDAWARE=y
CONFIG_ESP32_BROWNOUT_DET=y
CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0=y
# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1 is not set
# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2 is not set
# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3 is not set
# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4 is not set
# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5 is not set
# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6 is not set
# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7 is not set
CONFIG_ESP32_BROWNOUT_DET_LVL=0
CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y
# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set
# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set
# CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set
CONFIG_ESP32_RTC_CLK_SRC_INT_RC=y
# CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS is not set
# CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC is not set
# CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256 is not set
CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024
CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000
CONFIG_ESP32_XTAL_FREQ_40=y
# CONFIG_ESP32_XTAL_FREQ_26 is not set
# CONFIG_ESP32_XTAL_FREQ_AUTO is not set
CONFIG_ESP32_XTAL_FREQ=40
# CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set
# CONFIG_ESP32_NO_BLOBS is not set
# CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set
# CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set
# CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set
CONFIG_ESP32_DPORT_DIS_INTERRUPT_LVL=5
# end of ESP32-specific

#
# ADC-Calibration
#
CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y
CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y
CONFIG_ADC_CAL_LUT_ENABLE=y
# end of ADC-Calibration

#
# Common ESP-related
#
CONFIG_ESP_ERR_TO_NAME_LOOKUP=y
# end of Common ESP-related

#
# Ethernet
#
CONFIG_ETH_ENABLED=y
CONFIG_ETH_USE_ESP32_EMAC=y
CONFIG_ETH_PHY_INTERFACE_RMII=y
CONFIG_ETH_RMII_CLK_INPUT=y
# CONFIG_ETH_RMII_CLK_OUTPUT is not set
CONFIG_ETH_RMII_CLK_IN_GPIO=0
CONFIG_ETH_DMA_BUFFER_SIZE=512
CONFIG_ETH_DMA_RX_BUFFER_NUM=10
CONFIG_ETH_DMA_TX_BUFFER_NUM=10
CONFIG_ETH_USE_SPI_ETHERNET=y
# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set
# CONFIG_ETH_SPI_ETHERNET_W5500 is not set
# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set
# CONFIG_ETH_USE_OPENETH is not set
# end of Ethernet

#
# Event Loop Library
#
# CONFIG_ESP_EVENT_LOOP_PROFILING is not set
CONFIG_ESP_EVENT_POST_FROM_ISR=y
CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y
# end of Event Loop Library

#
# GDB Stub
#
# end of GDB Stub

#
# ESP HTTP client
#
CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y
# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set
CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH=y
# end of ESP HTTP client

#
# HTTP Server
#
CONFIG_HTTPD_MAX_REQ_HDR_LEN=512
CONFIG_HTTPD_MAX_URI_LEN=512
CONFIG_HTTPD_ERR_RESP_NO_DELAY=y
CONFIG_HTTPD_PURGE_BUF_LEN=32
# CONFIG_HTTPD_LOG_PURGE_DATA is not set
# CONFIG_HTTPD_WS_SUPPORT is not set
# end of HTTP Server

#
# ESP HTTPS OTA
#
# CONFIG_OTA_ALLOW_HTTP is not set
# end of ESP HTTPS OTA

#
# ESP HTTPS server
#
# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set
# end of ESP HTTPS server

#
# Hardware Settings
#

#
# MAC Config
#
CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y
CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y
CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y
CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y
# CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set
CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR=y
CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4
# end of MAC Config

#
# Sleep Config
#
CONFIG_ESP_SLEEP_POWER_DOWN_FLASH=y
CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y
# CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set
# CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND is not set
# end of Sleep Config

#
# RTC Clock Config
#
# end of RTC Clock Config
# end of Hardware Settings

#
# IPC (Inter-Processor Call)
#
CONFIG_ESP_IPC_TASK_STACK_SIZE=1536
CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y
CONFIG_ESP_IPC_ISR_ENABLE=y
# end of IPC (Inter-Processor Call)

#
# LCD and Touch Panel
#

#
# LCD Peripheral Configuration
#
CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE=32
# end of LCD Peripheral Configuration
# end of LCD and Touch Panel

#
# ESP NETIF Adapter
#
CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120
CONFIG_ESP_NETIF_TCPIP_LWIP=y
# CONFIG_ESP_NETIF_LOOPBACK is not set
CONFIG_ESP_NETIF_TCPIP_ADAPTER_COMPATIBLE_LAYER=y
# end of ESP NETIF Adapter

#
# PHY
#
CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y
# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set
CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20
CONFIG_ESP_PHY_MAX_TX_POWER=20
CONFIG_ESP_PHY_REDUCE_TX_POWER=y
# end of PHY

#
# Power Management
#
# CONFIG_PM_ENABLE is not set
# end of Power Management

#
# ESP System Settings
#
# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set
CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y
# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set
# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set
# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set

#
# Memory protection
#
# end of Memory protection

CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32
CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304
CONFIG_ESP_MAIN_TASK_STACK_SIZE=8192
CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y
# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set
# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set
CONFIG_ESP_MAIN_TASK_AFFINITY=0x0
CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048
CONFIG_ESP_CONSOLE_UART_DEFAULT=y
# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set
# CONFIG_ESP_CONSOLE_NONE is not set
CONFIG_ESP_CONSOLE_UART=y
CONFIG_ESP_CONSOLE_MULTIPLE_UART=y
CONFIG_ESP_CONSOLE_UART_NUM=0
CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200
CONFIG_ESP_INT_WDT=y
CONFIG_ESP_INT_WDT_TIMEOUT_MS=300
CONFIG_ESP_INT_WDT_CHECK_CPU1=y
CONFIG_ESP_TASK_WDT=y
# CONFIG_ESP_TASK_WDT_PANIC is not set
CONFIG_ESP_TASK_WDT_TIMEOUT_S=5
CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y
CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y
# CONFIG_ESP_PANIC_HANDLER_IRAM is not set
# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set
# CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 is not set
CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y
# end of ESP System Settings

#
# High resolution timer (esp_timer)
#
# CONFIG_ESP_TIMER_PROFILING is not set
CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y
CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y
CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584
CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1
# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set
# CONFIG_ESP_TIMER_IMPL_FRC2 is not set
CONFIG_ESP_TIMER_IMPL_TG0_LAC=y
# end of High resolution timer (esp_timer)

#
# Wi-Fi
#
CONFIG_ESP32_WIFI_ENABLED=y
CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10
CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32
# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set
CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y
CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1
CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32
# CONFIG_ESP32_WIFI_CSI_ENABLED is not set
CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y
CONFIG_ESP32_WIFI_TX_BA_WIN=6
CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y
CONFIG_ESP32_WIFI_RX_BA_WIN=6
CONFIG_ESP32_WIFI_NVS_ENABLED=y
CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y
# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set
CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752
CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32
CONFIG_ESP32_WIFI_IRAM_OPT=y
CONFIG_ESP32_WIFI_RX_IRAM_OPT=y
CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y
# CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set
# CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE is not set
# CONFIG_ESP_WIFI_GMAC_SUPPORT is not set
CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y
# end of Wi-Fi

#
# Core dump
#
# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set
# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set
CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y
# end of Core dump

#
# FAT Filesystem support
#
# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set
CONFIG_FATFS_CODEPAGE_437=y
# CONFIG_FATFS_CODEPAGE_720 is not set
# CONFIG_FATFS_CODEPAGE_737 is not set
# CONFIG_FATFS_CODEPAGE_771 is not set
# CONFIG_FATFS_CODEPAGE_775 is not set
# CONFIG_FATFS_CODEPAGE_850 is not set
# CONFIG_FATFS_CODEPAGE_852 is not set
# CONFIG_FATFS_CODEPAGE_855 is not set
# CONFIG_FATFS_CODEPAGE_857 is not set
# CONFIG_FATFS_CODEPAGE_860 is not set
# CONFIG_FATFS_CODEPAGE_861 is not set
# CONFIG_FATFS_CODEPAGE_862 is not set
# CONFIG_FATFS_CODEPAGE_863 is not set
# CONFIG_FATFS_CODEPAGE_864 is not set
# CONFIG_FATFS_CODEPAGE_865 is not set
# CONFIG_FATFS_CODEPAGE_866 is not set
# CONFIG_FATFS_CODEPAGE_869 is not set
# CONFIG_FATFS_CODEPAGE_932 is not set
# CONFIG_FATFS_CODEPAGE_936 is not set
# CONFIG_FATFS_CODEPAGE_949 is not set
# CONFIG_FATFS_CODEPAGE_950 is not set
CONFIG_FATFS_CODEPAGE=437
CONFIG_FATFS_LFN_NONE=y
# CONFIG_FATFS_LFN_HEAP is not set
# CONFIG_FATFS_LFN_STACK is not set
CONFIG_FATFS_FS_LOCK=0
CONFIG_FATFS_TIMEOUT_MS=10000
CONFIG_FATFS_PER_FILE_CACHE=y
# CONFIG_FATFS_USE_FASTSEEK is not set
# end of FAT Filesystem support

#
# Modbus configuration
#
CONFIG_FMB_COMM_MODE_TCP_EN=y
CONFIG_FMB_TCP_PORT_DEFAULT=502
CONFIG_FMB_TCP_PORT_MAX_CONN=5
CONFIG_FMB_TCP_CONNECTION_TOUT_SEC=20
CONFIG_FMB_COMM_MODE_RTU_EN=y
CONFIG_FMB_COMM_MODE_ASCII_EN=y
CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND=150
CONFIG_FMB_MASTER_DELAY_MS_CONVERT=200
CONFIG_FMB_QUEUE_LENGTH=20
CONFIG_FMB_PORT_TASK_STACK_SIZE=4096
CONFIG_FMB_SERIAL_BUF_SIZE=256
CONFIG_FMB_SERIAL_ASCII_BITS_PER_SYMB=8
CONFIG_FMB_SERIAL_ASCII_TIMEOUT_RESPOND_MS=1000
CONFIG_FMB_PORT_TASK_PRIO=10
# CONFIG_FMB_PORT_TASK_AFFINITY_NO_AFFINITY is not set
CONFIG_FMB_PORT_TASK_AFFINITY_CPU0=y
# CONFIG_FMB_PORT_TASK_AFFINITY_CPU1 is not set
CONFIG_FMB_PORT_TASK_AFFINITY=0x0
CONFIG_FMB_CONTROLLER_SLAVE_ID_SUPPORT=y
CONFIG_FMB_CONTROLLER_SLAVE_ID=0x00112233
CONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT=20
CONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE=20
CONFIG_FMB_CONTROLLER_STACK_SIZE=4096
CONFIG_FMB_EVENT_QUEUE_TIMEOUT=20
# CONFIG_FMB_TIMER_PORT_ENABLED is not set
CONFIG_FMB_TIMER_GROUP=0
CONFIG_FMB_TIMER_INDEX=0
CONFIG_FMB_MASTER_TIMER_GROUP=0
CONFIG_FMB_MASTER_TIMER_INDEX=0
# CONFIG_FMB_TIMER_ISR_IN_IRAM is not set
# end of Modbus configuration

#
# FreeRTOS
#
# CONFIG_FREERTOS_UNICORE is not set
CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF
CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER=y
CONFIG_FREERTOS_CORETIMER_0=y
# CONFIG_FREERTOS_CORETIMER_1 is not set
CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y
CONFIG_FREERTOS_HZ=100
CONFIG_FREERTOS_ASSERT_ON_UNTESTED_FUNCTION=y
# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set
# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set
CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y
# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set
CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y
CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1
CONFIG_FREERTOS_ASSERT_FAIL_ABORT=y
# CONFIG_FREERTOS_ASSERT_FAIL_PRINT_CONTINUE is not set
# CONFIG_FREERTOS_ASSERT_DISABLE is not set
CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536
CONFIG_FREERTOS_ISR_STACKSIZE=1536
# CONFIG_FREERTOS_LEGACY_HOOKS is not set
CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16
CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y
# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set
CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1
CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048
CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10
CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0
# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set
# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set
CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y
CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y
# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set
# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set
CONFIG_FREERTOS_DEBUG_OCDAWARE=y
# CONFIG_FREERTOS_FPU_IN_ISR is not set
CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y
# CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH is not set
# end of FreeRTOS

#
# Hardware Abstraction Layer (HAL) and Low Level (LL)
#
CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y
# CONFIG_HAL_ASSERTION_DISABLE is not set
# CONFIG_HAL_ASSERTION_SILIENT is not set
# CONFIG_HAL_ASSERTION_ENABLE is not set
CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2
# end of Hardware Abstraction Layer (HAL) and Low Level (LL)

#
# Heap memory debugging
#
CONFIG_HEAP_POISONING_DISABLED=y
# CONFIG_HEAP_POISONING_LIGHT is not set
# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set
CONFIG_HEAP_TRACING_OFF=y
# CONFIG_HEAP_TRACING_STANDALONE is not set
# CONFIG_HEAP_TRACING_TOHOST is not set
# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set
# end of Heap memory debugging

#
# jsmn
#
# CONFIG_JSMN_PARENT_LINKS is not set
# CONFIG_JSMN_STRICT is not set
# end of jsmn

#
# libsodium
#
# end of libsodium

#
# Log output
#
# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set
# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set
# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set
CONFIG_LOG_DEFAULT_LEVEL_INFO=y
# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set
# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set
CONFIG_LOG_DEFAULT_LEVEL=3
CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y
# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set
# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set
CONFIG_LOG_MAXIMUM_LEVEL=3
CONFIG_LOG_COLORS=y
CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y
# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set
# end of Log output

#
# LWIP
#
CONFIG_LWIP_LOCAL_HOSTNAME="espressif"
# CONFIG_LWIP_NETIF_API is not set
# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set
CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y
# CONFIG_LWIP_L2_TO_L3_COPY is not set
# CONFIG_LWIP_IRAM_OPTIMIZATION is not set
CONFIG_LWIP_TIMERS_ONDEMAND=y
CONFIG_LWIP_MAX_SOCKETS=10
# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set
# CONFIG_LWIP_SO_LINGER is not set
CONFIG_LWIP_SO_REUSE=y
CONFIG_LWIP_SO_REUSE_RXTOALL=y
# CONFIG_LWIP_SO_RCVBUF is not set
# CONFIG_LWIP_NETBUF_RECVINFO is not set
CONFIG_LWIP_IP4_FRAG=y
CONFIG_LWIP_IP6_FRAG=y
# CONFIG_LWIP_IP4_REASSEMBLY is not set
# CONFIG_LWIP_IP6_REASSEMBLY is not set
# CONFIG_LWIP_IP_FORWARD is not set
# CONFIG_LWIP_STATS is not set
# CONFIG_LWIP_ETHARP_TRUST_IP_MAC is not set
CONFIG_LWIP_ESP_GRATUITOUS_ARP=y
CONFIG_LWIP_GARP_TMR_INTERVAL=60
CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32
CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y
# CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set
CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y
# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set
CONFIG_LWIP_DHCP_OPTIONS_LEN=68

#
# DHCP server
#
CONFIG_LWIP_DHCPS=y
CONFIG_LWIP_DHCPS_LEASE_UNIT=60
CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8
# end of DHCP server

# CONFIG_LWIP_AUTOIP is not set
CONFIG_LWIP_IPV6=y
# CONFIG_LWIP_IPV6_AUTOCONFIG is not set
CONFIG_LWIP_IPV6_NUM_ADDRESSES=3
# CONFIG_LWIP_IPV6_FORWARD is not set
# CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set
CONFIG_LWIP_NETIF_LOOPBACK=y
CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8

#
# TCP
#
CONFIG_LWIP_MAX_ACTIVE_TCP=16
CONFIG_LWIP_MAX_LISTENING_TCP=16
CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y
CONFIG_LWIP_TCP_MAXRTX=12
CONFIG_LWIP_TCP_SYNMAXRTX=12
CONFIG_LWIP_TCP_MSS=1440
CONFIG_LWIP_TCP_TMR_INTERVAL=250
CONFIG_LWIP_TCP_MSL=60000
CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5744
CONFIG_LWIP_TCP_WND_DEFAULT=5744
CONFIG_LWIP_TCP_RECVMBOX_SIZE=6
CONFIG_LWIP_TCP_QUEUE_OOSEQ=y
# CONFIG_LWIP_TCP_SACK_OUT is not set
# CONFIG_LWIP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set
CONFIG_LWIP_TCP_OVERSIZE_MSS=y
# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set
# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set
CONFIG_LWIP_TCP_RTO_TIME=1500
# end of TCP

#
# UDP
#
CONFIG_LWIP_MAX_UDP_PCBS=16
CONFIG_LWIP_UDP_RECVMBOX_SIZE=6
# end of UDP

#
# Checksums
#
# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set
# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set
CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y
# end of Checksums

CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072
CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y
# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set
# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set
CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF
# CONFIG_LWIP_PPP_SUPPORT is not set
CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3
CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5
# CONFIG_LWIP_SLIP_SUPPORT is not set

#
# ICMP
#
CONFIG_LWIP_ICMP=y
# CONFIG_LWIP_MULTICAST_PING is not set
# CONFIG_LWIP_BROADCAST_PING is not set
# end of ICMP

#
# LWIP RAW API
#
CONFIG_LWIP_MAX_RAW_PCBS=16
# end of LWIP RAW API

#
# SNTP
#
CONFIG_LWIP_SNTP_MAX_SERVERS=1
# CONFIG_LWIP_DHCP_GET_NTP_SRV is not set
CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000
# end of SNTP

CONFIG_LWIP_ESP_LWIP_ASSERT=y

#
# Hooks
#
# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set
CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y
# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set
CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y
# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set
# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set
CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y
# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set
# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set
CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y
# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set
# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set
# end of Hooks

# CONFIG_LWIP_DEBUG is not set
# end of LWIP

#
# mbedTLS
#
CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y
# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set
# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set
CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y
CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384
CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096
# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set
# CONFIG_MBEDTLS_DEBUG is not set

#
# mbedTLS v2.28.x related
#
# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set
# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set
# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set
CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y
# end of mbedTLS v2.28.x related

#
# Certificate Bundle
#
CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y
CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y
# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set
# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set
# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set
# end of Certificate Bundle

# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set
# CONFIG_MBEDTLS_CMAC_C is not set
CONFIG_MBEDTLS_HARDWARE_AES=y
CONFIG_MBEDTLS_HARDWARE_MPI=y
CONFIG_MBEDTLS_HARDWARE_SHA=y
CONFIG_MBEDTLS_ROM_MD5=y
# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set
# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set
CONFIG_MBEDTLS_HAVE_TIME=y
# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set
CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y
CONFIG_MBEDTLS_SHA512_C=y
CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y
# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set
# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set
# CONFIG_MBEDTLS_TLS_DISABLED is not set
CONFIG_MBEDTLS_TLS_SERVER=y
CONFIG_MBEDTLS_TLS_CLIENT=y
CONFIG_MBEDTLS_TLS_ENABLED=y

#
# TLS Key Exchange Methods
#
# CONFIG_MBEDTLS_PSK_MODES is not set
CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y
CONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA=y
CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y
CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y
# end of TLS Key Exchange Methods

CONFIG_MBEDTLS_SSL_RENEGOTIATION=y
# CONFIG_MBEDTLS_SSL_PROTO_SSL3 is not set
CONFIG_MBEDTLS_SSL_PROTO_TLS1=y
CONFIG_MBEDTLS_SSL_PROTO_TLS1_1=y
CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y
# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set
# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set
CONFIG_MBEDTLS_SSL_ALPN=y
CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y
CONFIG_MBEDTLS_X509_CHECK_KEY_USAGE=y
CONFIG_MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE=y
CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y

#
# Symmetric Ciphers
#
CONFIG_MBEDTLS_AES_C=y
# CONFIG_MBEDTLS_CAMELLIA_C is not set
# CONFIG_MBEDTLS_DES_C is not set
CONFIG_MBEDTLS_RC4_DISABLED=y
# CONFIG_MBEDTLS_RC4_ENABLED_NO_DEFAULT is not set
# CONFIG_MBEDTLS_RC4_ENABLED is not set
# CONFIG_MBEDTLS_BLOWFISH_C is not set
# CONFIG_MBEDTLS_XTEA_C is not set
CONFIG_MBEDTLS_CCM_C=y
CONFIG_MBEDTLS_GCM_C=y
# CONFIG_MBEDTLS_NIST_KW_C is not set
# end of Symmetric Ciphers

# CONFIG_MBEDTLS_RIPEMD160_C is not set

#
# Certificates
#
CONFIG_MBEDTLS_PEM_PARSE_C=y
CONFIG_MBEDTLS_PEM_WRITE_C=y
CONFIG_MBEDTLS_X509_CRL_PARSE_C=y
CONFIG_MBEDTLS_X509_CSR_PARSE_C=y
# end of Certificates

CONFIG_MBEDTLS_ECP_C=y
CONFIG_MBEDTLS_ECDH_C=y
CONFIG_MBEDTLS_ECDSA_C=y
# CONFIG_MBEDTLS_ECJPAKE_C is not set
CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y
CONFIG_MBEDTLS_ECP_NIST_OPTIM=y
# CONFIG_MBEDTLS_POLY1305_C is not set
# CONFIG_MBEDTLS_CHACHA20_C is not set
# CONFIG_MBEDTLS_HKDF_C is not set
# CONFIG_MBEDTLS_THREADING_C is not set
# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set
# CONFIG_MBEDTLS_SECURITY_RISKS is not set
# end of mbedTLS

#
# mDNS
#
CONFIG_MDNS_MAX_SERVICES=10
CONFIG_MDNS_TASK_PRIORITY=1
CONFIG_MDNS_TASK_STACK_SIZE=4096
# CONFIG_MDNS_TASK_AFFINITY_NO_AFFINITY is not set
CONFIG_MDNS_TASK_AFFINITY_CPU0=y
# CONFIG_MDNS_TASK_AFFINITY_CPU1 is not set
CONFIG_MDNS_TASK_AFFINITY=0x0
CONFIG_MDNS_SERVICE_ADD_TIMEOUT_MS=2000
# CONFIG_MDNS_STRICT_MODE is not set
CONFIG_MDNS_TIMER_PERIOD_MS=100
# CONFIG_MDNS_NETWORKING_SOCKET is not set
CONFIG_MDNS_MULTIPLE_INSTANCE=y
# end of mDNS

#
# ESP-MQTT Configurations
#
CONFIG_MQTT_PROTOCOL_311=y
CONFIG_MQTT_TRANSPORT_SSL=y
CONFIG_MQTT_TRANSPORT_WEBSOCKET=y
CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y
# CONFIG_MQTT_MSG_ID_INCREMENTAL is not set
# CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set
# CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set
# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set
# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set
# CONFIG_MQTT_CUSTOM_OUTBOX is not set
# end of ESP-MQTT Configurations

#
# Newlib
#
CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y
# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set
# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set
# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set
# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set
CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y
# CONFIG_NEWLIB_NANO_FORMAT is not set
# end of Newlib

#
# NVS
#
# end of NVS

#
# OpenSSL
#
# CONFIG_OPENSSL_DEBUG is not set
CONFIG_OPENSSL_ERROR_STACK=y
# CONFIG_OPENSSL_ASSERT_DO_NOTHING is not set
CONFIG_OPENSSL_ASSERT_EXIT=y
# end of OpenSSL

#
# OpenThread
#
# CONFIG_OPENTHREAD_ENABLED is not set
# end of OpenThread

#
# PThreads
#
CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5
CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072
CONFIG_PTHREAD_STACK_MIN=768
CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y
# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set
# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set
CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1
CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread"
# end of PThreads

#
# SPI Flash driver
#
# CONFIG_SPI_FLASH_VERIFY_WRITE is not set
# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set
CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
# CONFIG_SPI_FLASH_USE_LEGACY_IMPL is not set
# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20
CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1
CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192
# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set
# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set
# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set

#
# Auto-detect flash chips
#
CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y
CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y
CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y
CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y
# CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP is not set
# CONFIG_SPI_FLASH_SUPPORT_TH_CHIP is not set
# end of Auto-detect flash chips

CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y
# end of SPI Flash driver

#
# SPIFFS Configuration
#
CONFIG_SPIFFS_MAX_PARTITIONS=3

#
# SPIFFS Cache Configuration
#
CONFIG_SPIFFS_CACHE=y
CONFIG_SPIFFS_CACHE_WR=y
# CONFIG_SPIFFS_CACHE_STATS is not set
# end of SPIFFS Cache Configuration

CONFIG_SPIFFS_PAGE_CHECK=y
CONFIG_SPIFFS_GC_MAX_RUNS=10
# CONFIG_SPIFFS_GC_STATS is not set
CONFIG_SPIFFS_PAGE_SIZE=256
CONFIG_SPIFFS_OBJ_NAME_LEN=32
# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set
CONFIG_SPIFFS_USE_MAGIC=y
CONFIG_SPIFFS_USE_MAGIC_LENGTH=y
CONFIG_SPIFFS_META_LENGTH=4
CONFIG_SPIFFS_USE_MTIME=y

#
# Debug Configuration
#
# CONFIG_SPIFFS_DBG is not set
# CONFIG_SPIFFS_API_DBG is not set
# CONFIG_SPIFFS_GC_DBG is not set
# CONFIG_SPIFFS_CACHE_DBG is not set
# CONFIG_SPIFFS_CHECK_DBG is not set
# CONFIG_SPIFFS_TEST_VISUALISATION is not set
# end of Debug Configuration
# end of SPIFFS Configuration

#
# TCP Transport
#

#
# Websocket
#
CONFIG_WS_TRANSPORT=y
CONFIG_WS_BUFFER_SIZE=1024
# end of Websocket
# end of TCP Transport

#
# Unity unit testing library
#
CONFIG_UNITY_ENABLE_FLOAT=y
CONFIG_UNITY_ENABLE_DOUBLE=y
# CONFIG_UNITY_ENABLE_64BIT is not set
# CONFIG_UNITY_ENABLE_COLOR is not set
CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y
# CONFIG_UNITY_ENABLE_FIXTURE is not set
# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set
# end of Unity unit testing library

#
# Virtual file system
#
CONFIG_VFS_SUPPORT_IO=y
CONFIG_VFS_SUPPORT_DIR=y
CONFIG_VFS_SUPPORT_SELECT=y
CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y
CONFIG_VFS_SUPPORT_TERMIOS=y

#
# Host File System I/O (Semihosting)
#
CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1
CONFIG_VFS_SEMIHOSTFS_HOST_PATH_MAX_LEN=128
# end of Host File System I/O (Semihosting)
# end of Virtual file system

#
# Wear Levelling
#
# CONFIG_WL_SECTOR_SIZE_512 is not set
CONFIG_WL_SECTOR_SIZE_4096=y
CONFIG_WL_SECTOR_SIZE=4096
# end of Wear Levelling

#
# Wi-Fi Provisioning Manager
#
CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16
CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30
# end of Wi-Fi Provisioning Manager

#
# Supplicant
#
CONFIG_WPA_MBEDTLS_CRYPTO=y
# CONFIG_WPA_WAPI_PSK is not set
# CONFIG_WPA_SUITE_B_192 is not set
# CONFIG_WPA_DEBUG_PRINT is not set
# CONFIG_WPA_TESTING_OPTIONS is not set
# CONFIG_WPA_WPS_STRICT is not set
# CONFIG_WPA_11KV_SUPPORT is not set
# CONFIG_WPA_MBO_SUPPORT is not set
# CONFIG_WPA_DPP_SUPPORT is not set
# end of Supplicant
# end of Component config

#
# Compatibility options
#
# CONFIG_LEGACY_INCLUDE_COMMON_HEADERS is not set
# end of Compatibility options

# Deprecated options for backward compatibility
CONFIG_TOOLPREFIX="xtensa-esp32-elf-"
# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set
# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set
# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set
CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y
# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set
# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set
CONFIG_LOG_BOOTLOADER_LEVEL=3
# CONFIG_APP_ROLLBACK_ENABLE is not set
# CONFIG_FLASH_ENCRYPTION_ENABLED is not set
# CONFIG_FLASHMODE_QIO is not set
# CONFIG_FLASHMODE_QOUT is not set
CONFIG_FLASHMODE_DIO=y
# CONFIG_FLASHMODE_DOUT is not set
# CONFIG_MONITOR_BAUD_9600B is not set
# CONFIG_MONITOR_BAUD_57600B is not set
CONFIG_MONITOR_BAUD_115200B=y
# CONFIG_MONITOR_BAUD_230400B is not set
# CONFIG_MONITOR_BAUD_921600B is not set
# CONFIG_MONITOR_BAUD_2MB is not set
# CONFIG_MONITOR_BAUD_OTHER is not set
CONFIG_MONITOR_BAUD_OTHER_VAL=115200
CONFIG_MONITOR_BAUD=115200
CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y
# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set
CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y
# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set
# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set
CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2
# CONFIG_CXX_EXCEPTIONS is not set
CONFIG_STACK_CHECK_NONE=y
# CONFIG_STACK_CHECK_NORM is not set
# CONFIG_STACK_CHECK_STRONG is not set
# CONFIG_STACK_CHECK_ALL is not set
# CONFIG_WARN_WRITE_STRINGS is not set
# CONFIG_DISABLE_GCC8_WARNINGS is not set
# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set
CONFIG_ESP32_APPTRACE_DEST_NONE=y
CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y
CONFIG_ADC2_DISABLE_DAC=y
# CONFIG_SPIRAM_SUPPORT is not set
CONFIG_TRACEMEM_RESERVE_DRAM=0x0
# CONFIG_ULP_COPROC_ENABLED is not set
CONFIG_ULP_COPROC_RESERVE_MEM=0
CONFIG_BROWNOUT_DET=y
CONFIG_BROWNOUT_DET_LVL_SEL_0=y
# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set
# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set
# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set
# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set
# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set
# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set
# CONFIG_BROWNOUT_DET_LVL_SEL_7 is not set
CONFIG_BROWNOUT_DET_LVL=0
CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y
# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set
# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC is not set
# CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256 is not set
# CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set
# CONFIG_NO_BLOBS is not set
# CONFIG_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set
# CONFIG_EVENT_LOOP_PROFILING is not set
CONFIG_POST_EVENTS_FROM_ISR=y
CONFIG_POST_EVENTS_FROM_IRAM_ISR=y
# CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set
CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y
CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4
CONFIG_ESP_SYSTEM_PD_FLASH=y
# CONFIG_ESP32C3_LIGHTSLEEP_GPIO_RESET_WORKAROUND is not set
CONFIG_IPC_TASK_STACK_SIZE=1536
CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y
# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set
CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20
CONFIG_ESP32_PHY_MAX_TX_POWER=20
CONFIG_ESP32_REDUCE_PHY_TX_POWER=y
# CONFIG_ESP32S2_PANIC_PRINT_HALT is not set
CONFIG_ESP32S2_PANIC_PRINT_REBOOT=y
# CONFIG_ESP32S2_PANIC_SILENT_REBOOT is not set
# CONFIG_ESP32S2_PANIC_GDBSTUB is not set
CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32
CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304
CONFIG_MAIN_TASK_STACK_SIZE=8192
CONFIG_CONSOLE_UART_DEFAULT=y
# CONFIG_CONSOLE_UART_CUSTOM is not set
# CONFIG_ESP_CONSOLE_UART_NONE is not set
CONFIG_CONSOLE_UART=y
CONFIG_CONSOLE_UART_NUM=0
CONFIG_CONSOLE_UART_BAUDRATE=115200
CONFIG_INT_WDT=y
CONFIG_INT_WDT_TIMEOUT_MS=300
CONFIG_INT_WDT_CHECK_CPU1=y
CONFIG_TASK_WDT=y
# CONFIG_TASK_WDT_PANIC is not set
CONFIG_TASK_WDT_TIMEOUT_S=5
CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y
CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y
# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set
CONFIG_TIMER_TASK_STACK_SIZE=3584
# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set
# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set
CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y
CONFIG_MB_MASTER_TIMEOUT_MS_RESPOND=150
CONFIG_MB_MASTER_DELAY_MS_CONVERT=200
CONFIG_MB_QUEUE_LENGTH=20
CONFIG_MB_SERIAL_TASK_STACK_SIZE=4096
CONFIG_MB_SERIAL_BUF_SIZE=256
CONFIG_MB_SERIAL_TASK_PRIO=10
CONFIG_MB_CONTROLLER_SLAVE_ID_SUPPORT=y
CONFIG_MB_CONTROLLER_SLAVE_ID=0x00112233
CONFIG_MB_CONTROLLER_NOTIFY_TIMEOUT=20
CONFIG_MB_CONTROLLER_NOTIFY_QUEUE_SIZE=20
CONFIG_MB_CONTROLLER_STACK_SIZE=4096
CONFIG_MB_EVENT_QUEUE_TIMEOUT=20
# CONFIG_MB_TIMER_PORT_ENABLED is not set
CONFIG_MB_TIMER_GROUP=0
CONFIG_MB_TIMER_INDEX=0
# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set
CONFIG_TIMER_TASK_PRIORITY=1
CONFIG_TIMER_TASK_STACK_DEPTH=2048
CONFIG_TIMER_QUEUE_LENGTH=10
# CONFIG_L2_TO_L3_COPY is not set
# CONFIG_USE_ONLY_LWIP_SELECT is not set
CONFIG_ESP_GRATUITOUS_ARP=y
CONFIG_GARP_TMR_INTERVAL=60
CONFIG_TCPIP_RECVMBOX_SIZE=32
CONFIG_TCP_MAXRTX=12
CONFIG_TCP_SYNMAXRTX=12
CONFIG_TCP_MSS=1440
CONFIG_TCP_MSL=60000
CONFIG_TCP_SND_BUF_DEFAULT=5744
CONFIG_TCP_WND_DEFAULT=5744
CONFIG_TCP_RECVMBOX_SIZE=6
CONFIG_TCP_QUEUE_OOSEQ=y
# CONFIG_ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set
CONFIG_TCP_OVERSIZE_MSS=y
# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set
# CONFIG_TCP_OVERSIZE_DISABLE is not set
CONFIG_UDP_RECVMBOX_SIZE=6
CONFIG_TCPIP_TASK_STACK_SIZE=3072
CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y
# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set
# CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set
CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF
# CONFIG_PPP_SUPPORT is not set
CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5
CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072
CONFIG_ESP32_PTHREAD_STACK_MIN=768
CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y
# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set
# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set
CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1
CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread"
CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y
# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set
# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set
CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y
CONFIG_SUPPORT_TERMIOS=y
CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1
CONFIG_SEMIHOSTFS_HOST_PATH_MAX_LEN=128
# End of deprecated options


================================================
FILE: examples/ESP-TLS/main.cpp
================================================
// matth-x/MicroOcpp
// Copyright Matthias Akstaller 2019 - 2024
// MIT License

#include <Arduino.h>
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti WiFiMulti;
#elif defined(ESP32)
#include <WiFi.h>
#else
#error only ESP32 or ESP8266 supported at the moment
#endif

#include <MicroOcpp.h>

#define STASSID "YOUR_WIFI_SSID"
#define STAPSK  "YOUR_WIFI_PW"

#define OCPP_BACKEND_URL   "wss://echo.websocket.events"
#define OCPP_CHARGE_BOX_ID ""
#define OCPP_AUTH_KEY      "SecureAuthKey" // OCPP Security Profile 2: TLS with Basic Authentication

/*
 * ISRG ROOT X1
 */
const char ca_cert[] PROGMEM = R"EOF(-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
-----END CERTIFICATE-----
)EOF";

void setup() {

    /*
     * Initialize Serial and WiFi
     */ 

    Serial.begin(115200);

    Serial.print(F("[main] Wait for WiFi: "));

#if defined(ESP8266)
    WiFiMulti.addAP(STASSID, STAPSK);
    while (WiFiMulti.run() != WL_CONNECTED) {
        Serial.print('.');
        delay(1000);
    }
#elif defined(ESP32)
    WiFi.begin(STASSID, STAPSK);
    while (!WiFi.isConnected()) {
        Serial.print('.');
        delay(1000);
    }
#else
#error only ESP32 or ESP8266 supported at the moment
#endif

    Serial.println(F(" connected!"));

    /*
     * Set system time (required for Certificate validation)
     */
    configTime(3 * 3600, 0, "pool.ntp.org", "time.nist.gov"); //alternatively: settimeofday(&de, &tz);
    Serial.print(F("[main] Wait for NTP time (used for certificate validation) "));
    time_t now = time(nullptr);
    while (now < 8 * 3600 * 2) {
        delay(1000);
        Serial.print('.');
        now = time(nullptr);
    }
    Serial.printf(" finished. Unix timestamp is %lu\n", now);
    
    /*
     * Initialize the OCPP library (using OCPP Security Profile 2: TLS with Basic Authentication)
     */
    mocpp_initialize(
            OCPP_BACKEND_URL,
            OCPP_CHARGE_BOX_ID,
            "My Charging Station",
            "My company name",
            MicroOcpp::FilesystemOpt::Use_Mount_FormatOnFail,
            OCPP_AUTH_KEY,
            ca_cert);

    /*
     * ... see MicroOcpp.h for how to integrate the EVSE hardware.
     *
     * This example only showcases the TLS connection. For examples about the HW integration,
     * see the other examples
     */
}

void loop() {

    /*
     * Execute all charge point routines and handle WebSocket
     */
    mocpp_loop();

    //... see MicroOcpp.h and the other examples for how to integrate the EVSE hardware.
}


================================================
FILE: library.json
================================================
{
    "name": "MicroOcpp",
    "version": "1.2.0",
    "description": "OCPP 1.6 / 2.0.1 Client for microcontrollers",
    "keywords": "OCPP, 1.6, OCPP 1.6, OCPP 2.0.1, Smart Energy, Smart Charging, client, ESP8266, ESP32, Arduino, esp-idf, EVSE, Charge Point",
    "repository":
    {
        "type": "git",
        "url": "https://github.com/matth-x/MicroOcpp/"
    },
    "authors":
    [
      {
        "name": "Matthias Akstaller",
        "url": "https://www.micro-ocpp.com",
        "maintainer": true
      }
    ],
    "license": "MIT",
    "homepage": "https://www.micro-ocpp.com",
    "dependencies": [
        {
            "owner": "bblanchon",
            "name": "ArduinoJson",
            "version": "6.20.1"
        },
        {
            "owner": "links2004",
            "name": "WebSockets",
            "version": "2.4.1"
        }
      ],
    "frameworks": "arduino,espidf",
    "platforms": "espressif8266, espressif32",

    "export": {
        "include":
        [
            "docs/*",
            "examples/*",
            "src/*",
            "CHANGELOG.md",
            "CMakeLists.txt",
            "library.json",
            "library.properties",
            "LICENSE",
            "mkdocs.yml",
            "platformio.ini",
            "README.md"
        ]
    },

    "examples": [
      {
          "name": "Basic OCPP connection",
          "base": "examples/ESP",
          "files": [
              "main.cpp"
          ]
      },
      {
          "name": "OCPP Security Profile 2",
          "base": "examples/ESP-TLS",
          "files": [
              "main.cpp"
          ]
      },
      {
        "name": "ESP-IDF integration",
        "base": "examples/ESP-IDF",
        "files": [
            "main/main.c"
        ]
      }
    ]
}


================================================
FILE: library.properties
================================================
name=MicroOcpp
version=1.2.0
author=Matthias Akstaller
maintainer=Matthias Akstaller
sentence=OCPP 1.6 Client for microcontrollers
paragraph=
category=Communication
url=https://github.com/matth-x/MicroOcpp/
architectures=*
depends=ArduinoJson, WebSockets


================================================
FILE: mkdocs.yml
================================================
site_name: MicroOCPP docs

theme:
  name: material
  features:
    - announce.dismiss
    - content.action.edit
    - content.action.view
    - content.code.annotate
    - content.code.copy
    # - content.tabs.link
    - content.tooltips
    # - header.autohide
    # - navigation.expand
    - navigation.footer
    - navigation.indexes
    # - navigation.instant
    # - navigation.prune
    - navigation.sections
    - navigation.tabs
    # - navigation.tabs.sticky
    - navigation.top
    - navigation.tracking
    - search.highlight
    - search.share
    - search.suggest
    - toc.follow
    # - toc.integrate
  palette:
    - scheme: default
      primary: custom
      accent: custom
      toggle:
        icon: material/brightness-7
        name: Switch to dark mode
    - scheme: slate
      primary: custom
      accent: custom
      toggle:
        icon: material/brightness-4
        name: Switch to light mode
  font:
    text: Roboto
    code: Roboto Mono
  favicon: img/favicon.ico
  icon:
    logo: logo

extra_css:
  - stylesheets/extra.css

plugins:
  - search
  - table-reader:
      data_path: "docs/assets/tables"


================================================
FILE: platformio.ini
================================================
; matth-x/MicroOcpp
; Copyright Matthias Akstaller 2019 - 2024
; MIT License

[platformio]
default_envs = esp32-development-board

[common]
framework = arduino
lib_deps =
    bblanchon/ArduinoJson@6.20.1
    links2004/WebSockets@2.4.1
monitor_speed = 115200

[env:nodemcuv2]
platform = espressif8266@2.6.3
board = nodemcuv2
framework = ${common.framework}
lib_deps = ${common.lib_deps}
monitor_speed = ${common.monitor_speed}
build_flags =
    -D MO_DBG_LEVEL=MO_DL_INFO ; flood the serial monitor with information about the internal state
    -DMO_TRAFFIC_OUT   ; print the OCPP communication to the serial monitor
    -D ARDUINOJSON_ENABLE_STD_STRING=1

[env:esp32-development-board]
platform = espressif32@6.0.1
board = esp-wrover-kit
framework = ${common.framework}
lib_deps = ${common.lib_deps}
monitor_speed = ${common.monitor_speed}
build_flags =
    -D MO_DBG_LEVEL=MO_DL_INFO ; flood the serial monitor with information about the internal state
    -DMO_TRAFFIC_OUT   ; print the OCPP communication to the serial monitor
board_build.partitions = min_spiffs.csv
upload_speed = 921600
monitor_filters =
    esp32_exception_decoder


================================================
FILE: src/MicroOcpp/Core/Configuration.cpp
================================================
// matth-x/MicroOcpp
// Copyright Matthias Akstaller 2019 - 2024
// MIT License

#include <MicroOcpp/Core/Configuration.h>
#include <MicroOcpp/Core/ConfigurationContainerFlash.h>
#include <MicroOcpp/Core/Memory.h>
#include <MicroOcpp/Debug.h>

#include <string.h>
#include <algorithm>
#include <ArduinoJson.h>

namespace MicroOcpp {

struct Validator {
    const char *key = nullptr;
    std::function<bool(const char*)> checkValue;
    Validator(const char *key, std::function<bool(const char*)> checkValue) : key(key), checkValue(checkValue) {

    }
};

namespace ConfigurationLocal {

std::shared_ptr<FilesystemAdapter> filesystem;
auto configurationContainers = makeVector<std::shared_ptr<ConfigurationContainer>>("v16.Configuration.Containers");
auto validators = makeVector<Validator>("v16.Configuration.Validators");

}

using namespace ConfigurationLocal;

std::unique_ptr<ConfigurationContainer> createConfigurationContainer(const char *filename, bool accessible) {
    //create non-persistent Configuration store (i.e. lives only in RAM) if
    //     - Flash FS usage is switched off OR
    //     - Filename starts with "/volatile"
    if (!filesystem ||
                 !strncmp(filename, CONFIGURATION_VOLATILE, strlen(CONFIGURATION_VOLATILE))) {
        return makeConfigurationContainerVolatile(filename, accessible);
    } else {
        //create persistent Configuration store. This is the normal case
        return makeConfigurationContainerFlash(filesystem, filename, accessible);
    }
}


void addConfigurationContainer(std::shared_ptr<ConfigurationContainer> container) {
    configurationContainers.push_back(container);
}

std::shared_ptr<ConfigurationContainer> getContainer(const char *filename) {
    auto container = std::find_if(configurationContainers.begin(), configurationContainers.end(),
        [filename](decltype(configurationContainers)::value_type &elem) {
            return !strcmp(elem->getFilename(), filename);
        });

    if (container != configurationContainers.end()) {
        return *container;
    } else {
        return nullptr;
    }
}

ConfigurationContainer *declareContainer(const char *filename, bool accessible) {

    auto container = getContainer(filename);
    
    if (!container) {
        MO_DBG_DEBUG("init new configurations container: %s", filename);

        container = createConfigurationContainer(filename, accessible);
        if (!container) {
            MO_DBG_ERR("OOM");
            return nullptr;
        }
        configurationContainers.push_back(container);
    }

    if (container->isAccessible() != accessible) {
        MO_DBG_ERR("%s: conflicting accessibility declarations (expect %s)", filename, container->isAccessible() ? "accessible" : "inaccessible");
    }

    return container.get();
}

std::shared_ptr<Configuration> loadConfiguration(TConfig type, const char *key, bool accessible) {
    for (auto& container : configurationContainers) {
        if (auto config = container->getConfiguration(key)) {
            if (config->getType() != type) {
                MO_DBG_ERR("conflicting type for %s - remove old config", key);
                container->remove(config.get());
                continue;
            }
            if (container->isAccessible() != accessible) {
                MO_DBG_ERR("conflicting accessibility for %s", key);
            }
            container->loadStaticKey(*config.get(), key);
            return config;
        }
    }
    return nullptr;
}

template<class T>
bool loadFactoryDefault(Configuration& config, T loadFactoryDefault);

template<>
bool loadFactoryDefault<int>(Configuration& config, int factoryDef) {
    config.setInt(factoryDef);
    return true;
}

template<>
bool loadFactoryDefault<bool>(Configuration& config, bool factoryDef) {
    config.setBool(factoryDef);
    return true;
}

template<>
bool loadFactoryDefault<const char*>(Configuration& config, const char *factoryDef) {
    return config.setString(factoryDef);
}

void loadPermissions(Configuration& config, bool readonly, bool rebootRequired) {
    if (readonly) {
        config.setReadOnly();
    }

    if (rebootRequired) {
        config.setRebootRequired();
    }
}

template<class T>
std::shared_ptr<Configuration> declareConfiguration(const char *key, T factoryDef, const char *filename, bool readonly, bool rebootRequired, bool accessible) {

    std::shared_ptr<Configuration> res = loadConfiguration(convertType<T>(), key, accessible);
    if (!res) {
        auto container = declareContainer(filename, accessible);
        if (!container) {
            return nullptr;
        }

        res = container->createConfiguration(convertType<T>(), key);
        if (!res) {
            return nullptr;
        }

        if (!loadFactoryDefault(*res.get(), factoryDef)) {
            container->remove(res.get());
            return nullptr;
        }
    }

    loadPermissions(*res.get(), readonly, rebootRequired);
    return res;
}

template std::shared_ptr<Configuration> declareConfiguration<int>(const char *key, int factoryDef, const char *filename, bool readonly, bool rebootRequired, bool accessible);
template std::shared_ptr<Configuration> declareConfiguration<bool>(const char *key, bool factoryDef, const char *filename, bool readonly, bool rebootRequired, bool accessible);
template std::shared_ptr<Configuration> declareConfiguration<const char*>(const char *key, const char *factoryDef, const char *filename, bool readonly, bool rebootRequired, bool accessible);

std::function<bool(const char*)> *getConfigurationValidator(const char *key) {
    for (auto& v : validators) {
        if (!strcmp(v.key, key)) {
            return &v.checkValue;
        }
    }
    return nullptr;
}

void registerConfigurationValidator(const char *key, std::function<bool(const char*)> validator) {
    for (auto& v : validators) {
        if (!strcmp(v.key, key)) {
            v.checkValue = validator;
            return;
        }
    }
    validators.push_back(Validator{key, validator});
}

Configuration *getConfigurationPublic(const char *key) {
    for (auto& container : configurationContainers) {
        if (container->isAccessible()) {
            if (auto res = container->getConfiguration(key)) {
                return res.get();
            }
        }
    }

    return nullptr;
}

Vector<ConfigurationContainer*> getConfigurationContainersPublic() {
    auto res = makeVector<ConfigurationContainer*>("v16.Configuration.Containers");

    for (auto& container : configurationContainers) {
        if (container->isAccessible()) {
            res.push_back(container.get());
        }
    }

    return res;
}

bool configuration_init(std::shared_ptr<FilesystemAdapter> _filesystem) {
    filesystem = _filesystem;
    return true;
}

void configuration_deinit() {
    makeVector<decltype(configurationContainers)::value_type>("v16.Configuration.Containers").swap(configurationContainers); //release allocated memory (see https://cplusplus.com/reference/vector/vector/clear/)
    makeVector<decltype(validators)::value_type>("v16.Configuration.Validators").swap(validators);
    filesystem.reset();
}

bool configuration_load(const char *filename) {
    bool success = true;

    for (auto& container : configurationContainers) {
        if ((!filename || !strcmp(filename, container->getFilename())) && !container->load()) {
            success = false;
        }
    }

    return success;
}

bool configuration_save() {
    bool success = true;

    for (auto& container : configurationContainers) {
        if (!container->save()) {
            success = false;
        }
    }

    return success;
}

bool configuration_clean_unused() {
    for (auto& container : configurationContainers) {
        container->removeUnused();
    }
    return configuration_save();
}

bool VALIDATE_UNSIGNED_INT(const char *value) {
    for(size_t i = 0; value[i] != '\0'; i++) {
        if (value[i] < '0' || value[i] > '9') {
            return false;
        }
    }
    return true;
}

} //end namespace MicroOcpp


================================================
FILE: src/MicroOcpp/Core/Configuration.h
================================================
// matth-x/MicroOcpp
// Copyright Matthias Akstaller 2019 - 2024
// MIT License

#ifndef MO_CONFIGURATION_H
#define MO_CONFIGURATION_H

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

#include <memory>

#define CONFIGURATION_FN (MO_FILENAME_PREFIX "ocpp-config.jsn")
#define CONFIGURATION_VOLATILE "/volatile"
#define MO_KEYVALUE_FN (MO_FILENAME_PREFIX "client-state.jsn")

namespace MicroOcpp {

template <class T>
std::shared_ptr<Configuration> declareConfiguration(const char *key, T factoryDefault, const char *filename = CONFIGURATION_FN, bool readonly = false, bool rebootRequired = false, bool accessible = true);

std::function<bool(const char*)> *getConfigurationValidator(const char *key);
void registerConfigurationValidator(const char *key, std::function<bool(const char*)> validator);

void addConfigurationContainer(std::shared_ptr<ConfigurationContainer> container);

Configuration *getConfigurationPublic(const char *key);
Vector<ConfigurationContainer*> getConfigurationContainersPublic();

bool configuration_init(std::shared_ptr<FilesystemAdapter> filesytem);
void configuration_deinit();

bool configuration_load(const char *filename = nullptr);

bool configuration_save();

bool configuration_clean_unused(); //remove configs which haven't been accessed

//default implementation for common validator
bool VALIDATE_UNSIGNED_INT(const char*);

} //end namespace MicroOcpp
#endif


================================================
FILE: src/MicroOcpp/Core/ConfigurationContainer.cpp
================================================
// matth-x/MicroOcpp
// Copyright Matthias Akstaller 2019 - 2024
// MIT License

#include <MicroOcpp/Core/ConfigurationContainer.h>

#include <MicroOcpp/Debug.h>

using namespace MicroOcpp;

ConfigurationContainer::~ConfigurationContainer() {

}

ConfigurationContainerVolatile::ConfigurationContainerVolatile(const char *filename, bool accessible) :
        ConfigurationContainer(filename, accessible), MemoryManaged("v16.Configuration.ContainerVoltaile.", filename), configurations(makeVector<std::shared_ptr<Configuration>>(getMemoryTag())) {

}

bool ConfigurationContainerVolatile::load() {
    return true;
}

bool ConfigurationContainerVolatile::save() {
    return true;
}

std::shared_ptr<Configuration> ConfigurationContainerVolatile::createConfiguration(TConfig type, const char *key) {
    auto res = std::shared_ptr<Configuration>(makeConfiguration(type, key).release(), std::default_delete<Configuration>(), makeAllocator<Configuration>("v16.Configuration.", key));
    if (!res) {
        //allocation failure - OOM
        MO_DBG_ERR("OOM");
        return nullptr;
    }
    configurations.push_back(res);
    return res;
}

void ConfigurationContainerVolatile::remove(Configuration *config) {
    for (auto entry = configurations.begin(); entry != configurations.end();) {
        if (entry->get() == config) {
            entry = configurations.erase(entry);
        } else {
            entry++;
        }
    }
}

size_t ConfigurationContainerVolatile::size() {
    return configurations.size();
}

Configuration *ConfigurationContainerVolatile::getConfiguration(size_t i) {
    return configurations[i].get();
}

std::shared_ptr<Configuration> ConfigurationContainerVolatile::getConfiguration(const char *key) {
    for (auto& entry : configurations) {
        if (entry->getKey() && !strcmp(entry->getKey(), key)) {
            return entry;
        }
    }
    return nullptr;
}

void ConfigurationContainerVolatile::add(std::shared_ptr<Configuration> c) {
    configurations.push_back(std::move(c));
}

namespace MicroOcpp {

std::unique_ptr<ConfigurationContainerVolatile> makeConfigurationContainerVolatile(const char *filename, bool accessible) {
    return std::unique_ptr<ConfigurationContainerVolatile>(new ConfigurationContainerVolatile(filename, accessible));
}

} //end namespace MicroOcpp


================================================
FILE: src/MicroOcpp/Core/ConfigurationContainer.h
================================================
// matth-x/MicroOcpp
// Copyright Matthias Akstaller 2019 - 2024
// MIT License

#ifndef MO_CONFIGURATIONCONTAINER_H
#define MO_CONFIGURATIONCONTAINER_H

#include <memory>

#include <MicroOcpp/Core/ConfigurationKeyValue.h>
#include <MicroOcpp/Core/Memory.h>

namespace MicroOcpp {

class ConfigurationContainer {
private:
    const char *filename;
    bool accessible;
public:
    ConfigurationContainer(const char *filename, bool accessible) : filename(filename), accessible(accessible) { }

    virtual ~ConfigurationContainer();

    const char *getFilename() {return filename;}
    bool isAccessible() {return accessible;}

    virtual bool load() = 0; //called at the end of mocpp_intialize, to load the configurations with the stored value
    virtual bool save() = 0;

    virtual std::shared_ptr<Configuration> createConfiguration(TConfig type, const char *key) = 0;
    virtual void remove(Configuration *config) = 0;

    virtual size_t size() = 0;
    virtual Configuration *getConfiguration(size_t i) = 0;
    virtual std::shared_ptr<Configuration> getConfiguration(const char *key) = 0;

    virtual void loadStaticKey(Configuration& config, const char *key) { } //possible optimization: can replace internal key with passed static key

    virtual void removeUnused() { } //remove configs which haven't been accessed (optional and only if known)
};

class ConfigurationContainerVolatile : public ConfigurationContainer, public MemoryManaged {
private:
    Vector<std::shared_ptr<Configuration>> configurations;
public:
    ConfigurationContainerVolatile(const char *filename, bool accessible);

    //ConfigurationContainer definitions
    bool load() override;
    bool save() override;
    std::shared_ptr<Configuration> createConfiguration(TConfig type, const char *key) override;
    void remove(Configuration *config) override;
    size_t size() override;
    Configuration *getConfiguration(size_t i) override;
    std::shared_ptr<Configuration> getConfiguration(const char *key) override;

    //add custom Configuration object
    void add(std::shared_ptr<Configuration> c);
};

std::unique_ptr<ConfigurationContainerVolatile> makeConfigurationContainerVolatile(const char *filename, bool accessible);

} //end namespace MicroOcpp

#endif


================================================
FILE: src/MicroOcpp/Core/ConfigurationContainerFlash.cpp
================================================
// matth-x/MicroOcpp
// Copyright Matthias Akstaller 2019 - 2024
// MIT License

#include <MicroOcpp/Core/ConfigurationContainerFlash.h>

#include <algorithm>
#include <MicroOcpp/Core/FilesystemUtils.h>
#include <MicroOcpp/Core/Memory.h>
#include <MicroOcpp/Debug.h>

#define MAX_CONFIGURATIONS 50

namespace MicroOcpp {

class ConfigurationContainerFlash : public ConfigurationContainer, public MemoryManaged {
private:
    Vector<std::shared_ptr<Configuration>> configurations;
    std::shared_ptr<FilesystemAdapter> filesystem;
    uint16_t revisionSum = 0;

    bool loaded = false;

    Vector<char*> keyPool;
    
    void clearKeyPool(const char *key) {
        auto it = keyPool.begin();
        while (it != keyPool.end()) {
            if (!strcmp(*it, key)) {
                MO_DBG_VERBOSE("clear key %s", key);
                MO_FREE(*it);
                it = keyPool.erase(it);
            } else {
                ++it;
            }
        }
    }

    bool configurationsUpdated() {
        auto revisionSum_old = revisionSum;

        revisionSum = 0;
        for (auto& config : configurations) {
            revisionSum += config->getValueRevision();
        }

        return revisionSum != revisionSum_old;
    }
public:
    ConfigurationContainerFlash(std::shared_ptr<FilesystemAdapter> filesystem, const char *filename, bool accessible) :
            ConfigurationContainer(filename, accessible), MemoryManaged("v16.Configuration.ContainerFlash.", filename), configurations(makeVector<std::shared_ptr<Configuration>>(getMemoryTag())), filesystem(filesystem), keyPool(makeVector<char*>(getMemoryTag())) { }

    ~ConfigurationContainerFlash() {
        auto it = keyPool.begin();
        while (it != keyPool.end()) {
            MO_FREE(*it);
            it = keyPool.erase(it);
        }
    }
    
    bool load() override {

        if (loaded) {
            return true;
        }

        if (!filesystem) {
            return false;
        }

        size_t file_size = 0;
        if (filesystem->stat(getFilename(), &file_size) != 0 // file does not exist
                || file_size == 0) {                         // file exists, but empty
            MO_DBG_DEBUG("Populate FS: create configuration file");
            return save();
        }

        auto doc = FilesystemUtils::loadJson(filesystem, getFilename(), getMemoryTag());
        if (!doc) {
            MO_DBG_ERR("failed to load %s", getFilename());
            return false;
        }

        JsonObject root = doc->as<JsonObject>();

        JsonObject configHeader = root["head"];

        if (strcmp(configHeader["content-type"] | "Invalid", "ocpp_config_file") &&
                strcmp(configHeader["content-type"] | "Invalid", "ao_configuration_file")) { //backwards-compatibility
            MO_DBG_ERR("Unable to initialize: unrecognized configuration file format");
            return false;
        }

        if (strcmp(configHeader["version"] | "Invalid", "2.0") &&
                strcmp(configHeader["version"] | "Invalid", "1.1")) { //backwards-compatibility
            MO_DBG_ERR("Unable to initialize: unsupported version");
            return false;
        }
        
        JsonArray configurationsArray = root["configurations"];
        if (configurationsArray.size() > MAX_CONFIGURATIONS) {
            MO_DBG_ERR("Unable to initialize: configurations_len is too big (=%zu)", configurationsArray.size());
            return false;
        }

        for (JsonObject stored : configurationsArray) {
            TConfig type;
            if (!deserializeTConfig(stored["type"] | "_Undefined", type)) {
                MO_DBG_ERR("corrupt config");
                continue;
            }

            const char *key = stored["key"] | "";
            if (!*key) {
                MO_DBG_ERR("corrupt config");
                continue;
            }

            if (!stored.containsKey("value")) {
                MO_DBG_ERR("corrupt config");
                continue;
            }

            char *key_pooled = nullptr;

            auto config = getConfiguration(key).get();
            if (config && config->getType() != type) {
                MO_DBG_ERR("conflicting type for %s - remove old config", key);
                remove(config);
                config = nullptr;
            }
            if (!config) {
                #if MO_ENABLE_HEAP_PROFILER
                char memoryTag [64];
                snprintf(memoryTag, sizeof(memoryTag), "%s%s", "v16.Configuration.", key);
                #else
                const char *memoryTag = nullptr;
                (void)memoryTag;
                #endif
                key_pooled = static_cast<char*>(MO_MALLOC(memoryTag, strlen(key) + 1));
                if (!key_pooled) {
                    MO_DBG_ERR("OOM: %s", key);
                    return false;
                }
                strcpy(key_pooled, key);
            }

            switch (type) {
                case TConfig::Int: {
                    if (!stored["value"].is<int>()) {
                        MO_DBG_ERR("corrupt config");
                        MO_FREE(key_pooled);
                        continue;
                    }
                    int value = stored["value"] | 0;
                    if (!config) {
                        //create new config
                        config = createConfiguration(TConfig::Int, key_pooled).get();
                    }
                    if (config) {
                        config->setInt(value);
                    }
                    break;
                }
                case TConfig::Bool: {
                    if (!stored["value"].is<bool>()) {
                        MO_DBG_ERR("corrupt config");
                        MO_FREE(key_pooled);
                        continue;
                    }
                    bool value = stored["value"] | false;
                    if (!config) {
                        //create new config
                        config = createConfiguration(TConfig::Bool, key_pooled).get();
                    }
                    if (config) {
                        config->setBool(value);
                    }
                    break;
                }
                case TConfig::String: {
                    if (!stored["value"].is<const char*>()) {
                        MO_DBG_ERR("corrupt config");
                        MO_FREE(key_pooled);
                        continue;
                    }
                    const char *value = stored["value"] | "";
                    if (!config) {
                        //create new config
                        config = createConfiguration(TConfig::String, key_pooled).get();
                    }
                    if (config) {
                        config->setString(value);
                    }
                    break;
                }
            }

            if (config) {
                //success

                if (key_pooled) {
                    //allocated key, need to store
                    keyPool.push_back(std::move(key_pooled));
                }
            } else {
                MO_DBG_ERR("OOM: %s", key);
                MO_FREE(key_pooled);
            }
        }

        configurationsUpdated();

        MO_DBG_DEBUG("Initialization finished");
        loaded = true;
        return true;
    }

    bool save() override {

        if (!filesystem) {
            return false;
        }

        if (!configurationsUpdated()) {
            return true; //nothing to be done
        }

        //during mocpp_deinitialize(), key owners are destructed. Don't store if this container is affected
        for (auto& config : configurations) {
            if (!config->getKey()) {
                MO_DBG_DEBUG("don't write back container with destructed key(s)");
                return false;
            }
        }

        size_t jsonCapacity = 2 * JSON_OBJECT_SIZE(2); //head + configurations + head payload
        jsonCapacity += JSON_ARRAY_SIZE(configurations.size()); //configurations array
        jsonCapacity += configurations.size() * JSON_OBJECT_SIZE(3); //config entries in array

        if (jsonCapacity > MO_MAX_JSON_CAPACITY) {
            MO_DBG_ERR("configs JSON exceeds maximum capacity (%s, %zu entries). Crop configs file (by FCFS)", getFilename(), configurations.size());
            jsonCapacity = MO_MAX_JSON_CAPACITY;
        }

        auto doc = initJsonDoc(getMemoryTag(), jsonCapacity);
        JsonObject head = doc.createNestedObject("head");
        head["content-type"] = "ocpp_config_file";
        head["version"] = "2.0";

        JsonArray configurationsArray = doc.createNestedArray("configurations");

        size_t trackCapacity = 0;

        for (size_t i = 0; i < configurations.size(); i++) {
            auto& config = *configurations[i];

            size_t entryCapacity = JSON_OBJECT_SIZE(3) + (JSON_ARRAY_SIZE(2) - JSON_ARRAY_SIZE(1));
            if (trackCapacity + entryCapacity > MO_MAX_JSON_CAPACITY) {
                break;
            }

            trackCapacity += entryCapacity;

            auto stored = configurationsArray.createNestedObject();

            stored["type"] = serializeTConfig(config.getType());
            stored["key"] = config.getKey();
            
            switch (config.getType()) {
                case TConfig::Int:
                    stored["value"] = config.getInt();
                    break;
                case TConfig::Bool:
                    stored["value"] = config.getBool();
                    break;
                case TConfig::String:
                    stored["value"] = config.getString();
                    break;
            }
        }

        bool success = FilesystemUtils::storeJson(filesystem, getFilename(), doc);

        if (success) {
            MO_DBG_DEBUG("Saving configurations finished");
        } else {
            MO_DBG_ERR("could not save configs file: %s", getFilename());
        }

        return success;
    }

    std::shared_ptr<Configuration> createConfiguration(TConfig type, const char *key) override {
        auto res = std::shared_ptr<Configuration>(makeConfiguration(type, key).release(), std::default_delete<Configuration>(), makeAllocator<Configuration>("v16.Configuration.", key));
        if (!res) {
            //allocation failure - OOM
            MO_DBG_ERR("OOM");
            return nullptr;
        }
        configurations.push_back(res);
        return res;
    }

    void remove(Configuration *config) override {
        const char *key = config->getKey();
        configurations.erase(std::remove_if(configurations.begin(), configurations.end(),
            [config] (std::shared_ptr<Configuration>& entry) {
                return entry.get() == config;
            }), configurations.end());
        if (key) {
            clearKeyPool(key);
        }
    }

    size_t size() override {
        return configurations.size();
    }

    Configuration *getConfiguration(size_t i) override {
        return configurations[i].get();
    }

    std::shared_ptr<Configuration> getConfiguration(const char *key) override {
        for (auto& entry : configurations) {
            if (entry->getKey() && !strcmp(entry->getKey(), key)) {
                return entry;
            }
        }
        return nullptr;
    }

    void loadStaticKey(Configuration& config, const char *key) override {
        config.setKey(key);
        clearKeyPool(key);
    }

    void removeUnused() override {
        //if a config's key is still in the keyPool, we know it's unused because it has never been declared in FW (originates from an older FW version)

        auto key = keyPool.begin();
        while (key != keyPool.end()) {

            for (auto config = configurations.begin(); config != configurations.end(); ++config) {
                if ((*config)->getKey() == *key) {
                    MO_DBG_DEBUG("remove unused config %s", (*config)->getKey());
                    configurations.erase(config);
                    break;
                }
            }

            MO_FREE(*key);
            key = keyPool.erase(key);
        }
    }
};

std::unique_ptr<ConfigurationContainer> makeConfigurationContainerFlash(std::shared_ptr<FilesystemAdapter> filesystem, const char *filename, bool accessible) {
    return std::unique_ptr<ConfigurationContainer>(new ConfigurationContainerFlash(filesystem, filename, accessible));
}

} //end namespace MicroOcpp


================================================
FILE: src/MicroOcpp/Core/ConfigurationContainerFlash.h
================================================
// matth-x/MicroOcpp
// Copyright Matthias Akstaller 2019 - 2024
// MIT License

#ifndef MO_CONFIGURATIONCONTAINERFLASH_H
#define MO_CONFIGURATIONCONTAINERFLASH_H

#include <MicroOcpp/Core/ConfigurationContainer.h>
#include <MicroOcpp/Core/FilesystemAdapter.h>

namespace MicroOcpp {

std::unique_ptr<ConfigurationContainer> makeConfigurationContainerFlash(std::shared_ptr<FilesystemAdapter> filesystem, const char *filename, bool accessible);

} //end namespace MicroOcpp

#endif


================================================
FILE: src/MicroOcpp/Core/ConfigurationKeyValue.cpp
================================================
// matth-x/MicroOcpp
// Copyright Matthias Akstaller 2019 - 2024
// MIT License

#include <MicroOcpp/Core/ConfigurationKeyValue.h>
#include <MicroOcpp/Core/Memory.h>
#include <MicroOcpp/Debug.h>

#include <string.h>
#include <ArduinoJson.h>

#define KEY_MAXLEN 60
#define STRING_VAL_MAXLEN 512

namespace MicroOcpp {

template<> TConfig convertType<int>() {return TConfig::Int;}
template<> TConfig convertType<bool>() {return TConfig::Bool;}
template<> TConfig convertType<const char*>() {return TConfig::String;}

Configuration::~Configuration() {

}

void Configuration::setInt(int) {
#if MO_CONFIG_TYPECHECK
    MO_DBG_ERR("type err");
#endif
}

void Configuration::setBool(bool) {
#if MO_CONFIG_TYPECHECK
    MO_DBG_ERR("type err");
#endif
}

bool Configuration::setString(const char*) {
#if MO_CONFIG_TYPECHECK
    MO_DBG_ERR("type err");
#endif
    return false;
}

int Configuration::getInt() {
#if MO_CONFIG_TYPECHECK
    MO_DBG_ERR("type err");
#endif
    return 0;
}

bool Configuration::getBool() {
#if MO_CONFIG_TYPECHECK
    MO_DBG_ERR("type err");
#endif
    return false;
}

const char *Configuration::getString() {
#if MO_CONFIG_TYPECHECK
    MO_DBG_ERR("type err");
#endif
    return "";
}

revision_t Configuration::getValueRevision() {
    return value_revision;
}

void Configuration::setRebootRequired() {
    rebootRequired = true;
}

bool Configuration::isRebootRequired() {
    return rebootRequired;
}

void Configuration::setReadOnly() {
    if (mutability == Mutability::ReadWrite) {
        mutability = Mutability::ReadOnly;
    } else {
        mutability = Mutability::None;
    }
}

bool Configuration::isReadOnly() {
    return mutability == Mutability::ReadOnly;
}

bool Configuration::isReadable() {
    return mutability == Mutability::ReadWrite || mutability == Mutability::ReadOnly;
}

void Configuration::setWriteOnly() {
    if (mutability == Mutability::ReadWrite) {
        mutability = Mutability::WriteOnly;
    } else {
        mutability = Mutability::None;
    }
}

/*
 * Default implementations of the Configuration interface.
 *
 * How to use custom implementations: for each OCPP config, pass a config instance to the OCPP lib
 * before its initialization stage. Then the library won't create new config objects but 
 */

class ConfigInt : public Configuration, public MemoryManaged {
private:
    const char *key = nullptr;
    int val = 0;
public:

    ~ConfigInt() = default;

    bool setKey(const char *key) override {
        this->key = key;
        updateMemoryTag("v16.Configuration.", key);
        return true;
    }

    const char *getKey() override {
        return key;
    }

    TConfig getType() override {
        return TConfig::Int;
    }

    void setInt(int val) override {
        this->val = val;
        value_revision++;
    }

    int getInt() override {
        return val;
    }
};

class ConfigBool : public Configuration, public MemoryManaged {
private:
    const char *key = nullptr;
    bool val = false;
public:

    ~ConfigBool() = default;

    bool setKey(const char *key) override {
        this->key = key;
        updateMemoryTag("v16.Configuration.", key);
        return true;
    }

    const char *getKey() override {
        return key;
    }

    TConfig getType() override {
        return TConfig::Bool;
    }

    void setBool(bool val) override {
        this->val = val;
        value_revision++;
    }

    bool getBool() override {
        return val;
    }
};

class ConfigString : public Configuration, public MemoryManaged {
private:
    const char *key = nullptr;
    char *val = nullptr;
public:
    ConfigString() = default;
    ConfigString(const ConfigString&) = delete;
    ConfigString(ConfigString&&) = delete;
    ConfigString& operator=(const ConfigString&) = delete;

    ~ConfigString() {
        MO_FREE(val);
    }

    bool setKey(const char *key) override {
        this->key = key;
        updateMemoryTag("v16.Configuration.", key);
        if (val) {
            MO_MEM_SET_TAG(val, getMemoryTag());
        }
        return true;
    }

    const char *getKey() override {
        return key;
    }

    TConfig getType() override {
        return TConfig::String;
    }

    bool setString(const char *src) override {
        bool src_empty = !src || !*src;

        if (!val && src_empty) {
            return true;
        }

        if (this->val && src && !strcmp(this->val, src)) {
            return true;
        }

        size_t size = 0;
        if (!src_empty) {
            size = strlen(src) + 1;
        }

        if (size > MO_CONFIG_MAX_VALSTRSIZE) {
            return false;
        }

        value_revision++;

        if (this->val) {
            MO_FREE(this->val);
            this->val = nullptr;
        }

        if (!src_empty) {
            this->val = (char*) MO_MALLOC(getMemoryTag(), size);
            if (!this->val) {
                return false;
            }
            strcpy(this->val, src);
        }

        return true;
    }

    const char *getString() override {
        if (!val) {
            return "";
        }
        return val;
    }
};

std::unique_ptr<Configuration> makeConfiguration(TConfig type, const char *key) {
    std::unique_ptr<Configuration> res;
    switch (type) {
        case TConfig::Int:
            res.reset(new ConfigInt());
            break;
        case TConfig::Bool:
            res.reset(new ConfigBool());
            break;
        case TConfig::String:
            res.reset(new ConfigString());
            break;
    }
    if (!res) {
        MO_DBG_ERR("OOM");
        return nullptr;
    }
    res->setKey(key);
    return res;
}

bool deserializeTConfig(const char *serialized, TConfig& out) {
    if (!strcmp(serialized, "int")) {
        out = TConfig::Int;
        return true;
    } else if (!strcmp(serialized, "bool")) {
        out = TConfig::Bool;
        return true;
    } else if (!strcmp(serialized, "string")) {
        out = TConfig::String;
        return true;
    } else {
        MO_DBG_WARN("config type error");
        return false;
    }
}

const char *serializeTConfig(TConfig type) {
    switch (type) {
        case TConfig::Int:
            return "int";
        case TConfig::Bool:
            return "bool";
        case TConfig::String:
            return "string";
    }
    return "_Undefined";
}

} //end namespace MicroOcpp


================================================
FILE: src/MicroOcpp/Core/ConfigurationKeyValue.h
================================================
// matth-x/MicroOcpp
// Copyright Matthias Akstaller 2019 - 2024
// MIT License

#ifndef CONFIGURATIONKEYVALUE_H
#define CONFIGURATIONKEYVALUE_H

#include <ArduinoJson.h>
#include <memory>

#define MO_CONFIG_MAX_VALSTRSIZE 128

#ifndef MO_CONFIG_EXT_PREFIX
#define MO_CONFIG_EXT_PREFIX "Cst_"
#endif

#ifndef MO_CONFIG_TYPECHECK
#define MO_CONFIG_TYPECHECK 1 //enable this for debugging
#endif

namespace MicroOcpp {

using revision_t = uint16_t;

enum class TConfig : uint8_t {
    Int,
    Bool,
    String
};

template<class T>
TConfig convertType();

class Configuration {
protected:
    revision_t value_revision = 0; //write access counter; used to check if this config has been changed
private:
    bool rebootRequired = false;

    enum class Mutability : uint8_t {
        ReadWrite,
        ReadOnly,
        WriteOnly,
        None
    };
    Mutability mutability = Mutability::ReadWrite;

public:
    virtual ~Configuration();

    virtual bool setKey(const char *key) = 0;
    virtual const char *getKey() = 0;

    virtual void setInt(int);
    virtual void setBool(bool);
    virtual bool setString(const char*);

    virtual int getInt();
    virtual bool getBool();
    virtual const char *getString(); //always returns c-string (empty if undefined)

    virtual TConfig getType() = 0;

    virtual revision_t getValueRevision();

    void setRebootRequired();
    bool isRebootRequired();

    void setReadOnly();
    bool isReadOnly();
    bool isReadable();

    void setWriteOnly();
};

/*
 * Default implementations of the Configuration interface.
 *
 * How to use custom implementations: for each OCPP config, pass a config instance to the OCPP lib
 * before its initialization stage. Then the library won't create new config objects but 
 */
std::unique_ptr<Configuration> makeConfiguration(TConfig type, const char *key);

const char *serializeTConfig(TConfig type);
bool deserializeTConfig(const char *serialized, TConfig& out);

} //end namespace MicroOcpp

#endif


================================================
FILE: src/MicroOcpp/Core/ConfigurationOptions.h
================================================
// matth-x/MicroOcpp
// Copyright Matthias Akstaller 2019 - 2024
// MIT License

#ifndef MO_CONFIGURATIONOPTIONS_H
#define MO_CONFIGURATIONOPTIONS_H

#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

struct OCPP_FilesystemOpt {
    bool use;
    bool mount;
    bool formatFsOnFail;
};

#ifdef __cplusplus
}

namespace MicroOcpp {

class FilesystemOpt{
private:
    bool use = false;
    bool mount = false;
    bool formatFsOnFail = false;
public:
    enum Mode : uint8_t {Deactivate, Use, Use_Mount, Use_Mount_FormatOnFail};

    FilesystemOpt() = default;
    FilesystemOpt(Mode mode) {
        switch (mode) {
            case (FilesystemOpt::Use_Mount_FormatOnFail):
                formatFsOnFail = true;
                //fallthrough
            case (FilesystemOpt::Use_Mount):
                mount = true;
                //fallthrough
            case (FilesystemOpt::Use):
                use = true;
                break;
            default:
                break;
        }
    }
    FilesystemOpt(struct OCPP_FilesystemOpt fsopt) {
        this->use = fsopt.use;
        this->mount = fsopt.mount;
        this->formatFsOnFail = fsopt.formatFsOnFail;
    }

    bool accessAllowed() {return use;}
    bool mustMount() {return mount;}
    bool formatOnFail() {return formatFsOnFail;}
};

} //end namespace MicroOcpp

#endif //__cplusplus

#endif


================================================
FILE: src/MicroOcpp/Core/Configuration_c.cpp
================================================
// matth-x/MicroOcpp
// Copyright Matthias Akstaller 2019 - 2024
// MIT License

#include <MicroOcpp/Core/Configuration_c.h>
#include <MicroOcpp/Core/Configuration.h>
#include <MicroOcpp/Core/Memory.h>
#include <MicroOcpp/Debug.h>

using namespace MicroOcpp;

class ConfigurationC : public Configuration, public MemoryManaged {
private:
    ocpp_configuration *config;
public:
    ConfigurationC(ocpp_configuration *config) :
            config(config) {
        if (config->read_only) {
            setReadOnly();
        }
        if (config->write_only) {
            setWriteOnly();
        }
        if (config->reboot_required) {
            setRebootRequired();
        }
    }

    bool setKey(const char *key) override {
        updateMemoryTag("v16.Configuration.", key);
        return config->set_key(config->user_data, key);
    }

    const char *getKey() override {
        return config->get_key(config->user_data);
    }

    void setInt(int val) override {
        #if MO_CONFIG_TYPECHECK
        if (config->get_type(config->user_data) != ENUM_CDT_INT) {
            MO_DBG_ERR("type err");
            return;
        }
        #endif
        config->set_int(config->user_data, val);
    }

    void setBool(bool val) override {
        #if MO_CONFIG_TYPECHECK
        if (config->get_type(config->user_data) != ENUM_CDT_BOOL) {
            MO_DBG_ERR("type err");
            return;
        }
        #endif
        config->set_bool(config->user_data, val);
    }

    bool setString(const char *val) override {
        #if MO_CONFIG_TYPECHECK
        if (config->get_type(config->user_data) != ENUM_CDT_STRING) {
            MO_DBG_ERR("type err");
            return false;
        }
        #endif
        return config->set_string(config->user_data, val);
    }

    int getInt() override {
        #if MO_CONFIG_TYPECHECK
        if (config->get_type(config->user_data) != ENUM_CDT_INT) {
            MO_DBG_ERR("type err");
            return 0;
        }
        #endif
        return config->get_int(config->user_data);
    }

    bool getBool() override {
        #if MO_CONFIG_TYPECHECK
        if (config->get_type(config->user_data) != ENUM_CDT_BOOL) {
            MO_DBG_ERR("type err");
            return false;
        }
        #endif
        return config->get_bool(config->user_data);
    }

    const char *getString() override {
        #if MO_CONFIG_TYPECHECK
        if (config->get_type(config->user_data) != ENUM_CDT_STRING) {
            MO_DBG_ERR("type err");
            return "";
        }
        #endif
        return config->get_string(config->user_data);
    }

    TConfig getType() override {
        TConfig res = TConfig::Int;
        switch (config->get_type(config->user_data)) {
            case ENUM_CDT_INT:
                res = TConfig::Int;
                break;
            case ENUM_CDT_BOOL:
                res = TConfig::Bool;
                break;
            case ENUM_CDT_STRING:
                res = TConfig::String;
                break;
            default:
                MO_DBG_ERR("type conversion");
                break;
        }

        return res;
    }

    uint16_t getValueRevision() override {
        return config->get_write_count(config->user_data);
    }

    ocpp_configuration *getConfiguration() {
        return config;
    }
};

namespace MicroOcpp {

ConfigurationC *getConfigurationC(ocpp_configuration *config) {
    if (!config->mo_data) {
        return nullptr;
    }
    return reinterpret_cast<std::shared_ptr<ConfigurationC>*>(config->mo_data)->get();
}

}

using namespace MicroOcpp;


void ocpp_setRebootRequired(ocpp_configuration *config) {
    if (auto c = getConfigurationC(config)) {
        c->setRebootRequired();
    }
    config->reboot_required = true;
}
bool ocpp_isRebootRequired(ocpp_configuration *config) {
    if (auto c = getConfigurationC(config)) {
        return c->isRebootRequired();
    }
    return config->reboot_required;
}

void ocpp_setReadOnly(ocpp_configuration *config) {
    if (auto c = getConfigurationC(config)) {
        c->setReadOnly();
    }
    config->read_only = true;
}
bool ocpp_isReadOnly(ocpp_configuration *config) {
    if (auto c = getConfigurationC(config)) {
        return c->isReadOnly();
    }
    return config->read_only;
}
bool ocpp_isReadable(ocpp_configuration *config) {
    if (auto c = getConfigurationC(config)) {
        return c->isReadable();
    }
    return !config->write_only;
}

void ocpp_setWriteOnly(ocpp_configuration *config) {
    if (auto c = getConfigurationC(config)) {
        c->setWriteOnly();
    }
    config->write_only = true;
}

class ConfigurationContainerC : public ConfigurationContainer, public MemoryManaged {
private:
    ocpp_configuration_container *container;
public:
    ConfigurationContainerC(ocpp_configuration_container *container, const char *filename, bool accessible) :
            ConfigurationContainer(filename, accessible), MemoryManaged("v16.Configuration.ContainerC.", filename), container(container) {

    }

    ~ConfigurationContainerC() {
        for (size_t i = 0; i < container->size(container->user_data); i++) {
            if (auto config = container->get_configuration(container->user_data, i)) {
                if (config->mo_data) {
                    delete reinterpret_cast<std::shared_ptr<ConfigurationC>*>(config->mo_data);
                    config->mo_data = nullptr;
                }
            }
        }
    }

    bool load() override {
        if (container->load) {
            return container->load(container->user_data);
        } else {
            return true;
        }
    }

    bool save() override {
        if (container->save) {
            return container->save(container->user_data);
        } else {
            return true;
        }
    }

    std::shared_ptr<Configuration> createConfiguration(TConfig type, const char *key) override {

        auto result = std::shared_ptr<ConfigurationC>(nullptr, std::default_delete<ConfigurationC>(), makeAllocator<ConfigurationC>(getMemoryTag()));

        if (!container->create_configuration) {
            return result;
        }

        ocpp_config_datatype dt;
        switch (type) {
            case TConfig::Int:
                dt = ENUM_CDT_INT;
                break;
            case TConfig::Bool:
                dt = ENUM_CDT_BOOL;
                break;
            case TConfig::String:
                dt = ENUM_CDT_STRING;
                break;
            default:
                MO_DBG_ERR("internal error");
                return result;
        }
        ocpp_configuration *config = container->create_configuration(container->user_data, dt, key);
        if (!config) {
            return result;
        }
        
        result.reset(new ConfigurationC(config));

        if (result) {
            auto captureConfigC = new std::shared_ptr<ConfigurationC>(result);
            config->mo_data = reinterpret_cast<void*>(captureConfigC);
        } else {
            MO_DBG_ERR("could not create config: %s", key);
            if (container->remove) {
                container->remove(container->user_data, key);
            }
        }

        return result;
    }

    void remove(Configuration *config) override {
        if (!co
Download .txt
gitextract_ls9b0kd7/

├── .github/
│   └── workflows/
│       ├── documentation.yml
│       ├── esp-idf.yml
│       ├── pio.yml
│       ├── platformless.yml
│       └── tests.yml
├── .gitignore
├── CHANGELOG.md
├── CMakeLists.txt
├── LICENSE
├── README.md
├── SConscript.py
├── docs/
│   ├── benchmarks.md
│   ├── index.md
│   ├── intro-tech.md
│   ├── migration.md
│   ├── modules.md
│   ├── prerequisites.md
│   ├── security.md
│   └── stylesheets/
│       └── extra.css
├── examples/
│   ├── ESP/
│   │   └── main.cpp
│   ├── ESP-IDF/
│   │   ├── CMakeLists.txt
│   │   ├── Makefile
│   │   ├── README.md
│   │   ├── components/
│   │   │   ├── ArduinoJson/
│   │   │   │   └── .gitkeep
│   │   │   ├── ArduinoOcpp/
│   │   │   │   └── .gitkeep
│   │   │   ├── ArduinoOcppMongoose/
│   │   │   │   └── .gitkeep
│   │   │   ├── README.md
│   │   │   └── mongoose/
│   │   │       └── .gitkeep
│   │   ├── main/
│   │   │   ├── CMakeLists.txt
│   │   │   ├── Kconfig.projbuild
│   │   │   ├── component.mk
│   │   │   └── main.c
│   │   ├── partitions.csv
│   │   └── sdkconfig
│   └── ESP-TLS/
│       └── main.cpp
├── library.json
├── library.properties
├── mkdocs.yml
├── platformio.ini
├── src/
│   ├── MicroOcpp/
│   │   ├── Core/
│   │   │   ├── Configuration.cpp
│   │   │   ├── Configuration.h
│   │   │   ├── ConfigurationContainer.cpp
│   │   │   ├── ConfigurationContainer.h
│   │   │   ├── ConfigurationContainerFlash.cpp
│   │   │   ├── ConfigurationContainerFlash.h
│   │   │   ├── ConfigurationKeyValue.cpp
│   │   │   ├── ConfigurationKeyValue.h
│   │   │   ├── ConfigurationOptions.h
│   │   │   ├── Configuration_c.cpp
│   │   │   ├── Configuration_c.h
│   │   │   ├── Connection.cpp
│   │   │   ├── Connection.h
│   │   │   ├── Context.cpp
│   │   │   ├── Context.h
│   │   │   ├── FilesystemAdapter.cpp
│   │   │   ├── FilesystemAdapter.h
│   │   │   ├── FilesystemUtils.cpp
│   │   │   ├── FilesystemUtils.h
│   │   │   ├── Ftp.h
│   │   │   ├── FtpMbedTLS.cpp
│   │   │   ├── FtpMbedTLS.h
│   │   │   ├── Memory.cpp
│   │   │   ├── Memory.h
│   │   │   ├── OcppError.h
│   │   │   ├── Operation.cpp
│   │   │   ├── Operation.h
│   │   │   ├── OperationRegistry.cpp
│   │   │   ├── OperationRegistry.h
│   │   │   ├── Request.cpp
│   │   │   ├── Request.h
│   │   │   ├── RequestCallbacks.h
│   │   │   ├── RequestQueue.cpp
│   │   │   ├── RequestQueue.h
│   │   │   ├── Time.cpp
│   │   │   ├── Time.h
│   │   │   ├── UuidUtils.cpp
│   │   │   └── UuidUtils.h
│   │   ├── Debug.cpp
│   │   ├── Debug.h
│   │   ├── Model/
│   │   │   ├── Authorization/
│   │   │   │   ├── AuthorizationData.cpp
│   │   │   │   ├── AuthorizationData.h
│   │   │   │   ├── AuthorizationList.cpp
│   │   │   │   ├── AuthorizationList.h
│   │   │   │   ├── AuthorizationService.cpp
│   │   │   │   ├── AuthorizationService.h
│   │   │   │   ├── IdToken.cpp
│   │   │   │   └── IdToken.h
│   │   │   ├── Availability/
│   │   │   │   ├── AvailabilityService.cpp
│   │   │   │   ├── AvailabilityService.h
│   │   │   │   └── ChangeAvailabilityStatus.h
│   │   │   ├── Boot/
│   │   │   │   ├── BootService.cpp
│   │   │   │   └── BootService.h
│   │   │   ├── Certificates/
│   │   │   │   ├── Certificate.cpp
│   │   │   │   ├── Certificate.h
│   │   │   │   ├── CertificateMbedTLS.cpp
│   │   │   │   ├── CertificateMbedTLS.h
│   │   │   │   ├── CertificateService.cpp
│   │   │   │   ├── CertificateService.h
│   │   │   │   ├── Certificate_c.cpp
│   │   │   │   └── Certificate_c.h
│   │   │   ├── ConnectorBase/
│   │   │   │   ├── ChargePointErrorData.h
│   │   │   │   ├── ChargePointStatus.h
│   │   │   │   ├── Connector.cpp
│   │   │   │   ├── Connector.h
│   │   │   │   ├── ConnectorsCommon.cpp
│   │   │   │   ├── ConnectorsCommon.h
│   │   │   │   ├── EvseId.h
│   │   │   │   └── UnlockConnectorResult.h
│   │   │   ├── Diagnostics/
│   │   │   │   ├── DiagnosticsService.cpp
│   │   │   │   ├── DiagnosticsService.h
│   │   │   │   └── DiagnosticsStatus.h
│   │   │   ├── FirmwareManagement/
│   │   │   │   ├── FirmwareService.cpp
│   │   │   │   ├── FirmwareService.h
│   │   │   │   └── FirmwareStatus.h
│   │   │   ├── Heartbeat/
│   │   │   │   ├── HeartbeatService.cpp
│   │   │   │   └── HeartbeatService.h
│   │   │   ├── Metering/
│   │   │   │   ├── MeterStore.cpp
│   │   │   │   ├── MeterStore.h
│   │   │   │   ├── MeterValue.cpp
│   │   │   │   ├── MeterValue.h
│   │   │   │   ├── MeterValuesV201.cpp
│   │   │   │   ├── MeterValuesV201.h
│   │   │   │   ├── MeteringConnector.cpp
│   │   │   │   ├── MeteringConnector.h
│   │   │   │   ├── MeteringService.cpp
│   │   │   │   ├── MeteringService.h
│   │   │   │   ├── ReadingContext.cpp
│   │   │   │   ├── ReadingContext.h
│   │   │   │   ├── SampledValue.cpp
│   │   │   │   └── SampledValue.h
│   │   │   ├── Model.cpp
│   │   │   ├── Model.h
│   │   │   ├── RemoteControl/
│   │   │   │   ├── RemoteControlDefs.h
│   │   │   │   ├── RemoteControlService.cpp
│   │   │   │   └── RemoteControlService.h
│   │   │   ├── Reservation/
│   │   │   │   ├── Reservation.cpp
│   │   │   │   ├── Reservation.h
│   │   │   │   ├── ReservationService.cpp
│   │   │   │   └── ReservationService.h
│   │   │   ├── Reset/
│   │   │   │   ├── ResetDefs.h
│   │   │   │   ├── ResetService.cpp
│   │   │   │   └── ResetService.h
│   │   │   ├── SmartCharging/
│   │   │   │   ├── SmartChargingModel.cpp
│   │   │   │   ├── SmartChargingModel.h
│   │   │   │   ├── SmartChargingService.cpp
│   │   │   │   └── SmartChargingService.h
│   │   │   ├── Transactions/
│   │   │   │   ├── Transaction.cpp
│   │   │   │   ├── Transaction.h
│   │   │   │   ├── TransactionDefs.h
│   │   │   │   ├── TransactionDeserialize.cpp
│   │   │   │   ├── TransactionDeserialize.h
│   │   │   │   ├── TransactionService.cpp
│   │   │   │   ├── TransactionService.h
│   │   │   │   ├── TransactionStore.cpp
│   │   │   │   └── TransactionStore.h
│   │   │   └── Variables/
│   │   │       ├── Variable.cpp
│   │   │       ├── Variable.h
│   │   │       ├── VariableContainer.cpp
│   │   │       ├── VariableContainer.h
│   │   │       ├── VariableService.cpp
│   │   │       └── VariableService.h
│   │   ├── Operations/
│   │   │   ├── Authorize.cpp
│   │   │   ├── Authorize.h
│   │   │   ├── BootNotification.cpp
│   │   │   ├── BootNotification.h
│   │   │   ├── CancelReservation.cpp
│   │   │   ├── CancelReservation.h
│   │   │   ├── ChangeAvailability.cpp
│   │   │   ├── ChangeAvailability.h
│   │   │   ├── ChangeConfiguration.cpp
│   │   │   ├── ChangeConfiguration.h
│   │   │   ├── CiStrings.h
│   │   │   ├── ClearCache.cpp
│   │   │   ├── ClearCache.h
│   │   │   ├── ClearChargingProfile.cpp
│   │   │   ├── ClearChargingProfile.h
│   │   │   ├── CustomOperation.cpp
│   │   │   ├── CustomOperation.h
│   │   │   ├── DataTransfer.cpp
│   │   │   ├── DataTransfer.h
│   │   │   ├── DeleteCertificate.cpp
│   │   │   ├── DeleteCertificate.h
│   │   │   ├── DiagnosticsStatusNotification.cpp
│   │   │   ├── DiagnosticsStatusNotification.h
│   │   │   ├── FirmwareStatusNotification.cpp
│   │   │   ├── FirmwareStatusNotification.h
│   │   │   ├── GetBaseReport.cpp
│   │   │   ├── GetBaseReport.h
│   │   │   ├── GetCompositeSchedule.cpp
│   │   │   ├── GetCompositeSchedule.h
│   │   │   ├── GetConfiguration.cpp
│   │   │   ├── GetConfiguration.h
│   │   │   ├── GetDiagnostics.cpp
│   │   │   ├── GetDiagnostics.h
│   │   │   ├── GetInstalledCertificateIds.cpp
│   │   │   ├── GetInstalledCertificateIds.h
│   │   │   ├── GetLocalListVersion.cpp
│   │   │   ├── GetLocalListVersion.h
│   │   │   ├── GetVariables.cpp
│   │   │   ├── GetVariables.h
│   │   │   ├── Heartbeat.cpp
│   │   │   ├── Heartbeat.h
│   │   │   ├── InstallCertificate.cpp
│   │   │   ├── InstallCertificate.h
│   │   │   ├── MeterValues.cpp
│   │   │   ├── MeterValues.h
│   │   │   ├── NotifyReport.cpp
│   │   │   ├── NotifyReport.h
│   │   │   ├── RemoteStartTransaction.cpp
│   │   │   ├── RemoteStartTransaction.h
│   │   │   ├── RemoteStopTransaction.cpp
│   │   │   ├── RemoteStopTransaction.h
│   │   │   ├── RequestStartTransaction.cpp
│   │   │   ├── RequestStartTransaction.h
│   │   │   ├── RequestStopTransaction.cpp
│   │   │   ├── RequestStopTransaction.h
│   │   │   ├── ReserveNow.cpp
│   │   │   ├── ReserveNow.h
│   │   │   ├── Reset.cpp
│   │   │   ├── Reset.h
│   │   │   ├── SecurityEventNotification.cpp
│   │   │   ├── SecurityEventNotification.h
│   │   │   ├── SendLocalList.cpp
│   │   │   ├── SendLocalList.h
│   │   │   ├── SetChargingProfile.cpp
│   │   │   ├── SetChargingProfile.h
│   │   │   ├── SetVariables.cpp
│   │   │   ├── SetVariables.h
│   │   │   ├── StartTransaction.cpp
│   │   │   ├── StartTransaction.h
│   │   │   ├── StatusNotification.cpp
│   │   │   ├── StatusNotification.h
│   │   │   ├── StopTransaction.cpp
│   │   │   ├── StopTransaction.h
│   │   │   ├── TransactionEvent.cpp
│   │   │   ├── TransactionEvent.h
│   │   │   ├── TriggerMessage.cpp
│   │   │   ├── TriggerMessage.h
│   │   │   ├── UnlockConnector.cpp
│   │   │   ├── UnlockConnector.h
│   │   │   ├── UpdateFirmware.cpp
│   │   │   └── UpdateFirmware.h
│   │   ├── Platform.cpp
│   │   ├── Platform.h
│   │   └── Version.h
│   ├── MicroOcpp.cpp
│   ├── MicroOcpp.h
│   ├── MicroOcpp_c.cpp
│   └── MicroOcpp_c.h
└── tests/
    ├── Api.cpp
    ├── Boot.cpp
    ├── Certificates.cpp
    ├── ChargePointError.cpp
    ├── ChargingSessions.cpp
    ├── Configuration.cpp
    ├── ConfigurationBehavior.cpp
    ├── FirmwareManagement.cpp
    ├── LocalAuthList.cpp
    ├── Metering.cpp
    ├── RemoteStartTransaction.cpp
    ├── Reservation.cpp
    ├── Reset.cpp
    ├── Security.cpp
    ├── SmartCharging.cpp
    ├── TransactionSafety.cpp
    ├── Transactions.cpp
    ├── Variables.cpp
    ├── benchmarks/
    │   ├── firmware_size/
    │   │   ├── main.cpp
    │   │   └── platformio.ini
    │   └── scripts/
    │       ├── eval_firmware_size.py
    │       └── measure_heap.py
    ├── catch2/
    │   ├── catch.hpp
    │   └── catchMain.cpp
    ├── helpers/
    │   ├── testHelper.cpp
    │   └── testHelper.h
    └── ocppEngineLifecycle.cpp
Copy disabled (too large) Download .txt
Showing preview only (376,866K chars total). Download the full file to get everything.
SYMBOL INDEX (2227 symbols across 174 files)

FILE: SConscript.py
  function getAllDirs (line 14) | def getAllDirs(root_dir):

FILE: examples/ESP-IDF/main/main.c
  function event_handler (line 49) | static void event_handler(void* arg, esp_event_base_t event_base,
  function wifi_init_sta (line 71) | void wifi_init_sta(void)
  function app_main (line 138) | void app_main(void)

FILE: examples/ESP-TLS/main.cpp
  function setup (line 61) | void setup() {
  function loop (line 122) | void loop() {

FILE: examples/ESP/main.cpp
  function setup (line 30) | void setup() {
  function loop (line 84) | void loop() {

FILE: src/MicroOcpp.cpp
  type MicroOcpp (line 40) | namespace MicroOcpp {
    type Facade (line 41) | namespace Facade {
  function mocpp_initialize (line 72) | void mocpp_initialize(const char *backendUrl, const char *chargeBoxId, c...
  function ChargerCredentials (line 217) | ChargerCredentials ChargerCredentials::v201(const char *cpModel, const c...
  function mocpp_initialize (line 249) | void mocpp_initialize(Connection& connection, const char *bootNotificati...
  function mocpp_deinitialize (line 382) | void mocpp_deinitialize() {
  function mocpp_loop (line 416) | void mocpp_loop() {
  function beginTransaction (line 425) | bool beginTransaction(const char *idTag, unsigned int connectorId) {
  function beginTransaction_authorized (line 462) | bool beginTransaction_authorized(const char *idTag, const char *parentId...
  function endTransaction (line 500) | bool endTransaction(const char *idTag, const char *reason, unsigned int ...
  function endTransaction_authorized (line 579) | bool endTransaction_authorized(const char *idTag, const char *reason, un...
  function isTransactionActive (line 613) | bool isTransactionActive(unsigned int connectorId) {
  function isTransactionRunning (line 642) | bool isTransactionRunning(unsigned int connectorId) {
  function ocppPermitsCharge (line 745) | bool ocppPermitsCharge(unsigned int connectorId) {
  function ChargePointStatus (line 771) | ChargePointStatus getChargePointStatus(unsigned int connectorId) {
  function setConnectorPluggedInput (line 793) | void setConnectorPluggedInput(std::function<bool()> pluggedInput, unsign...
  function setEnergyMeterInput (line 821) | void setEnergyMeterInput(std::function<int()> energyInput, unsigned int ...
  function setPowerMeterInput (line 845) | void setPowerMeterInput(std::function<float()> powerInput, unsigned int ...
  function setSmartChargingPowerOutput (line 869) | void setSmartChargingPowerOutput(std::function<void(float)> chargingLimi...
  function setSmartChargingCurrentOutput (line 896) | void setSmartChargingCurrentOutput(std::function<void(float)> chargingLi...
  function setSmartChargingOutput (line 923) | void setSmartChargingOutput(std::function<void(float,float,int)> chargin...
  function setEvReadyInput (line 949) | void setEvReadyInput(std::function<bool()> evReadyInput, unsigned int co...
  function setEvseReadyInput (line 972) | void setEvseReadyInput(std::function<bool()> evseReadyInput, unsigned in...
  function addErrorCodeInput (line 995) | void addErrorCodeInput(std::function<const char*()> errorCodeInput, unsi...
  function addErrorDataInput (line 1008) | void addErrorDataInput(std::function<MicroOcpp::ErrorData()> errorDataIn...
  function addMeterValueInput (line 1021) | void addMeterValueInput(std::function<float ()> valueInput, const char *...
  function addMeterValueInput (line 1081) | void addMeterValueInput(std::unique_ptr<SampledValueSampler> valueInput,...
  function setOccupiedInput (line 1100) | void setOccupiedInput(std::function<bool()> occupied, unsigned int conne...
  function setStartTxReadyInput (line 1123) | void setStartTxReadyInput(std::function<bool()> startTxReady, unsigned i...
  function setStopTxReadyInput (line 1136) | void setStopTxReadyInput(std::function<bool()> stopTxReady, unsigned int...
  function setTxNotificationOutput (line 1149) | void setTxNotificationOutput(std::function<void(MicroOcpp::Transaction*,...
  function setTxNotificationOutputV201 (line 1169) | void setTxNotificationOutputV201(std::function<void(MicroOcpp::Ocpp201::...
  function setOnUnlockConnectorInOut (line 1193) | void setOnUnlockConnectorInOut(std::function<UnlockConnectorResult()> on...
  function isOperative (line 1207) | bool isOperative(unsigned int connectorId) {
  function setOnResetNotify (line 1235) | void setOnResetNotify(std::function<bool(bool)> onResetNotify) {
  function setOnResetExecute (line 1255) | void setOnResetExecute(std::function<void(bool)> onResetExecute) {
  function FirmwareService (line 1275) | FirmwareService *getFirmwareService() {
  function DiagnosticsService (line 1290) | DiagnosticsService *getDiagnosticsService() {
  function setCertificateStore (line 1307) | void setCertificateStore(std::unique_ptr<MicroOcpp::CertificateStore> ce...
  function Context (line 1326) | Context *getOcppContext() {
  function setOnReceiveRequest (line 1330) | void setOnReceiveRequest(const char *operationType, OnReceiveReqListener...
  function setOnSendConf (line 1342) | void setOnSendConf(const char *operationType, OnSendConfListener onSendC...
  function sendRequest (line 1354) | void sendRequest(const char *operationType,
  function setRequestHandler (line 1371) | void setRequestHandler(const char *operationType,
  function authorize (line 1391) | void authorize(const char *idTag, OnReceiveConfListener onConf, OnAbortL...
  function startTransaction (line 1417) | bool startTransaction(const char *idTag, OnReceiveConfListener onConf, O...
  function stopTransaction (line 1479) | bool stopTransaction(OnReceiveConfListener onConf, OnAbortListener onAbo...

FILE: src/MicroOcpp.h
  type ChargerCredentials (line 64) | struct ChargerCredentials {
  function namespace (line 367) | namespace MicroOcpp {
  function namespace (line 416) | namespace MicroOcpp {

FILE: src/MicroOcpp/Core/Configuration.cpp
  type MicroOcpp (line 14) | namespace MicroOcpp {
    type Validator (line 16) | struct Validator {
      method Validator (line 19) | Validator(const char *key, std::function<bool(const char*)> checkVal...
    type ConfigurationLocal (line 24) | namespace ConfigurationLocal {
    function createConfigurationContainer (line 34) | std::unique_ptr<ConfigurationContainer> createConfigurationContainer(c...
    function addConfigurationContainer (line 48) | void addConfigurationContainer(std::shared_ptr<ConfigurationContainer>...
    function getContainer (line 52) | std::shared_ptr<ConfigurationContainer> getContainer(const char *filen...
    function ConfigurationContainer (line 65) | ConfigurationContainer *declareContainer(const char *filename, bool ac...
    function loadConfiguration (line 87) | std::shared_ptr<Configuration> loadConfiguration(TConfig type, const c...
    function loadPermissions (line 125) | void loadPermissions(Configuration& config, bool readonly, bool reboot...
    function declareConfiguration (line 136) | std::shared_ptr<Configuration> declareConfiguration(const char *key, T...
    function registerConfigurationValidator (line 173) | void registerConfigurationValidator(const char *key, std::function<boo...
    function Configuration (line 183) | Configuration *getConfigurationPublic(const char *key) {
    function getConfigurationContainersPublic (line 195) | Vector<ConfigurationContainer*> getConfigurationContainersPublic() {
    function configuration_init (line 207) | bool configuration_init(std::shared_ptr<FilesystemAdapter> _filesystem) {
    function configuration_deinit (line 212) | void configuration_deinit() {
    function configuration_load (line 218) | bool configuration_load(const char *filename) {
    function configuration_save (line 230) | bool configuration_save() {
    function configuration_clean_unused (line 242) | bool configuration_clean_unused() {
    function VALIDATE_UNSIGNED_INT (line 249) | bool VALIDATE_UNSIGNED_INT(const char *value) {

FILE: src/MicroOcpp/Core/Configuration.h
  function namespace (line 19) | namespace MicroOcpp {

FILE: src/MicroOcpp/Core/ConfigurationContainer.cpp
  function Configuration (line 53) | Configuration *ConfigurationContainerVolatile::getConfiguration(size_t i) {
  type MicroOcpp (line 70) | namespace MicroOcpp {
    function makeConfigurationContainerVolatile (line 72) | std::unique_ptr<ConfigurationContainerVolatile> makeConfigurationConta...

FILE: src/MicroOcpp/Core/ConfigurationContainer.h
  function class (line 15) | class ConfigurationContainer {

FILE: src/MicroOcpp/Core/ConfigurationContainerFlash.cpp
  type MicroOcpp (line 14) | namespace MicroOcpp {
    class ConfigurationContainerFlash (line 16) | class ConfigurationContainerFlash : public ConfigurationContainer, pub...
      method clearKeyPool (line 26) | void clearKeyPool(const char *key) {
      method configurationsUpdated (line 39) | bool configurationsUpdated() {
      method ConfigurationContainerFlash (line 50) | ConfigurationContainerFlash(std::shared_ptr<FilesystemAdapter> files...
      method load (line 61) | bool load() override {
      method save (line 219) | bool save() override {
      method createConfiguration (line 294) | std::shared_ptr<Configuration> createConfiguration(TConfig type, con...
      method remove (line 305) | void remove(Configuration *config) override {
      method size (line 316) | size_t size() override {
      method Configuration (line 320) | Configuration *getConfiguration(size_t i) override {
      method getConfiguration (line 324) | std::shared_ptr<Configuration> getConfiguration(const char *key) ove...
      method loadStaticKey (line 333) | void loadStaticKey(Configuration& config, const char *key) override {
      method removeUnused (line 338) | void removeUnused() override {
    function makeConfigurationContainerFlash (line 358) | std::unique_ptr<ConfigurationContainer> makeConfigurationContainerFlas...

FILE: src/MicroOcpp/Core/ConfigurationContainerFlash.h
  function namespace (line 11) | namespace MicroOcpp {

FILE: src/MicroOcpp/Core/ConfigurationKeyValue.cpp
  type MicroOcpp (line 15) | namespace MicroOcpp {
    function TConfig (line 17) | TConfig convertType<int>() {return TConfig::Int;}
    function TConfig (line 18) | TConfig convertType<bool>() {return TConfig::Bool;}
    function TConfig (line 19) | TConfig convertType<const char*>() {return TConfig::String;}
    function revision_t (line 65) | revision_t Configuration::getValueRevision() {
    class ConfigInt (line 108) | class ConfigInt : public Configuration, public MemoryManaged {
      method setKey (line 116) | bool setKey(const char *key) override {
      method TConfig (line 126) | TConfig getType() override {
      method setInt (line 130) | void setInt(int val) override {
      method getInt (line 135) | int getInt() override {
    class ConfigBool (line 140) | class ConfigBool : public Configuration, public MemoryManaged {
      method setKey (line 148) | bool setKey(const char *key) override {
      method TConfig (line 158) | TConfig getType() override {
      method setBool (line 162) | void setBool(bool val) override {
      method getBool (line 167) | bool getBool() override {
    class ConfigString (line 172) | class ConfigString : public Configuration, public MemoryManaged {
      method ConfigString (line 177) | ConfigString() = default;
      method ConfigString (line 178) | ConfigString(const ConfigString&) = delete;
      method ConfigString (line 179) | ConfigString(ConfigString&&) = delete;
      method ConfigString (line 180) | ConfigString& operator=(const ConfigString&) = delete;
      method setKey (line 186) | bool setKey(const char *key) override {
      method TConfig (line 199) | TConfig getType() override {
      method setString (line 203) | bool setString(const char *src) override {
    function makeConfiguration (line 249) | std::unique_ptr<Configuration> makeConfiguration(TConfig type, const c...
    function deserializeTConfig (line 270) | bool deserializeTConfig(const char *serialized, TConfig& out) {

FILE: src/MicroOcpp/Core/ConfigurationKeyValue.h
  type class (line 25) | enum class
  function class (line 34) | class Configuration {

FILE: src/MicroOcpp/Core/ConfigurationOptions.h
  type OCPP_FilesystemOpt (line 14) | struct OCPP_FilesystemOpt {
  function namespace (line 23) | namespace MicroOcpp {

FILE: src/MicroOcpp/Core/Configuration_c.cpp
  class ConfigurationC (line 12) | class ConfigurationC : public Configuration, public MemoryManaged {
    method ConfigurationC (line 16) | ConfigurationC(ocpp_configuration *config) :
    method setKey (line 29) | bool setKey(const char *key) override {
    method setInt (line 38) | void setInt(int val) override {
    method setBool (line 48) | void setBool(bool val) override {
    method setString (line 58) | bool setString(const char *val) override {
    method getInt (line 68) | int getInt() override {
    method getBool (line 78) | bool getBool() override {
    method TConfig (line 98) | TConfig getType() override {
    method getValueRevision (line 118) | uint16_t getValueRevision() override {
    method ocpp_configuration (line 122) | ocpp_configuration *getConfiguration() {
  type MicroOcpp (line 127) | namespace MicroOcpp {
    function ConfigurationC (line 129) | ConfigurationC *getConfigurationC(ocpp_configuration *config) {
  function ocpp_setRebootRequired (line 141) | void ocpp_setRebootRequired(ocpp_configuration *config) {
  function ocpp_isRebootRequired (line 147) | bool ocpp_isRebootRequired(ocpp_configuration *config) {
  function ocpp_setReadOnly (line 154) | void ocpp_setReadOnly(ocpp_configuration *config) {
  function ocpp_isReadOnly (line 160) | bool ocpp_isReadOnly(ocpp_configuration *config) {
  function ocpp_isReadable (line 166) | bool ocpp_isReadable(ocpp_configuration *config) {
  function ocpp_setWriteOnly (line 173) | void ocpp_setWriteOnly(ocpp_configuration *config) {
  class ConfigurationContainerC (line 180) | class ConfigurationContainerC : public ConfigurationContainer, public Me...
    method ConfigurationContainerC (line 184) | ConfigurationContainerC(ocpp_configuration_container *container, const...
    method load (line 200) | bool load() override {
    method save (line 208) | bool save() override {
    method createConfiguration (line 216) | std::shared_ptr<Configuration> createConfiguration(TConfig type, const...
    method remove (line 259) | void remove(Configuration *config) override {
    method size (line 272) | size_t size() override {
    method Configuration (line 276) | Configuration *getConfiguration(size_t i) override {
    method getConfiguration (line 291) | std::shared_ptr<Configuration> getConfiguration(const char *key) overr...
    method loadStaticKey (line 306) | void loadStaticKey(Configuration& config, const char *key) override {
  function ocpp_configuration_container_add (line 313) | void ocpp_configuration_container_add(ocpp_configuration_container *cont...

FILE: src/MicroOcpp/Core/Configuration_c.h
  type ocpp_config_datatype (line 15) | typedef enum ocpp_config_datatype {
  type ocpp_configuration (line 21) | typedef struct ocpp_configuration {
  type ocpp_configuration_container (line 61) | typedef struct ocpp_configuration_container {

FILE: src/MicroOcpp/Core/Connection.h
  function namespace (line 22) | namespace MicroOcpp {
  function namespace (line 105) | namespace MicroOcpp {

FILE: src/MicroOcpp/Core/Context.cpp
  function Model (line 37) | Model& Context::getModel() {
  function OperationRegistry (line 41) | OperationRegistry& Context::getOperationRegistry() {
  function ProtocolVersion (line 45) | const ProtocolVersion& Context::getVersion() {
  function Connection (line 49) | Connection& Context::getConnection() {
  function RequestQueue (line 53) | RequestQueue& Context::getRequestQueue() {
  function FtpClient (line 61) | FtpClient *Context::getFtpClient() {

FILE: src/MicroOcpp/Core/Context.h
  function namespace (line 17) | namespace MicroOcpp {

FILE: src/MicroOcpp/Core/FilesystemAdapter.cpp
  type MicroOcpp (line 27) | namespace MicroOcpp {
    class FilesystemAdapterIndex (line 29) | class FilesystemAdapterIndex
      type IndexEntry (line 71) | struct IndexEntry {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 80) | IndexEntry *getEntryByFname(const char *fn) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 93) | IndexEntry *getEntryByPath(const char *path) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method FilesystemAdapterIndex (line 105) | FilesystemAdapterIndex(std::shared_ptr<FilesystemAdapter> filesystem...
      method stat (line 113) | int stat(const char *path, size_t *size) override {
      method open (line 122) | std::unique_ptr<FileAdapter> open(const char *path, const char *mode) {
      method remove (line 159) | bool remove(const char *path) override {
      method ftw_root (line 172) | int ftw_root(std::function<int(const char *fpath)> fn) {
      method createIndex (line 191) | bool createIndex() {
      method updateFilesize (line 223) | void updateFilesize(const char *fn, size_t size) {
    class IndexedFileAdapter (line 31) | class IndexedFileAdapter : public FileAdapter, public MemoryManaged {
      method IndexedFileAdapter (line 39) | IndexedFileAdapter(FilesystemAdapterIndex& index, const char *fn, st...
      method read (line 46) | size_t read(char *buf, size_t len) override {
      method write (line 50) | size_t write(const char *buf, size_t len) override {
      method seek (line 56) | size_t seek(size_t offset) override {
      method read (line 62) | int read() override {
    class FilesystemAdapterIndex (line 67) | class FilesystemAdapterIndex : public FilesystemAdapter, public Memory...
      type IndexEntry (line 71) | struct IndexEntry {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 80) | IndexEntry *getEntryByFname(const char *fn) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 93) | IndexEntry *getEntryByPath(const char *path) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method FilesystemAdapterIndex (line 105) | FilesystemAdapterIndex(std::shared_ptr<FilesystemAdapter> filesystem...
      method stat (line 113) | int stat(const char *path, size_t *size) override {
      method open (line 122) | std::unique_ptr<FileAdapter> open(const char *path, const char *mode) {
      method remove (line 159) | bool remove(const char *path) override {
      method ftw_root (line 172) | int ftw_root(std::function<int(const char *fpath)> fn) {
      method createIndex (line 191) | bool createIndex() {
      method updateFilesize (line 223) | void updateFilesize(const char *fn, size_t size) {
    function decorateIndex (line 235) | std::shared_ptr<FilesystemAdapter> decorateIndex(std::shared_ptr<Files...
    class ArduinoFileAdapter (line 268) | class ArduinoFileAdapter : public FileAdapter, public MemoryManaged {
      method ArduinoFileAdapter (line 271) | ArduinoFileAdapter(File&& file) : MemoryManaged("Filesystem"), file(...
      method read (line 279) | int read() override {
      method read (line 282) | size_t read(char *buf, size_t len) override {
      method write (line 285) | size_t write(const char *buf, size_t len) override {
      method seek (line 288) | size_t seek(size_t offset) override {
    class ArduinoFilesystemAdapter (line 293) | class ArduinoFilesystemAdapter : public FilesystemAdapter, public Memo...
      method ArduinoFilesystemAdapter (line 300) | ArduinoFilesystemAdapter(FilesystemOpt config, void (*onDestruct)(vo...
      method stat (line 340) | int stat(const char *path, size_t *size) override {
      method open (line 379) | std::unique_ptr<FileAdapter> open(const char *fn, const char *mode) ...
      method remove (line 388) | bool remove(const char *fn) override {
      method ftw_root (line 391) | int ftw_root(std::function<int(const char *fpath)> fn) override {
    function resetFilesystemCache (line 441) | void resetFilesystemCache(void*) {
    function makeDefaultFilesystemAdapter (line 445) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
    class EspIdfFileAdapter (line 486) | class EspIdfFileAdapter : public FileAdapter, public MemoryManaged {
      method EspIdfFileAdapter (line 489) | EspIdfFileAdapter(FILE *file) : MemoryManaged("Filesystem"), file(fi...
      method read (line 495) | size_t read(char *buf, size_t len) override {
      method write (line 499) | size_t write(const char *buf, size_t len) override {
      method seek (line 503) | size_t seek(size_t offset) override {
      method read (line 507) | int read() override {
    class EspIdfFilesystemAdapter (line 512) | class EspIdfFilesystemAdapter : public FilesystemAdapter, public Memor...
      method EspIdfFilesystemAdapter (line 518) | EspIdfFilesystemAdapter(FilesystemOpt config, void (* onDestruct)(vo...
      method stat (line 531) | int stat(const char *path, size_t *size) override {
      method open (line 540) | std::unique_ptr<FileAdapter> open(const char *fn, const char *mode) ...
      method remove (line 550) | bool remove(const char *fn) override {
      method ftw_root (line 554) | int ftw_root(std::function<int(const char *fpath)> fn) override {
    function resetFilesystemCache (line 589) | void resetFilesystemCache(void*) {
    function makeDefaultFilesystemAdapter (line 593) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
    class PosixFileAdapter (line 671) | class PosixFileAdapter : public FileAdapter, public MemoryManaged {
      method PosixFileAdapter (line 674) | PosixFileAdapter(FILE *file) : MemoryManaged("Filesystem"), file(fil...
      method read (line 680) | size_t read(char *buf, size_t len) override {
      method write (line 684) | size_t write(const char *buf, size_t len) override {
      method seek (line 688) | size_t seek(size_t offset) override {
      method read (line 692) | int read() override {
    class PosixFilesystemAdapter (line 697) | class PosixFilesystemAdapter : public FilesystemAdapter, public Memory...
      method PosixFilesystemAdapter (line 703) | PosixFilesystemAdapter(FilesystemOpt config, void (* onDestruct)(voi...
      method stat (line 711) | int stat(const char *path, size_t *size) override {
      method open (line 720) | std::unique_ptr<FileAdapter> open(const char *fn, const char *mode) ...
      method remove (line 730) | bool remove(const char *fn) override {
      method ftw_root (line 734) | int ftw_root(std::function<int(const char *fpath)> fn) override {
    function resetFilesystemCache (line 759) | void resetFilesystemCache(void*) {
    function makeDefaultFilesystemAdapter (line 763) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
    function makeDefaultFilesystemAdapter (line 794) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
  type MicroOcpp (line 266) | namespace MicroOcpp {
    class FilesystemAdapterIndex (line 29) | class FilesystemAdapterIndex
      type IndexEntry (line 71) | struct IndexEntry {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 80) | IndexEntry *getEntryByFname(const char *fn) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 93) | IndexEntry *getEntryByPath(const char *path) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method FilesystemAdapterIndex (line 105) | FilesystemAdapterIndex(std::shared_ptr<FilesystemAdapter> filesystem...
      method stat (line 113) | int stat(const char *path, size_t *size) override {
      method open (line 122) | std::unique_ptr<FileAdapter> open(const char *path, const char *mode) {
      method remove (line 159) | bool remove(const char *path) override {
      method ftw_root (line 172) | int ftw_root(std::function<int(const char *fpath)> fn) {
      method createIndex (line 191) | bool createIndex() {
      method updateFilesize (line 223) | void updateFilesize(const char *fn, size_t size) {
    class IndexedFileAdapter (line 31) | class IndexedFileAdapter : public FileAdapter, public MemoryManaged {
      method IndexedFileAdapter (line 39) | IndexedFileAdapter(FilesystemAdapterIndex& index, const char *fn, st...
      method read (line 46) | size_t read(char *buf, size_t len) override {
      method write (line 50) | size_t write(const char *buf, size_t len) override {
      method seek (line 56) | size_t seek(size_t offset) override {
      method read (line 62) | int read() override {
    class FilesystemAdapterIndex (line 67) | class FilesystemAdapterIndex : public FilesystemAdapter, public Memory...
      type IndexEntry (line 71) | struct IndexEntry {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 80) | IndexEntry *getEntryByFname(const char *fn) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 93) | IndexEntry *getEntryByPath(const char *path) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method FilesystemAdapterIndex (line 105) | FilesystemAdapterIndex(std::shared_ptr<FilesystemAdapter> filesystem...
      method stat (line 113) | int stat(const char *path, size_t *size) override {
      method open (line 122) | std::unique_ptr<FileAdapter> open(const char *path, const char *mode) {
      method remove (line 159) | bool remove(const char *path) override {
      method ftw_root (line 172) | int ftw_root(std::function<int(const char *fpath)> fn) {
      method createIndex (line 191) | bool createIndex() {
      method updateFilesize (line 223) | void updateFilesize(const char *fn, size_t size) {
    function decorateIndex (line 235) | std::shared_ptr<FilesystemAdapter> decorateIndex(std::shared_ptr<Files...
    class ArduinoFileAdapter (line 268) | class ArduinoFileAdapter : public FileAdapter, public MemoryManaged {
      method ArduinoFileAdapter (line 271) | ArduinoFileAdapter(File&& file) : MemoryManaged("Filesystem"), file(...
      method read (line 279) | int read() override {
      method read (line 282) | size_t read(char *buf, size_t len) override {
      method write (line 285) | size_t write(const char *buf, size_t len) override {
      method seek (line 288) | size_t seek(size_t offset) override {
    class ArduinoFilesystemAdapter (line 293) | class ArduinoFilesystemAdapter : public FilesystemAdapter, public Memo...
      method ArduinoFilesystemAdapter (line 300) | ArduinoFilesystemAdapter(FilesystemOpt config, void (*onDestruct)(vo...
      method stat (line 340) | int stat(const char *path, size_t *size) override {
      method open (line 379) | std::unique_ptr<FileAdapter> open(const char *fn, const char *mode) ...
      method remove (line 388) | bool remove(const char *fn) override {
      method ftw_root (line 391) | int ftw_root(std::function<int(const char *fpath)> fn) override {
    function resetFilesystemCache (line 441) | void resetFilesystemCache(void*) {
    function makeDefaultFilesystemAdapter (line 445) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
    class EspIdfFileAdapter (line 486) | class EspIdfFileAdapter : public FileAdapter, public MemoryManaged {
      method EspIdfFileAdapter (line 489) | EspIdfFileAdapter(FILE *file) : MemoryManaged("Filesystem"), file(fi...
      method read (line 495) | size_t read(char *buf, size_t len) override {
      method write (line 499) | size_t write(const char *buf, size_t len) override {
      method seek (line 503) | size_t seek(size_t offset) override {
      method read (line 507) | int read() override {
    class EspIdfFilesystemAdapter (line 512) | class EspIdfFilesystemAdapter : public FilesystemAdapter, public Memor...
      method EspIdfFilesystemAdapter (line 518) | EspIdfFilesystemAdapter(FilesystemOpt config, void (* onDestruct)(vo...
      method stat (line 531) | int stat(const char *path, size_t *size) override {
      method open (line 540) | std::unique_ptr<FileAdapter> open(const char *fn, const char *mode) ...
      method remove (line 550) | bool remove(const char *fn) override {
      method ftw_root (line 554) | int ftw_root(std::function<int(const char *fpath)> fn) override {
    function resetFilesystemCache (line 589) | void resetFilesystemCache(void*) {
    function makeDefaultFilesystemAdapter (line 593) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
    class PosixFileAdapter (line 671) | class PosixFileAdapter : public FileAdapter, public MemoryManaged {
      method PosixFileAdapter (line 674) | PosixFileAdapter(FILE *file) : MemoryManaged("Filesystem"), file(fil...
      method read (line 680) | size_t read(char *buf, size_t len) override {
      method write (line 684) | size_t write(const char *buf, size_t len) override {
      method seek (line 688) | size_t seek(size_t offset) override {
      method read (line 692) | int read() override {
    class PosixFilesystemAdapter (line 697) | class PosixFilesystemAdapter : public FilesystemAdapter, public Memory...
      method PosixFilesystemAdapter (line 703) | PosixFilesystemAdapter(FilesystemOpt config, void (* onDestruct)(voi...
      method stat (line 711) | int stat(const char *path, size_t *size) override {
      method open (line 720) | std::unique_ptr<FileAdapter> open(const char *fn, const char *mode) ...
      method remove (line 730) | bool remove(const char *fn) override {
      method ftw_root (line 734) | int ftw_root(std::function<int(const char *fpath)> fn) override {
    function resetFilesystemCache (line 759) | void resetFilesystemCache(void*) {
    function makeDefaultFilesystemAdapter (line 763) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
    function makeDefaultFilesystemAdapter (line 794) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
  type MicroOcpp (line 484) | namespace MicroOcpp {
    class FilesystemAdapterIndex (line 29) | class FilesystemAdapterIndex
      type IndexEntry (line 71) | struct IndexEntry {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 80) | IndexEntry *getEntryByFname(const char *fn) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 93) | IndexEntry *getEntryByPath(const char *path) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method FilesystemAdapterIndex (line 105) | FilesystemAdapterIndex(std::shared_ptr<FilesystemAdapter> filesystem...
      method stat (line 113) | int stat(const char *path, size_t *size) override {
      method open (line 122) | std::unique_ptr<FileAdapter> open(const char *path, const char *mode) {
      method remove (line 159) | bool remove(const char *path) override {
      method ftw_root (line 172) | int ftw_root(std::function<int(const char *fpath)> fn) {
      method createIndex (line 191) | bool createIndex() {
      method updateFilesize (line 223) | void updateFilesize(const char *fn, size_t size) {
    class IndexedFileAdapter (line 31) | class IndexedFileAdapter : public FileAdapter, public MemoryManaged {
      method IndexedFileAdapter (line 39) | IndexedFileAdapter(FilesystemAdapterIndex& index, const char *fn, st...
      method read (line 46) | size_t read(char *buf, size_t len) override {
      method write (line 50) | size_t write(const char *buf, size_t len) override {
      method seek (line 56) | size_t seek(size_t offset) override {
      method read (line 62) | int read() override {
    class FilesystemAdapterIndex (line 67) | class FilesystemAdapterIndex : public FilesystemAdapter, public Memory...
      type IndexEntry (line 71) | struct IndexEntry {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 80) | IndexEntry *getEntryByFname(const char *fn) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 93) | IndexEntry *getEntryByPath(const char *path) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method FilesystemAdapterIndex (line 105) | FilesystemAdapterIndex(std::shared_ptr<FilesystemAdapter> filesystem...
      method stat (line 113) | int stat(const char *path, size_t *size) override {
      method open (line 122) | std::unique_ptr<FileAdapter> open(const char *path, const char *mode) {
      method remove (line 159) | bool remove(const char *path) override {
      method ftw_root (line 172) | int ftw_root(std::function<int(const char *fpath)> fn) {
      method createIndex (line 191) | bool createIndex() {
      method updateFilesize (line 223) | void updateFilesize(const char *fn, size_t size) {
    function decorateIndex (line 235) | std::shared_ptr<FilesystemAdapter> decorateIndex(std::shared_ptr<Files...
    class ArduinoFileAdapter (line 268) | class ArduinoFileAdapter : public FileAdapter, public MemoryManaged {
      method ArduinoFileAdapter (line 271) | ArduinoFileAdapter(File&& file) : MemoryManaged("Filesystem"), file(...
      method read (line 279) | int read() override {
      method read (line 282) | size_t read(char *buf, size_t len) override {
      method write (line 285) | size_t write(const char *buf, size_t len) override {
      method seek (line 288) | size_t seek(size_t offset) override {
    class ArduinoFilesystemAdapter (line 293) | class ArduinoFilesystemAdapter : public FilesystemAdapter, public Memo...
      method ArduinoFilesystemAdapter (line 300) | ArduinoFilesystemAdapter(FilesystemOpt config, void (*onDestruct)(vo...
      method stat (line 340) | int stat(const char *path, size_t *size) override {
      method open (line 379) | std::unique_ptr<FileAdapter> open(const char *fn, const char *mode) ...
      method remove (line 388) | bool remove(const char *fn) override {
      method ftw_root (line 391) | int ftw_root(std::function<int(const char *fpath)> fn) override {
    function resetFilesystemCache (line 441) | void resetFilesystemCache(void*) {
    function makeDefaultFilesystemAdapter (line 445) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
    class EspIdfFileAdapter (line 486) | class EspIdfFileAdapter : public FileAdapter, public MemoryManaged {
      method EspIdfFileAdapter (line 489) | EspIdfFileAdapter(FILE *file) : MemoryManaged("Filesystem"), file(fi...
      method read (line 495) | size_t read(char *buf, size_t len) override {
      method write (line 499) | size_t write(const char *buf, size_t len) override {
      method seek (line 503) | size_t seek(size_t offset) override {
      method read (line 507) | int read() override {
    class EspIdfFilesystemAdapter (line 512) | class EspIdfFilesystemAdapter : public FilesystemAdapter, public Memor...
      method EspIdfFilesystemAdapter (line 518) | EspIdfFilesystemAdapter(FilesystemOpt config, void (* onDestruct)(vo...
      method stat (line 531) | int stat(const char *path, size_t *size) override {
      method open (line 540) | std::unique_ptr<FileAdapter> open(const char *fn, const char *mode) ...
      method remove (line 550) | bool remove(const char *fn) override {
      method ftw_root (line 554) | int ftw_root(std::function<int(const char *fpath)> fn) override {
    function resetFilesystemCache (line 589) | void resetFilesystemCache(void*) {
    function makeDefaultFilesystemAdapter (line 593) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
    class PosixFileAdapter (line 671) | class PosixFileAdapter : public FileAdapter, public MemoryManaged {
      method PosixFileAdapter (line 674) | PosixFileAdapter(FILE *file) : MemoryManaged("Filesystem"), file(fil...
      method read (line 680) | size_t read(char *buf, size_t len) override {
      method write (line 684) | size_t write(const char *buf, size_t len) override {
      method seek (line 688) | size_t seek(size_t offset) override {
      method read (line 692) | int read() override {
    class PosixFilesystemAdapter (line 697) | class PosixFilesystemAdapter : public FilesystemAdapter, public Memory...
      method PosixFilesystemAdapter (line 703) | PosixFilesystemAdapter(FilesystemOpt config, void (* onDestruct)(voi...
      method stat (line 711) | int stat(const char *path, size_t *size) override {
      method open (line 720) | std::unique_ptr<FileAdapter> open(const char *fn, const char *mode) ...
      method remove (line 730) | bool remove(const char *fn) override {
      method ftw_root (line 734) | int ftw_root(std::function<int(const char *fpath)> fn) override {
    function resetFilesystemCache (line 759) | void resetFilesystemCache(void*) {
    function makeDefaultFilesystemAdapter (line 763) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
    function makeDefaultFilesystemAdapter (line 794) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
  type MicroOcpp (line 669) | namespace MicroOcpp {
    class FilesystemAdapterIndex (line 29) | class FilesystemAdapterIndex
      type IndexEntry (line 71) | struct IndexEntry {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 80) | IndexEntry *getEntryByFname(const char *fn) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 93) | IndexEntry *getEntryByPath(const char *path) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method FilesystemAdapterIndex (line 105) | FilesystemAdapterIndex(std::shared_ptr<FilesystemAdapter> filesystem...
      method stat (line 113) | int stat(const char *path, size_t *size) override {
      method open (line 122) | std::unique_ptr<FileAdapter> open(const char *path, const char *mode) {
      method remove (line 159) | bool remove(const char *path) override {
      method ftw_root (line 172) | int ftw_root(std::function<int(const char *fpath)> fn) {
      method createIndex (line 191) | bool createIndex() {
      method updateFilesize (line 223) | void updateFilesize(const char *fn, size_t size) {
    class IndexedFileAdapter (line 31) | class IndexedFileAdapter : public FileAdapter, public MemoryManaged {
      method IndexedFileAdapter (line 39) | IndexedFileAdapter(FilesystemAdapterIndex& index, const char *fn, st...
      method read (line 46) | size_t read(char *buf, size_t len) override {
      method write (line 50) | size_t write(const char *buf, size_t len) override {
      method seek (line 56) | size_t seek(size_t offset) override {
      method read (line 62) | int read() override {
    class FilesystemAdapterIndex (line 67) | class FilesystemAdapterIndex : public FilesystemAdapter, public Memory...
      type IndexEntry (line 71) | struct IndexEntry {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 80) | IndexEntry *getEntryByFname(const char *fn) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 93) | IndexEntry *getEntryByPath(const char *path) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method FilesystemAdapterIndex (line 105) | FilesystemAdapterIndex(std::shared_ptr<FilesystemAdapter> filesystem...
      method stat (line 113) | int stat(const char *path, size_t *size) override {
      method open (line 122) | std::unique_ptr<FileAdapter> open(const char *path, const char *mode) {
      method remove (line 159) | bool remove(const char *path) override {
      method ftw_root (line 172) | int ftw_root(std::function<int(const char *fpath)> fn) {
      method createIndex (line 191) | bool createIndex() {
      method updateFilesize (line 223) | void updateFilesize(const char *fn, size_t size) {
    function decorateIndex (line 235) | std::shared_ptr<FilesystemAdapter> decorateIndex(std::shared_ptr<Files...
    class ArduinoFileAdapter (line 268) | class ArduinoFileAdapter : public FileAdapter, public MemoryManaged {
      method ArduinoFileAdapter (line 271) | ArduinoFileAdapter(File&& file) : MemoryManaged("Filesystem"), file(...
      method read (line 279) | int read() override {
      method read (line 282) | size_t read(char *buf, size_t len) override {
      method write (line 285) | size_t write(const char *buf, size_t len) override {
      method seek (line 288) | size_t seek(size_t offset) override {
    class ArduinoFilesystemAdapter (line 293) | class ArduinoFilesystemAdapter : public FilesystemAdapter, public Memo...
      method ArduinoFilesystemAdapter (line 300) | ArduinoFilesystemAdapter(FilesystemOpt config, void (*onDestruct)(vo...
      method stat (line 340) | int stat(const char *path, size_t *size) override {
      method open (line 379) | std::unique_ptr<FileAdapter> open(const char *fn, const char *mode) ...
      method remove (line 388) | bool remove(const char *fn) override {
      method ftw_root (line 391) | int ftw_root(std::function<int(const char *fpath)> fn) override {
    function resetFilesystemCache (line 441) | void resetFilesystemCache(void*) {
    function makeDefaultFilesystemAdapter (line 445) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
    class EspIdfFileAdapter (line 486) | class EspIdfFileAdapter : public FileAdapter, public MemoryManaged {
      method EspIdfFileAdapter (line 489) | EspIdfFileAdapter(FILE *file) : MemoryManaged("Filesystem"), file(fi...
      method read (line 495) | size_t read(char *buf, size_t len) override {
      method write (line 499) | size_t write(const char *buf, size_t len) override {
      method seek (line 503) | size_t seek(size_t offset) override {
      method read (line 507) | int read() override {
    class EspIdfFilesystemAdapter (line 512) | class EspIdfFilesystemAdapter : public FilesystemAdapter, public Memor...
      method EspIdfFilesystemAdapter (line 518) | EspIdfFilesystemAdapter(FilesystemOpt config, void (* onDestruct)(vo...
      method stat (line 531) | int stat(const char *path, size_t *size) override {
      method open (line 540) | std::unique_ptr<FileAdapter> open(const char *fn, const char *mode) ...
      method remove (line 550) | bool remove(const char *fn) override {
      method ftw_root (line 554) | int ftw_root(std::function<int(const char *fpath)> fn) override {
    function resetFilesystemCache (line 589) | void resetFilesystemCache(void*) {
    function makeDefaultFilesystemAdapter (line 593) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
    class PosixFileAdapter (line 671) | class PosixFileAdapter : public FileAdapter, public MemoryManaged {
      method PosixFileAdapter (line 674) | PosixFileAdapter(FILE *file) : MemoryManaged("Filesystem"), file(fil...
      method read (line 680) | size_t read(char *buf, size_t len) override {
      method write (line 684) | size_t write(const char *buf, size_t len) override {
      method seek (line 688) | size_t seek(size_t offset) override {
      method read (line 692) | int read() override {
    class PosixFilesystemAdapter (line 697) | class PosixFilesystemAdapter : public FilesystemAdapter, public Memory...
      method PosixFilesystemAdapter (line 703) | PosixFilesystemAdapter(FilesystemOpt config, void (* onDestruct)(voi...
      method stat (line 711) | int stat(const char *path, size_t *size) override {
      method open (line 720) | std::unique_ptr<FileAdapter> open(const char *fn, const char *mode) ...
      method remove (line 730) | bool remove(const char *fn) override {
      method ftw_root (line 734) | int ftw_root(std::function<int(const char *fpath)> fn) override {
    function resetFilesystemCache (line 759) | void resetFilesystemCache(void*) {
    function makeDefaultFilesystemAdapter (line 763) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
    function makeDefaultFilesystemAdapter (line 794) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
  type MicroOcpp (line 792) | namespace MicroOcpp {
    class FilesystemAdapterIndex (line 29) | class FilesystemAdapterIndex
      type IndexEntry (line 71) | struct IndexEntry {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 80) | IndexEntry *getEntryByFname(const char *fn) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 93) | IndexEntry *getEntryByPath(const char *path) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method FilesystemAdapterIndex (line 105) | FilesystemAdapterIndex(std::shared_ptr<FilesystemAdapter> filesystem...
      method stat (line 113) | int stat(const char *path, size_t *size) override {
      method open (line 122) | std::unique_ptr<FileAdapter> open(const char *path, const char *mode) {
      method remove (line 159) | bool remove(const char *path) override {
      method ftw_root (line 172) | int ftw_root(std::function<int(const char *fpath)> fn) {
      method createIndex (line 191) | bool createIndex() {
      method updateFilesize (line 223) | void updateFilesize(const char *fn, size_t size) {
    class IndexedFileAdapter (line 31) | class IndexedFileAdapter : public FileAdapter, public MemoryManaged {
      method IndexedFileAdapter (line 39) | IndexedFileAdapter(FilesystemAdapterIndex& index, const char *fn, st...
      method read (line 46) | size_t read(char *buf, size_t len) override {
      method write (line 50) | size_t write(const char *buf, size_t len) override {
      method seek (line 56) | size_t seek(size_t offset) override {
      method read (line 62) | int read() override {
    class FilesystemAdapterIndex (line 67) | class FilesystemAdapterIndex : public FilesystemAdapter, public Memory...
      type IndexEntry (line 71) | struct IndexEntry {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 80) | IndexEntry *getEntryByFname(const char *fn) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method IndexEntry (line 93) | IndexEntry *getEntryByPath(const char *path) {
        method IndexEntry (line 75) | IndexEntry(const char *fname, size_t size) : fname(makeString("Fil...
      method FilesystemAdapterIndex (line 105) | FilesystemAdapterIndex(std::shared_ptr<FilesystemAdapter> filesystem...
      method stat (line 113) | int stat(const char *path, size_t *size) override {
      method open (line 122) | std::unique_ptr<FileAdapter> open(const char *path, const char *mode) {
      method remove (line 159) | bool remove(const char *path) override {
      method ftw_root (line 172) | int ftw_root(std::function<int(const char *fpath)> fn) {
      method createIndex (line 191) | bool createIndex() {
      method updateFilesize (line 223) | void updateFilesize(const char *fn, size_t size) {
    function decorateIndex (line 235) | std::shared_ptr<FilesystemAdapter> decorateIndex(std::shared_ptr<Files...
    class ArduinoFileAdapter (line 268) | class ArduinoFileAdapter : public FileAdapter, public MemoryManaged {
      method ArduinoFileAdapter (line 271) | ArduinoFileAdapter(File&& file) : MemoryManaged("Filesystem"), file(...
      method read (line 279) | int read() override {
      method read (line 282) | size_t read(char *buf, size_t len) override {
      method write (line 285) | size_t write(const char *buf, size_t len) override {
      method seek (line 288) | size_t seek(size_t offset) override {
    class ArduinoFilesystemAdapter (line 293) | class ArduinoFilesystemAdapter : public FilesystemAdapter, public Memo...
      method ArduinoFilesystemAdapter (line 300) | ArduinoFilesystemAdapter(FilesystemOpt config, void (*onDestruct)(vo...
      method stat (line 340) | int stat(const char *path, size_t *size) override {
      method open (line 379) | std::unique_ptr<FileAdapter> open(const char *fn, const char *mode) ...
      method remove (line 388) | bool remove(const char *fn) override {
      method ftw_root (line 391) | int ftw_root(std::function<int(const char *fpath)> fn) override {
    function resetFilesystemCache (line 441) | void resetFilesystemCache(void*) {
    function makeDefaultFilesystemAdapter (line 445) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
    class EspIdfFileAdapter (line 486) | class EspIdfFileAdapter : public FileAdapter, public MemoryManaged {
      method EspIdfFileAdapter (line 489) | EspIdfFileAdapter(FILE *file) : MemoryManaged("Filesystem"), file(fi...
      method read (line 495) | size_t read(char *buf, size_t len) override {
      method write (line 499) | size_t write(const char *buf, size_t len) override {
      method seek (line 503) | size_t seek(size_t offset) override {
      method read (line 507) | int read() override {
    class EspIdfFilesystemAdapter (line 512) | class EspIdfFilesystemAdapter : public FilesystemAdapter, public Memor...
      method EspIdfFilesystemAdapter (line 518) | EspIdfFilesystemAdapter(FilesystemOpt config, void (* onDestruct)(vo...
      method stat (line 531) | int stat(const char *path, size_t *size) override {
      method open (line 540) | std::unique_ptr<FileAdapter> open(const char *fn, const char *mode) ...
      method remove (line 550) | bool remove(const char *fn) override {
      method ftw_root (line 554) | int ftw_root(std::function<int(const char *fpath)> fn) override {
    function resetFilesystemCache (line 589) | void resetFilesystemCache(void*) {
    function makeDefaultFilesystemAdapter (line 593) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
    class PosixFileAdapter (line 671) | class PosixFileAdapter : public FileAdapter, public MemoryManaged {
      method PosixFileAdapter (line 674) | PosixFileAdapter(FILE *file) : MemoryManaged("Filesystem"), file(fil...
      method read (line 680) | size_t read(char *buf, size_t len) override {
      method write (line 684) | size_t write(const char *buf, size_t len) override {
      method seek (line 688) | size_t seek(size_t offset) override {
      method read (line 692) | int read() override {
    class PosixFilesystemAdapter (line 697) | class PosixFilesystemAdapter : public FilesystemAdapter, public Memory...
      method PosixFilesystemAdapter (line 703) | PosixFilesystemAdapter(FilesystemOpt config, void (* onDestruct)(voi...
      method stat (line 711) | int stat(const char *path, size_t *size) override {
      method open (line 720) | std::unique_ptr<FileAdapter> open(const char *fn, const char *mode) ...
      method remove (line 730) | bool remove(const char *fn) override {
      method ftw_root (line 734) | int ftw_root(std::function<int(const char *fpath)> fn) override {
    function resetFilesystemCache (line 759) | void resetFilesystemCache(void*) {
    function makeDefaultFilesystemAdapter (line 763) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...
    function makeDefaultFilesystemAdapter (line 794) | std::shared_ptr<FilesystemAdapter> makeDefaultFilesystemAdapter(Filesy...

FILE: src/MicroOcpp/Core/FilesystemAdapter.h
  function namespace (line 58) | namespace MicroOcpp {

FILE: src/MicroOcpp/Core/FilesystemUtils.h
  function namespace (line 13) | namespace MicroOcpp {

FILE: src/MicroOcpp/Core/Ftp.h
  type MO_FtpCloseReason (line 14) | typedef enum {
  type ocpp_ftp_download (line 20) | typedef struct ocpp_ftp_download {
  type ocpp_ftp_upload (line 27) | typedef struct ocpp_ftp_upload {
  type ocpp_ftp_client (line 34) | typedef struct ocpp_ftp_client {
  function namespace (line 64) | namespace MicroOcpp {

FILE: src/MicroOcpp/Core/FtpMbedTLS.cpp
  type MicroOcpp (line 22) | namespace MicroOcpp {
    class FtpTransferMbedTLS (line 24) | class FtpTransferMbedTLS : public FtpUpload, public FtpDownload, publi...
      type Method (line 69) | enum class Method {
    class FtpClientMbedTLS (line 114) | class FtpClientMbedTLS : public FtpClient, public MemoryManaged {
    function makeFtpClientMbedTLS (line 134) | std::unique_ptr<FtpClient> makeFtpClientMbedTLS(bool tls_only, const c...
    function mo_mbedtls_log (line 138) | void mo_mbedtls_log(void *user, int level, const char *file, int line,...

FILE: src/MicroOcpp/Core/FtpMbedTLS.h
  function namespace (line 32) | namespace MicroOcpp {

FILE: src/MicroOcpp/Core/Memory.cpp
  type MicroOcpp (line 12) | namespace MicroOcpp {
    type Memory (line 13) | namespace Memory {
      type MemBlockInfo (line 15) | struct MemBlockInfo {
        method MemBlockInfo (line 20) | MemBlockInfo(void* ptr, const char *tag, size_t size) : size{size} {
      type MemTagInfo (line 29) | struct MemTagInfo {
        method MemTagInfo (line 33) | MemTagInfo(size_t size) {
        method reset (line 50) | void reset() {
    type Memory (line 91) | namespace Memory {
      type MemBlockInfo (line 15) | struct MemBlockInfo {
        method MemBlockInfo (line 20) | MemBlockInfo(void* ptr, const char *tag, size_t size) : size{size} {
      type MemTagInfo (line 29) | struct MemTagInfo {
        method MemTagInfo (line 33) | MemTagInfo(size_t size) {
        method reset (line 50) | void reset() {
    function String (line 296) | String makeString(const char *tag, const char *val) {
    function JsonDoc (line 312) | JsonDoc initJsonDoc(const char *tag, size_t capacity) {
    function makeJsonDoc (line 320) | std::unique_ptr<JsonDoc> makeJsonDoc(const char *tag, size_t capacity) {
  type MicroOcpp (line 90) | namespace MicroOcpp {
    type Memory (line 13) | namespace Memory {
      type MemBlockInfo (line 15) | struct MemBlockInfo {
        method MemBlockInfo (line 20) | MemBlockInfo(void* ptr, const char *tag, size_t size) : size{size} {
      type MemTagInfo (line 29) | struct MemTagInfo {
        method MemTagInfo (line 33) | MemTagInfo(size_t size) {
        method reset (line 50) | void reset() {
    type Memory (line 91) | namespace Memory {
      type MemBlockInfo (line 15) | struct MemBlockInfo {
        method MemBlockInfo (line 20) | MemBlockInfo(void* ptr, const char *tag, size_t size) : size{size} {
      type MemTagInfo (line 29) | struct MemTagInfo {
        method MemTagInfo (line 33) | MemTagInfo(size_t size) {
        method reset (line 50) | void reset() {
    function String (line 296) | String makeString(const char *tag, const char *val) {
    function JsonDoc (line 312) | JsonDoc initJsonDoc(const char *tag, size_t capacity) {
    function makeJsonDoc (line 320) | std::unique_ptr<JsonDoc> makeJsonDoc(const char *tag, size_t capacity) {
  function mo_mem_set_malloc_free (line 101) | void mo_mem_set_malloc_free(void* (*malloc_override)(size_t), void (*fre...
  function mo_mem_free (line 127) | void mo_mem_free(void* ptr) {
  function mo_mem_deinit (line 159) | void mo_mem_deinit() {
  function mo_mem_reset (line 164) | void mo_mem_reset() {
  function mo_mem_set_tag (line 174) | void mo_mem_set_tag(void *ptr, const char *tag) {
  function mo_mem_print_stats (line 200) | void mo_mem_print_stats() {
  function mo_mem_write_stats_json (line 257) | int mo_mem_write_stats_json(char *buf, size_t size) {
  type MicroOcpp (line 294) | namespace MicroOcpp {
    type Memory (line 13) | namespace Memory {
      type MemBlockInfo (line 15) | struct MemBlockInfo {
        method MemBlockInfo (line 20) | MemBlockInfo(void* ptr, const char *tag, size_t size) : size{size} {
      type MemTagInfo (line 29) | struct MemTagInfo {
        method MemTagInfo (line 33) | MemTagInfo(size_t size) {
        method reset (line 50) | void reset() {
    type Memory (line 91) | namespace Memory {
      type MemBlockInfo (line 15) | struct MemBlockInfo {
        method MemBlockInfo (line 20) | MemBlockInfo(void* ptr, const char *tag, size_t size) : size{size} {
      type MemTagInfo (line 29) | struct MemTagInfo {
        method MemTagInfo (line 33) | MemTagInfo(size_t size) {
        method reset (line 50) | void reset() {
    function String (line 296) | String makeString(const char *tag, const char *val) {
    function JsonDoc (line 312) | JsonDoc initJsonDoc(const char *tag, size_t capacity) {
    function makeJsonDoc (line 320) | std::unique_ptr<JsonDoc> makeJsonDoc(const char *tag, size_t capacity) {

FILE: src/MicroOcpp/Core/Memory.h
  function namespace (line 104) | namespace MicroOcpp {
  function T (line 220) | T *allocate(size_t count) {
  function deallocate (line 228) | void deallocate(T *ptr, size_t count) {
  type T (line 250) | typedef T value_type;
  function class (line 294) | class ArduinoJsonAllocator {
  function deallocate (line 358) | void deallocate(void *ptr) {
  function namespace (line 387) | namespace MicroOcpp {
  function namespace (line 434) | namespace MicroOcpp {

FILE: src/MicroOcpp/Core/OcppError.h
  function namespace (line 11) | namespace MicroOcpp {

FILE: src/MicroOcpp/Core/Operation.h
  function namespace (line 25) | namespace MicroOcpp {

FILE: src/MicroOcpp/Core/OperationRegistry.cpp
  function OperationCreator (line 18) | OperationCreator *OperationRegistry::findCreator(const char *operationTy...

FILE: src/MicroOcpp/Core/OperationRegistry.h
  type OperationCreator (line 18) | struct OperationCreator {
  function OnReceiveReqListener (line 21) | OnReceiveReqListener onRequest {nullptr};

FILE: src/MicroOcpp/Core/Request.cpp
  type MicroOcpp (line 17) | namespace MicroOcpp {
    function writeRandomNonsecure (line 20) | void writeRandomNonsecure(unsigned char *buf, size_t len) {
    function makeRequest (line 286) | std::unique_ptr<Request> makeRequest(std::unique_ptr<Operation> operat...
    function makeRequest (line 293) | std::unique_ptr<Request> makeRequest(Operation *operation) {
  function Operation (line 42) | Operation *Request::getOperation(){
  type MicroOcpp (line 284) | namespace MicroOcpp {
    function writeRandomNonsecure (line 20) | void writeRandomNonsecure(unsigned char *buf, size_t len) {
    function makeRequest (line 286) | std::unique_ptr<Request> makeRequest(std::unique_ptr<Operation> operat...
    function makeRequest (line 293) | std::unique_ptr<Request> makeRequest(Operation *operation) {

FILE: src/MicroOcpp/Core/Request.h
  function OnReceiveConfListener (line 28) | OnReceiveConfListener onReceiveConfListener = [] (JsonObject payload) {}
  function OnReceiveReqListener (line 29) | OnReceiveReqListener onReceiveReqListener = [] (JsonObject payload) {}
  function OnSendConfListener (line 30) | OnSendConfListener onSendConfListener = [] (JsonObject payload) {}
  function OnTimeoutListener (line 31) | OnTimeoutListener onTimeoutListener = [] () {}
  function OnReceiveErrorListener (line 32) | OnReceiveErrorListener onReceiveErrorListener = [] (const char *code, co...
  function OnAbortListener (line 33) | OnAbortListener onAbortListener = [] () {}
  function CreateRequestResult (line 63) | enum class CreateRequestResult {

FILE: src/MicroOcpp/Core/RequestCallbacks.h
  function namespace (line 11) | namespace MicroOcpp {

FILE: src/MicroOcpp/Core/RequestQueue.cpp
  function removePayload (line 390) | size_t removePayload(const char *src, size_t src_size, char *dst, size_t...

FILE: src/MicroOcpp/Core/RequestQueue.h
  function namespace (line 24) | namespace MicroOcpp {

FILE: src/MicroOcpp/Core/Time.cpp
  type MicroOcpp (line 9) | namespace MicroOcpp {
    function noDays (line 30) | int noDays(int month, int year) {
    function Timestamp (line 157) | Timestamp &Timestamp::operator+=(int secs) {
    function Timestamp (line 211) | Timestamp &Timestamp::addMilliseconds(int val) {
    function Timestamp (line 227) | Timestamp &Timestamp::operator-=(int secs) {
    function Timestamp (line 268) | Timestamp &Timestamp::operator=(const Timestamp &rhs) {
    function Timestamp (line 282) | Timestamp operator+(const Timestamp &lhs, int secs) {
    function Timestamp (line 288) | Timestamp operator-(const Timestamp &lhs, int secs) {
    function Timestamp (line 358) | const Timestamp &Clock::now() {
    function Timestamp (line 374) | Timestamp Clock::adjustPrebootTimestamp(const Timestamp& t) {

FILE: src/MicroOcpp/Core/Time.h
  function namespace (line 25) | namespace MicroOcpp {

FILE: src/MicroOcpp/Core/UuidUtils.cpp
  type MicroOcpp (line 6) | namespace MicroOcpp {
    function generateUUID (line 10) | bool generateUUID(char *uuidBuffer, size_t len) {

FILE: src/MicroOcpp/Core/UuidUtils.h
  function namespace (line 5) | namespace MicroOcpp {

FILE: src/MicroOcpp/Debug.cpp
  function mo_dbg_print_prefix (line 19) | void mo_dbg_print_prefix(int level, const char *fn, int line) {
  function mo_dbg_print_prefix (line 24) | void mo_dbg_print_prefix(int level, const char *fn, int line) {
  function mo_dbg_print_prefix (line 35) | void mo_dbg_print_prefix(int level, const char *fn, int line) {
  function mo_dbg_print_prefix (line 44) | void mo_dbg_print_prefix(int level, const char *fn, int line) {
  function mo_dbg_print_suffix (line 52) | void mo_dbg_print_suffix() {

FILE: src/MicroOcpp/Model/Authorization/AuthorizationData.cpp
  function AuthorizationData (line 27) | AuthorizationData& AuthorizationData::operator=(AuthorizationData&& othe...
  function Timestamp (line 132) | Timestamp *AuthorizationData::getExpiryDate() const {
  function AuthorizationStatus (line 138) | AuthorizationStatus AuthorizationData::getAuthorizationStatus() const {

FILE: src/MicroOcpp/Model/Authorization/AuthorizationData.h
  function AuthorizationStatus (line 20) | enum class AuthorizationStatus : uint8_t {

FILE: src/MicroOcpp/Model/Authorization/AuthorizationList.h
  function namespace (line 23) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Authorization/AuthorizationService.cpp
  function AuthorizationData (line 77) | AuthorizationData *AuthorizationService::getLocalAuthorization(const cha...

FILE: src/MicroOcpp/Model/Authorization/AuthorizationService.h
  function namespace (line 17) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Authorization/IdToken.h
  function namespace (line 18) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Availability/AvailabilityService.cpp
  function ChargePointStatus (line 49) | ChargePointStatus AvailabilityServiceEvse::getStatus() {
  function ChangeAvailabilityStatus (line 92) | ChangeAvailabilityStatus AvailabilityServiceEvse::changeAvailability(boo...
  function AvailabilityServiceEvse (line 195) | AvailabilityServiceEvse *AvailabilityService::getEvse(unsigned int evseI...

FILE: src/MicroOcpp/Model/Availability/AvailabilityService.h
  function namespace (line 33) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Availability/ChangeAvailabilityStatus.h
  function namespace (line 14) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Boot/BootService.cpp
  function RegistrationStatus (line 31) | RegistrationStatus MicroOcpp::deserializeRegistrationStatus(const char *...

FILE: src/MicroOcpp/Model/Boot/BootService.h
  function namespace (line 20) | namespace MicroOcpp {
  function RegistrationStatus (line 35) | enum class RegistrationStatus {

FILE: src/MicroOcpp/Model/Certificates/Certificate.cpp
  function ocpp_cert_equals (line 12) | bool ocpp_cert_equals(const ocpp_cert_hash *h1, const ocpp_cert_hash *h2) {
  function ocpp_cert_bytes_to_hex (line 19) | int ocpp_cert_bytes_to_hex(char *dst, size_t dst_size, const unsigned ch...
  function ocpp_cert_print_issuerNameHash (line 40) | int ocpp_cert_print_issuerNameHash(const ocpp_cert_hash *src, char *buf,...
  function ocpp_cert_print_issuerKeyHash (line 44) | int ocpp_cert_print_issuerKeyHash(const ocpp_cert_hash *src, char *buf, ...
  function ocpp_cert_print_serialNumber (line 48) | int ocpp_cert_print_serialNumber(const ocpp_cert_hash *src, char *buf, s...
  function ocpp_cert_hex_to_bytes (line 76) | int ocpp_cert_hex_to_bytes(unsigned char *dst, size_t dst_size, const ch...
  function ocpp_cert_set_issuerNameHash (line 127) | int ocpp_cert_set_issuerNameHash(ocpp_cert_hash *dst, const char *hex_sr...
  function ocpp_cert_set_issuerKeyHash (line 141) | int ocpp_cert_set_issuerKeyHash(ocpp_cert_hash *dst, const char *hex_src...
  function ocpp_cert_set_serialNumber (line 155) | int ocpp_cert_set_serialNumber(ocpp_cert_hash *dst, const char *hex_src) {

FILE: src/MicroOcpp/Model/Certificates/Certificate.h
  type GetCertificateIdType (line 23) | typedef enum GetCertificateIdType {
  type GetInstalledCertificateStatus (line 34) | typedef enum GetInstalledCertificateStatus {
  type InstallCertificateType (line 42) | typedef enum InstallCertificateType {
  type InstallCertificateStatus (line 52) | typedef enum InstallCertificateStatus {
  type DeleteCertificateStatus (line 61) | typedef enum DeleteCertificateStatus {
  type HashAlgorithmType (line 70) | typedef enum HashAlgorithmType {
  type ocpp_cert_hash (line 86) | typedef struct ocpp_cert_hash {
  function namespace (line 133) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Certificates/CertificateMbedTLS.cpp
  function ocpp_get_cert_hash (line 18) | bool ocpp_get_cert_hash(mbedtls_x509_crt& cacert, HashAlgorithmType hash...
  function ocpp_get_cert_hash (line 115) | bool ocpp_get_cert_hash(const unsigned char *buf, size_t len, HashAlgori...
  type MicroOcpp (line 135) | namespace MicroOcpp {
    class CertificateStoreMbedTLS (line 137) | class CertificateStoreMbedTLS : public CertificateStore, public Memory...
      method getCertHash (line 141) | bool getCertHash(const char *fn, HashAlgorithmType hashAlg, Certific...
      method CertificateStoreMbedTLS (line 187) | CertificateStoreMbedTLS(std::shared_ptr<FilesystemAdapter> filesystem)
      method GetInstalledCertificateStatus (line 192) | GetInstalledCertificateStatus getCertificateIds(const Vector<GetCert...
      method DeleteCertificateStatus (line 244) | DeleteCertificateStatus deleteCertificate(const CertificateHash& has...
      method InstallCertificateStatus (line 286) | InstallCertificateStatus installCertificate(InstallCertificateType c...
    function makeCertificateStoreMbedTLS (line 389) | std::unique_ptr<CertificateStore> makeCertificateStoreMbedTLS(std::sha...
    function printCertFn (line 397) | bool printCertFn(const char *certType, size_t index, char *buf, size_t...

FILE: src/MicroOcpp/Model/Certificates/CertificateMbedTLS.h
  type HashAlgorithmType (line 30) | enum HashAlgorithmType
  function namespace (line 59) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Certificates/CertificateService.cpp
  function CertificateStore (line 31) | CertificateStore *CertificateService::getCertificateStore() {

FILE: src/MicroOcpp/Model/Certificates/CertificateService.h
  function namespace (line 27) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Certificates/Certificate_c.cpp
  type MicroOcpp (line 14) | namespace MicroOcpp {
    class CertificateStoreC (line 19) | class CertificateStoreC : public CertificateStore, public MemoryManaged {
      method CertificateStoreC (line 23) | CertificateStoreC(ocpp_cert_store *certstore) : MemoryManaged("v201....
      method GetInstalledCertificateStatus (line 29) | GetInstalledCertificateStatus getCertificateIds(const Vector<GetCert...
      method DeleteCertificateStatus (line 63) | DeleteCertificateStatus deleteCertificate(const CertificateHash& has...
      method InstallCertificateStatus (line 67) | InstallCertificateStatus installCertificate(InstallCertificateType c...
    function makeCertificateStoreCwrapper (line 72) | std::unique_ptr<CertificateStore> makeCertificateStoreCwrapper(ocpp_ce...

FILE: src/MicroOcpp/Model/Certificates/Certificate_c.h
  type ocpp_cert_chain_hash (line 20) | typedef struct ocpp_cert_chain_hash {
  type ocpp_cert_store (line 32) | typedef struct ocpp_cert_store {
  function namespace (line 45) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/ConnectorBase/ChargePointErrorData.h
  function namespace (line 10) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/ConnectorBase/ChargePointStatus.h
  type ChargePointStatus (line 14) | typedef enum ChargePointStatus {

FILE: src/MicroOcpp/Model/ConnectorBase/Connector.cpp
  function ChargePointStatus (line 140) | ChargePointStatus Connector::getStatus() {

FILE: src/MicroOcpp/Model/ConnectorBase/Connector.h
  function namespace (line 29) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/ConnectorBase/ConnectorsCommon.h
  function namespace (line 11) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/ConnectorBase/EvseId.h
  type EvseId (line 24) | struct EvseId {

FILE: src/MicroOcpp/Model/ConnectorBase/UnlockConnectorResult.h
  type UnlockConnectorResult (line 25) | typedef enum {

FILE: src/MicroOcpp/Model/Diagnostics/DiagnosticsService.cpp
  function DiagnosticsStatus (line 192) | DiagnosticsStatus DiagnosticsService::getDiagnosticsStatus() {

FILE: src/MicroOcpp/Model/Diagnostics/DiagnosticsService.h
  function UploadStatus (line 17) | enum class UploadStatus {
  function namespace (line 110) | namespace MicroOcpp {
  function namespace (line 116) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Diagnostics/DiagnosticsStatus.h
  function namespace (line 8) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/FirmwareManagement/FirmwareService.cpp
  function FirmwareStatus (line 243) | FirmwareStatus FirmwareService::getFirmwareStatus() {

FILE: src/MicroOcpp/Model/FirmwareManagement/FirmwareService.h
  type class (line 19) | enum class
  function InstallationStatus (line 25) | enum class InstallationStatus {
  function namespace (line 122) | namespace MicroOcpp {
  function namespace (line 128) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/FirmwareManagement/FirmwareStatus.h
  function namespace (line 8) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Heartbeat/HeartbeatService.h
  function namespace (line 13) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Metering/MeterStore.h
  function namespace (line 13) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Metering/MeterValue.cpp
  function Timestamp (line 54) | const Timestamp& MeterValue::getTimestamp() {
  function ReadingContext (line 62) | ReadingContext MeterValue::getReadingContext() {

FILE: src/MicroOcpp/Model/Metering/MeterValue.h
  function namespace (line 15) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Metering/MeterValuesV201.cpp
  type MicroOcpp (line 16) | namespace MicroOcpp {
    function csvContains (line 18) | bool csvContains(const char *csv, const char *elem) {
    type Ocpp201 (line 292) | namespace Ocpp201 {
      function validateSelectString (line 294) | bool validateSelectString(const char *csl, void *userPtr) {
  function SampledValue (line 122) | SampledValue *SampledValueInput::takeSampledValue(ReadingContext reading...
  function SampledValueProperties (line 126) | const SampledValueProperties& SampledValueInput::getProperties() {
  type MicroOcpp (line 291) | namespace MicroOcpp {
    function csvContains (line 18) | bool csvContains(const char *csv, const char *elem) {
    type Ocpp201 (line 292) | namespace Ocpp201 {
      function validateSelectString (line 294) | bool validateSelectString(const char *csl, void *userPtr) {
  function MeteringServiceEvse (line 357) | MeteringServiceEvse *MeteringService::getEvse(unsigned int evseId) {

FILE: src/MicroOcpp/Model/Metering/MeterValuesV201.h
  function namespace (line 28) | namespace Ocpp201 {

FILE: src/MicroOcpp/Model/Metering/MeteringConnector.h
  function energySamplerIndex (line 56) | int energySamplerIndex {-1};

FILE: src/MicroOcpp/Model/Metering/MeteringService.h
  function namespace (line 16) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Metering/ReadingContext.cpp
  type MicroOcpp (line 10) | namespace MicroOcpp {
    function ReadingContext (line 37) | ReadingContext deserializeReadingContext(const char *context) {

FILE: src/MicroOcpp/Model/Metering/ReadingContext.h
  type ReadingContext (line 8) | typedef enum {
  function namespace (line 22) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Metering/SampledValue.cpp
  function ReadingContext (line 59) | ReadingContext SampledValue::getReadingContext() {

FILE: src/MicroOcpp/Model/Metering/SampledValue.h
  function namespace (line 16) | namespace MicroOcpp {
  function class (line 45) | class SampledValueProperties {
  function class (line 80) | class SampledValue {
  function operator (line 107) | operator bool() override {return DeSerializer::ready(value);}
  function String (line 109) | String serializeValue() override {return DeSerializer::serialize(value);}
  function toInteger (line 111) | int32_t toInteger() override { return DeSerializer::toInteger(value);}
  function class (line 114) | class SampledValueSampler {

FILE: src/MicroOcpp/Model/Model.cpp
  function TransactionStore (line 99) | TransactionStore *Model::getTransactionStore() {
  function SmartChargingService (line 108) | SmartChargingService* Model::getSmartChargingService() const {
  function ConnectorsCommon (line 117) | ConnectorsCommon *Model::getConnectorsCommon() {
  function Connector (line 130) | Connector *Model::getConnector(unsigned int connectorId) {
  function MeteringService (line 144) | MeteringService* Model::getMeteringService() const {
  function FirmwareService (line 153) | FirmwareService *Model::getFirmwareService() const {
  function DiagnosticsService (line 162) | DiagnosticsService *Model::getDiagnosticsService() const {
  function AuthorizationService (line 177) | AuthorizationService *Model::getAuthorizationService() {
  function ReservationService (line 188) | ReservationService *Model::getReservationService() {
  function BootService (line 198) | BootService *Model::getBootService() const {
  function ResetService (line 207) | ResetService *Model::getResetService() const {
  function CertificateService (line 217) | CertificateService *Model::getCertificateService() const {
  function AvailabilityService (line 228) | AvailabilityService *Model::getAvailabilityService() const {
  function VariableService (line 237) | VariableService *Model::getVariableService() const {
  function TransactionService (line 246) | TransactionService *Model::getTransactionService() const {
  function RemoteControlService (line 273) | RemoteControlService *Model::getRemoteControlService() const {
  function Clock (line 278) | Clock& Model::getClock() {
  function ProtocolVersion (line 282) | const ProtocolVersion& Model::getVersion() const {

FILE: src/MicroOcpp/Model/Model.h
  function namespace (line 15) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/RemoteControl/RemoteControlDefs.h
  type RequestStartStopStatus (line 16) | typedef enum {
  type UnlockStatus (line 23) | typedef enum {

FILE: src/MicroOcpp/Model/RemoteControl/RemoteControlService.cpp
  function UnlockStatus (line 31) | UnlockStatus RemoteControlServiceEvse::unlockConnector() {
  function RemoteControlServiceEvse (line 97) | RemoteControlServiceEvse *RemoteControlService::getEvse(unsigned int evs...
  function RequestStartStopStatus (line 105) | RequestStartStopStatus RemoteControlService::requestStartTransaction(uns...
  function RequestStartStopStatus (line 149) | RequestStartStopStatus RemoteControlService::requestStopTransaction(cons...

FILE: src/MicroOcpp/Model/RemoteControl/RemoteControlService.h
  function namespace (line 17) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Reservation/Reservation.cpp
  function Timestamp (line 93) | Timestamp& Reservation::getExpiryDate() {

FILE: src/MicroOcpp/Model/Reservation/Reservation.h
  function namespace (line 26) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Reservation/ReservationService.cpp
  function Reservation (line 77) | Reservation *ReservationService::getReservation(unsigned int connectorId) {
  function Reservation (line 92) | Reservation *ReservationService::getReservation(const char *idTag, const...
  function Reservation (line 119) | Reservation *ReservationService::getReservation(unsigned int connectorId...
  function Reservation (line 175) | Reservation *ReservationService::getReservationById(int reservationId) {

FILE: src/MicroOcpp/Model/Reservation/ReservationService.h
  function namespace (line 17) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Reset/ResetDefs.h
  type ResetType (line 12) | typedef enum ResetType {
  type ResetStatus (line 17) | typedef enum ResetStatus {

FILE: src/MicroOcpp/Model/Reset/ResetService.cpp
  type MicroOcpp (line 111) | namespace MicroOcpp {
    type Ocpp201 (line 112) | namespace Ocpp201 {
      function ResetStatus (line 258) | ResetStatus ResetService::initiateReset(ResetType type, unsigned int...

FILE: src/MicroOcpp/Model/Reset/ResetService.h
  function namespace (line 15) | namespace MicroOcpp {
  function namespace (line 51) | namespace MicroOcpp {
  function namespace (line 61) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/SmartCharging/SmartChargingModel.cpp
  function ChargeRate (line 13) | ChargeRate MicroOcpp::chargeRate_min(const ChargeRate& a, const ChargeRa...
  function ChargingProfilePurposeType (line 212) | ChargingProfilePurposeType ChargingProfile::getChargingProfilePurpose(){
  type MicroOcpp (line 329) | namespace MicroOcpp {
    function loadChargingSchedulePeriod (line 331) | bool loadChargingSchedulePeriod(JsonObject& json, ChargingSchedulePeri...

FILE: src/MicroOcpp/Model/SmartCharging/SmartChargingModel.h
  type class (line 30) | enum class
  type class (line 36) | enum class
  type class (line 42) | enum class
  function ChargingRateUnitType (line 48) | enum class ChargingRateUnitType {
  function class (line 71) | class ChargingSchedulePeriod {
  function class (line 78) | class ChargingSchedule : public MemoryManaged {
  function ChargingProfileKindType (line 115) | ChargingProfileKindType chargingProfileKind {ChargingProfileKindType::Re...

FILE: src/MicroOcpp/Model/SmartCharging/SmartChargingService.cpp
  function ChargingProfile (line 197) | ChargingProfile *SmartChargingConnector::updateProfiles(std::unique_ptr<...
  function SmartChargingConnector (line 301) | SmartChargingConnector *SmartChargingService::getScConnectorById(unsigne...
  function ChargingProfile (line 339) | ChargingProfile *SmartChargingService::updateProfiles(unsigned int conne...

FILE: src/MicroOcpp/Model/SmartCharging/SmartChargingService.h
  function ChargingRateUnitType_Optional (line 20) | enum class ChargingRateUnitType_Optional {

FILE: src/MicroOcpp/Model/Transactions/Transaction.cpp
  type MicroOcpp (line 37) | namespace MicroOcpp {
    type Ocpp201 (line 38) | namespace Ocpp201 {
      function deserializeTransactionStoppedReason (line 107) | bool deserializeTransactionStoppedReason(const char *stoppedReasonCs...
      function deserializeTransactionEventType (line 170) | bool deserializeTransactionEventType(const char *typeCstr, Transacti...
      function deserializeTransactionEventTriggerReason (line 257) | bool deserializeTransactionEventTriggerReason(const char *triggerRea...
      function deserializeTransactionEventChargingState (line 333) | bool deserializeTransactionEventChargingState(const char *chargingSt...
  function ocpp_tx_compat_setV201 (line 361) | void ocpp_tx_compat_setV201(bool isV201) {
  function ocpp_tx_getTransactionId (line 366) | int ocpp_tx_getTransactionId(OCPP_Transaction *tx) {
  function ocpp_tx_isAuthorized (line 384) | bool ocpp_tx_isAuthorized(OCPP_Transaction *tx) {
  function ocpp_tx_isIdTagDeauthorized (line 392) | bool ocpp_tx_isIdTagDeauthorized(OCPP_Transaction *tx) {
  function ocpp_tx_isRunning (line 401) | bool ocpp_tx_isRunning(OCPP_Transaction *tx) {
  function ocpp_tx_isActive (line 410) | bool ocpp_tx_isActive(OCPP_Transaction *tx) {
  function ocpp_tx_isAborted (line 418) | bool ocpp_tx_isAborted(OCPP_Transaction *tx) {
  function ocpp_tx_isCompleted (line 427) | bool ocpp_tx_isCompleted(OCPP_Transaction *tx) {
  function ocpp_tx_getBeginTimestamp (line 457) | bool ocpp_tx_getBeginTimestamp(OCPP_Transaction *tx, char *buf, size_t l...
  function ocpp_tx_getMeterStart (line 466) | int32_t ocpp_tx_getMeterStart(OCPP_Transaction *tx) {
  function ocpp_tx_getStartTimestamp (line 476) | bool ocpp_tx_getStartTimestamp(OCPP_Transaction *tx, char *buf, size_t l...
  function ocpp_tx_getMeterStop (line 496) | int32_t ocpp_tx_getMeterStop(OCPP_Transaction *tx) {
  function ocpp_tx_setMeterStop (line 506) | void ocpp_tx_setMeterStop(OCPP_Transaction* tx, int32_t meter) {
  function ocpp_tx_getStopTimestamp (line 516) | bool ocpp_tx_getStopTimestamp(OCPP_Transaction *tx, char *buf, size_t le...

FILE: src/MicroOcpp/Model/Transactions/Transaction.h
  type TxNotification (line 16) | typedef enum {
  function namespace (line 47) | namespace MicroOcpp {
  function TransactionEventTriggerReason (line 238) | enum class TransactionEventTriggerReason : uint8_t {
  type OCPP_Transaction (line 451) | struct OCPP_Transaction
  type OCPP_Transaction (line 452) | typedef struct OCPP_Transaction OCPP_Transaction;

FILE: src/MicroOcpp/Model/Transactions/TransactionDeserialize.cpp
  type MicroOcpp (line 10) | namespace MicroOcpp {
    function serializeSendStatus (line 12) | bool serializeSendStatus(SendStatus& status, JsonObject out) {
    function deserializeSendStatus (line 31) | bool deserializeSendStatus(SendStatus& status, JsonObject in) {
    function serializeTransaction (line 54) | bool serializeTransaction(Transaction& tx, JsonDoc& out) {
    function deserializeTransaction (line 142) | bool deserializeTransaction(Transaction& tx, JsonObject state) {

FILE: src/MicroOcpp/Model/Transactions/TransactionDeserialize.h
  function namespace (line 13) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Transactions/TransactionService.cpp
  type MicroOcpp (line 1007) | namespace MicroOcpp {
    function validateTxStartStopPoint (line 1009) | bool validateTxStartStopPoint(const char *value, void *userPtr) {
    function validateUnsignedInt (line 1016) | bool validateUnsignedInt(int val, void*) {

FILE: src/MicroOcpp/Model/Transactions/TransactionService.h
  function class (line 35) | class TransactionService : public MemoryManaged {

FILE: src/MicroOcpp/Model/Transactions/TransactionStore.cpp
  type MicroOcpp (line 229) | namespace MicroOcpp {
    type Ocpp201 (line 230) | namespace Ocpp201 {
      function TransactionStoreEvse (line 1100) | TransactionStoreEvse *TransactionStore::getEvse(unsigned int evseId) {

FILE: src/MicroOcpp/Model/Transactions/TransactionStore.h
  function namespace (line 13) | namespace MicroOcpp {
  function namespace (line 64) | namespace MicroOcpp {

FILE: src/MicroOcpp/Model/Variables/Variable.cpp
  function ComponentId (line 94) | const ComponentId& Variable::getComponentId() const {
  type VariableSingleData (line 169) | struct VariableSingleData {
    method T (line 172) | T& get(Variable::AttributeType attribute) {
  type VariableFullData (line 178) | struct VariableFullData {
    method T (line 184) | T& get(Variable::AttributeType attribute) {
  class VariableInt (line 201) | class VariableInt : public Variable {
    method VariableInt (line 210) | VariableInt(AttributeTypeSet attributes) :
    method setInt (line 219) | void setInt(int val, AttributeType attrType) override {
    method getInt (line 230) | int getInt(AttributeType attrType) override {
    method InternalDataType (line 240) | InternalDataType getInternalDataType() override {
    method getWriteCount (line 244) | uint16_t getWriteCount() override {
  class VariableBool (line 250) | class VariableBool : public Variable {
    method VariableBool (line 259) | VariableBool(AttributeTypeSet attributes) :
    method setBool (line 268) | void setBool(bool val, AttributeType attrType) override {
    method getBool (line 279) | bool getBool(AttributeType attrType) override {
    method InternalDataType (line 289) | InternalDataType getInternalDataType() override {
    method getWriteCount (line 293) | uint16_t getWriteCount() override {
  class VariableString (line 299) | class VariableString : public Variable {
    method VariableString (line 308) | VariableString(AttributeTypeSet attributes) :
    method setString (line 328) | bool setString(const char *val, AttributeType attrType) override {
    method InternalDataType (line 363) | InternalDataType getInternalDataType() override {
    method getWriteCount (line 367) | uint16_t getWriteCount() override {

FILE: src/MicroOcpp/Model/Variables/Variable.h
  type VariableCharacteristics (line 30) | struct VariableCharacteristics
  function DataType (line 33) | enum class DataType : uint8_t {
  type class (line 55) | enum class
  type class (line 65) | enum class
  type ReportBase (line 74) | typedef enum ReportBase {
  type GenericDeviceModelStatus (line 81) | typedef enum GenericDeviceModelStatus {
  type class (line 92) | enum class
  type ComponentId (line 112) | struct ComponentId {
  type class (line 133) | enum class
  type AttributeTypeSet (line 140) | struct AttributeTypeSet {
  type class (line 151) | enum class
  type class (line 158) | enum class

FILE: src/MicroOcpp/Model/Variables/VariableContainer.cpp
  function Variable (line 39) | Variable *VariableContainerNonOwning::getVariable(size_t i) {
  function Variable (line 43) | Variable *VariableContainerNonOwning::getVariable(const ComponentId& com...
  function Variable (line 88) | Variable *VariableContainerOwning::getVariable(size_t i) {
  function Variable (line 92) | Variable *VariableContainerOwning::getVariable(const ComponentId& compon...

FILE: src/MicroOcpp/Model/Variables/VariableContainer.h
  function class (line 24) | class VariableContainer {
  function size (line 40) | size_t size() override;

FILE: src/MicroOcpp/Model/Variables/VariableService.cpp
  type MicroOcpp (line 26) | namespace MicroOcpp {
    function VariableContainerOwning (line 62) | VariableContainerOwning& VariableService::getContainerInternalByVariab...
    function registerVariableValidator (line 82) | bool registerVariableValidator(Vector<VariableValidator<T>>& collectio...
    function Variable (line 108) | Variable *VariableService::getVariable(const ComponentId& component, c...
    function loadVariableCharacteristics (line 174) | void loadVariableCharacteristics(Variable& variable, Variable::Mutabil...
    function Variable (line 211) | Variable *VariableService::declareVariable(const ComponentId& componen...
    function SetVariableStatus (line 275) | SetVariableStatus VariableService::setVariable(Variable::AttributeType...
    function GetVariableStatus (line 412) | GetVariableStatus VariableService::getVariable(Variable::AttributeType...
    function GenericDeviceModelStatus (line 449) | GenericDeviceModelStatus VariableService::getBaseReport(int requestId,...

FILE: src/MicroOcpp/Model/Variables/VariableService.h
  function namespace (line 33) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/Authorize.cpp
  type MicroOcpp (line 13) | namespace MicroOcpp {
    type Ocpp16 (line 14) | namespace Ocpp16 {
    type Ocpp201 (line 71) | namespace Ocpp201 {
  type MicroOcpp (line 70) | namespace MicroOcpp {
    type Ocpp16 (line 14) | namespace Ocpp16 {
    type Ocpp201 (line 71) | namespace Ocpp201 {

FILE: src/MicroOcpp/Operations/Authorize.h
  function namespace (line 12) | namespace MicroOcpp {
  function namespace (line 44) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/BootNotification.h
  function namespace (line 16) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/CancelReservation.h
  function namespace (line 14) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/ChangeAvailability.cpp
  type MicroOcpp (line 12) | namespace MicroOcpp {
    type Ocpp16 (line 13) | namespace Ocpp16 {
    type Ocpp201 (line 89) | namespace Ocpp201 {
  type MicroOcpp (line 88) | namespace MicroOcpp {
    type Ocpp16 (line 13) | namespace Ocpp16 {
    type Ocpp201 (line 89) | namespace Ocpp201 {

FILE: src/MicroOcpp/Operations/ChangeAvailability.h
  function namespace (line 14) | namespace Ocpp16 {
  function namespace (line 47) | namespace Ocpp201 {

FILE: src/MicroOcpp/Operations/ChangeConfiguration.h
  function namespace (line 10) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/ClearCache.h
  function namespace (line 11) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/ClearChargingProfile.h
  function namespace (line 10) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/CustomOperation.h
  function namespace (line 12) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/DataTransfer.h
  function namespace (line 10) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/DeleteCertificate.h
  function namespace (line 14) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/DiagnosticsStatusNotification.h
  function namespace (line 11) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/FirmwareStatusNotification.h
  function namespace (line 12) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/GetBaseReport.h
  function namespace (line 16) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/GetCompositeSchedule.h
  function namespace (line 16) | namespace Ocpp16 {

FILE: src/MicroOcpp/Operations/GetConfiguration.h
  function namespace (line 12) | namespace Ocpp16 {

FILE: src/MicroOcpp/Operations/GetDiagnostics.h
  function namespace (line 11) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/GetInstalledCertificateIds.h
  function namespace (line 15) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/GetLocalListVersion.h
  function namespace (line 14) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/GetVariables.h
  function namespace (line 16) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/Heartbeat.h
  function namespace (line 10) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/InstallCertificate.h
  function namespace (line 14) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/MeterValues.h
  function namespace (line 12) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/NotifyReport.h
  function namespace (line 16) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/RemoteStartTransaction.h
  function namespace (line 16) | namespace Ocpp16 {

FILE: src/MicroOcpp/Operations/RemoteStopTransaction.h
  function namespace (line 10) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/RequestStartTransaction.h
  function namespace (line 17) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/RequestStopTransaction.h
  function namespace (line 16) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/ReserveNow.h
  function namespace (line 14) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/Reset.cpp
  type MicroOcpp (line 57) | namespace MicroOcpp {
    type Ocpp201 (line 58) | namespace Ocpp201 {

FILE: src/MicroOcpp/Operations/Reset.h
  function namespace (line 16) | namespace Ocpp16 {
  function namespace (line 37) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/SecurityEventNotification.h
  function namespace (line 16) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/SendLocalList.h
  function namespace (line 14) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/SetChargingProfile.h
  function namespace (line 10) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/SetVariables.h
  function namespace (line 16) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/StartTransaction.h
  function namespace (line 13) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/StatusNotification.cpp
  type MicroOcpp (line 11) | namespace MicroOcpp {
    type Ocpp16 (line 46) | namespace Ocpp16 {
    type Ocpp201 (line 120) | namespace Ocpp201 {
  type MicroOcpp (line 119) | namespace MicroOcpp {
    type Ocpp16 (line 46) | namespace Ocpp16 {
    type Ocpp201 (line 120) | namespace Ocpp201 {

FILE: src/MicroOcpp/Operations/StatusNotification.h
  function namespace (line 14) | namespace MicroOcpp {
  function namespace (line 51) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/StopTransaction.h
  function namespace (line 13) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/TransactionEvent.h
  function namespace (line 14) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/TriggerMessage.h
  function namespace (line 11) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/UnlockConnector.cpp
  type MicroOcpp (line 88) | namespace MicroOcpp {
    type Ocpp201 (line 89) | namespace Ocpp201 {

FILE: src/MicroOcpp/Operations/UnlockConnector.h
  function namespace (line 14) | namespace MicroOcpp {
  function namespace (line 51) | namespace MicroOcpp {

FILE: src/MicroOcpp/Operations/UpdateFirmware.h
  function namespace (line 11) | namespace MicroOcpp {

FILE: src/MicroOcpp/Platform.cpp
  type MicroOcpp (line 11) | namespace MicroOcpp {
  function _mo_console_out (line 15) | void _mo_console_out(const char *msg) {
  function mocpp_set_console_out (line 21) | void mocpp_set_console_out(void (*console_out)(const char *msg)) {
  function mocpp_set_timer (line 33) | void mocpp_set_timer(unsigned long (*get_ms)()) {
  function mocpp_tick_ms_custom (line 37) | unsigned long mocpp_tick_ms_custom() {
  type MicroOcpp (line 50) | namespace MicroOcpp {
  function mocpp_tick_ms_espidf (line 57) | unsigned long mocpp_tick_ms_espidf() {
  type MicroOcpp (line 67) | namespace MicroOcpp {
  function mocpp_tick_ms_unix (line 74) | unsigned long mocpp_tick_ms_unix() {
  function mocpp_set_rng (line 89) | void mocpp_set_rng(uint32_t (*rng)()) {
  function mocpp_rng_custom (line 93) | uint32_t mocpp_rng_custom(void) {
  function mocpp_time_based_prng (line 106) | uint32_t mocpp_time_based_prng(void) {

FILE: src/MicroOcpp/Version.h
  type ProtocolVersion (line 28) | struct ProtocolVersion {

FILE: src/MicroOcpp_c.cpp
  function ocpp_initialize (line 19) | void ocpp_initialize(OCPP_Connection *conn, const char *chargePointModel...
  function ocpp_initialize_full (line 26) | void ocpp_initialize_full(OCPP_Connection *conn, const char *bootNotific...
  function ocpp_initialize_full2 (line 41) | void ocpp_initialize_full2(OCPP_Connection *conn, const char *bootNotifi...
  function ocpp_deinitialize (line 54) | void ocpp_deinitialize() {
  function ocpp_is_initialized (line 58) | bool ocpp_is_initialized() {
  function ocpp_loop (line 62) | void ocpp_loop() {
  function adaptFn (line 70) | std::function<bool()> adaptFn(InputBool fn) {
  function adaptFn (line 74) | std::function<bool()> adaptFn(unsigned int connectorId, InputBool_m fn) {
  function adaptFn (line 78) | std::function<const char*()> adaptFn(InputString fn) {
  function adaptFn (line 82) | std::function<const char*()> adaptFn(unsigned int connectorId, InputStri...
  function adaptFn (line 86) | std::function<float()> adaptFn(InputFloat fn) {
  function adaptFn (line 90) | std::function<float()> adaptFn(unsigned int connectorId, InputFloat_m fn) {
  function adaptFn (line 94) | std::function<int()> adaptFn(InputInt fn) {
  function adaptFn (line 98) | std::function<int()> adaptFn(unsigned int connectorId, InputInt_m fn) {
  function adaptFn (line 102) | std::function<void(float)> adaptFn(OutputFloat fn) {
  function adaptFn (line 106) | std::function<void(float, float, int)> adaptFn(OutputSmartCharging fn) {
  function adaptFn (line 110) | std::function<void(float, float, int)> adaptFn(unsigned int connectorId,...
  function adaptFn (line 114) | std::function<void(float)> adaptFn(unsigned int connectorId, OutputFloat...
  function adaptFn (line 118) | std::function<void(void)> adaptFn(void (*fn)(void)) {
  function adaptFn (line 128) | std::function<void(JsonObject)> adaptFn(OnMessage fn) {
  function adaptFn (line 139) | MicroOcpp::OnReceiveErrorListener adaptFn(OnCallError fn) {
  function adaptFn (line 151) | std::function<UnlockConnectorResult()> adaptFn(PollUnlockResult fn) {
  function adaptFn (line 155) | std::function<UnlockConnectorResult()> adaptFn(unsigned int connectorId,...
  function ocpp_beginTransaction (line 160) | bool ocpp_beginTransaction(const char *idTag) {
  function ocpp_beginTransaction_m (line 163) | bool ocpp_beginTransaction_m(unsigned int connectorId, const char *idTag) {
  function ocpp_beginTransaction_authorized (line 167) | bool ocpp_beginTransaction_authorized(const char *idTag, const char *par...
  function ocpp_beginTransaction_authorized_m (line 170) | bool ocpp_beginTransaction_authorized_m(unsigned int connectorId, const ...
  function ocpp_endTransaction (line 174) | bool ocpp_endTransaction(const char *idTag, const char *reason) {
  function ocpp_endTransaction_m (line 177) | bool ocpp_endTransaction_m(unsigned int connectorId, const char *idTag, ...
  function ocpp_endTransaction_authorized (line 181) | bool ocpp_endTransaction_authorized(const char *idTag, const char *reaso...
  function ocpp_endTransaction_authorized_m (line 184) | bool ocpp_endTransaction_authorized_m(unsigned int connectorId, const ch...
  function ocpp_isTransactionActive (line 188) | bool ocpp_isTransactionActive() {
  function ocpp_isTransactionActive_m (line 191) | bool ocpp_isTransactionActive_m(unsigned int connectorId) {
  function ocpp_isTransactionRunning (line 195) | bool ocpp_isTransactionRunning() {
  function ocpp_isTransactionRunning_m (line 198) | bool ocpp_isTransactionRunning_m(unsigned int connectorId) {
  function OCPP_Transaction (line 209) | OCPP_Transaction *ocpp_getTransaction() {
  function OCPP_Transaction (line 212) | OCPP_Transaction *ocpp_getTransaction_m(unsigned int connectorId) {
  function ocpp_ocppPermitsCharge (line 239) | bool ocpp_ocppPermitsCharge() {
  function ocpp_ocppPermitsCharge_m (line 242) | bool ocpp_ocppPermitsCharge_m(unsigned int connectorId) {
  function ChargePointStatus (line 246) | ChargePointStatus ocpp_getChargePointStatus() {
  function ChargePointStatus (line 250) | ChargePointStatus ocpp_getChargePointStatus_m(unsigned int connectorId) {
  function ocpp_setConnectorPluggedInput (line 254) | void ocpp_setConnectorPluggedInput(InputBool pluggedInput) {
  function ocpp_setConnectorPluggedInput_m (line 257) | void ocpp_setConnectorPluggedInput_m(unsigned int connectorId, InputBool...
  function ocpp_setEnergyMeterInput (line 261) | void ocpp_setEnergyMeterInput(InputInt energyInput) {
  function ocpp_setEnergyMeterInput_m (line 264) | void ocpp_setEnergyMeterInput_m(unsigned int connectorId, InputInt_m ene...
  function ocpp_setPowerMeterInput (line 268) | void ocpp_setPowerMeterInput(InputFloat powerInput) {
  function ocpp_setPowerMeterInput_m (line 271) | void ocpp_setPowerMeterInput_m(unsigned int connectorId, InputFloat_m po...
  function ocpp_setSmartChargingPowerOutput (line 275) | void ocpp_setSmartChargingPowerOutput(OutputFloat maxPowerOutput) {
  function ocpp_setSmartChargingPowerOutput_m (line 278) | void ocpp_setSmartChargingPowerOutput_m(unsigned int connectorId, Output...
  function ocpp_setSmartChargingCurrentOutput (line 281) | void ocpp_setSmartChargingCurrentOutput(OutputFloat maxCurrentOutput) {
  function ocpp_setSmartChargingCurrentOutput_m (line 284) | void ocpp_setSmartChargingCurrentOutput_m(unsigned int connectorId, Outp...
  function ocpp_setSmartChargingOutput (line 287) | void ocpp_setSmartChargingOutput(OutputSmartCharging chargingLimitOutput) {
  function ocpp_setSmartChargingOutput_m (line 290) | void ocpp_setSmartChargingOutput_m(unsigned int connectorId, OutputSmart...
  function ocpp_setEvReadyInput (line 294) | void ocpp_setEvReadyInput(InputBool evReadyInput) {
  function ocpp_setEvReadyInput_m (line 297) | void ocpp_setEvReadyInput_m(unsigned int connectorId, InputBool_m evRead...
  function ocpp_setEvseReadyInput (line 301) | void ocpp_setEvseReadyInput(InputBool evseReadyInput) {
  function ocpp_setEvseReadyInput_m (line 304) | void ocpp_setEvseReadyInput_m(unsigned int connectorId, InputBool_m evse...
  function ocpp_addErrorCodeInput (line 308) | void ocpp_addErrorCodeInput(InputString errorCodeInput) {
  function ocpp_addErrorCodeInput_m (line 311) | void ocpp_addErrorCodeInput_m(unsigned int connectorId, InputString_m er...
  function ocpp_addMeterValueInputFloat (line 315) | void ocpp_addMeterValueInputFloat(InputFloat valueInput, const char *mea...
  function ocpp_addMeterValueInputFloat_m (line 318) | void ocpp_addMeterValueInputFloat_m(unsigned int connectorId, InputFloat...
  function ocpp_addMeterValueInputIntTx (line 322) | void ocpp_addMeterValueInputIntTx(int (*valueInput)(ReadingContext), con...
  function ocpp_addMeterValueInputIntTx_m (line 335) | void ocpp_addMeterValueInputIntTx_m(unsigned int connectorId, int (*valu...
  function ocpp_addMeterValueInput (line 349) | void ocpp_addMeterValueInput(MeterValueInput *meterValueInput) {
  function ocpp_addMeterValueInput_m (line 352) | void ocpp_addMeterValueInput_m(unsigned int connectorId, MeterValueInput...
  function ocpp_setOnUnlockConnectorInOut (line 361) | void ocpp_setOnUnlockConnectorInOut(PollUnlockResult onUnlockConnectorIn...
  function ocpp_setOnUnlockConnectorInOut_m (line 364) | void ocpp_setOnUnlockConnectorInOut_m(unsigned int connectorId, PollUnlo...
  function ocpp_setStartTxReadyInput (line 369) | void ocpp_setStartTxReadyInput(InputBool startTxReady) {
  function ocpp_setStartTxReadyInput_m (line 372) | void ocpp_setStartTxReadyInput_m(unsigned int connectorId, InputBool_m s...
  function ocpp_setStopTxReadyInput (line 376) | void ocpp_setStopTxReadyInput(InputBool stopTxReady) {
  function ocpp_setStopTxReadyInput_m (line 379) | void ocpp_setStopTxReadyInput_m(unsigned int connectorId, InputBool_m st...
  function ocpp_setTxNotificationOutput (line 383) | void ocpp_setTxNotificationOutput(void (*notificationOutput)(OCPP_Transa...
  function ocpp_setTxNotificationOutput_m (line 388) | void ocpp_setTxNotificationOutput_m(unsigned int connectorId, void (*not...
  function ocpp_setOccupiedInput (line 394) | void ocpp_setOccupiedInput(InputBool occupied) {
  function ocpp_setOccupiedInput_m (line 397) | void ocpp_setOccupiedInput_m(unsigned int connectorId, InputBool_m occup...
  function ocpp_isOperative (line 401) | bool ocpp_isOperative() {
  function ocpp_isOperative_m (line 404) | bool ocpp_isOperative_m(unsigned int connectorId) {
  function ocpp_setOnResetNotify (line 407) | void ocpp_setOnResetNotify(bool (*onResetNotify)(bool)) {
  function ocpp_setOnResetExecute (line 411) | void ocpp_setOnResetExecute(void (*onResetExecute)(bool)) {
  function ocpp_setCertificateStore (line 416) | void ocpp_setCertificateStore(ocpp_cert_store *certs) {
  function ocpp_setOnReceiveRequest (line 425) | void ocpp_setOnReceiveRequest(const char *operationType, OnMessage onReq...
  function ocpp_setOnSendConf (line 429) | void ocpp_setOnSendConf(const char *operationType, OnMessage onConfirmat...
  function ocpp_authorize (line 433) | void ocpp_authorize(const char *idTag, AuthorizeConfCallback onConfirmat...
  function ocpp_startTransaction (line 456) | void ocpp_startTransaction(const char *idTag, OnMessage onConfirmation, ...
  function ocpp_stopTransaction (line 460) | void ocpp_stopTransaction(OnMessage onConfirmation, OnAbort onAbort, OnT...

FILE: src/MicroOcpp_c.h
  type OCPP_Connection (line 17) | struct OCPP_Connection
  type OCPP_Connection (line 18) | typedef struct OCPP_Connection OCPP_Connection;
  type MeterValueInput (line 20) | struct MeterValueInput
  type MeterValueInput (line 21) | typedef struct MeterValueInput MeterValueInput;
  type FilesystemAdapterC (line 23) | struct FilesystemAdapterC
  type FilesystemAdapterC (line 24) | typedef struct FilesystemAdapterC FilesystemAdapterC;
  type UnlockConnectorResult (line 49) | typedef UnlockConnectorResult (*PollUnlockResult)();
  type UnlockConnectorResult (line 50) | typedef UnlockConnectorResult (*PollUnlockResult_m)(unsigned int connect...
  type OCPP_FilesystemOpt (line 66) | struct OCPP_FilesystemOpt
  type OCPP_FilesystemOpt (line 74) | struct OCPP_FilesystemOpt

FILE: tests/Api.cpp
  type OCPP_FilesystemOpt (line 194) | struct OCPP_FilesystemOpt

FILE: tests/Boot.cpp
  class TriggeredOperation (line 32) | class TriggeredOperation : public Operation {
    method TriggeredOperation (line 36) | TriggeredOperation(bool& checkExecuted) : checkExecuted(checkExecuted)...
    method createReq (line 38) | std::unique_ptr<JsonDoc> createReq() override {
    method processConf (line 42) | void processConf(JsonObject) override {}
    method processReq (line 43) | void processReq(JsonObject) override {}
    method createConf (line 44) | std::unique_ptr<JsonDoc> createConf() override {return createEmptyDocu...

FILE: tests/ConfigurationBehavior.cpp
  class CustomAuthorize (line 21) | class CustomAuthorize : public Operation {
    method CustomAuthorize (line 25) | CustomAuthorize(const char *status) : status(status) { }
    method processReq (line 27) | void processReq(JsonObject payload) override {
    method createConf (line 30) | std::unique_ptr<JsonDoc> createConf() override {
  class CustomStartTransaction (line 38) | class CustomStartTransaction : public Operation {
    method CustomStartTransaction (line 42) | CustomStartTransaction(const char *status) : status(status) { }
    method processReq (line 44) | void processReq(JsonObject payload) override {
    method createConf (line 47) | std::unique_ptr<JsonDoc> createConf() override {

FILE: tests/LocalAuthList.cpp
  function generateAuthList (line 28) | void generateAuthList(JsonArray out, size_t size, bool compact) {

FILE: tests/benchmarks/firmware_size/main.cpp
  function setup (line 12) | void setup() {
  function loop (line 66) | void loop() {

FILE: tests/benchmarks/scripts/eval_firmware_size.py
  function load_compilation_units (line 9) | def load_compilation_units(fn):
  function categorize_table (line 22) | def categorize_table(df):

FILE: tests/benchmarks/scripts/measure_heap.py
  function connect_ssh (line 108) | def connect_ssh():
  function close_ssh (line 121) | def close_ssh(client: paramiko.SSHClient):
  function deploy_simulator (line 125) | def deploy_simulator():
  function cleanup_simulator (line 154) | def cleanup_simulator():
  function setup_simulator (line 169) | def setup_simulator():
  function run_measurements (line 197) | def run_measurements():
  function run_measurements_and_retry (line 349) | def run_measurements_and_retry():

FILE: tests/catch2/catch.hpp
  type Catch (line 98) | namespace Catch {
    type CaseSensitive (line 486) | struct CaseSensitive { enum Choice {
      type Choice (line 486) | enum Choice {
    class NonCopyable (line 491) | class NonCopyable {
      method NonCopyable (line 492) | NonCopyable( NonCopyable const& )              = delete;
      method NonCopyable (line 493) | NonCopyable( NonCopyable && )                  = delete;
      method NonCopyable (line 494) | NonCopyable& operator = ( NonCopyable const& ) = delete;
      method NonCopyable (line 495) | NonCopyable& operator = ( NonCopyable && )     = delete;
    type SourceLineInfo (line 502) | struct SourceLineInfo {
      method SourceLineInfo (line 504) | SourceLineInfo() = delete;
      method SourceLineInfo (line 505) | SourceLineInfo( char const* _file, std::size_t _line ) noexcept
      method SourceLineInfo (line 510) | SourceLineInfo( SourceLineInfo const& other )            = default;
      method SourceLineInfo (line 511) | SourceLineInfo& operator = ( SourceLineInfo const& )     = default;
      method SourceLineInfo (line 512) | SourceLineInfo( SourceLineInfo&& )              noexcept = default;
      method SourceLineInfo (line 513) | SourceLineInfo& operator = ( SourceLineInfo&& ) noexcept = default;
      method empty (line 515) | bool empty() const noexcept { return file[0] == '\0'; }
    type StreamEndStop (line 534) | struct StreamEndStop {
    function T (line 538) | T const& operator + ( T const& value, StreamEndStop ) {
    type RegistrarForTagAliases (line 549) | struct RegistrarForTagAliases {
    class TestSpec (line 570) | class TestSpec
      class Pattern (line 5112) | class Pattern {
      class NamePattern (line 5123) | class NamePattern : public Pattern {
      class TagPattern (line 5131) | class TagPattern : public Pattern {
      class ExcludedPattern (line 5139) | class ExcludedPattern : public Pattern {
      type Filter (line 5147) | struct Filter {
      type FilterMatch (line 5155) | struct FilterMatch {
    type ITestInvoker (line 572) | struct ITestInvoker {
    class TestCase (line 577) | class TestCase
    type IConfig (line 578) | struct IConfig
    type ITestCaseRegistry (line 580) | struct ITestCaseRegistry {
    class StringRef (line 606) | class StringRef {
      method StringRef (line 618) | constexpr StringRef() noexcept = default;
      method StringRef (line 622) | constexpr StringRef( char const* rawChars, size_type size ) noexcept
      method StringRef (line 627) | StringRef( std::string const& stdString ) noexcept
      method empty (line 648) | constexpr auto empty() const noexcept -> bool {
      method size (line 651) | constexpr auto size() const noexcept -> size_type {
      method isNullTerminated (line 668) | constexpr auto isNullTerminated() const noexcept -> bool {
      method const_iterator (line 673) | constexpr const_iterator begin() const { return m_start; }
      method const_iterator (line 674) | constexpr const_iterator end() const { return m_start + m_size; }
    type always_false (line 925) | struct always_false : std::false_type {}
    type true_given (line 927) | struct true_given : std::true_type {}
    type is_callable_tester (line 928) | struct is_callable_tester {
    type is_callable (line 936) | struct is_callable
    class TestInvokerAsMethod (line 962) | class TestInvokerAsMethod : public ITestInvoker {
      method TestInvokerAsMethod (line 965) | TestInvokerAsMethod( void (C::*testAsMethod)() ) noexcept : m_testAs...
      method invoke (line 967) | void invoke() const override {
    function makeTestInvoker (line 976) | auto makeTestInvoker( void (C::*testAsMethod)() ) noexcept -> ITestInv...
    type NameAndTags (line 980) | struct NameAndTags {
    type AutoReg (line 986) | struct AutoReg : NonCopyable {
    type ResultWas (line 1353) | struct ResultWas { enum OfType {
      type OfType (line 1353) | enum OfType {
    type ResultDisposition (line 1377) | struct ResultDisposition { enum Flags {
      type Flags (line 1377) | enum Flags {
    function isFalseTest (line 1388) | inline bool isFalseTest( int flags ) { return ( flags & ResultDisposit...
    type AssertionInfo (line 1396) | struct AssertionInfo
    class StringRef (line 1431) | class StringRef
      method StringRef (line 618) | constexpr StringRef() noexcept = default;
      method StringRef (line 622) | constexpr StringRef( char const* rawChars, size_type size ) noexcept
      method StringRef (line 627) | StringRef( std::string const& stdString ) noexcept
      method empty (line 648) | constexpr auto empty() const noexcept -> bool {
      method size (line 651) | constexpr auto size() const noexcept -> size_type {
      method isNullTerminated (line 668) | constexpr auto isNullTerminated() const noexcept -> bool {
      method const_iterator (line 673) | constexpr const_iterator begin() const { return m_start; }
      method const_iterator (line 674) | constexpr const_iterator end() const { return m_start + m_size; }
    type IStream (line 1433) | struct IStream {
    class ReusableStringStream (line 1440) | class ReusableStringStream : NonCopyable {
      method get (line 1454) | auto get() -> std::ostream& { return *m_oss; }
    type Detail (line 1465) | namespace Detail {
      type EnumInfo (line 1466) | struct EnumInfo {
      function rawMemoryToString (line 1559) | std::string rawMemoryToString( const T& object ) {
      class IsStreamInsertable (line 1564) | class IsStreamInsertable {
      function convertUnstreamable (line 1580) | typename std::enable_if<
      function convertUnstreamable (line 1586) | typename std::enable_if<
      function convertUnstreamable (line 1593) | typename std::enable_if<
      function stringify (line 1644) | std::string stringify(const T& e) {
      function convertUnknownEnumToString (line 1649) | std::string convertUnknownEnumToString( E e ) {
      function rangeToString (line 1829) | std::string rangeToString(InputIterator first, Sentinel last) {
      function stringify (line 1859) | inline std::string stringify( NSString* nsstring ) {
      type TupleElementPrinter (line 1927) | struct TupleElementPrinter {
        method print (line 1928) | static void print(const Tuple& tuple, std::ostream& os) {
      type TupleElementPrinter<Tuple, N, false> (line 1939) | struct TupleElementPrinter<Tuple, N, false> {
        method print (line 1940) | static void print(const Tuple&, std::ostream&) {}
      class Approx (line 3078) | class Approx {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7885) | Approx Approx::custom() {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7889) | Approx Approx::operator-() const {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      class EnumValuesRegistry (line 10567) | class EnumValuesRegistry : public IMutableEnumValuesRegistry {
      function StringRef (line 10594) | StringRef extractInstanceName(StringRef enumInstance) {
      function parseEnums (line 10604) | std::vector<StringRef> parseEnums( StringRef enums ) {
      function StringRef (line 10616) | StringRef EnumInfo::lookup( int value ) const {
      function makeEnumInfo (line 10624) | std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRe...
      function EnumInfo (line 10638) | EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName...
      class StreamBufImpl (line 13649) | class StreamBufImpl : public std::streambuf {
        method StreamBufImpl (line 13654) | StreamBufImpl() {
        method overflow (line 13663) | int overflow( int c ) override {
        method sync (line 13675) | int sync() override {
      type OutputDebugWriter (line 13686) | struct OutputDebugWriter {
      class FileStream (line 13695) | class FileStream : public IStream {
        method FileStream (line 13698) | FileStream( StringRef filename ) {
      class CoutStream (line 13711) | class CoutStream : public IStream {
        method CoutStream (line 13716) | CoutStream() : m_os( Catch::cout().rdbuf() ) {}
      class DebugOutStream (line 13725) | class DebugOutStream : public IStream {
        method DebugOutStream (line 13729) | DebugOutStream()
      type Endianness (line 15029) | struct Endianness {
        type Arch (line 15030) | enum Arch { Big, Little }
        method Arch (line 15032) | static Arch which() {
      function rawMemoryToString (line 15042) | std::string rawMemoryToString( const void *object, std::size_t size ) {
    type IMutableEnumValuesRegistry (line 1476) | struct IMutableEnumValuesRegistry {
    type Detail (line 1552) | namespace Detail {
      type EnumInfo (line 1466) | struct EnumInfo {
      function rawMemoryToString (line 1559) | std::string rawMemoryToString( const T& object ) {
      class IsStreamInsertable (line 1564) | class IsStreamInsertable {
      function convertUnstreamable (line 1580) | typename std::enable_if<
      function convertUnstreamable (line 1586) | typename std::enable_if<
      function convertUnstreamable (line 1593) | typename std::enable_if<
      function stringify (line 1644) | std::string stringify(const T& e) {
      function convertUnknownEnumToString (line 1649) | std::string convertUnknownEnumToString( E e ) {
      function rangeToString (line 1829) | std::string rangeToString(InputIterator first, Sentinel last) {
      function stringify (line 1859) | inline std::string stringify( NSString* nsstring ) {
      type TupleElementPrinter (line 1927) | struct TupleElementPrinter {
        method print (line 1928) | static void print(const Tuple& tuple, std::ostream& os) {
      type TupleElementPrinter<Tuple, N, false> (line 1939) | struct TupleElementPrinter<Tuple, N, false> {
        method print (line 1940) | static void print(const Tuple&, std::ostream&) {}
      class Approx (line 3078) | class Approx {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7885) | Approx Approx::custom() {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7889) | Approx Approx::operator-() const {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      class EnumValuesRegistry (line 10567) | class EnumValuesRegistry : public IMutableEnumValuesRegistry {
      function StringRef (line 10594) | StringRef extractInstanceName(StringRef enumInstance) {
      function parseEnums (line 10604) | std::vector<StringRef> parseEnums( StringRef enums ) {
      function StringRef (line 10616) | StringRef EnumInfo::lookup( int value ) const {
      function makeEnumInfo (line 10624) | std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRe...
      function EnumInfo (line 10638) | EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName...
      class StreamBufImpl (line 13649) | class StreamBufImpl : public std::streambuf {
        method StreamBufImpl (line 13654) | StreamBufImpl() {
        method overflow (line 13663) | int overflow( int c ) override {
        method sync (line 13675) | int sync() override {
      type OutputDebugWriter (line 13686) | struct OutputDebugWriter {
      class FileStream (line 13695) | class FileStream : public IStream {
        method FileStream (line 13698) | FileStream( StringRef filename ) {
      class CoutStream (line 13711) | class CoutStream : public IStream {
        method CoutStream (line 13716) | CoutStream() : m_os( Catch::cout().rdbuf() ) {}
      class DebugOutStream (line 13725) | class DebugOutStream : public IStream {
        method DebugOutStream (line 13729) | DebugOutStream()
      type Endianness (line 15029) | struct Endianness {
        type Arch (line 15030) | enum Arch { Big, Little }
        method Arch (line 15032) | static Arch which() {
      function rawMemoryToString (line 15042) | std::string rawMemoryToString( const void *object, std::size_t size ) {
    type StringMaker (line 1615) | struct StringMaker {
      method convert (line 1617) | static
      method convert (line 1628) | static
    type Detail (line 1639) | namespace Detail {
      type EnumInfo (line 1466) | struct EnumInfo {
      function rawMemoryToString (line 1559) | std::string rawMemoryToString( const T& object ) {
      class IsStreamInsertable (line 1564) | class IsStreamInsertable {
      function convertUnstreamable (line 1580) | typename std::enable_if<
      function convertUnstreamable (line 1586) | typename std::enable_if<
      function convertUnstreamable (line 1593) | typename std::enable_if<
      function stringify (line 1644) | std::string stringify(const T& e) {
      function convertUnknownEnumToString (line 1649) | std::string convertUnknownEnumToString( E e ) {
      function rangeToString (line 1829) | std::string rangeToString(InputIterator first, Sentinel last) {
      function stringify (line 1859) | inline std::string stringify( NSString* nsstring ) {
      type TupleElementPrinter (line 1927) | struct TupleElementPrinter {
        method print (line 1928) | static void print(const Tuple& tuple, std::ostream& os) {
      type TupleElementPrinter<Tuple, N, false> (line 1939) | struct TupleElementPrinter<Tuple, N, false> {
        method print (line 1940) | static void print(const Tuple&, std::ostream&) {}
      class Approx (line 3078) | class Approx {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7885) | Approx Approx::custom() {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7889) | Approx Approx::operator-() const {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      class EnumValuesRegistry (line 10567) | class EnumValuesRegistry : public IMutableEnumValuesRegistry {
      function StringRef (line 10594) | StringRef extractInstanceName(StringRef enumInstance) {
      function parseEnums (line 10604) | std::vector<StringRef> parseEnums( StringRef enums ) {
      function StringRef (line 10616) | StringRef EnumInfo::lookup( int value ) const {
      function makeEnumInfo (line 10624) | std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRe...
      function EnumInfo (line 10638) | EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName...
      class StreamBufImpl (line 13649) | class StreamBufImpl : public std::streambuf {
        method StreamBufImpl (line 13654) | StreamBufImpl() {
        method overflow (line 13663) | int overflow( int c ) override {
        method sync (line 13675) | int sync() override {
      type OutputDebugWriter (line 13686) | struct OutputDebugWriter {
      class FileStream (line 13695) | class FileStream : public IStream {
        method FileStream (line 13698) | FileStream( StringRef filename ) {
      class CoutStream (line 13711) | class CoutStream : public IStream {
        method CoutStream (line 13716) | CoutStream() : m_os( Catch::cout().rdbuf() ) {}
      class DebugOutStream (line 13725) | class DebugOutStream : public IStream {
        method DebugOutStream (line 13729) | DebugOutStream()
      type Endianness (line 15029) | struct Endianness {
        type Arch (line 15030) | enum Arch { Big, Little }
        method Arch (line 15032) | static Arch which() {
      function rawMemoryToString (line 15042) | std::string rawMemoryToString( const void *object, std::size_t size ) {
    type StringMaker<std::string> (line 1665) | struct StringMaker<std::string> {
    type StringMaker<std::string_view> (line 1671) | struct StringMaker<std::string_view> {
    type StringMaker<char const *> (line 1677) | struct StringMaker<char const *> {
    type StringMaker<char *> (line 1681) | struct StringMaker<char *> {
    type StringMaker<std::wstring> (line 1687) | struct StringMaker<std::wstring> {
    type StringMaker<std::wstring_view> (line 1693) | struct StringMaker<std::wstring_view> {
    type StringMaker<wchar_t const *> (line 1699) | struct StringMaker<wchar_t const *> {
    type StringMaker<wchar_t *> (line 1703) | struct StringMaker<wchar_t *> {
    type StringMaker<char[SZ]> (line 1711) | struct StringMaker<char[SZ]> {
      method convert (line 1712) | static std::string convert(char const* str) {
    type StringMaker<signed char[SZ]> (line 1717) | struct StringMaker<signed char[SZ]> {
      method convert (line 1718) | static std::string convert(signed char const* str) {
    type StringMaker<unsigned char[SZ]> (line 1723) | struct StringMaker<unsigned char[SZ]> {
      method convert (line 1724) | static std::string convert(unsigned char const* str) {
    type StringMaker<std::byte> (line 1731) | struct StringMaker<std::byte> {
    type StringMaker<int> (line 1736) | struct StringMaker<int> {
    type StringMaker<long> (line 1740) | struct StringMaker<long> {
    type StringMaker<long long> (line 1744) | struct StringMaker<long long> {
    type StringMaker<unsigned int> (line 1748) | struct StringMaker<unsigned int> {
    type StringMaker<unsigned long> (line 1752) | struct StringMaker<unsigned long> {
    type StringMaker<unsigned long long> (line 1756) | struct StringMaker<unsigned long long> {
    type StringMaker<bool> (line 1761) | struct StringMaker<bool> {
    type StringMaker<char> (line 1766) | struct StringMaker<char> {
    type StringMaker<signed char> (line 1770) | struct StringMaker<signed char> {
    type StringMaker<unsigned char> (line 1774) | struct StringMaker<unsigned char> {
    type StringMaker<std::nullptr_t> (line 1779) | struct StringMaker<std::nullptr_t> {
    type StringMaker<float> (line 1784) | struct StringMaker<float> {
    type StringMaker<double> (line 1790) | struct StringMaker<double> {
    type StringMaker<T*> (line 1796) | struct StringMaker<T*> {
      method convert (line 1798) | static std::string convert(U* p) {
    type StringMaker<R C::*> (line 1808) | struct StringMaker<R C::*> {
      method convert (line 1809) | static std::string convert(R C::* p) {
    type StringMaker<T^> (line 1820) | struct StringMaker<T^> {
      method convert (line 1821) | static std::string convert( T^ ref ) {
    type Detail (line 1827) | namespace Detail {
      type EnumInfo (line 1466) | struct EnumInfo {
      function rawMemoryToString (line 1559) | std::string rawMemoryToString( const T& object ) {
      class IsStreamInsertable (line 1564) | class IsStreamInsertable {
      function convertUnstreamable (line 1580) | typename std::enable_if<
      function convertUnstreamable (line 1586) | typename std::enable_if<
      function convertUnstreamable (line 1593) | typename std::enable_if<
      function stringify (line 1644) | std::string stringify(const T& e) {
      function convertUnknownEnumToString (line 1649) | std::string convertUnknownEnumToString( E e ) {
      function rangeToString (line 1829) | std::string rangeToString(InputIterator first, Sentinel last) {
      function stringify (line 1859) | inline std::string stringify( NSString* nsstring ) {
      type TupleElementPrinter (line 1927) | struct TupleElementPrinter {
        method print (line 1928) | static void print(const Tuple& tuple, std::ostream& os) {
      type TupleElementPrinter<Tuple, N, false> (line 1939) | struct TupleElementPrinter<Tuple, N, false> {
        method print (line 1940) | static void print(const Tuple&, std::ostream&) {}
      class Approx (line 3078) | class Approx {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7885) | Approx Approx::custom() {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7889) | Approx Approx::operator-() const {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      class EnumValuesRegistry (line 10567) | class EnumValuesRegistry : public IMutableEnumValuesRegistry {
      function StringRef (line 10594) | StringRef extractInstanceName(StringRef enumInstance) {
      function parseEnums (line 10604) | std::vector<StringRef> parseEnums( StringRef enums ) {
      function StringRef (line 10616) | StringRef EnumInfo::lookup( int value ) const {
      function makeEnumInfo (line 10624) | std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRe...
      function EnumInfo (line 10638) | EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName...
      class StreamBufImpl (line 13649) | class StreamBufImpl : public std::streambuf {
        method StreamBufImpl (line 13654) | StreamBufImpl() {
        method overflow (line 13663) | int overflow( int c ) override {
        method sync (line 13675) | int sync() override {
      type OutputDebugWriter (line 13686) | struct OutputDebugWriter {
      class FileStream (line 13695) | class FileStream : public IStream {
        method FileStream (line 13698) | FileStream( StringRef filename ) {
      class CoutStream (line 13711) | class CoutStream : public IStream {
        method CoutStream (line 13716) | CoutStream() : m_os( Catch::cout().rdbuf() ) {}
      class DebugOutStream (line 13725) | class DebugOutStream : public IStream {
        method DebugOutStream (line 13729) | DebugOutStream()
      type Endianness (line 15029) | struct Endianness {
        type Arch (line 15030) | enum Arch { Big, Little }
        method Arch (line 15032) | static Arch which() {
      function rawMemoryToString (line 15042) | std::string rawMemoryToString( const void *object, std::size_t size ) {
    type StringMaker<NSString*> (line 1844) | struct StringMaker<NSString*> {
      method convert (line 1845) | static std::string convert(NSString * nsstring) {
    type StringMaker<NSObject*> (line 1852) | struct StringMaker<NSObject*> {
      method convert (line 1853) | static std::string convert(NSObject* nsObject) {
    type Detail (line 1858) | namespace Detail {
      type EnumInfo (line 1466) | struct EnumInfo {
      function rawMemoryToString (line 1559) | std::string rawMemoryToString( const T& object ) {
      class IsStreamInsertable (line 1564) | class IsStreamInsertable {
      function convertUnstreamable (line 1580) | typename std::enable_if<
      function convertUnstreamable (line 1586) | typename std::enable_if<
      function convertUnstreamable (line 1593) | typename std::enable_if<
      function stringify (line 1644) | std::string stringify(const T& e) {
      function convertUnknownEnumToString (line 1649) | std::string convertUnknownEnumToString( E e ) {
      function rangeToString (line 1829) | std::string rangeToString(InputIterator first, Sentinel last) {
      function stringify (line 1859) | inline std::string stringify( NSString* nsstring ) {
      type TupleElementPrinter (line 1927) | struct TupleElementPrinter {
        method print (line 1928) | static void print(const Tuple& tuple, std::ostream& os) {
      type TupleElementPrinter<Tuple, N, false> (line 1939) | struct TupleElementPrinter<Tuple, N, false> {
        method print (line 1940) | static void print(const Tuple&, std::ostream&) {}
      class Approx (line 3078) | class Approx {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7885) | Approx Approx::custom() {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7889) | Approx Approx::operator-() const {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      class EnumValuesRegistry (line 10567) | class EnumValuesRegistry : public IMutableEnumValuesRegistry {
      function StringRef (line 10594) | StringRef extractInstanceName(StringRef enumInstance) {
      function parseEnums (line 10604) | std::vector<StringRef> parseEnums( StringRef enums ) {
      function StringRef (line 10616) | StringRef EnumInfo::lookup( int value ) const {
      function makeEnumInfo (line 10624) | std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRe...
      function EnumInfo (line 10638) | EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName...
      class StreamBufImpl (line 13649) | class StreamBufImpl : public std::streambuf {
        method StreamBufImpl (line 13654) | StreamBufImpl() {
        method overflow (line 13663) | int overflow( int c ) override {
        method sync (line 13675) | int sync() override {
      type OutputDebugWriter (line 13686) | struct OutputDebugWriter {
      class FileStream (line 13695) | class FileStream : public IStream {
        method FileStream (line 13698) | FileStream( StringRef filename ) {
      class CoutStream (line 13711) | class CoutStream : public IStream {
        method CoutStream (line 13716) | CoutStream() : m_os( Catch::cout().rdbuf() ) {}
      class DebugOutStream (line 13725) | class DebugOutStream : public IStream {
        method DebugOutStream (line 13729) | DebugOutStream()
      type Endianness (line 15029) | struct Endianness {
        type Arch (line 15030) | enum Arch { Big, Little }
        method Arch (line 15032) | static Arch which() {
      function rawMemoryToString (line 15042) | std::string rawMemoryToString( const void *object, std::size_t size ) {
    type StringMaker<std::pair<T1, T2> > (line 1885) | struct StringMaker<std::pair<T1, T2> > {
      method convert (line 1886) | static std::string convert(const std::pair<T1, T2>& pair) {
    type StringMaker<std::optional<T> > (line 1903) | struct StringMaker<std::optional<T> > {
      method convert (line 1904) | static std::string convert(const std::optional<T>& optional) {
    type Detail (line 1921) | namespace Detail {
      type EnumInfo (line 1466) | struct EnumInfo {
      function rawMemoryToString (line 1559) | std::string rawMemoryToString( const T& object ) {
      class IsStreamInsertable (line 1564) | class IsStreamInsertable {
      function convertUnstreamable (line 1580) | typename std::enable_if<
      function convertUnstreamable (line 1586) | typename std::enable_if<
      function convertUnstreamable (line 1593) | typename std::enable_if<
      function stringify (line 1644) | std::string stringify(const T& e) {
      function convertUnknownEnumToString (line 1649) | std::string convertUnknownEnumToString( E e ) {
      function rangeToString (line 1829) | std::string rangeToString(InputIterator first, Sentinel last) {
      function stringify (line 1859) | inline std::string stringify( NSString* nsstring ) {
      type TupleElementPrinter (line 1927) | struct TupleElementPrinter {
        method print (line 1928) | static void print(const Tuple& tuple, std::ostream& os) {
      type TupleElementPrinter<Tuple, N, false> (line 1939) | struct TupleElementPrinter<Tuple, N, false> {
        method print (line 1940) | static void print(const Tuple&, std::ostream&) {}
      class Approx (line 3078) | class Approx {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7885) | Approx Approx::custom() {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7889) | Approx Approx::operator-() const {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      class EnumValuesRegistry (line 10567) | class EnumValuesRegistry : public IMutableEnumValuesRegistry {
      function StringRef (line 10594) | StringRef extractInstanceName(StringRef enumInstance) {
      function parseEnums (line 10604) | std::vector<StringRef> parseEnums( StringRef enums ) {
      function StringRef (line 10616) | StringRef EnumInfo::lookup( int value ) const {
      function makeEnumInfo (line 10624) | std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRe...
      function EnumInfo (line 10638) | EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName...
      class StreamBufImpl (line 13649) | class StreamBufImpl : public std::streambuf {
        method StreamBufImpl (line 13654) | StreamBufImpl() {
        method overflow (line 13663) | int overflow( int c ) override {
        method sync (line 13675) | int sync() override {
      type OutputDebugWriter (line 13686) | struct OutputDebugWriter {
      class FileStream (line 13695) | class FileStream : public IStream {
        method FileStream (line 13698) | FileStream( StringRef filename ) {
      class CoutStream (line 13711) | class CoutStream : public IStream {
        method CoutStream (line 13716) | CoutStream() : m_os( Catch::cout().rdbuf() ) {}
      class DebugOutStream (line 13725) | class DebugOutStream : public IStream {
        method DebugOutStream (line 13729) | DebugOutStream()
      type Endianness (line 15029) | struct Endianness {
        type Arch (line 15030) | enum Arch { Big, Little }
        method Arch (line 15032) | static Arch which() {
      function rawMemoryToString (line 15042) | std::string rawMemoryToString( const void *object, std::size_t size ) {
    type StringMaker<std::monostate> (line 1962) | struct StringMaker<std::monostate> {
      method convert (line 1963) | static std::string convert(const std::monostate&) {
    type detail (line 1991) | namespace detail {
      type void_type (line 1993) | struct void_type {
      type is_range_impl (line 1998) | struct is_range_impl : std::false_type {
      type is_range_impl<T, typename void_type<decltype(begin(std::declval<T>()))>::type> (line 2002) | struct is_range_impl<T, typename void_type<decltype(begin(std::declv...
    type is_range (line 2007) | struct is_range : detail::is_range_impl<T> {
    type is_range<T^> (line 2012) | struct is_range<T^> {
    function rangeToString (line 2018) | std::string rangeToString( Range const& range ) {
    function rangeToString (line 2024) | std::string rangeToString( std::vector<bool, Allocator> const& v ) {
    type StringMaker<R, typename std::enable_if<is_range<R>::value && !::Catch::Detail::IsStreamInsertable<R>::value>::type> (line 2040) | struct StringMaker<R, typename std::enable_if<is_range<R>::value && !:...
      method convert (line 2041) | static std::string convert( R const& range ) {
    type StringMaker<T[SZ]> (line 2047) | struct StringMaker<T[SZ]> {
      method convert (line 2048) | static std::string convert(T const(&arr)[SZ]) {
    type ratio_string (line 2064) | struct ratio_string {
    type ratio_string<std::atto> (line 2076) | struct ratio_string<std::atto> {
    type ratio_string<std::femto> (line 2080) | struct ratio_string<std::femto> {
    type ratio_string<std::pico> (line 2084) | struct ratio_string<std::pico> {
    type ratio_string<std::nano> (line 2088) | struct ratio_string<std::nano> {
    type ratio_string<std::micro> (line 2092) | struct ratio_string<std::micro> {
    type ratio_string<std::milli> (line 2096) | struct ratio_string<std::milli> {
    type StringMaker<std::chrono::duration<Value, Ratio>> (line 2103) | struct StringMaker<std::chrono::duration<Value, Ratio>> {
      method convert (line 2104) | static std::string convert(std::chrono::duration<Value, Ratio> const...
    type StringMaker<std::chrono::duration<Value, std::ratio<1>>> (line 2111) | struct StringMaker<std::chrono::duration<Value, std::ratio<1>>> {
      method convert (line 2112) | static std::string convert(std::chrono::duration<Value, std::ratio<1...
    type StringMaker<std::chrono::duration<Value, std::ratio<60>>> (line 2119) | struct StringMaker<std::chrono::duration<Value, std::ratio<60>>> {
      method convert (line 2120) | static std::string convert(std::chrono::duration<Value, std::ratio<6...
    type StringMaker<std::chrono::duration<Value, std::ratio<3600>>> (line 2127) | struct StringMaker<std::chrono::duration<Value, std::ratio<3600>>> {
      method convert (line 2128) | static std::string convert(std::chrono::duration<Value, std::ratio<3...
    type StringMaker<std::chrono::time_point<Clock, Duration>> (line 2139) | struct StringMaker<std::chrono::time_point<Clock, Duration>> {
      method convert (line 2140) | static std::string convert(std::chrono::time_point<Clock, Duration> ...
    type StringMaker<std::chrono::time_point<std::chrono::system_clock, Duration>> (line 2146) | struct StringMaker<std::chrono::time_point<std::chrono::system_clock, ...
      method convert (line 2147) | static std::string convert(std::chrono::time_point<std::chrono::syst...
    type ITransientExpression (line 2202) | struct ITransientExpression {
      method isBinaryExpression (line 2203) | auto isBinaryExpression() const -> bool { return m_isBinaryExpressio...
      method getResult (line 2204) | auto getResult() const -> bool { return m_result; }
      method ITransientExpression (line 2207) | ITransientExpression( bool isBinaryExpression, bool result )
    class BinaryExpr (line 2224) | class BinaryExpr  : public ITransientExpression {
      method streamReconstructedExpression (line 2229) | void streamReconstructedExpression( std::ostream &os ) const override {
      method BinaryExpr (line 2235) | BinaryExpr( bool comparisonResult, LhsT lhs, StringRef op, RhsT rhs )
    class UnaryExpr (line 2300) | class UnaryExpr : public ITransientExpression {
      method streamReconstructedExpression (line 2303) | void streamReconstructedExpression( std::ostream &os ) const override {
      method UnaryExpr (line 2308) | explicit UnaryExpr( LhsT lhs )
    function compareEqual (line 2316) | auto compareEqual( LhsT const& lhs, RhsT const& rhs ) -> bool { return...
    function compareEqual (line 2318) | auto compareEqual( T* const& lhs, int rhs ) -> bool { return lhs == re...
    function compareEqual (line 2320) | auto compareEqual( T* const& lhs, long rhs ) -> bool { return lhs == r...
    function compareEqual (line 2322) | auto compareEqual( int lhs, T* const& rhs ) -> bool { return reinterpr...
    function compareEqual (line 2324) | auto compareEqual( long lhs, T* const& rhs ) -> bool { return reinterp...
    function compareNotEqual (line 2327) | auto compareNotEqual( LhsT const& lhs, RhsT&& rhs ) -> bool { return s...
    function compareNotEqual (line 2329) | auto compareNotEqual( T* const& lhs, int rhs ) -> bool { return lhs !=...
    function compareNotEqual (line 2331) | auto compareNotEqual( T* const& lhs, long rhs ) -> bool { return lhs !...
    function compareNotEqual (line 2333) | auto compareNotEqual( int lhs, T* const& rhs ) -> bool { return reinte...
    function compareNotEqual (line 2335) | auto compareNotEqual( long lhs, T* const& rhs ) -> bool { return reint...
    class ExprLhs (line 2338) | class ExprLhs {
      method ExprLhs (line 2341) | explicit ExprLhs( LhsT lhs ) : m_lhs( lhs ) {}
      method makeUnaryExpr (line 2402) | auto makeUnaryExpr() const -> UnaryExpr<LhsT> {
    function handleExpression (line 2410) | void handleExpression( ExprLhs<T> const& expr ) {
    type Decomposer (line 2414) | struct Decomposer {
    class AssertionResult (line 2439) | class AssertionResult
      method AssertionResult (line 5399) | AssertionResult() = delete;
    type AssertionInfo (line 2440) | struct AssertionInfo
    type SectionInfo (line 2441) | struct SectionInfo
      method SectionInfo (line 2866) | SectionInfo
    type SectionEndInfo (line 2442) | struct SectionEndInfo
    type MessageInfo (line 2443) | struct MessageInfo
    type MessageBuilder (line 2444) | struct MessageBuilder
      method MessageBuilder (line 2633) | MessageBuilder& operator << ( T const& value ) {
    type Counts (line 2445) | struct Counts
    type AssertionReaction (line 2446) | struct AssertionReaction
    type SourceLineInfo (line 2447) | struct SourceLineInfo
      method SourceLineInfo (line 504) | SourceLineInfo() = delete;
      method SourceLineInfo (line 505) | SourceLineInfo( char const* _file, std::size_t _line ) noexcept
      method SourceLineInfo (line 510) | SourceLineInfo( SourceLineInfo const& other )            = default;
      method SourceLineInfo (line 511) | SourceLineInfo& operator = ( SourceLineInfo const& )     = default;
      method SourceLineInfo (line 512) | SourceLineInfo( SourceLineInfo&& )              noexcept = default;
      method SourceLineInfo (line 513) | SourceLineInfo& operator = ( SourceLineInfo&& ) noexcept = default;
      method empty (line 515) | bool empty() const noexcept { return file[0] == '\0'; }
    type ITransientExpression (line 2449) | struct ITransientExpression
      method isBinaryExpression (line 2203) | auto isBinaryExpression() const -> bool { return m_isBinaryExpressio...
      method getResult (line 2204) | auto getResult() const -> bool { return m_result; }
      method ITransientExpression (line 2207) | ITransientExpression( bool isBinaryExpression, bool result )
    type IGeneratorTracker (line 2450) | struct IGeneratorTracker
    type BenchmarkInfo (line 2453) | struct BenchmarkInfo
    type BenchmarkStats (line 2455) | struct BenchmarkStats
    type IResultCapture (line 2458) | struct IResultCapture {
    type TestFailureException (line 2521) | struct TestFailureException{}
    type AssertionResultData (line 2522) | struct AssertionResultData
      method AssertionResultData (line 5385) | AssertionResultData() = delete;
    type IResultCapture (line 2523) | struct IResultCapture
    class RunContext (line 2524) | class RunContext
      method RunContext (line 8064) | RunContext( RunContext const& ) = delete;
      method RunContext (line 8065) | RunContext& operator =( RunContext const& ) = delete;
    class LazyExpression (line 2526) | class LazyExpression {
      method LazyExpression (line 2536) | LazyExpression& operator = ( LazyExpression const& ) = delete;
    type AssertionReaction (line 2543) | struct AssertionReaction {
    class AssertionHandler (line 2548) | class AssertionHandler {
      method handleExpr (line 2567) | void handleExpr( ExprLhs<T> const& expr ) {
    type MessageInfo (line 2599) | struct MessageInfo {
    type MessageStream (line 2616) | struct MessageStream {
      method MessageStream (line 2619) | MessageStream& operator << ( T const& value ) {
    type MessageBuilder (line 2627) | struct MessageBuilder : MessageStream {
      method MessageBuilder (line 2633) | MessageBuilder& operator << ( T const& value ) {
    class ScopedMessage (line 2641) | class ScopedMessage {
      method ScopedMessage (line 2644) | ScopedMessage( ScopedMessage& duplicate ) = delete;
    class Capturer (line 2652) | class Capturer {
      method captureValues (line 2663) | void captureValues( size_t index, T const& value ) {
      method captureValues (line 2668) | void captureValues( size_t index, T const& value, Ts const&... value...
    type Counts (line 2829) | struct Counts {
    type Totals (line 2842) | struct Totals {
    type SectionInfo (line 2860) | struct SectionInfo {
      method SectionInfo (line 2866) | SectionInfo
    type SectionEndInfo (line 2876) | struct SectionEndInfo {
    class Timer (line 2894) | class Timer {
    class Section (line 2911) | class Section : NonCopyable {
    class TestCase (line 2952) | class TestCase
    type ITestCaseRegistry (line 2953) | struct ITestCaseRegistry
    type IExceptionTranslatorRegistry (line 2954) | struct IExceptionTranslatorRegistry
    type IExceptionTranslator (line 2955) | struct IExceptionTranslator
    type IReporterRegistry (line 2956) | struct IReporterRegistry
    type IReporterFactory (line 2957) | struct IReporterFactory
    type ITagAliasRegistry (line 2958) | struct ITagAliasRegistry
    type IMutableEnumValuesRegistry (line 2959) | struct IMutableEnumValuesRegistry
    class StartupExceptionRegistry (line 2961) | class StartupExceptionRegistry
    type IRegistryHub (line 2965) | struct IRegistryHub {
    type IMutableRegistryHub (line 2976) | struct IMutableRegistryHub {
    type IExceptionTranslator (line 3007) | struct IExceptionTranslator
    type IExceptionTranslator (line 3010) | struct IExceptionTranslator {
    type IExceptionTranslatorRegistry (line 3015) | struct IExceptionTranslatorRegistry {
    class ExceptionTranslatorRegistrar (line 3021) | class ExceptionTranslatorRegistrar {
      class ExceptionTranslator (line 3023) | class ExceptionTranslator : public IExceptionTranslator {
        method ExceptionTranslator (line 3026) | ExceptionTranslator( std::string(*translateFunction)( T& ) )
        method translate (line 3030) | std::string translate( ExceptionTranslators::const_iterator it, Ex...
      method ExceptionTranslatorRegistrar (line 3052) | ExceptionTranslatorRegistrar( std::string(*translateFunction)( T& ) ) {
    type Detail (line 3076) | namespace Detail {
      type EnumInfo (line 1466) | struct EnumInfo {
      function rawMemoryToString (line 1559) | std::string rawMemoryToString( const T& object ) {
      class IsStreamInsertable (line 1564) | class IsStreamInsertable {
      function convertUnstreamable (line 1580) | typename std::enable_if<
      function convertUnstreamable (line 1586) | typename std::enable_if<
      function convertUnstreamable (line 1593) | typename std::enable_if<
      function stringify (line 1644) | std::string stringify(const T& e) {
      function convertUnknownEnumToString (line 1649) | std::string convertUnknownEnumToString( E e ) {
      function rangeToString (line 1829) | std::string rangeToString(InputIterator first, Sentinel last) {
      function stringify (line 1859) | inline std::string stringify( NSString* nsstring ) {
      type TupleElementPrinter (line 1927) | struct TupleElementPrinter {
        method print (line 1928) | static void print(const Tuple& tuple, std::ostream& os) {
      type TupleElementPrinter<Tuple, N, false> (line 1939) | struct TupleElementPrinter<Tuple, N, false> {
        method print (line 1940) | static void print(const Tuple&, std::ostream&) {}
      class Approx (line 3078) | class Approx {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7885) | Approx Approx::custom() {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      function Approx (line 7889) | Approx Approx::operator-() const {
        method Approx (line 3096) | Approx operator()( T const& value ) const {
        method Approx (line 3105) | explicit Approx( T const& value ): Approx(static_cast<double>(value))
        method Approx (line 3150) | Approx& epsilon( T const& newEpsilon ) {
        method Approx (line 3157) | Approx& margin( T const& newMargin ) {
        method Approx (line 3164) | Approx& scale( T const& newScale ) {
      class EnumValuesRegistry (line 10567) | class EnumValuesRegistry : public IMutableEnumValuesRegistry {
      function StringRef (line 10594) | StringRef extractInstanceName(StringRef enumInstance) {
      function parseEnums (line 10604) | std::vector<StringRef> parseEnums( StringRef enums ) {
      function StringRef (line 10616) | StringRef EnumInfo::lookup( int value ) const {
      function makeEnumInfo (line 10624) | std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRe...
      function EnumInfo (line 10638) | EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName...
      class StreamBufImpl (line 13649) | class StreamBufImpl : public std::streambuf {
        method StreamBufImpl (line 13654) | StreamBufImpl() {
        method overflow (line 13663) | int overflow( int c ) override {
        method sync (line 13675) | int sync() override {
      type OutputDebugWriter (line 13686) | struct OutputDebugWriter {
      class FileStream (line 13695) | class FileStream : public IStream {
        method FileStream (line 13698) | FileStream( StringRef filename ) {
      class CoutStream (line 13711) | class CoutStream : public IStream {
        method CoutStream (line 13716) | CoutStream() : m_os( Catch::cout().rdbuf() ) {}
      class DebugOutStream (line 13725) | class DebugOutStream : public IStream {
        method DebugOutStream (line 13729) | DebugOutStream()
      type Endianness (line 15029) | struct Endianness {
        type Arch (line 15030) | enum Arch { Big, Little }
        method Arch (line 15032) | static Arch which() {
      function rawMemoryToString (line 15042) | std::string rawMemoryToString( const void *object, std::size_t size ) {
    type literals (line 3179) | namespace literals {
    type StringMaker<Catch::Detail::Approx> (line 3185) | struct StringMaker<Catch::Detail::Approx> {
    type pluralise (line 3216) | struct pluralise {
    type Matchers (line 3236) | namespace Matchers {
      type Impl (line 3237) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 3397) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      type Floating (line 3425) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11565) | enum class FloatingPointKind : uint8_t {
      type Generic (line 3488) | namespace Generic {
        type Detail (line 3490) | namespace Detail {
        class PredicateMatcher (line 3495) | class PredicateMatcher : public MatcherBase<T> {
          method PredicateMatcher (line 3500) | PredicateMatcher(std::function<bool(T const&)> const& elem, std:...
          method match (line 3505) | bool match( T const& item ) const override {
          method describe (line 3509) | std::string describe() const override {
      function Predicate (line 3521) | Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)>...
      type StdString (line 3536) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line 3556) | struct EqualsMatcher : StringMatcherBase {
        type ContainsMatcher (line 3560) | struct ContainsMatcher : StringMatcherBase {
        type StartsWithMatcher (line 3564) | struct StartsWithMatcher : StringMatcherBase {
        type EndsWithMatcher (line 3568) | struct EndsWithMatcher : StringMatcherBase {
        type RegexMatcher (line 3573) | struct RegexMatcher : MatcherBase<std::string> {
      type Vector (line 3605) | namespace Vector {
        type ContainsElementMatcher (line 3607) | struct ContainsElementMatcher : MatcherBase<std::vector<T, Alloc>> {
          method ContainsElementMatcher (line 3609) | ContainsElementMatcher(T const &comparator) : m_comparator( comp...
          method match (line 3611) | bool match(std::vector<T, Alloc> const &v) const override {
          method describe (line 3620) | std::string describe() const override {
        type ContainsMatcher (line 3628) | struct ContainsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method ContainsMatcher (line 3630) | ContainsMatcher(std::vector<T, AllocComp> const &comparator) : m...
          method match (line 3632) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3650) | std::string describe() const override {
        type EqualsMatcher (line 3658) | struct EqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method EqualsMatcher (line 3660) | EqualsMatcher(std::vector<T, AllocComp> const &comparator) : m_c...
          method match (line 3662) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3674) | std::string describe() const override {
        type ApproxMatcher (line 3681) | struct ApproxMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method ApproxMatcher (line 3683) | ApproxMatcher(std::vector<T, AllocComp> const& comparator) : m_c...
          method match (line 3685) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3693) | std::string describe() const override {
          method ApproxMatcher (line 3697) | ApproxMatcher& epsilon( T const& newEpsilon ) {
          method ApproxMatcher (line 3702) | ApproxMatcher& margin( T const& newMargin ) {
          method ApproxMatcher (line 3707) | ApproxMatcher& scale( T const& newScale ) {
        type UnorderedEqualsMatcher (line 3717) | struct UnorderedEqualsMatcher : MatcherBase<std::vector<T, AllocMa...
          method UnorderedEqualsMatcher (line 3718) | UnorderedEqualsMatcher(std::vector<T, AllocComp> const& target) ...
          method match (line 3719) | bool match(std::vector<T, AllocMatch> const& vec) const override {
          method describe (line 3726) | std::string describe() const override {
      function Contains (line 3739) | Vector::ContainsMatcher<T, AllocComp, AllocMatch> Contains( std::vec...
      function VectorContains (line 3744) | Vector::ContainsElementMatcher<T, Alloc> VectorContains( T const& co...
      function Equals (line 3749) | Vector::EqualsMatcher<T, AllocComp, AllocMatch> Equals( std::vector<...
      function Approx (line 3754) | Vector::ApproxMatcher<T, AllocComp, AllocMatch> Approx( std::vector<...
      function UnorderedEquals (line 3759) | Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch> UnorderedEq...
      type Impl (line 11406) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 11428) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      function Message (line 11439) | Exception::ExceptionMessageMatcher Message(std::string const& messag...
      type Floating (line 11563) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11565) | enum class FloatingPointKind : uint8_t {
      function WithinULP (line 11663) | Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlp...
      function WithinULP (line 11667) | Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpD...
      function WithinAbs (line 11671) | Floating::WithinAbsMatcher WithinAbs(double target, double margin) {
      function WithinRel (line 11675) | Floating::WithinRelMatcher WithinRel(double target, double eps) {
      function WithinRel (line 11679) | Floating::WithinRelMatcher WithinRel(double target) {
      function WithinRel (line 11683) | Floating::WithinRelMatcher WithinRel(float target, float eps) {
      function WithinRel (line 11687) | Floating::WithinRelMatcher WithinRel(float target) {
      type StdString (line 11711) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line 3556) | struct EqualsMatcher : StringMatcherBase {
        type ContainsMatcher (line 3560) | struct ContainsMatcher : StringMatcherBase {
        type StartsWithMatcher (line 3564) | struct StartsWithMatcher : StringMatcherBase {
        type EndsWithMatcher (line 3568) | struct EndsWithMatcher : StringMatcherBase {
        type RegexMatcher (line 3573) | struct RegexMatcher : MatcherBase<std::string> {
      function Equals (line 11786) | StdString::EqualsMatcher Equals( std::string const& str, CaseSensiti...
      function Contains (line 11789) | StdString::ContainsMatcher Contains( std::string const& str, CaseSen...
      function EndsWith (line 11792) | StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSen...
      function StartsWith (line 11795) | StdString::StartsWithMatcher StartsWith( std::string const& str, Cas...
      function Matches (line 11799) | StdString::RegexMatcher Matches(std::string const& regex, CaseSensit...
    type Matchers (line 3396) | namespace Matchers {
      type Impl (line 3237) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 3397) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      type Floating (line 3425) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11565) | enum class FloatingPointKind : uint8_t {
      type Generic (line 3488) | namespace Generic {
        type Detail (line 3490) | namespace Detail {
        class PredicateMatcher (line 3495) | class PredicateMatcher : public MatcherBase<T> {
          method PredicateMatcher (line 3500) | PredicateMatcher(std::function<bool(T const&)> const& elem, std:...
          method match (line 3505) | bool match( T const& item ) const override {
          method describe (line 3509) | std::string describe() const override {
      function Predicate (line 3521) | Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)>...
      type StdString (line 3536) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line 3556) | struct EqualsMatcher : StringMatcherBase {
        type ContainsMatcher (line 3560) | struct ContainsMatcher : StringMatcherBase {
        type StartsWithMatcher (line 3564) | struct StartsWithMatcher : StringMatcherBase {
        type EndsWithMatcher (line 3568) | struct EndsWithMatcher : StringMatcherBase {
        type RegexMatcher (line 3573) | struct RegexMatcher : MatcherBase<std::string> {
      type Vector (line 3605) | namespace Vector {
        type ContainsElementMatcher (line 3607) | struct ContainsElementMatcher : MatcherBase<std::vector<T, Alloc>> {
          method ContainsElementMatcher (line 3609) | ContainsElementMatcher(T const &comparator) : m_comparator( comp...
          method match (line 3611) | bool match(std::vector<T, Alloc> const &v) const override {
          method describe (line 3620) | std::string describe() const override {
        type ContainsMatcher (line 3628) | struct ContainsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method ContainsMatcher (line 3630) | ContainsMatcher(std::vector<T, AllocComp> const &comparator) : m...
          method match (line 3632) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3650) | std::string describe() const override {
        type EqualsMatcher (line 3658) | struct EqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method EqualsMatcher (line 3660) | EqualsMatcher(std::vector<T, AllocComp> const &comparator) : m_c...
          method match (line 3662) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3674) | std::string describe() const override {
        type ApproxMatcher (line 3681) | struct ApproxMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method ApproxMatcher (line 3683) | ApproxMatcher(std::vector<T, AllocComp> const& comparator) : m_c...
          method match (line 3685) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3693) | std::string describe() const override {
          method ApproxMatcher (line 3697) | ApproxMatcher& epsilon( T const& newEpsilon ) {
          method ApproxMatcher (line 3702) | ApproxMatcher& margin( T const& newMargin ) {
          method ApproxMatcher (line 3707) | ApproxMatcher& scale( T const& newScale ) {
        type UnorderedEqualsMatcher (line 3717) | struct UnorderedEqualsMatcher : MatcherBase<std::vector<T, AllocMa...
          method UnorderedEqualsMatcher (line 3718) | UnorderedEqualsMatcher(std::vector<T, AllocComp> const& target) ...
          method match (line 3719) | bool match(std::vector<T, AllocMatch> const& vec) const override {
          method describe (line 3726) | std::string describe() const override {
      function Contains (line 3739) | Vector::ContainsMatcher<T, AllocComp, AllocMatch> Contains( std::vec...
      function VectorContains (line 3744) | Vector::ContainsElementMatcher<T, Alloc> VectorContains( T const& co...
      function Equals (line 3749) | Vector::EqualsMatcher<T, AllocComp, AllocMatch> Equals( std::vector<...
      function Approx (line 3754) | Vector::ApproxMatcher<T, AllocComp, AllocMatch> Approx( std::vector<...
      function UnorderedEquals (line 3759) | Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch> UnorderedEq...
      type Impl (line 11406) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 11428) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      function Message (line 11439) | Exception::ExceptionMessageMatcher Message(std::string const& messag...
      type Floating (line 11563) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11565) | enum class FloatingPointKind : uint8_t {
      function WithinULP (line 11663) | Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlp...
      function WithinULP (line 11667) | Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpD...
      function WithinAbs (line 11671) | Floating::WithinAbsMatcher WithinAbs(double target, double margin) {
      function WithinRel (line 11675) | Floating::WithinRelMatcher WithinRel(double target, double eps) {
      function WithinRel (line 11679) | Floating::WithinRelMatcher WithinRel(double target) {
      function WithinRel (line 11683) | Floating::WithinRelMatcher WithinRel(float target, float eps) {
      function WithinRel (line 11687) | Floating::WithinRelMatcher WithinRel(float target) {
      type StdString (line 11711) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line 3556) | struct EqualsMatcher : StringMatcherBase {
        type ContainsMatcher (line 3560) | struct ContainsMatcher : StringMatcherBase {
        type StartsWithMatcher (line 3564) | struct StartsWithMatcher : StringMatcherBase {
        type EndsWithMatcher (line 3568) | struct EndsWithMatcher : StringMatcherBase {
        type RegexMatcher (line 3573) | struct RegexMatcher : MatcherBase<std::string> {
      function Equals (line 11786) | StdString::EqualsMatcher Equals( std::string const& str, CaseSensiti...
      function Contains (line 11789) | StdString::ContainsMatcher Contains( std::string const& str, CaseSen...
      function EndsWith (line 11792) | StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSen...
      function StartsWith (line 11795) | StdString::StartsWithMatcher StartsWith( std::string const& str, Cas...
      function Matches (line 11799) | StdString::RegexMatcher Matches(std::string const& regex, CaseSensit...
    type Matchers (line 3423) | namespace Matchers {
      type Impl (line 3237) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 3397) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      type Floating (line 3425) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11565) | enum class FloatingPointKind : uint8_t {
      type Generic (line 3488) | namespace Generic {
        type Detail (line 3490) | namespace Detail {
        class PredicateMatcher (line 3495) | class PredicateMatcher : public MatcherBase<T> {
          method PredicateMatcher (line 3500) | PredicateMatcher(std::function<bool(T const&)> const& elem, std:...
          method match (line 3505) | bool match( T const& item ) const override {
          method describe (line 3509) | std::string describe() const override {
      function Predicate (line 3521) | Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)>...
      type StdString (line 3536) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line 3556) | struct EqualsMatcher : StringMatcherBase {
        type ContainsMatcher (line 3560) | struct ContainsMatcher : StringMatcherBase {
        type StartsWithMatcher (line 3564) | struct StartsWithMatcher : StringMatcherBase {
        type EndsWithMatcher (line 3568) | struct EndsWithMatcher : StringMatcherBase {
        type RegexMatcher (line 3573) | struct RegexMatcher : MatcherBase<std::string> {
      type Vector (line 3605) | namespace Vector {
        type ContainsElementMatcher (line 3607) | struct ContainsElementMatcher : MatcherBase<std::vector<T, Alloc>> {
          method ContainsElementMatcher (line 3609) | ContainsElementMatcher(T const &comparator) : m_comparator( comp...
          method match (line 3611) | bool match(std::vector<T, Alloc> const &v) const override {
          method describe (line 3620) | std::string describe() const override {
        type ContainsMatcher (line 3628) | struct ContainsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method ContainsMatcher (line 3630) | ContainsMatcher(std::vector<T, AllocComp> const &comparator) : m...
          method match (line 3632) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3650) | std::string describe() const override {
        type EqualsMatcher (line 3658) | struct EqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method EqualsMatcher (line 3660) | EqualsMatcher(std::vector<T, AllocComp> const &comparator) : m_c...
          method match (line 3662) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3674) | std::string describe() const override {
        type ApproxMatcher (line 3681) | struct ApproxMatcher : MatcherBase<std::vector<T, AllocMatch>> {
          method ApproxMatcher (line 3683) | ApproxMatcher(std::vector<T, AllocComp> const& comparator) : m_c...
          method match (line 3685) | bool match(std::vector<T, AllocMatch> const &v) const override {
          method describe (line 3693) | std::string describe() const override {
          method ApproxMatcher (line 3697) | ApproxMatcher& epsilon( T const& newEpsilon ) {
          method ApproxMatcher (line 3702) | ApproxMatcher& margin( T const& newMargin ) {
          method ApproxMatcher (line 3707) | ApproxMatcher& scale( T const& newScale ) {
        type UnorderedEqualsMatcher (line 3717) | struct UnorderedEqualsMatcher : MatcherBase<std::vector<T, AllocMa...
          method UnorderedEqualsMatcher (line 3718) | UnorderedEqualsMatcher(std::vector<T, AllocComp> const& target) ...
          method match (line 3719) | bool match(std::vector<T, AllocMatch> const& vec) const override {
          method describe (line 3726) | std::string describe() const override {
      function Contains (line 3739) | Vector::ContainsMatcher<T, AllocComp, AllocMatch> Contains( std::vec...
      function VectorContains (line 3744) | Vector::ContainsElementMatcher<T, Alloc> VectorContains( T const& co...
      function Equals (line 3749) | Vector::EqualsMatcher<T, AllocComp, AllocMatch> Equals( std::vector<...
      function Approx (line 3754) | Vector::ApproxMatcher<T, AllocComp, AllocMatch> Approx( std::vector<...
      function UnorderedEquals (line 3759) | Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch> UnorderedEq...
      type Impl (line 11406) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 11428) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      function Message (line 11439) | Exception::ExceptionMessageMatcher Message(std::string const& messag...
      type Floating (line 11563) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11565) | enum class FloatingPointKind : uint8_t {
      function WithinULP (line 11663) | Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlp...
      function WithinULP (line 11667) | Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpD...
      function WithinAbs (line 11671) | Floating::WithinAbsMatcher WithinAbs(double target, double margin) {
      function WithinRel (line 11675) | Floating::WithinRelMatcher WithinRel(double target, double eps) {
      function WithinRel (line 11679) | Floating::WithinRelMatcher WithinRel(double target) {
      function WithinRel (line 11683) | Floating::WithinRelMatcher WithinRel(float target, float eps) {
      function WithinRel (line 11687) | Floating::WithinRelMatcher WithinRel(float target) {
      type StdString (line 11711) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line 3556) | struct EqualsMatcher : StringMatcherBase {
        type ContainsMatcher (line 3560) | struct ContainsMatcher : StringMatcherBase {
        type StartsWithMatcher (line 3564) | struct StartsWithMatcher : StringMatcherBase {
        type EndsWithMatcher (line 3568) | struct EndsWithMatcher : StringMatcherBase {
        type RegexMatcher (line 3573) | struct RegexMatcher : MatcherBase<std::string> {
      function Equals (line 11786) | StdString::EqualsMatcher Equals( std::string const& str, CaseSensiti...
      function Contains (line 11789) | StdString::ContainsMatcher Contains( std::string const& str, CaseSen...
      function EndsWith (line 11792) | StdString::EndsWithMatcher EndsWith( std::string const& str, CaseSen...
      function StartsWith (line 11795) | StdString::StartsWithMatcher StartsWith( std::string const& str, Cas...
      function Matches (line 11799) | StdString::RegexMatcher Matches(std::string const& regex, CaseSensit...
    type Matchers (line 3487) | namespace Matchers {
      type Impl (line 3237) | namespace Impl {
        type MatchAllOf (line 3239) | struct MatchAllOf
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3240) | struct MatchAnyOf
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3241) | struct MatchNotOf
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
        class MatcherUntypedBase (line 3243) | class MatcherUntypedBase {
          method MatcherUntypedBase (line 3245) | MatcherUntypedBase() = default;
          method MatcherUntypedBase (line 3246) | MatcherUntypedBase ( MatcherUntypedBase const& ) = default;
          method MatcherUntypedBase (line 3247) | MatcherUntypedBase& operator = ( MatcherUntypedBase const& ) = d...
        type MatcherMethod (line 3262) | struct MatcherMethod {
        type MatcherMethod<NSString*> (line 3270) | struct MatcherMethod<NSString*> {
        type MatcherBase (line 3280) | struct MatcherBase : MatcherUntypedBase, MatcherMethod<T> {
        type MatchAllOf (line 3288) | struct MatchAllOf : MatcherBase<ArgT> {
          method match (line 3289) | bool match( ArgT const& arg ) const override {
          method describe (line 3296) | std::string describe() const override {
        type MatchAnyOf (line 3321) | struct MatchAnyOf : MatcherBase<ArgT> {
          method match (line 3323) | bool match( ArgT const& arg ) const override {
          method describe (line 3330) | std::string describe() const override {
        type MatchNotOf (line 3356) | struct MatchNotOf : MatcherBase<ArgT> {
          method MatchNotOf (line 3358) | MatchNotOf( MatcherBase<ArgT> const& underlyingMatcher ) : m_und...
          method match (line 3360) | bool match( ArgT const& arg ) const override {
          method describe (line 3364) | std::string describe() const override {
      type Exception (line 3397) | namespace Exception {
        class ExceptionMessageMatcher (line 3399) | class ExceptionMessageMatcher : public MatcherBase<std::exception> {
          method ExceptionMessageMatcher (line 3403) | ExceptionMessageMatcher(std::string const& message):
      type Floating (line 3425) | namespace Floating {
        type FloatingPointKind (line 3427) | enum class FloatingPointKind : uint8_t
        type WithinAbsMatcher (line 3429) | struct WithinAbsMatcher : MatcherBase<double> {
        type WithinUlpsMatcher (line 3438) | struct WithinUlpsMatcher : MatcherBase<double> {
        type WithinRelMatcher (line 3454) | struct WithinRelMatcher : MatcherBase<double> {
        type FloatingPointKind (line 11565) | enum class FloatingPointKind : uint8_t {
      type Generic (line 3488) | namespace Generic {
        type Detail (line 3490) | namespace Detail {
        class PredicateMatcher (line 3495) | class PredicateMatcher : public MatcherBase<T> {
          method PredicateMatcher (line 3500) | PredicateMatcher(std::function<bool(T const&)> const& elem, std:...
          method match (line 3505) | bool match( T const& item ) const override {
          method describe (line 3509) | std::string describe() const override {
      function Predicate (line 3521) | Generic::PredicateMatcher<T> Predicate(std::function<bool(T const&)>...
      type StdString (line 3536) | namespace StdString {
        type CasedString (line 3538) | struct CasedString
        type StringMatcherBase (line 3548) | struct StringMatcherBase : MatcherBase<std::string> {
        type EqualsMatcher (line
Condensed preview — 276 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,375K chars).
[
  {
    "path": ".github/workflows/documentation.yml",
    "chars": 7070,
    "preview": "# matth-x/MicroOcpp\n# Copyright Matthias Akstaller 2019 - 2024\n# MIT License\n\nname: Documentation\non:\n  push:\n    branch"
  },
  {
    "path": ".github/workflows/esp-idf.yml",
    "chars": 1377,
    "preview": "# matth-x/MicroOcpp\n# Copyright Matthias Akstaller 2019 - 2024\n# MIT License\n\nname: ESP-IDF CI\n\non:\n  push:\n    branches"
  },
  {
    "path": ".github/workflows/pio.yml",
    "chars": 1154,
    "preview": "# matth-x/MicroOcpp\n# Copyright Matthias Akstaller 2019 - 2024\n# MIT License\n\nname: PlatformIO CI\n\non:\n  push:\n    branc"
  },
  {
    "path": ".github/workflows/platformless.yml",
    "chars": 892,
    "preview": "# matth-x/MicroOcpp\n# Copyright Matthias Akstaller 2019 - 2024\n# MIT License\n\nname: Default Compilation\n\non:\n  push:\n   "
  },
  {
    "path": ".github/workflows/tests.yml",
    "chars": 2119,
    "preview": "# matth-x/MicroOcpp\n# Copyright Matthias Akstaller 2019 - 2024\n# MIT License\n\nname: Unit tests\n\non:\n  push:\n    branches"
  },
  {
    "path": ".gitignore",
    "chars": 115,
    "preview": ".pio\n.vscode\nbuild\nlib\nmo_store\nsrc/ArduinoJson*\nsrc/main.cpp\ntests/helpers/ArduinoJson*\ncoverage.info\ndocs/assets\n"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 12450,
    "preview": "# Changelog\n\n## Unreleased\n\n### Changed\n\n- Change `MicroOcpp::TxNotification` into C-style enum, replace `OCPP_TxNoticat"
  },
  {
    "path": "CMakeLists.txt",
    "chars": 7310,
    "preview": "# matth-x/MicroOcpp\n# Copyright Matthias Akstaller 2019 - 2024\n# MIT License\n\ncmake_minimum_required(VERSION 3.15)\n\nset("
  },
  {
    "path": "LICENSE",
    "chars": 1082,
    "preview": "MIT License\n\nCopyright (c) 2019 - 2024 Matthias Akstaller\n\nPermission is hereby granted, free of charge, to any person o"
  },
  {
    "path": "README.md",
    "chars": 7495,
    "preview": "# <img src=\"https://github.com/matth-x/MicroOcpp/assets/63792403/1c49d1ad-7afc-48d3-a54e-9aef2d4886db\" alt=\"Icon\" height"
  },
  {
    "path": "SConscript.py",
    "chars": 1210,
    "preview": "# matth-x/MicroOcpp\n# Copyright Matthias Akstaller 2019 - 2024\n# MIT License\n\n# NOTE: This SConscript is still WIP. It h"
  },
  {
    "path": "docs/benchmarks.md",
    "chars": 5029,
    "preview": "# Benchmarks\n\nMicrocontrollers have tight hardware constraints which affect how much resources the firmware can demand. "
  },
  {
    "path": "docs/index.md",
    "chars": 753,
    "preview": "MicroOCPP is an OCPP client which runs on microcontrollers and enables EVSEs to participate in OCPP charging networks. A"
  },
  {
    "path": "docs/intro-tech.md",
    "chars": 11835,
    "preview": "# Technical introduction\n\nThis chapter covers the technical concepts of MicroOCPP.\n\n## Scope of MicroOCPP\n\nThe OCPP spec"
  },
  {
    "path": "docs/migration.md",
    "chars": 4218,
    "preview": "# Migrating to v1.1\n\nAs a new minor version, all features should work the same as in v1.0 and existing integrations are "
  },
  {
    "path": "docs/modules.md",
    "chars": 6451,
    "preview": "# Modules\n\nThis chapter gives an overview of the class structure of MicroOCPP.\n\n## Context\n\nThe *Context* contains all r"
  },
  {
    "path": "docs/prerequisites.md",
    "chars": 3784,
    "preview": "# Development tools and basic prerequisites\n\nThis page explains how to work with this library using the appropriate deve"
  },
  {
    "path": "docs/security.md",
    "chars": 9434,
    "preview": "# Security\n\nMicroOCPP is designed to be compatible with IoT devices which leads to special considerations regarding cybe"
  },
  {
    "path": "docs/stylesheets/extra.css",
    "chars": 55,
    "preview": ":root {\n    --md-primary-fg-color:        #2984C7;\n  }\n"
  },
  {
    "path": "examples/ESP/main.cpp",
    "chars": 4077,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <Arduino.h>\n#if defined(ESP826"
  },
  {
    "path": "examples/ESP-IDF/CMakeLists.txt",
    "chars": 385,
    "preview": "# The following five lines of boilerplate have to be in your project's\n# CMakeLists in this exact order for cmake to wor"
  },
  {
    "path": "examples/ESP-IDF/Makefile",
    "chars": 181,
    "preview": "#\n# This is a project Makefile. It is assumed the directory this Makefile resides in is a\n# project subdirectory.\n#\n\nPRO"
  },
  {
    "path": "examples/ESP-IDF/README.md",
    "chars": 2326,
    "preview": "# ESP-IDF integration example\n\nTo run MicroOcpp on the ESP-IDF platform, please take this example as the starting point."
  },
  {
    "path": "examples/ESP-IDF/components/ArduinoJson/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "examples/ESP-IDF/components/ArduinoOcpp/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "examples/ESP-IDF/components/ArduinoOcppMongoose/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "examples/ESP-IDF/components/README.md",
    "chars": 499,
    "preview": "## Components folder structure\n\nThe ESP-IDF integration requires at least the following components:\n\n- [MicroOcpp](https"
  },
  {
    "path": "examples/ESP-IDF/components/mongoose/.gitkeep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "examples/ESP-IDF/main/CMakeLists.txt",
    "chars": 75,
    "preview": "idf_component_register(SRCS \"main.c\"\n                    INCLUDE_DIRS \".\")\n"
  },
  {
    "path": "examples/ESP-IDF/main/Kconfig.projbuild",
    "chars": 1044,
    "preview": "menu \"Example Configuration\"\n\n    config ESP_WIFI_SSID\n        string \"WiFi SSID\"\n        default \"myssid\"\n        help\n"
  },
  {
    "path": "examples/ESP-IDF/main/component.mk",
    "chars": 314,
    "preview": "#\n# Main component makefile.\n#\n# This Makefile can be left empty. By default, it will take the sources in the\n# src/ dir"
  },
  {
    "path": "examples/ESP-IDF/main/main.c",
    "chars": 6945,
    "preview": "/* Based on the ESP-IDF WiFi station Example (see https://github.com/espressif/esp-idf/tree/release/v4.4/examples/wifi/g"
  },
  {
    "path": "examples/ESP-IDF/partitions.csv",
    "chars": 302,
    "preview": "# Name,   Type, SubType, Offset,  Size, Flags\nnvs,      data, nvs,     ,        0x4000,\notadata,  data, ota,     ,      "
  },
  {
    "path": "examples/ESP-IDF/sdkconfig",
    "chars": 40459,
    "preview": "#\n# Automatically generated file. DO NOT EDIT.\n# Espressif IoT Development Framework (ESP-IDF) Project Configuration\n#\nC"
  },
  {
    "path": "examples/ESP-TLS/main.cpp",
    "chars": 4417,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <Arduino.h>\n#if defined(ESP826"
  },
  {
    "path": "library.json",
    "chars": 1785,
    "preview": "{\n    \"name\": \"MicroOcpp\",\n    \"version\": \"1.2.0\",\n    \"description\": \"OCPP 1.6 / 2.0.1 Client for microcontrollers\",\n  "
  },
  {
    "path": "library.properties",
    "chars": 255,
    "preview": "name=MicroOcpp\nversion=1.2.0\nauthor=Matthias Akstaller\nmaintainer=Matthias Akstaller\nsentence=OCPP 1.6 Client for microc"
  },
  {
    "path": "mkdocs.yml",
    "chars": 1138,
    "preview": "site_name: MicroOCPP docs\n\ntheme:\n  name: material\n  features:\n    - announce.dismiss\n    - content.action.edit\n    - co"
  },
  {
    "path": "platformio.ini",
    "chars": 1138,
    "preview": "; matth-x/MicroOcpp\n; Copyright Matthias Akstaller 2019 - 2024\n; MIT License\n\n[platformio]\ndefault_envs = esp32-developm"
  },
  {
    "path": "src/MicroOcpp/Core/Configuration.cpp",
    "chars": 8054,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Core/Configuration."
  },
  {
    "path": "src/MicroOcpp/Core/Configuration.h",
    "chars": 1534,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CONFIGURATION_H\n#define MO_C"
  },
  {
    "path": "src/MicroOcpp/Core/ConfigurationContainer.cpp",
    "chars": 2325,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Core/ConfigurationC"
  },
  {
    "path": "src/MicroOcpp/Core/ConfigurationContainer.h",
    "chars": 2261,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CONFIGURATIONCONTAINER_H\n#de"
  },
  {
    "path": "src/MicroOcpp/Core/ConfigurationContainerFlash.cpp",
    "chars": 12515,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Core/ConfigurationC"
  },
  {
    "path": "src/MicroOcpp/Core/ConfigurationContainerFlash.h",
    "chars": 481,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CONFIGURATIONCONTAINERFLASH_"
  },
  {
    "path": "src/MicroOcpp/Core/ConfigurationKeyValue.cpp",
    "chars": 6378,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Core/ConfigurationK"
  },
  {
    "path": "src/MicroOcpp/Core/ConfigurationKeyValue.h",
    "chars": 1993,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef CONFIGURATIONKEYVALUE_H\n#define"
  },
  {
    "path": "src/MicroOcpp/Core/ConfigurationOptions.h",
    "chars": 1373,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CONFIGURATIONOPTIONS_H\n#defi"
  },
  {
    "path": "src/MicroOcpp/Core/Configuration_c.cpp",
    "chars": 9668,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Core/Configuration_"
  },
  {
    "path": "src/MicroOcpp/Core/Configuration_c.h",
    "chars": 3398,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CONFIGURATION_C_H\n#define MO"
  },
  {
    "path": "src/MicroOcpp/Core/Connection.cpp",
    "chars": 3334,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Core/Connection.h>\n"
  },
  {
    "path": "src/MicroOcpp/Core/Connection.h",
    "chars": 4300,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CONNECTION_H\n#define MO_CONN"
  },
  {
    "path": "src/MicroOcpp/Core/Context.cpp",
    "chars": 1367,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Core/Context.h>\n#in"
  },
  {
    "path": "src/MicroOcpp/Core/Context.h",
    "chars": 1179,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CONTEXT_H\n#define MO_CONTEXT"
  },
  {
    "path": "src/MicroOcpp/Core/FilesystemAdapter.cpp",
    "chars": 22400,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Core/FilesystemAdap"
  },
  {
    "path": "src/MicroOcpp/Core/FilesystemAdapter.h",
    "chars": 2493,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_FILESYSTEMADAPTER_H\n#define "
  },
  {
    "path": "src/MicroOcpp/Core/FilesystemUtils.cpp",
    "chars": 3946,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Core/FilesystemAdap"
  },
  {
    "path": "src/MicroOcpp/Core/FilesystemUtils.h",
    "chars": 1141,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_FILESYSTEMUTILS_H\n#define MO"
  },
  {
    "path": "src/MicroOcpp/Core/Ftp.h",
    "chars": 3305,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_FTP_H\n#define MO_FTP_H\n\n#inc"
  },
  {
    "path": "src/MicroOcpp/Core/FtpMbedTLS.cpp",
    "chars": 31056,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Core/FtpMbedTLS.h>\n"
  },
  {
    "path": "src/MicroOcpp/Core/FtpMbedTLS.h",
    "chars": 1202,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_FTP_MBEDTLS_H\n#define MO_FTP"
  },
  {
    "path": "src/MicroOcpp/Core/Memory.cpp",
    "chars": 8339,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Core/Memory.h>\n#inc"
  },
  {
    "path": "src/MicroOcpp/Core/Memory.h",
    "chars": 10844,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_MEMORY_H\n#define MO_MEMORY_H"
  },
  {
    "path": "src/MicroOcpp/Core/OcppError.h",
    "chars": 1273,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_OCPPERROR_H\n#define MO_OCPPE"
  },
  {
    "path": "src/MicroOcpp/Core/Operation.cpp",
    "chars": 1134,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Core/Operation.h>\n\n"
  },
  {
    "path": "src/MicroOcpp/Core/Operation.h",
    "chars": 2461,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n/**\n * This framework considers OCPP op"
  },
  {
    "path": "src/MicroOcpp/Core/OperationRegistry.cpp",
    "chars": 2572,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Core/OperationRegis"
  },
  {
    "path": "src/MicroOcpp/Core/OperationRegistry.h",
    "chars": 1082,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_OPERATIONREGISTRY_H\n#define "
  },
  {
    "path": "src/MicroOcpp/Core/Request.cpp",
    "chars": 8538,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Core/Request.h>\n#in"
  },
  {
    "path": "src/MicroOcpp/Core/Request.h",
    "chars": 4392,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_REQUEST_H\n#define MO_REQUEST"
  },
  {
    "path": "src/MicroOcpp/Core/RequestCallbacks.h",
    "chars": 890,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_REQUESTCALLBACKS_H\n#define M"
  },
  {
    "path": "src/MicroOcpp/Core/RequestQueue.cpp",
    "chars": 13450,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <limits>\n\n#include <MicroOcpp/"
  },
  {
    "path": "src/MicroOcpp/Core/RequestQueue.h",
    "chars": 2793,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_REQUESTQUEUE_H\n#define MO_RE"
  },
  {
    "path": "src/MicroOcpp/Core/Time.cpp",
    "chars": 11167,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Core/Time.h>\n#inclu"
  },
  {
    "path": "src/MicroOcpp/Core/Time.h",
    "chars": 4390,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_TIME_H\n#define MO_TIME_H\n\n#i"
  },
  {
    "path": "src/MicroOcpp/Core/UuidUtils.cpp",
    "chars": 1382,
    "preview": "#include <MicroOcpp/Core/UuidUtils.h>\n#include <MicroOcpp/Platform.h>\n\n#include <stdint.h>\n\nnamespace MicroOcpp {\n\n#defi"
  },
  {
    "path": "src/MicroOcpp/Core/UuidUtils.h",
    "chars": 358,
    "preview": "#ifndef MO_UUIDUTILS_H\n#define MO_UUIDUTILS_H\n\n#include <stddef.h>\nnamespace MicroOcpp {\n\n// Generates a UUID (Universal"
  },
  {
    "path": "src/MicroOcpp/Debug.cpp",
    "chars": 1417,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <string.h>\n\n#include <MicroOcp"
  },
  {
    "path": "src/MicroOcpp/Debug.h",
    "chars": 2614,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_DEBUG_H\n#define MO_DEBUG_H\n\n"
  },
  {
    "path": "src/MicroOcpp/Model/Authorization/AuthorizationData.cpp",
    "chars": 5537,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Version.h>\n\n#if MO_"
  },
  {
    "path": "src/MicroOcpp/Model/Authorization/AuthorizationData.h",
    "chars": 2096,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_AUTHORIZATIONDATA_H\n#define "
  },
  {
    "path": "src/MicroOcpp/Model/Authorization/AuthorizationList.cpp",
    "chars": 6265,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Version.h>\n\n#if MO_"
  },
  {
    "path": "src/MicroOcpp/Model/Authorization/AuthorizationList.h",
    "chars": 1189,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_AUTHORIZATIONLIST_H\n#define "
  },
  {
    "path": "src/MicroOcpp/Model/Authorization/AuthorizationService.cpp",
    "chars": 6945,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Version.h>\n\n#if MO_"
  },
  {
    "path": "src/MicroOcpp/Model/Authorization/AuthorizationService.h",
    "chars": 1276,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_AUTHORIZATIONSERVICE_H\n#defi"
  },
  {
    "path": "src/MicroOcpp/Model/Authorization/IdToken.cpp",
    "chars": 2855,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Version.h>\n\n#if MO_"
  },
  {
    "path": "src/MicroOcpp/Model/Authorization/IdToken.h",
    "chars": 1086,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_IDTOKEN_H\n#define MO_IDTOKEN"
  },
  {
    "path": "src/MicroOcpp/Model/Availability/AvailabilityService.cpp",
    "chars": 6437,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Version.h>\n\n#if MO_"
  },
  {
    "path": "src/MicroOcpp/Model/Availability/AvailabilityService.h",
    "chars": 2280,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n/*\n * Implementation of the UCs G01, G0"
  },
  {
    "path": "src/MicroOcpp/Model/Availability/ChangeAvailabilityStatus.h",
    "chars": 404,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CHANGEAVAILABILITYSTATUS_H\n#"
  },
  {
    "path": "src/MicroOcpp/Model/Boot/BootService.cpp",
    "chars": 9170,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <limits>\n\n#include <MicroOcpp/"
  },
  {
    "path": "src/MicroOcpp/Model/Boot/BootService.h",
    "chars": 2892,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_BOOTSERVICE_H\n#define MO_BOO"
  },
  {
    "path": "src/MicroOcpp/Model/Certificates/Certificate.cpp",
    "chars": 4346,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/Certificates/"
  },
  {
    "path": "src/MicroOcpp/Model/Certificates/Certificate.h",
    "chars": 5652,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CERTIFICATE_H\n#define MO_CER"
  },
  {
    "path": "src/MicroOcpp/Model/Certificates/CertificateMbedTLS.cpp",
    "chars": 13792,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/Certificates/"
  },
  {
    "path": "src/MicroOcpp/Model/Certificates/CertificateMbedTLS.h",
    "chars": 1662,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CERTIFICATE_MBEDTLS_H\n#defin"
  },
  {
    "path": "src/MicroOcpp/Model/Certificates/CertificateService.cpp",
    "chars": 1254,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/Certificates/"
  },
  {
    "path": "src/MicroOcpp/Model/Certificates/CertificateService.h",
    "chars": 848,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n/*\n * Functional Block M: ISO 15118 Cer"
  },
  {
    "path": "src/MicroOcpp/Model/Certificates/Certificate_c.cpp",
    "chars": 2413,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/Certificates/"
  },
  {
    "path": "src/MicroOcpp/Model/Certificates/Certificate_c.h",
    "chars": 1569,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CERTIFICATE_C_H\n#define MO_C"
  },
  {
    "path": "src/MicroOcpp/Model/ConnectorBase/ChargePointErrorData.h",
    "chars": 1031,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CHARGEPOINTERRORCODE_H\n#defi"
  },
  {
    "path": "src/MicroOcpp/Model/ConnectorBase/ChargePointStatus.h",
    "chars": 748,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CHARGEPOINTSTATUS_H\n#define "
  },
  {
    "path": "src/MicroOcpp/Model/ConnectorBase/Connector.cpp",
    "chars": 52432,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/ConnectorBase"
  },
  {
    "path": "src/MicroOcpp/Model/ConnectorBase/Connector.h",
    "chars": 7075,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CONNECTOR_H\n#define MO_CONNE"
  },
  {
    "path": "src/MicroOcpp/Model/ConnectorBase/ConnectorsCommon.cpp",
    "chars": 4685,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/ConnectorBase"
  },
  {
    "path": "src/MicroOcpp/Model/ConnectorBase/ConnectorsCommon.h",
    "chars": 529,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CHARGECONTROLCOMMON_H\n#defin"
  },
  {
    "path": "src/MicroOcpp/Model/ConnectorBase/EvseId.h",
    "chars": 674,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_EVSEID_H\n#define MO_EVSEID_H"
  },
  {
    "path": "src/MicroOcpp/Model/ConnectorBase/UnlockConnectorResult.h",
    "chars": 960,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_UNLOCKCONNECTORRESULT_H\n#def"
  },
  {
    "path": "src/MicroOcpp/Model/Diagnostics/DiagnosticsService.cpp",
    "chars": 23077,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/Diagnostics/D"
  },
  {
    "path": "src/MicroOcpp/Model/Diagnostics/DiagnosticsService.h",
    "chars": 4708,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef DIAGNOSTICSSERVICE_H\n#define DI"
  },
  {
    "path": "src/MicroOcpp/Model/Diagnostics/DiagnosticsStatus.h",
    "chars": 312,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_DIAGNOSTICS_STATUS\n#define M"
  },
  {
    "path": "src/MicroOcpp/Model/FirmwareManagement/FirmwareService.cpp",
    "chars": 18243,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/FirmwareManag"
  },
  {
    "path": "src/MicroOcpp/Model/FirmwareManagement/FirmwareService.h",
    "chars": 4228,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef FIRMWARESERVICE_H\n#define FIRMW"
  },
  {
    "path": "src/MicroOcpp/Model/FirmwareManagement/FirmwareStatus.h",
    "chars": 364,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_FIRMWARE_STATUS\n#define MO_F"
  },
  {
    "path": "src/MicroOcpp/Model/Heartbeat/HeartbeatService.cpp",
    "chars": 1429,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/Heartbeat/Hea"
  },
  {
    "path": "src/MicroOcpp/Model/Heartbeat/HeartbeatService.h",
    "chars": 537,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_HEARTBEATSERVICE_H\n#define M"
  },
  {
    "path": "src/MicroOcpp/Model/Metering/MeterStore.cpp",
    "chars": 9090,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/Metering/Mete"
  },
  {
    "path": "src/MicroOcpp/Model/Metering/MeterStore.h",
    "chars": 1929,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_METERSTORE_H\n#define MO_METE"
  },
  {
    "path": "src/MicroOcpp/Model/Metering/MeterValue.cpp",
    "chars": 6511,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <limits>\n\n#include <MicroOcpp/"
  },
  {
    "path": "src/MicroOcpp/Model/Metering/MeterValue.h",
    "chars": 1906,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_METERVALUE_H\n#define MO_METE"
  },
  {
    "path": "src/MicroOcpp/Model/Metering/MeterValuesV201.cpp",
    "chars": 13828,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Version.h>\n\n#if MO_"
  },
  {
    "path": "src/MicroOcpp/Model/Metering/MeterValuesV201.h",
    "chars": 4777,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n/*\n * Implementation of the UCs E01 - E"
  },
  {
    "path": "src/MicroOcpp/Model/Metering/MeteringConnector.cpp",
    "chars": 12889,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/Metering/Mete"
  },
  {
    "path": "src/MicroOcpp/Model/Metering/MeteringConnector.h",
    "chars": 3008,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_METERING_CONNECTOR_H\n#define"
  },
  {
    "path": "src/MicroOcpp/Model/Metering/MeteringService.cpp",
    "chars": 6284,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/Metering/Mete"
  },
  {
    "path": "src/MicroOcpp/Model/Metering/MeteringService.h",
    "chars": 1676,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_METERINGSERVICE_H\n#define MO"
  },
  {
    "path": "src/MicroOcpp/Model/Metering/ReadingContext.cpp",
    "chars": 2184,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <string.h>\n\n#include <MicroOcp"
  },
  {
    "path": "src/MicroOcpp/Model/Metering/ReadingContext.h",
    "chars": 656,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_READINGCONTEXT_H\n#define MO_"
  },
  {
    "path": "src/MicroOcpp/Model/Metering/SampledValue.cpp",
    "chars": 1924,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/Metering/Samp"
  },
  {
    "path": "src/MicroOcpp/Model/Metering/SampledValue.h",
    "chars": 5561,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef SAMPLEDVALUE_H\n#define SAMPLEDV"
  },
  {
    "path": "src/MicroOcpp/Model/Model.cpp",
    "chars": 9680,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/Model.h>\n\n#in"
  },
  {
    "path": "src/MicroOcpp/Model/Model.h",
    "chars": 5530,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_MODEL_H\n#define MO_MODEL_H\n\n"
  },
  {
    "path": "src/MicroOcpp/Model/RemoteControl/RemoteControlDefs.h",
    "chars": 801,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_UNLOCKCONNECTOR_H\n#define MO"
  },
  {
    "path": "src/MicroOcpp/Model/RemoteControl/RemoteControlService.cpp",
    "chars": 6464,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Version.h>\n\n#if MO_"
  },
  {
    "path": "src/MicroOcpp/Model/RemoteControl/RemoteControlService.h",
    "chars": 1755,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_REMOTECONTROLSERVICE_H\n#defi"
  },
  {
    "path": "src/MicroOcpp/Model/Reservation/Reservation.cpp",
    "chars": 4297,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Version.h>\n\n#if MO_"
  },
  {
    "path": "src/MicroOcpp/Model/Reservation/Reservation.h",
    "chars": 2246,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_RESERVATION_H\n#define MO_RES"
  },
  {
    "path": "src/MicroOcpp/Model/Reservation/ReservationService.cpp",
    "chars": 8174,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Version.h>\n\n#if MO_"
  },
  {
    "path": "src/MicroOcpp/Model/Reservation/ReservationService.h",
    "chars": 1565,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_RESERVATIONSERVICE_H\n#define"
  },
  {
    "path": "src/MicroOcpp/Model/Reset/ResetDefs.h",
    "chars": 422,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_RESETDEFS_H\n#define MO_RESET"
  },
  {
    "path": "src/MicroOcpp/Model/Reset/ResetService.cpp",
    "chars": 10964,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/Reset/ResetSe"
  },
  {
    "path": "src/MicroOcpp/Model/Reset/ResetService.h",
    "chars": 3188,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_RESETSERVICE_H\n#define MO_RE"
  },
  {
    "path": "src/MicroOcpp/Model/SmartCharging/SmartChargingModel.cpp",
    "chars": 18893,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/SmartCharging"
  },
  {
    "path": "src/MicroOcpp/Model/SmartCharging/SmartChargingModel.h",
    "chars": 4292,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef SMARTCHARGINGMODEL_H\n#define SM"
  },
  {
    "path": "src/MicroOcpp/Model/SmartCharging/SmartChargingService.cpp",
    "chars": 29089,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/SmartCharging"
  },
  {
    "path": "src/MicroOcpp/Model/SmartCharging/SmartChargingService.h",
    "chars": 4488,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef SMARTCHARGINGSERVICE_H\n#define "
  },
  {
    "path": "src/MicroOcpp/Model/Transactions/Transaction.cpp",
    "chars": 21784,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/Transactions/"
  },
  {
    "path": "src/MicroOcpp/Model/Transactions/Transaction.h",
    "chars": 16594,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef TRANSACTION_H\n#define TRANSACTI"
  },
  {
    "path": "src/MicroOcpp/Model/Transactions/TransactionDefs.h",
    "chars": 251,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_TRANSACTIONDEFS_H\n#define MO"
  },
  {
    "path": "src/MicroOcpp/Model/Transactions/TransactionDeserialize.cpp",
    "chars": 7952,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <limits>\n\n#include <MicroOcpp/"
  },
  {
    "path": "src/MicroOcpp/Model/Transactions/TransactionDeserialize.h",
    "chars": 423,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_TRANSACTIONDESERIALIZE_H\n#de"
  },
  {
    "path": "src/MicroOcpp/Model/Transactions/TransactionService.cpp",
    "chars": 44865,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Version.h>\n\n#if MO_"
  },
  {
    "path": "src/MicroOcpp/Model/Transactions/TransactionService.h",
    "chars": 5229,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n/*\n * Implementation of the UCs E01 - E"
  },
  {
    "path": "src/MicroOcpp/Model/Transactions/TransactionStore.cpp",
    "chars": 34282,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Model/Transactions/"
  },
  {
    "path": "src/MicroOcpp/Model/Transactions/TransactionStore.h",
    "chars": 3722,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_TRANSACTIONSTORE_H\n#define M"
  },
  {
    "path": "src/MicroOcpp/Model/Variables/Variable.cpp",
    "chars": 10348,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n/*\n * Implementation of the UCs B05 - B"
  },
  {
    "path": "src/MicroOcpp/Model/Variables/Variable.h",
    "chars": 6644,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n/*\n * Implementation of the UCs B05 - B"
  },
  {
    "path": "src/MicroOcpp/Model/Variables/VariableContainer.cpp",
    "chars": 11540,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n/*\n * Implementation of the UCs B05 - B"
  },
  {
    "path": "src/MicroOcpp/Model/Variables/VariableContainer.h",
    "chars": 1898,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n/*\n * Implementation of the UCs B05 - B"
  },
  {
    "path": "src/MicroOcpp/Model/Variables/VariableService.cpp",
    "chars": 17352,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n/*\n * Implementation of the UCs B05 - B"
  },
  {
    "path": "src/MicroOcpp/Model/Variables/VariableService.h",
    "chars": 3443,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n/*\n * Implementation of the UCs B05 - B"
  },
  {
    "path": "src/MicroOcpp/Operations/Authorize.cpp",
    "chars": 3562,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Operations/Authoriz"
  },
  {
    "path": "src/MicroOcpp/Operations/Authorize.h",
    "chars": 1422,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef AUTHORIZE_H\n#define AUTHORIZE_H"
  },
  {
    "path": "src/MicroOcpp/Operations/BootNotification.cpp",
    "chars": 4257,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Operations/BootNoti"
  },
  {
    "path": "src/MicroOcpp/Operations/BootNotification.h",
    "chars": 1149,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_BOOTNOTIFICATION_H\n#define M"
  },
  {
    "path": "src/MicroOcpp/Operations/CancelReservation.cpp",
    "chars": 1283,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Version.h>\n\n#if MO_"
  },
  {
    "path": "src/MicroOcpp/Operations/CancelReservation.h",
    "chars": 871,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CANCELRESERVATION_H\n#define "
  },
  {
    "path": "src/MicroOcpp/Operations/ChangeAvailability.cpp",
    "chars": 4337,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Operations/ChangeAv"
  },
  {
    "path": "src/MicroOcpp/Operations/ChangeAvailability.h",
    "chars": 1567,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CHANGEAVAILABILITY_H\n#define"
  },
  {
    "path": "src/MicroOcpp/Operations/ChangeConfiguration.cpp",
    "chars": 4584,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Operations/ChangeCo"
  },
  {
    "path": "src/MicroOcpp/Operations/ChangeConfiguration.h",
    "chars": 772,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CHANGECONFIGURATION_H\n#defin"
  },
  {
    "path": "src/MicroOcpp/Operations/CiStrings.h",
    "chars": 524,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n/*\n * A collection of the fixed-length "
  },
  {
    "path": "src/MicroOcpp/Operations/ClearCache.cpp",
    "chars": 1316,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Operations/ClearCac"
  },
  {
    "path": "src/MicroOcpp/Operations/ClearCache.h",
    "chars": 687,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CLEARCACHE_H\n#define MO_CLEA"
  },
  {
    "path": "src/MicroOcpp/Operations/ClearChargingProfile.cpp",
    "chars": 2714,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Operations/ClearCha"
  },
  {
    "path": "src/MicroOcpp/Operations/ClearChargingProfile.h",
    "chars": 703,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CLEARCHARGINGPROFILE_H\n#defi"
  },
  {
    "path": "src/MicroOcpp/Operations/CustomOperation.cpp",
    "chars": 2683,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Operations/CustomOp"
  },
  {
    "path": "src/MicroOcpp/Operations/CustomOperation.h",
    "chars": 2257,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_CUSTOMOPERATION_H\n#define MO"
  },
  {
    "path": "src/MicroOcpp/Operations/DataTransfer.cpp",
    "chars": 1430,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Operations/DataTran"
  },
  {
    "path": "src/MicroOcpp/Operations/DataTransfer.h",
    "chars": 690,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_DATATRANSFER_H\n#define MO_DA"
  },
  {
    "path": "src/MicroOcpp/Operations/DeleteCertificate.cpp",
    "chars": 3057,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Operations/DeleteCe"
  },
  {
    "path": "src/MicroOcpp/Operations/DeleteCertificate.h",
    "chars": 894,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_DELETECERTIFICATE_H\n#define "
  },
  {
    "path": "src/MicroOcpp/Operations/DiagnosticsStatusNotification.cpp",
    "chars": 1429,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Operations/Diagnost"
  },
  {
    "path": "src/MicroOcpp/Operations/DiagnosticsStatusNotification.h",
    "chars": 844,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Core/Operation.h>\n#"
  },
  {
    "path": "src/MicroOcpp/Operations/FirmwareStatusNotification.cpp",
    "chars": 1699,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Operations/Firmware"
  },
  {
    "path": "src/MicroOcpp/Operations/FirmwareStatusNotification.h",
    "chars": 824,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Core/Operation.h>\n\n"
  },
  {
    "path": "src/MicroOcpp/Operations/GetBaseReport.cpp",
    "chars": 2242,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Version.h>\n\n#if MO_"
  },
  {
    "path": "src/MicroOcpp/Operations/GetBaseReport.h",
    "chars": 920,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_GETBASEREPORT_H\n#define MO_G"
  },
  {
    "path": "src/MicroOcpp/Operations/GetCompositeSchedule.cpp",
    "chars": 2556,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Operations/GetCompo"
  },
  {
    "path": "src/MicroOcpp/Operations/GetCompositeSchedule.h",
    "chars": 1010,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_GETCOMPOSITESCHEDULE_H\n#defi"
  },
  {
    "path": "src/MicroOcpp/Operations/GetConfiguration.cpp",
    "chars": 4886,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Operations/GetConfi"
  },
  {
    "path": "src/MicroOcpp/Operations/GetConfiguration.h",
    "chars": 817,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_GETCONFIGURATION_H\n#define M"
  },
  {
    "path": "src/MicroOcpp/Operations/GetDiagnostics.cpp",
    "chars": 2000,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Operations/GetDiagn"
  },
  {
    "path": "src/MicroOcpp/Operations/GetDiagnostics.h",
    "chars": 812,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_GETDIAGNOSTICS_H\n#define MO_"
  },
  {
    "path": "src/MicroOcpp/Operations/GetInstalledCertificateIds.cpp",
    "chars": 5313,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Operations/GetInsta"
  },
  {
    "path": "src/MicroOcpp/Operations/GetInstalledCertificateIds.h",
    "chars": 1052,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_GETINSTALLEDCERTIFICATEIDS_H"
  },
  {
    "path": "src/MicroOcpp/Operations/GetLocalListVersion.cpp",
    "chars": 1228,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Version.h>\n\n#if MO_"
  },
  {
    "path": "src/MicroOcpp/Operations/GetLocalListVersion.h",
    "chars": 690,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_GETLOCALLISTVERSION_H\n#defin"
  },
  {
    "path": "src/MicroOcpp/Operations/GetVariables.cpp",
    "chars": 8542,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#include <MicroOcpp/Version.h>\n\n#if MO_"
  },
  {
    "path": "src/MicroOcpp/Operations/GetVariables.h",
    "chars": 1393,
    "preview": "// matth-x/MicroOcpp\n// Copyright Matthias Akstaller 2019 - 2024\n// MIT License\n\n#ifndef MO_GETVARIABLES_H\n#define MO_GE"
  }
]

// ... and 76 more files (download for full content)

About this extraction

This page contains the full source code of the matth-x/MicroOcpp GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 276 files (2.2 MB), approximately 582.7k tokens, and a symbol index with 2227 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!