diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 05e750d0f..46911d88a 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -2,150 +2,145 @@ name: Continuous Integration (Legacy serial build) on: # Triggers the workflow on push or pull request events but only for the master branch workflow_dispatch: - -jobs: +jobs: ci-check: runs-on: ubuntu-latest steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + submodules: "recursive" + ref: ${{github.event.pull_request.head.ref}} + repository: ${{github.event.pull_request.head.repo.full_name}} - - name: Checkout code - uses: actions/checkout@v2 - with: - submodules: 'recursive' - ref: ${{github.event.pull_request.head.ref}} - repository: ${{github.event.pull_request.head.repo.full_name}} + - name: Install cppcheck + run: | + sudo apt-get install -y cppcheck - - name: Install cppcheck - run: | - sudo apt-get install -y cppcheck + - name: Setup Python + uses: actions/setup-python@v2 + with: + python-version: 3.x - - name: Setup Python - uses: actions/setup-python@v2 - with: - python-version: 3.x + - name: Cache python libs + uses: actions/cache@v1 + id: cache-pip # needed in if test + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip - - name: Cache python libs - uses: actions/cache@v1 - id: cache-pip # needed in if test - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip - - - name: Upgrade python tools and install platformio - run: | - python -m pip install --upgrade pip - pip install -U platformio - - - name: Upgrade platformio - run: | - pio upgrade - - - name: Check everything - run: bin/check-all.sh + - name: Upgrade python tools and install platformio + run: | + python -m pip install --upgrade pip + pip install -U platformio + - name: Upgrade platformio + run: | + pio upgrade + - name: Check everything + run: bin/check-all.sh ci-build: runs-on: ubuntu-latest steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + submodules: "recursive" + ref: ${{github.event.pull_request.head.ref}} + repository: ${{github.event.pull_request.head.repo.full_name}} - - name: Checkout code - uses: actions/checkout@v2 - with: - submodules: 'recursive' - ref: ${{github.event.pull_request.head.ref}} - repository: ${{github.event.pull_request.head.repo.full_name}} + - name: Setup Python + uses: actions/setup-python@v2 + with: + python-version: 3.x - - name: Setup Python - uses: actions/setup-python@v2 - with: - python-version: 3.x + - name: Cache python libs + uses: actions/cache@v1 + id: cache-pip # needed in if test + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip - - name: Cache python libs - uses: actions/cache@v1 - id: cache-pip # needed in if test - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip + - name: Upgrade python tools + # We actually want to run this every time + # if: steps.cache-pip.outputs.cache-hit != 'true' + run: | + python -m pip install --upgrade pip + pip install -U platformio meshtastic adafruit-nrfutil - - name: Upgrade python tools - # We actually want to run this every time - # if: steps.cache-pip.outputs.cache-hit != 'true' - run: | - python -m pip install --upgrade pip - pip install -U platformio meshtastic adafruit-nrfutil + # - name: Cache platformio + # uses: actions/cache@v1 + # id: cache-platformio # needed in if test + # with: + # path: ~/.platformio + # key: ${{ runner.os }}-platformio - # - name: Cache platformio - # uses: actions/cache@v1 - # id: cache-platformio # needed in if test - # with: - # path: ~/.platformio - # key: ${{ runner.os }}-platformio + - name: Upgrade platformio + run: | + pio upgrade - - name: Upgrade platformio - run: | - pio upgrade + - name: Pull web ui + uses: dsaltares/fetch-gh-release-asset@master + with: + repo: "meshtastic/meshtastic-web" + file: "build.tar" + target: "build.tar" + token: ${{ secrets.GITHUB_TOKEN }} - - name: Pull web ui - uses: dsaltares/fetch-gh-release-asset@master - with: - repo: "meshtastic/meshtastic-web" - file: "build.tar" - target: "build.tar" - token: ${{ secrets.GITHUB_TOKEN }} + - name: Unpack web ui + run: | + tar -xf build.tar -C data/static + rm build.tar - - name: Unpack web ui - run: | - tar -xf build.tar -C data/static - rm build.tar + # We now run integration test before other build steps (to quickly see runtime failures) + - name: Build for native + run: platformio run -e native + - name: Integration test + run: | + .pio/build/native/program & + sleep 20 # 5 seconds was not enough + echo "Simulator started, launching python test..." + python3 -c 'from meshtastic.test import testSimulator; testSimulator()' - # We now run integration test before other build steps (to quickly see runtime failures) - - name: Build for native - run: platformio run -e native - - name: Integration test - run: | - .pio/build/native/program & - sleep 20 # 5 seconds was not enough - echo "Simulator started, launching python test..." - python3 -c 'from meshtastic.test import testSimulator; testSimulator()' + - name: Cat bin/build-all.sh + run: | + cat bin/build-all.sh - - name: Cat bin/build-all.sh - run: | - cat bin/build-all.sh + - name: Build everything + run: bin/build-all.sh - - name: Build everything - run: bin/build-all.sh + - name: Get release version string + run: echo "::set-output name=version::$(./bin/buildinfo.py long)" + id: version - - name: Get release version string - run: echo "::set-output name=version::$(./bin/buildinfo.py long)" - id: version + - name: Store binaries as an artifact + uses: actions/upload-artifact@v2 + with: + name: firmware-${{ steps.version.outputs.version }}.zip + path: release/archive/firmware-${{ steps.version.outputs.version }}.zip + retention-days: 90 - - name: Store binaries as an artifact - uses: actions/upload-artifact@v2 - with: - name: firmware-${{ steps.version.outputs.version }}.zip - path: release/archive/firmware-${{ steps.version.outputs.version }}.zip - retention-days: 90 + - name: Store debugging elf files as an artifact + uses: actions/upload-artifact@v2 + with: + name: debug-elfs + path: release/archive/elfs-*.zip + retention-days: 7 - - name: Store debugging elf files as an artifact - uses: actions/upload-artifact@v2 - with: - name: debug-elfs - path: release/archive/elfs-*.zip - retention-days: 7 + - name: Download firmware.zip + uses: actions/download-artifact@master + with: + name: firmware-${{ steps.version.outputs.version }}.zip + path: ./ - - name: Download firmware.zip - uses: actions/download-artifact@master - with: - name: firmware-${{ steps.version.outputs.version }}.zip - path: ./ - - - name: Pull request artifacts - if: ${{ github.event_name == 'pull_request_target' || github.event_name == 'pull_request' }} - uses: gavv/pull-request-artifacts@v1.0.0 - with: - commit: ${{ (github.event.pull_request_target || github.event.pull_request).head.sha }} - repo-token: ${{ secrets.GITHUB_TOKEN }} - artifacts-branch: artifacts - artifacts: ./firmware-${{ steps.version.outputs.version }}.zip + - name: Pull request artifacts + if: ${{ github.event_name == 'pull_request_target' || github.event_name == 'pull_request' }} + uses: gavv/pull-request-artifacts@v1.0.0 + with: + commit: ${{ (github.event.pull_request_target || github.event.pull_request).head.sha }} + repo-token: ${{ secrets.GITHUB_TOKEN }} + artifacts-branch: artifacts + artifacts: ./firmware-${{ steps.version.outputs.version }}.zip diff --git a/.github/workflows/main_matrix.yml b/.github/workflows/main_matrix.yml index 28a3ba5ba..2f2e7b25c 100644 --- a/.github/workflows/main_matrix.yml +++ b/.github/workflows/main_matrix.yml @@ -2,23 +2,22 @@ name: Continuous Integration on: # # Triggers the workflow on push but only for the master branch push: - branches: [ master ] + branches: [master] paths-ignore: - - '**.md' - - '**.yml' - - 'version.properties' - + - "**.md" + - "**.yml" + - "version.properties" + # Note: This is different from "pull_request". Need to specify ref when doing checkouts. pull_request_target: - branches: [ master ] + branches: [master] paths-ignore: - - '**.md' - - '**.yml' + - "**.md" + - "**.yml" workflow_dispatch: jobs: - check: strategy: fail-fast: false @@ -39,44 +38,43 @@ jobs: - board: rak4631_19003 - board: rak4631_5005_eink - board: t-echo - + runs-on: ubuntu-latest steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + submodules: "recursive" + ref: ${{github.event.pull_request.head.ref}} + repository: ${{github.event.pull_request.head.repo.full_name}} - - name: Checkout code - uses: actions/checkout@v2 - with: - submodules: 'recursive' - ref: ${{github.event.pull_request.head.ref}} - repository: ${{github.event.pull_request.head.repo.full_name}} + - name: Install cppcheck + run: | + sudo apt-get install -y cppcheck - - name: Install cppcheck - run: | - sudo apt-get install -y cppcheck + - name: Setup Python + uses: actions/setup-python@v2 + with: + python-version: 3.x - - name: Setup Python - uses: actions/setup-python@v2 - with: - python-version: 3.x + - name: Cache python libs + uses: actions/cache@v1 + id: cache-pip # needed in if test + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip - - name: Cache python libs - uses: actions/cache@v1 - id: cache-pip # needed in if test - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip + - name: Upgrade python tools and install platformio + run: | + python -m pip install --upgrade pip + pip install -U platformio - - name: Upgrade python tools and install platformio - run: | - python -m pip install --upgrade pip - pip install -U platformio - - - name: Upgrade platformio - run: | - pio upgrade + - name: Upgrade platformio + run: | + pio upgrade - - name: Check ${{ matrix.board }} - run: bin/check-all.sh ${{ matrix.board }} + - name: Check ${{ matrix.board }} + run: bin/check-all.sh ${{ matrix.board }} build-esp32: strategy: @@ -94,190 +92,187 @@ jobs: - board: heltec-v2.1 - board: tbeam0.7 - board: meshtastic-diy-v1 - + runs-on: ubuntu-latest steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + submodules: "recursive" + ref: ${{github.event.pull_request.head.ref}} + repository: ${{github.event.pull_request.head.repo.full_name}} - - name: Checkout code - uses: actions/checkout@v2 - with: - submodules: 'recursive' - ref: ${{github.event.pull_request.head.ref}} - repository: ${{github.event.pull_request.head.repo.full_name}} + - name: Setup Python + uses: actions/setup-python@v2 + with: + python-version: 3.x - - name: Setup Python - uses: actions/setup-python@v2 - with: - python-version: 3.x + - name: Cache python libs + uses: actions/cache@v1 + id: cache-pip # needed in if test + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip - - name: Cache python libs - uses: actions/cache@v1 - id: cache-pip # needed in if test - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip + - name: Upgrade python tools + run: | + python -m pip install --upgrade pip + pip install -U platformio meshtastic adafruit-nrfutil littlefs-python - - name: Upgrade python tools - run: | - python -m pip install --upgrade pip - pip install -U platformio meshtastic adafruit-nrfutil littlefs-python + - name: Upgrade platformio + run: | + pio upgrade - - name: Upgrade platformio - run: | - pio upgrade + - name: Pull web ui + uses: dsaltares/fetch-gh-release-asset@master + with: + repo: "meshtastic/meshtastic-web" + file: "build.tar" + target: "build.tar" + token: ${{ secrets.GITHUB_TOKEN }} - - name: Pull web ui - uses: dsaltares/fetch-gh-release-asset@master - with: - repo: "meshtastic/meshtastic-web" - file: "build.tar" - target: "build.tar" - token: ${{ secrets.GITHUB_TOKEN }} + - name: Unpack web ui + run: | + tar -xf build.tar -C data/static + rm build.tar - - name: Unpack web ui - run: | - tar -xf build.tar -C data/static - rm build.tar + - name: Build ESP32 + run: bin/build-esp32.sh ${{ matrix.board }} - - name: Build ESP32 - run: bin/build-esp32.sh ${{ matrix.board }} + - name: Get release version string + run: echo "::set-output name=version::$(./bin/buildinfo.py long)" + id: version - - name: Get release version string - run: echo "::set-output name=version::$(./bin/buildinfo.py long)" - id: version - - - name: Store binaries as an artifact - uses: actions/upload-artifact@v2 - with: - name: firmware-${{ matrix.board }}-${{ steps.version.outputs.version }}.zip - path: | - release/*.bin - release/*.elf - retention-days: 90 + - name: Store binaries as an artifact + uses: actions/upload-artifact@v2 + with: + name: firmware-${{ matrix.board }}-${{ steps.version.outputs.version }}.zip + path: | + release/*.bin + release/*.elf + retention-days: 90 build-nrf52: strategy: fail-fast: false max-parallel: 2 matrix: - include: + include: - board: rak4631_5005 - board: rak4631_19003 - board: rak4631_5005_eink - board: t-echo - + runs-on: ubuntu-latest steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + submodules: "recursive" + ref: ${{github.event.pull_request.head.ref}} + repository: ${{github.event.pull_request.head.repo.full_name}} - - name: Checkout code - uses: actions/checkout@v2 - with: - submodules: 'recursive' - ref: ${{github.event.pull_request.head.ref}} - repository: ${{github.event.pull_request.head.repo.full_name}} + - name: Setup Python + uses: actions/setup-python@v2 + with: + python-version: 3.x - - name: Setup Python - uses: actions/setup-python@v2 - with: - python-version: 3.x + - name: Cache python libs + uses: actions/cache@v1 + id: cache-pip # needed in if test + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip - - name: Cache python libs - uses: actions/cache@v1 - id: cache-pip # needed in if test - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip + - name: Upgrade python tools + run: | + python -m pip install --upgrade pip + pip install -U platformio meshtastic adafruit-nrfutil - - name: Upgrade python tools - run: | - python -m pip install --upgrade pip - pip install -U platformio meshtastic adafruit-nrfutil + - name: Upgrade platformio + run: | + pio upgrade - - name: Upgrade platformio - run: | - pio upgrade + - name: Build NRF52 + run: bin/build-nrf52.sh ${{ matrix.board }} - - name: Build NRF52 - run: bin/build-nrf52.sh ${{ matrix.board }} + - name: Get release version string + run: echo "::set-output name=version::$(./bin/buildinfo.py long)" + id: version - - name: Get release version string - run: echo "::set-output name=version::$(./bin/buildinfo.py long)" - id: version - - - name: Store binaries as an artifact - uses: actions/upload-artifact@v2 - with: - name: firmware-${{ matrix.board }}-${{ steps.version.outputs.version }}.zip - path: | - release/*.uf2 - release/*.elf - retention-days: 90 + - name: Store binaries as an artifact + uses: actions/upload-artifact@v2 + with: + name: firmware-${{ matrix.board }}-${{ steps.version.outputs.version }}.zip + path: | + release/*.uf2 + release/*.elf + retention-days: 90 build-native: runs-on: ubuntu-latest steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + submodules: "recursive" + ref: ${{github.event.pull_request.head.ref}} + repository: ${{github.event.pull_request.head.repo.full_name}} - - name: Checkout code - uses: actions/checkout@v2 - with: - submodules: 'recursive' - ref: ${{github.event.pull_request.head.ref}} - repository: ${{github.event.pull_request.head.repo.full_name}} + - name: Setup Python + uses: actions/setup-python@v2 + with: + python-version: 3.x - - name: Setup Python - uses: actions/setup-python@v2 - with: - python-version: 3.x + - name: Cache python libs + uses: actions/cache@v1 + id: cache-pip # needed in if test + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip - - name: Cache python libs - uses: actions/cache@v1 - id: cache-pip # needed in if test - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip + - name: Upgrade python tools + run: | + python -m pip install --upgrade pip + pip install -U platformio meshtastic adafruit-nrfutil - - name: Upgrade python tools - run: | - python -m pip install --upgrade pip - pip install -U platformio meshtastic adafruit-nrfutil + - name: Upgrade platformio + run: | + pio upgrade - - name: Upgrade platformio - run: | - pio upgrade + # We now run integration test before other build steps (to quickly see runtime failures) + - name: Build for native + run: platformio run -e native + - name: Integration test + run: | + .pio/build/native/program & + sleep 20 # 5 seconds was not enough + echo "Simulator started, launching python test..." + python3 -c 'from meshtastic.test import testSimulator; testSimulator()' - # We now run integration test before other build steps (to quickly see runtime failures) - - name: Build for native - run: platformio run -e native - - name: Integration test - run: | - .pio/build/native/program & - sleep 20 # 5 seconds was not enough - echo "Simulator started, launching python test..." - python3 -c 'from meshtastic.test import testSimulator; testSimulator()' + - name: Build Native + run: bin/build-native.sh - - name: Build Native - run: bin/build-native.sh + - name: Get release version string + run: echo "::set-output name=version::$(./bin/buildinfo.py long)" + id: version - - name: Get release version string - run: echo "::set-output name=version::$(./bin/buildinfo.py long)" - id: version + - name: Store binaries as an artifact + uses: actions/upload-artifact@v2 + with: + name: firmware-native-${{ steps.version.outputs.version }}.zip + path: | + release/meshtasticd_linux_amd64 + release/device-*.sh + release/device-*.bat + retention-days: 90 - - name: Store binaries as an artifact - uses: actions/upload-artifact@v2 - with: - name: firmware-native-${{ steps.version.outputs.version }}.zip - path: | - release/meshtasticd_linux_amd64 - release/device-*.sh - release/device-*.bat - retention-days: 90 - after-checks: runs-on: ubuntu-latest needs: [check] steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} @@ -286,9 +281,8 @@ jobs: runs-on: ubuntu-latest needs: [build-esp32, build-nrf52, build-native] steps: - - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: ${{github.event.pull_request.head.ref}} repository: ${{github.event.pull_request.head.repo.full_name}} @@ -308,7 +302,7 @@ jobs: uses: actions/upload-artifact@v2 with: name: firmware-${{ steps.version.outputs.version }} - path: | + path: | ./*.bin ./*.uf2 ./meshtasticd_linux_amd64 @@ -322,7 +316,7 @@ jobs: path: ./output # For diagnostics - - name: Show artifacts + - name: Show artifacts run: ls -lR - name: Zip firmware diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index da7dfcf18..096bbd1e2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -9,85 +9,84 @@ on: branches: - master paths: - - 'version.properties' + - "version.properties" jobs: release-build: runs-on: ubuntu-latest steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + submodules: "recursive" - - name: Checkout code - uses: actions/checkout@v2 - with: - submodules: 'recursive' + - name: Setup Python + uses: actions/setup-python@v2 + with: + python-version: 3.x - - name: Setup Python - uses: actions/setup-python@v2 - with: - python-version: 3.x - - # Will be available in steps.version.outputs.version - - name: Get release version string - run: echo "::set-output name=version::$(./bin/buildinfo.py long)" - id: version - # Note: we don't use caches on release builds because we don't want to accidentally not have a virgin build machine + # Will be available in steps.version.outputs.version + - name: Get release version string + run: echo "::set-output name=version::$(./bin/buildinfo.py long)" + id: version + # Note: we don't use caches on release builds because we don't want to accidentally not have a virgin build machine - - name: Upgrade python tools - # We actually want to run this every time - # if: steps.cache-pip.outputs.cache-hit != 'true' - run: | - python -m pip install --upgrade pip - pip install -U platformio meshtastic adafruit-nrfutil littlefs-python + - name: Upgrade python tools + # We actually want to run this every time + # if: steps.cache-pip.outputs.cache-hit != 'true' + run: | + python -m pip install --upgrade pip + pip install -U platformio meshtastic adafruit-nrfutil littlefs-python - - name: Upgrade platformio - run: | - pio upgrade + - name: Upgrade platformio + run: | + pio upgrade - - name: Pull web ui - uses: dsaltares/fetch-gh-release-asset@master - with: - repo: "meshtastic/meshtastic-web" - file: "build.tar" - target: "build.tar" - token: ${{ secrets.GITHUB_TOKEN }} + - name: Pull web ui + uses: dsaltares/fetch-gh-release-asset@master + with: + repo: "meshtastic/meshtastic-web" + file: "build.tar" + target: "build.tar" + token: ${{ secrets.GITHUB_TOKEN }} - - name: Unpack web ui - run: | - tar -xf build.tar -C data/static - rm build.tar + - name: Unpack web ui + run: | + tar -xf build.tar -C data/static + rm build.tar - - name: Build everything - run: bin/build-all.sh + - name: Build everything + run: bin/build-all.sh - - name: Create release - uses: actions/create-release@v1 - id: create_release - with: - draft: true - prerelease: true - release_name: ${{ steps.version.outputs.version }} alpha - tag_name: v${{ steps.version.outputs.version }} - body: | - Autogenerated by github action, developer should edit as required before publishing... - env: - GITHUB_TOKEN: ${{ github.token }} + - name: Create release + uses: actions/create-release@v1 + id: create_release + with: + draft: true + prerelease: true + release_name: ${{ steps.version.outputs.version }} alpha + tag_name: v${{ steps.version.outputs.version }} + body: | + Autogenerated by github action, developer should edit as required before publishing... + env: + GITHUB_TOKEN: ${{ github.token }} - - name: Add bins to release - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ github.token }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: release/archive/firmware-${{ steps.version.outputs.version }}.zip - asset_name: firmware-${{ steps.version.outputs.version }}.zip - asset_content_type: application/zip + - name: Add bins to release + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ github.token }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: release/archive/firmware-${{ steps.version.outputs.version }}.zip + asset_name: firmware-${{ steps.version.outputs.version }}.zip + asset_content_type: application/zip - - name: Add debug elfs to release - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ github.token }} - with: - upload_url: ${{ steps.create_release.outputs.upload_url }} - asset_path: release/archive/elfs-${{ steps.version.outputs.version }}.zip - asset_name: debug-elfs-${{ steps.version.outputs.version }}.zip - asset_content_type: application/zip + - name: Add debug elfs to release + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ github.token }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: release/archive/elfs-${{ steps.version.outputs.version }}.zip + asset_name: debug-elfs-${{ steps.version.outputs.version }}.zip + asset_content_type: application/zip diff --git a/.github/workflows/update_protobufs.yml b/.github/workflows/update_protobufs.yml index 8debfcd10..514304e65 100644 --- a/.github/workflows/update_protobufs.yml +++ b/.github/workflows/update_protobufs.yml @@ -7,24 +7,24 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: submodules: true - name: Update submodule run: | git submodule update --remote proto - + - name: Download nanopb run: | wget https://jpa.kapsi.fi/nanopb/download/nanopb-0.4.4-linux-x86.tar.gz tar xvzf nanopb-0.4.4-linux-x86.tar.gz mv nanopb-0.4.4-linux-x86 nanopb-0.4.4 - + - name: Re-generate protocol buffers run: | - ./bin/regen-protos.sh - + ./bin/regen-protos.sh + - name: Create pull request uses: peter-evans/create-pull-request@v3 with: diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index ae9c20b82..000000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,50 +0,0 @@ -image: python:latest - -variables: - # make sure GitLab check out submodules - GIT_SUBMODULE_STRATEGY: recursive - -stages: - - buildall - - upload - -build: - stage: buildall - - before_script: - # we need zip later for packaging - - "apt update;apt -y install zip" - - "pip install -U platformio" - - script: - # clean up residues from previous run - - rm -rf release - - bin/build-all.sh - - # This is for my local environment, if your runners are tagged differently, modify or remove - tags: - - dockerized - - # The files which are to be made available in GitLab - artifacts: - paths: - - release/archive/firmware*.zip - - -upload: - image: curlimages/curl:latest - - stage: upload - - script: - - | - PACKAGE_REGISTRY_URL="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}/master" - cd release/archive - for f in *.zip; do - curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file ${f} ${PACKAGE_REGISTRY_URL}/${f} - done - echo 'Package uploaded!' - - # This is for my local environment, if your runners are tagged differently, modify or remove - tags: - - dockerized diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 666369c99..000000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -# !!! WARNING !!! AUTO-GENERATED FILE, PLEASE DO NOT MODIFY IT AND USE -# https://docs.platformio.org/page/projectconf/section_env_build.html#build-flags -# -# If you need to override existing CMake configuration or add extra, -# please create `CMakeListsUser.txt` in the root of project. -# The `CMakeListsUser.txt` will not be overwritten by PlatformIO. - -cmake_minimum_required(VERSION 3.13) -set(CMAKE_SYSTEM_NAME Generic) -set(CMAKE_C_COMPILER_WORKS 1) -set(CMAKE_CXX_COMPILER_WORKS 1) - -project("meshtastic-esp32" C CXX) - -include(CMakeListsPrivate.txt) - -if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/CMakeListsUser.txt) -include(CMakeListsUser.txt) -endif() - -include_directories("$ENV{HOME}/.platformio/packages/framework-portduino") -include_directories("/usr/include") - -add_custom_target( - Production ALL - COMMAND platformio -c clion run "$<$>:-e${CMAKE_BUILD_TYPE}>" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} -) - -add_custom_target( - Debug ALL - COMMAND platformio -c clion run --target debug "$<$>:-e${CMAKE_BUILD_TYPE}>" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} -) - -add_executable(Z_DUMMY_TARGET ${SRC_LIST}) diff --git a/CMakeListsPrivate.txt b/CMakeListsPrivate.txt deleted file mode 100644 index 49aebfa15..000000000 --- a/CMakeListsPrivate.txt +++ /dev/null @@ -1,2041 +0,0 @@ -# !!! WARNING !!! AUTO-GENERATED FILE, PLEASE DO NOT MODIFY IT AND USE -# https://docs.platformio.org/page/projectconf/section_env_build.html#build-flags -# -# If you need to override existing CMake configuration or add extra, -# please create `CMakeListsUser.txt` in the root of project. -# The `CMakeListsUser.txt` will not be overwritten by PlatformIO. - - - -set(CMAKE_CONFIGURATION_TYPES "tbeam;tbeam0.7;heltec;tlora-v1;tlora-v2;tlora-v2-1-1.6;cubecellplus;nrf52840dk;nrf52840dk-geeksville;feather_nrf52832;rak815;ppr;ppr1;eink;eink0.1;lora-relay-v1;lora-relay-v2;native;" CACHE STRING "Build Types reflect PlatformIO Environments" FORCE) - - -SET(CMAKE_C_COMPILER "/usr/bin/gcc") -SET(CMAKE_CXX_COMPILER "/usr/bin/g++") -SET(CMAKE_CXX_FLAGS "-Wno-missing-field-initializers -Wno-format -Os -O0 -w -Wall -ggdb -DAPP_VERSION=1.2.10") -SET(CMAKE_C_FLAGS "-Wno-missing-field-initializers -Wno-format -Os -O0 -w -Wall -ggdb -DAPP_VERSION=1.2.10") - - -if (CMAKE_BUILD_TYPE MATCHES "native") - add_definitions(-D'PLATFORMIO=50100') - add_definitions(-D'FIXMEFLAG') - add_definitions(-D'HW_VERSION_') - add_definitions(-D'HW_VERSION=') - add_definitions(-D'USE_THREAD_NAMES') - add_definitions(-D'TINYGPS_OPTION_NO_CUSTOM_FIELDS') - add_definitions(-D'ARDUINO=4403') - add_definitions(-D'PORTDUINO') - - include_directories("${CMAKE_CURRENT_LIST_DIR}/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-portduino/libraries/WiFi/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/native/Crypto") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/native/Thread") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/native/AXP202X_Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/native/TinyGPSPlus/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/native/RadioLib/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/native/SparkFun Ublox Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/native/arduino-fsm") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/native/CRC32/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/native/OneButton/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/native/ESP8266_SSD1306/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-portduino/libraries/SPI/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-portduino/libraries/Wire/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/mesh") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/gps") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-portduino/cores/portduino") - include_directories("$ENV{HOME}/.platformio/packages/framework-portduino/cores/portduino/FS") - include_directories("$ENV{HOME}/.platformio/packages/framework-portduino/ArduinoCore-API/api") - include_directories("$ENV{HOME}/.platformio/packages/framework-portduino/variants/native") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/BluetoothOTA") - include_directories("$ENV{HOME}/.platformio/packages/tool-unity") - - FILE(GLOB_RECURSE EXTRA_LIB_SOURCES - ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/native/*.* - ) -endif() - -if (CMAKE_BUILD_TYPE MATCHES "tbeam") - add_definitions(-D'PLATFORMIO=50100') - add_definitions(-D'ARDUINO_T_Beam') - add_definitions(-D'BOARD_HAS_PSRAM') - add_definitions(-D'HW_VERSION_') - add_definitions(-D'HW_VERSION=') - add_definitions(-D'USE_THREAD_NAMES') - add_definitions(-D'TINYGPS_OPTION_NO_CUSTOM_FIELDS') - add_definitions(-D'LOG_LOCAL_LEVEL=ESP_LOG_DEBUG') - add_definitions(-D'CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG') - add_definitions(-D'AXP_DEBUG_PORT=Serial') - add_definitions(-D'TBEAM_V10') - add_definitions(-D'ESP32') - add_definitions(-D'ESP_PLATFORM') - add_definitions(-D'F_CPU=240000000L') - add_definitions(-D'HAVE_CONFIG_H') - add_definitions(-D'MBEDTLS_CONFIG_FILE=\"mbedtls/esp_config.h\"') - add_definitions(-D'ARDUINO=10805') - add_definitions(-D'ARDUINO_ARCH_ESP32') - add_definitions(-D'ARDUINO_VARIANT=\"t-beam\"') - add_definitions(-D'ARDUINO_BOARD=\"TTGO T-Beam\"') - - include_directories("${CMAKE_CURRENT_LIST_DIR}/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/DNSServer/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/BLE/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Update/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SPIFFS/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/FS/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/DHT sensor library") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/Adafruit Unified Sensor") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/esp32_https_server/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/Thread") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/AXP202X_Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/TinyGPSPlus/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/RadioLib/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/SparkFun Ublox Arduino Library@src-58e4c8c3342495b31ae9596afafd3e00/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/arduino-fsm") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/CRC32/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/OneButton@src-58e84a61e1135cf59834c5fb268069d2/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/ESP8266_SSD1306/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/mesh") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/gps") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/esp32") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/esp32-mfix-esp32-psram-cache-issue") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/app_trace") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/app_update") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/asio") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/bootloader_support") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/bt") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/coap") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/console") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/driver") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/efuse") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp-tls") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp32") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_adc_cal") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_event") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_http_client") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_http_server") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_https_ota") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_https_server") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_ringbuf") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/espcoredump") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/ethernet") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/expat") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/fatfs") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/freemodbus") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/freertos") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/heap") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/idf_test") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/jsmn") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/json") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/libsodium") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/log") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/lwip") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/mbedtls") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/mdns") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/micro-ecc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/mqtt") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/newlib") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/nghttp") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/nimble") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/nvs_flash") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/openssl") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/protobuf-c") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/protocomm") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/pthread") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/sdmmc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/smartconfig_ack") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/soc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/spi_flash") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/spiffs") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/tcp_transport") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/tcpip_adapter") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/ulp") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/unity") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/vfs") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/wear_levelling") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/wifi_provisioning") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/wpa_supplicant") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/xtensa-debug-module") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp-face") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp32-camera") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/fb_gfx") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/cores/esp32") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/variants/t-beam") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/BluetoothOTA") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/ESP8266_SSD1306@src-4ab3ad976e5f12b4a61f839d23a3c46d/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/OneButton/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/RadioLib@src-eaad48fc571e663359162082157944f2/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/SparkFun Ublox Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/Thread@src-a2b7660c81ffe1635912fa2f065bc3ce") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/TinyGPSPlus@src-2765db9a05cb947ced769bf56fedd1f5/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/TinyGPSPlus@src-addcdb46757d61b29d61d7a3c8d2c6aa/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/arduino-fsm@src-47e2e1a833a6aba34dc6f0811d801e49") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/arduino-fsm@src-4bf5152e2f279002470ccf60d567d9e6") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/ArduinoOTA/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/AzureIoT/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/BluetoothSerial/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/EEPROM/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/ESP32/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/FFat/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdate/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/NetBIOS/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SD/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SD_MMC/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/xtensa-esp32-elf/include/c++/5.2.0") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/xtensa-esp32-elf/include/c++/5.2.0/xtensa-esp32-elf") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/lib/gcc/xtensa-esp32-elf/5.2.0/include") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/lib/gcc/xtensa-esp32-elf/5.2.0/include-fixed") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/xtensa-esp32-elf/include") - include_directories("$ENV{HOME}/.platformio/packages/tool-unity") - - FILE(GLOB_RECURSE EXTRA_LIB_SOURCES - ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam/*.* - ) -endif() -if (CMAKE_BUILD_TYPE MATCHES "tbeam0.7") - add_definitions(-D'PLATFORMIO=50100') - add_definitions(-D'ARDUINO_T_Beam') - add_definitions(-D'BOARD_HAS_PSRAM') - add_definitions(-D'HW_VERSION_') - add_definitions(-D'HW_VERSION=') - add_definitions(-D'USE_THREAD_NAMES') - add_definitions(-D'TINYGPS_OPTION_NO_CUSTOM_FIELDS') - add_definitions(-D'LOG_LOCAL_LEVEL=ESP_LOG_DEBUG') - add_definitions(-D'CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG') - add_definitions(-D'AXP_DEBUG_PORT=Serial') - add_definitions(-D'TBEAM_V07') - add_definitions(-D'ESP32') - add_definitions(-D'ESP_PLATFORM') - add_definitions(-D'F_CPU=240000000L') - add_definitions(-D'HAVE_CONFIG_H') - add_definitions(-D'MBEDTLS_CONFIG_FILE=\"mbedtls/esp_config.h\"') - add_definitions(-D'ARDUINO=10805') - add_definitions(-D'ARDUINO_ARCH_ESP32') - add_definitions(-D'ARDUINO_VARIANT=\"t-beam\"') - add_definitions(-D'ARDUINO_BOARD=\"TTGO T-Beam\"') - - include_directories("${CMAKE_CURRENT_LIST_DIR}/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/DNSServer/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/BLE/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Update/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SPIFFS/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/FS/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/DHT sensor library") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/Adafruit Unified Sensor") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/esp32_https_server/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/Thread") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/AXP202X_Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/TinyGPSPlus/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/RadioLib/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/SparkFun Ublox Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/arduino-fsm") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/CRC32/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/OneButton/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/ESP8266_SSD1306/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/mesh") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/gps") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/esp32") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/esp32-mfix-esp32-psram-cache-issue") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/app_trace") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/app_update") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/asio") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/bootloader_support") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/bt") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/coap") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/console") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/driver") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/efuse") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp-tls") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp32") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_adc_cal") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_event") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_http_client") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_http_server") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_https_ota") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_https_server") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_ringbuf") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/espcoredump") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/ethernet") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/expat") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/fatfs") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/freemodbus") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/freertos") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/heap") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/idf_test") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/jsmn") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/json") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/libsodium") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/log") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/lwip") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/mbedtls") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/mdns") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/micro-ecc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/mqtt") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/newlib") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/nghttp") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/nimble") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/nvs_flash") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/openssl") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/protobuf-c") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/protocomm") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/pthread") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/sdmmc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/smartconfig_ack") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/soc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/spi_flash") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/spiffs") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/tcp_transport") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/tcpip_adapter") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/ulp") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/unity") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/vfs") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/wear_levelling") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/wifi_provisioning") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/wpa_supplicant") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/xtensa-debug-module") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp-face") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp32-camera") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/fb_gfx") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/cores/esp32") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/variants/t-beam") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/BluetoothOTA") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/AXP202X_Library@src-445982841d155f061f37b636975a7965/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/AXP202X_Library@src-4c7639995fa9a549e4df71b1e6ec1726/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/ESP8266_SSD1306@src-4ab3ad976e5f12b4a61f839d23a3c46d/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/OneButton@0.0.0-alpha+sha.eb583d713a/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/RadioLib@src-04c34ef49d4ad9f955bfeccb187cbfb4/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/RadioLib@src-73ec3f00ee50ec53c3e35f8f57cb805b/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/RadioLib@src-7defea5cd18ca13be529349922fbc9bd/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/RadioLib@src-eaad48fc571e663359162082157944f2/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/SparkFun Ublox Arduino Library@src-8ce11c31a386d7fec113d205dac8fee5/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/SparkFun Ublox Arduino Library@src-c2b16aac179b750f0dd483f91954d27c/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/Thread@src-a2b7660c81ffe1635912fa2f065bc3ce") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/TinyGPSPlus@src-2765db9a05cb947ced769bf56fedd1f5/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/TinyGPSPlus@src-addcdb46757d61b29d61d7a3c8d2c6aa/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/arduino-fsm@src-47e2e1a833a6aba34dc6f0811d801e49") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/arduino-fsm@src-4bf5152e2f279002470ccf60d567d9e6") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/ArduinoOTA/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/AzureIoT/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/BluetoothSerial/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/EEPROM/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/ESP32/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/FFat/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdate/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/NetBIOS/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SD/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SD_MMC/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/xtensa-esp32-elf/include/c++/5.2.0") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/xtensa-esp32-elf/include/c++/5.2.0/xtensa-esp32-elf") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/lib/gcc/xtensa-esp32-elf/5.2.0/include") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/lib/gcc/xtensa-esp32-elf/5.2.0/include-fixed") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/xtensa-esp32-elf/include") - include_directories("$ENV{HOME}/.platformio/packages/tool-unity") - - FILE(GLOB_RECURSE EXTRA_LIB_SOURCES - ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tbeam0.7/*.* - ) -endif() -if (CMAKE_BUILD_TYPE MATCHES "heltec") - add_definitions(-D'PLATFORMIO=50100') - add_definitions(-D'ARDUINO_HELTEC_WIFI_LORA_32_V2') - add_definitions(-D'HW_VERSION_') - add_definitions(-D'HW_VERSION=') - add_definitions(-D'USE_THREAD_NAMES') - add_definitions(-D'TINYGPS_OPTION_NO_CUSTOM_FIELDS') - add_definitions(-D'LOG_LOCAL_LEVEL=ESP_LOG_DEBUG') - add_definitions(-D'CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG') - add_definitions(-D'AXP_DEBUG_PORT=Serial') - add_definitions(-D'ESP32') - add_definitions(-D'ESP_PLATFORM') - add_definitions(-D'F_CPU=240000000L') - add_definitions(-D'HAVE_CONFIG_H') - add_definitions(-D'MBEDTLS_CONFIG_FILE=\"mbedtls/esp_config.h\"') - add_definitions(-D'ARDUINO=10805') - add_definitions(-D'ARDUINO_ARCH_ESP32') - add_definitions(-D'ARDUINO_VARIANT=\"heltec_wifi_lora_32_V2\"') - add_definitions(-D'ARDUINO_BOARD=\"Heltec WiFi LoRa 32 \(V2\)\"') - - include_directories("${CMAKE_CURRENT_LIST_DIR}/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/DNSServer/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/BLE/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Update/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SPIFFS/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/FS/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/DHT sensor library") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/Adafruit Unified Sensor") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/esp32_https_server/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/Thread") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/AXP202X_Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/TinyGPSPlus/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/RadioLib/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/SparkFun Ublox Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/arduino-fsm") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/CRC32/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/OneButton/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/ESP8266_SSD1306/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/mesh") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/gps") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/esp32") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/esp32-mfix-esp32-psram-cache-issue") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/app_trace") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/app_update") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/asio") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/bootloader_support") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/bt") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/coap") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/console") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/driver") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/efuse") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp-tls") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp32") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_adc_cal") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_event") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_http_client") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_http_server") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_https_ota") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_https_server") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_ringbuf") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/espcoredump") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/ethernet") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/expat") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/fatfs") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/freemodbus") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/freertos") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/heap") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/idf_test") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/jsmn") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/json") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/libsodium") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/log") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/lwip") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/mbedtls") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/mdns") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/micro-ecc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/mqtt") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/newlib") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/nghttp") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/nimble") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/nvs_flash") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/openssl") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/protobuf-c") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/protocomm") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/pthread") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/sdmmc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/smartconfig_ack") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/soc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/spi_flash") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/spiffs") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/tcp_transport") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/tcpip_adapter") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/ulp") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/unity") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/vfs") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/wear_levelling") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/wifi_provisioning") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/wpa_supplicant") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/xtensa-debug-module") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp-face") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp32-camera") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/fb_gfx") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/cores/esp32") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/variants/heltec_wifi_lora_32_V2") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/BluetoothOTA") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/ESP8266_SSD1306@src-4ab3ad976e5f12b4a61f839d23a3c46d/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/OneButton@0.0.0-alpha+sha.eb583d713a/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/RadioLib@src-04c34ef49d4ad9f955bfeccb187cbfb4/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/RadioLib@src-73ec3f00ee50ec53c3e35f8f57cb805b/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/RadioLib@src-7defea5cd18ca13be529349922fbc9bd/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/RadioLib@src-eaad48fc571e663359162082157944f2/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/SparkFun Ublox Arduino Library@src-8ce11c31a386d7fec113d205dac8fee5/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/SparkFun Ublox Arduino Library@src-c2b16aac179b750f0dd483f91954d27c/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/Thread@src-a2b7660c81ffe1635912fa2f065bc3ce") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/TinyGPSPlus@src-2765db9a05cb947ced769bf56fedd1f5/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/TinyGPSPlus@src-addcdb46757d61b29d61d7a3c8d2c6aa/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/arduino-fsm@src-47e2e1a833a6aba34dc6f0811d801e49") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/arduino-fsm@src-4bf5152e2f279002470ccf60d567d9e6") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/ArduinoOTA/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/AzureIoT/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/BluetoothSerial/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/EEPROM/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/ESP32/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/FFat/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdate/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/NetBIOS/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SD/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SD_MMC/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/xtensa-esp32-elf/include/c++/5.2.0") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/xtensa-esp32-elf/include/c++/5.2.0/xtensa-esp32-elf") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/lib/gcc/xtensa-esp32-elf/5.2.0/include") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/lib/gcc/xtensa-esp32-elf/5.2.0/include-fixed") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/xtensa-esp32-elf/include") - include_directories("$ENV{HOME}/.platformio/packages/tool-unity") - - FILE(GLOB_RECURSE EXTRA_LIB_SOURCES - ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/heltec/*.* - ) -endif() -if (CMAKE_BUILD_TYPE MATCHES "tlora-v1") - add_definitions(-D'PLATFORMIO=50100') - add_definitions(-D'ARDUINO_TTGO_LoRa32_V1') - add_definitions(-D'HW_VERSION_') - add_definitions(-D'HW_VERSION=') - add_definitions(-D'USE_THREAD_NAMES') - add_definitions(-D'TINYGPS_OPTION_NO_CUSTOM_FIELDS') - add_definitions(-D'LOG_LOCAL_LEVEL=ESP_LOG_DEBUG') - add_definitions(-D'CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG') - add_definitions(-D'AXP_DEBUG_PORT=Serial') - add_definitions(-D'TLORA_V1') - add_definitions(-D'ESP32') - add_definitions(-D'ESP_PLATFORM') - add_definitions(-D'F_CPU=240000000L') - add_definitions(-D'HAVE_CONFIG_H') - add_definitions(-D'MBEDTLS_CONFIG_FILE=\"mbedtls/esp_config.h\"') - add_definitions(-D'ARDUINO=10805') - add_definitions(-D'ARDUINO_ARCH_ESP32') - add_definitions(-D'ARDUINO_VARIANT=\"ttgo-lora32-v1\"') - add_definitions(-D'ARDUINO_BOARD=\"TTGO LoRa32-OLED V1\"') - - include_directories("${CMAKE_CURRENT_LIST_DIR}/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/DNSServer/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/BLE/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Update/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SPIFFS/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/FS/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/DHT sensor library") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/Adafruit Unified Sensor") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/esp32_https_server/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/Thread") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/AXP202X_Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/TinyGPSPlus/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/RadioLib/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/SparkFun Ublox Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/arduino-fsm") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/CRC32/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/OneButton/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/ESP8266_SSD1306/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/mesh") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/gps") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/esp32") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/esp32-mfix-esp32-psram-cache-issue") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/app_trace") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/app_update") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/asio") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/bootloader_support") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/bt") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/coap") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/console") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/driver") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/efuse") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp-tls") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp32") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_adc_cal") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_event") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_http_client") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_http_server") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_https_ota") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_https_server") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_ringbuf") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/espcoredump") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/ethernet") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/expat") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/fatfs") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/freemodbus") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/freertos") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/heap") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/idf_test") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/jsmn") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/json") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/libsodium") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/log") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/lwip") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/mbedtls") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/mdns") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/micro-ecc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/mqtt") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/newlib") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/nghttp") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/nimble") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/nvs_flash") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/openssl") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/protobuf-c") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/protocomm") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/pthread") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/sdmmc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/smartconfig_ack") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/soc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/spi_flash") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/spiffs") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/tcp_transport") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/tcpip_adapter") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/ulp") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/unity") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/vfs") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/wear_levelling") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/wifi_provisioning") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/wpa_supplicant") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/xtensa-debug-module") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp-face") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp32-camera") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/fb_gfx") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/cores/esp32") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/variants/ttgo-lora32-v1") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/BluetoothOTA") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/ESP8266_SSD1306@src-4ab3ad976e5f12b4a61f839d23a3c46d/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/OneButton@0.0.0-alpha+sha.eb583d713a/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/RadioLib@src-04c34ef49d4ad9f955bfeccb187cbfb4/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/RadioLib@src-73ec3f00ee50ec53c3e35f8f57cb805b/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/RadioLib@src-7defea5cd18ca13be529349922fbc9bd/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/RadioLib@src-eaad48fc571e663359162082157944f2/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/SparkFun Ublox Arduino Library@src-8ce11c31a386d7fec113d205dac8fee5/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/SparkFun Ublox Arduino Library@src-c2b16aac179b750f0dd483f91954d27c/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/Thread@src-a2b7660c81ffe1635912fa2f065bc3ce") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/TinyGPSPlus@src-2765db9a05cb947ced769bf56fedd1f5/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/TinyGPSPlus@src-addcdb46757d61b29d61d7a3c8d2c6aa/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/arduino-fsm@src-47e2e1a833a6aba34dc6f0811d801e49") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/arduino-fsm@src-4bf5152e2f279002470ccf60d567d9e6") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/ArduinoOTA/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/AzureIoT/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/BluetoothSerial/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/EEPROM/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/ESP32/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/FFat/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdate/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/NetBIOS/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SD/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SD_MMC/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/xtensa-esp32-elf/include/c++/5.2.0") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/xtensa-esp32-elf/include/c++/5.2.0/xtensa-esp32-elf") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/lib/gcc/xtensa-esp32-elf/5.2.0/include") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/lib/gcc/xtensa-esp32-elf/5.2.0/include-fixed") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/xtensa-esp32-elf/include") - include_directories("$ENV{HOME}/.platformio/packages/tool-unity") - - FILE(GLOB_RECURSE EXTRA_LIB_SOURCES - ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v1/*.* - ) -endif() -if (CMAKE_BUILD_TYPE MATCHES "tlora-v2") - add_definitions(-D'PLATFORMIO=50100') - add_definitions(-D'ARDUINO_TTGO_LoRa32_V1') - add_definitions(-D'HW_VERSION_') - add_definitions(-D'HW_VERSION=') - add_definitions(-D'USE_THREAD_NAMES') - add_definitions(-D'TINYGPS_OPTION_NO_CUSTOM_FIELDS') - add_definitions(-D'LOG_LOCAL_LEVEL=ESP_LOG_DEBUG') - add_definitions(-D'CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG') - add_definitions(-D'AXP_DEBUG_PORT=Serial') - add_definitions(-D'TLORA_V2') - add_definitions(-D'ESP32') - add_definitions(-D'ESP_PLATFORM') - add_definitions(-D'F_CPU=240000000L') - add_definitions(-D'HAVE_CONFIG_H') - add_definitions(-D'MBEDTLS_CONFIG_FILE=\"mbedtls/esp_config.h\"') - add_definitions(-D'ARDUINO=10805') - add_definitions(-D'ARDUINO_ARCH_ESP32') - add_definitions(-D'ARDUINO_VARIANT=\"ttgo-lora32-v1\"') - add_definitions(-D'ARDUINO_BOARD=\"TTGO LoRa32-OLED V1\"') - - include_directories("${CMAKE_CURRENT_LIST_DIR}/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/DNSServer/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/BLE/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Update/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SPIFFS/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/FS/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/DHT sensor library") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/Adafruit Unified Sensor") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/esp32_https_server/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/Thread") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/AXP202X_Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/TinyGPSPlus/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/RadioLib/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/SparkFun Ublox Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/arduino-fsm") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/CRC32/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/OneButton/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/ESP8266_SSD1306/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/mesh") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/gps") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/esp32") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/esp32-mfix-esp32-psram-cache-issue") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/app_trace") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/app_update") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/asio") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/bootloader_support") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/bt") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/coap") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/console") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/driver") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/efuse") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp-tls") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp32") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_adc_cal") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_event") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_http_client") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_http_server") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_https_ota") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_https_server") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_ringbuf") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/espcoredump") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/ethernet") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/expat") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/fatfs") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/freemodbus") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/freertos") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/heap") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/idf_test") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/jsmn") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/json") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/libsodium") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/log") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/lwip") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/mbedtls") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/mdns") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/micro-ecc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/mqtt") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/newlib") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/nghttp") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/nimble") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/nvs_flash") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/openssl") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/protobuf-c") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/protocomm") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/pthread") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/sdmmc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/smartconfig_ack") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/soc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/spi_flash") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/spiffs") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/tcp_transport") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/tcpip_adapter") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/ulp") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/unity") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/vfs") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/wear_levelling") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/wifi_provisioning") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/wpa_supplicant") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/xtensa-debug-module") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp-face") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp32-camera") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/fb_gfx") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/cores/esp32") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/variants/ttgo-lora32-v1") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/BluetoothOTA") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/ESP8266_SSD1306@src-4ab3ad976e5f12b4a61f839d23a3c46d/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/OneButton@0.0.0-alpha+sha.eb583d713a/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/RadioLib@src-04c34ef49d4ad9f955bfeccb187cbfb4/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/RadioLib@src-73ec3f00ee50ec53c3e35f8f57cb805b/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/RadioLib@src-7defea5cd18ca13be529349922fbc9bd/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/RadioLib@src-eaad48fc571e663359162082157944f2/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/SparkFun Ublox Arduino Library@src-8ce11c31a386d7fec113d205dac8fee5/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/SparkFun Ublox Arduino Library@src-c2b16aac179b750f0dd483f91954d27c/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/Thread@src-a2b7660c81ffe1635912fa2f065bc3ce") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/TinyGPSPlus@src-2765db9a05cb947ced769bf56fedd1f5/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/TinyGPSPlus@src-addcdb46757d61b29d61d7a3c8d2c6aa/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/arduino-fsm@src-47e2e1a833a6aba34dc6f0811d801e49") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/arduino-fsm@src-4bf5152e2f279002470ccf60d567d9e6") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/ArduinoOTA/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/AzureIoT/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/BluetoothSerial/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/EEPROM/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/ESP32/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/FFat/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdate/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/NetBIOS/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SD/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SD_MMC/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/xtensa-esp32-elf/include/c++/5.2.0") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/xtensa-esp32-elf/include/c++/5.2.0/xtensa-esp32-elf") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/lib/gcc/xtensa-esp32-elf/5.2.0/include") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/lib/gcc/xtensa-esp32-elf/5.2.0/include-fixed") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/xtensa-esp32-elf/include") - include_directories("$ENV{HOME}/.platformio/packages/tool-unity") - - FILE(GLOB_RECURSE EXTRA_LIB_SOURCES - ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2/*.* - ) -endif() -if (CMAKE_BUILD_TYPE MATCHES "tlora-v2-1-1.6") - add_definitions(-D'PLATFORMIO=50100') - add_definitions(-D'ARDUINO_TTGO_LoRa32_V1') - add_definitions(-D'HW_VERSION_') - add_definitions(-D'HW_VERSION=') - add_definitions(-D'USE_THREAD_NAMES') - add_definitions(-D'TINYGPS_OPTION_NO_CUSTOM_FIELDS') - add_definitions(-D'LOG_LOCAL_LEVEL=ESP_LOG_DEBUG') - add_definitions(-D'CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG') - add_definitions(-D'AXP_DEBUG_PORT=Serial') - add_definitions(-D'TLORA_V2_1_16') - add_definitions(-D'ESP32') - add_definitions(-D'ESP_PLATFORM') - add_definitions(-D'F_CPU=240000000L') - add_definitions(-D'HAVE_CONFIG_H') - add_definitions(-D'MBEDTLS_CONFIG_FILE=\"mbedtls/esp_config.h\"') - add_definitions(-D'ARDUINO=10805') - add_definitions(-D'ARDUINO_ARCH_ESP32') - add_definitions(-D'ARDUINO_VARIANT=\"ttgo-lora32-v1\"') - add_definitions(-D'ARDUINO_BOARD=\"TTGO LoRa32-OLED V1\"') - - include_directories("${CMAKE_CURRENT_LIST_DIR}/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/ESPmDNS/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/DNSServer/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SimpleBLE/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Preferences/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/BLE/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Update/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SPIFFS/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/FS/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/DHT sensor library") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/Adafruit Unified Sensor") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/esp32_https_server/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/Thread") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/AXP202X_Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/TinyGPSPlus/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/RadioLib/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/SparkFun Ublox Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/arduino-fsm") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/CRC32/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/OneButton/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/ESP8266_SSD1306/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/mesh") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/gps") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/esp32") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/esp32-mfix-esp32-psram-cache-issue") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/app_trace") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/app_update") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/asio") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/bootloader_support") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/bt") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/coap") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/console") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/driver") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/efuse") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp-tls") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp32") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_adc_cal") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_event") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_http_client") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_http_server") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_https_ota") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_https_server") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp_ringbuf") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/espcoredump") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/ethernet") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/expat") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/fatfs") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/freemodbus") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/freertos") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/heap") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/idf_test") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/jsmn") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/json") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/libsodium") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/log") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/lwip") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/mbedtls") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/mdns") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/micro-ecc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/mqtt") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/newlib") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/nghttp") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/nimble") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/nvs_flash") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/openssl") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/protobuf-c") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/protocomm") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/pthread") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/sdmmc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/smartconfig_ack") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/soc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/spi_flash") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/spiffs") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/tcp_transport") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/tcpip_adapter") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/ulp") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/unity") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/vfs") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/wear_levelling") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/wifi_provisioning") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/wpa_supplicant") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/xtensa-debug-module") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp-face") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/esp32-camera") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/tools/sdk/include/fb_gfx") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/cores/esp32") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/variants/ttgo-lora32-v1") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/BluetoothOTA") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/ESP8266_SSD1306@src-4ab3ad976e5f12b4a61f839d23a3c46d/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/OneButton@0.0.0-alpha+sha.eb583d713a/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/RadioLib@src-04c34ef49d4ad9f955bfeccb187cbfb4/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/RadioLib@src-73ec3f00ee50ec53c3e35f8f57cb805b/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/RadioLib@src-7defea5cd18ca13be529349922fbc9bd/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/RadioLib@src-eaad48fc571e663359162082157944f2/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/SparkFun Ublox Arduino Library@src-8ce11c31a386d7fec113d205dac8fee5/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/SparkFun Ublox Arduino Library@src-c2b16aac179b750f0dd483f91954d27c/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/Thread@src-a2b7660c81ffe1635912fa2f065bc3ce") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/TinyGPSPlus@src-2765db9a05cb947ced769bf56fedd1f5/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/TinyGPSPlus@src-addcdb46757d61b29d61d7a3c8d2c6aa/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/arduino-fsm@src-47e2e1a833a6aba34dc6f0811d801e49") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/arduino-fsm@src-4bf5152e2f279002470ccf60d567d9e6") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/ArduinoOTA/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/AsyncUDP/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/AzureIoT/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/BluetoothSerial/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/EEPROM/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/ESP32/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/FFat/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/HTTPUpdate/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/NetBIOS/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SD/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/SD_MMC/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/Ticker/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoespressif32/libraries/WiFiClientSecure/src") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/xtensa-esp32-elf/include/c++/5.2.0") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/xtensa-esp32-elf/include/c++/5.2.0/xtensa-esp32-elf") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/lib/gcc/xtensa-esp32-elf/5.2.0/include") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/lib/gcc/xtensa-esp32-elf/5.2.0/include-fixed") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-xtensa32/xtensa-esp32-elf/include") - include_directories("$ENV{HOME}/.platformio/packages/tool-unity") - - FILE(GLOB_RECURSE EXTRA_LIB_SOURCES - ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/tlora-v2-1-1.6/*.* - ) -endif() -if (CMAKE_BUILD_TYPE MATCHES "cubecellplus") - add_definitions(-D'PLATFORMIO=50100') - add_definitions(-D'CubeCell_BoardPlus') - add_definitions(-D'HW_VERSION_') - add_definitions(-D'HW_VERSION=') - add_definitions(-D'USE_THREAD_NAMES') - add_definitions(-D'TINYGPS_OPTION_NO_CUSTOM_FIELDS') - add_definitions(-D'ARDUINO=100') - - include_directories("${CMAKE_CURRENT_LIST_DIR}/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/mesh") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/gps") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/cubecell") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi/arm-none-eabi/include/c++/9.2.1") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi/arm-none-eabi/include/c++/9.2.1/arm-none-eabi") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi/lib/gcc/arm-none-eabi/9.2.1/include") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi/lib/gcc/arm-none-eabi/9.2.1/include-fixed") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi/arm-none-eabi/include") - include_directories("$ENV{HOME}/.platformio/packages/tool-unity") - - FILE(GLOB_RECURSE EXTRA_LIB_SOURCES - ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/cubecellplus/*.* - ) -endif() -if (CMAKE_BUILD_TYPE MATCHES "nrf52840dk") - add_definitions(-D'PLATFORMIO=50100') - add_definitions(-D'ARDUINO_NRF52840_PCA10056') - add_definitions(-D'NRF52840_XXAA') - add_definitions(-D'HW_VERSION_') - add_definitions(-D'HW_VERSION=') - add_definitions(-D'USE_THREAD_NAMES') - add_definitions(-D'TINYGPS_OPTION_NO_CUSTOM_FIELDS') - add_definitions(-D'F_CPU=64000000L') - add_definitions(-D'ARDUINO=10804') - add_definitions(-D'ARDUINO_ARCH_NRF52') - add_definitions(-D'ARDUINO_BSP_VERSION=\"0.21.0\"') - add_definitions(-D'ARDUINO_FEATHER52') - add_definitions(-D'ARDUINO_NRF52_ADAFRUIT') - add_definitions(-D'NRF52_SERIES') - add_definitions(-D'LFS_NAME_MAX=64') - add_definitions(-D'NRF52840') - add_definitions(-D'S140') - add_definitions(-D'NRF52_S140') - add_definitions(-D'SOFTDEVICE_PRESENT') - add_definitions(-D'USBCON') - add_definitions(-D'USE_TINYUSB') - add_definitions(-D'USB_VID=0x239A') - add_definitions(-D'USB_PID=0x4404') - add_definitions(-D'USB_PRODUCT=\"nrf52840dk\"') - add_definitions(-D'USB_MANUFACTURER=\"Nordic Semi\"') - add_definitions(-D'CFG_DEBUG=0') - add_definitions(-D'__PLATFORMIO_BUILD_DEBUG__') - - include_directories("${CMAKE_CURRENT_LIST_DIR}/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Bluefruit52Lib/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/InternalFileSytem/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Adafruit_LittleFS/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk/Thread") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk/AXP202X_Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk/TinyGPSPlus/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk/RadioLib/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SoftwareSerial") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk/SparkFun Ublox Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk/arduino-fsm") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk/CRC32/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk/OneButton/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk/ESP8266_SSD1306/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SPI") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Wire") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/mesh") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/gps") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/nrf52") - include_directories("${CMAKE_CURRENT_LIST_DIR}/sdk-nrfxlib/crypto/nrf_oberon/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/Core/Include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/hal") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/mdk") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/soc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s140_nrf52_6.1.1_API/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s140_nrf52_6.1.1_API/include/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/Source/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/GCC/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/CMSIS/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/SEGGER") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/Config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore/tinyusb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/variants/pca10056") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk/ESP8266_SSD1306@src-4ab3ad976e5f12b4a61f839d23a3c46d/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk/RadioLib@src-eaad48fc571e663359162082157944f2/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk/SparkFun Ublox Arduino Library@src-c2b16aac179b750f0dd483f91954d27c/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk/Thread@src-a2b7660c81ffe1635912fa2f065bc3ce") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk/TinyGPSPlus@src-addcdb46757d61b29d61d7a3c8d2c6aa/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk/arduino-fsm@src-47e2e1a833a6aba34dc6f0811d801e49") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk/arduino-fsm@src-4bf5152e2f279002470ccf60d567d9e6") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEAdafruitService/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEHomekit/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/PDM/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/RotaryEncoder") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Servo/src") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1/arm-none-eabi") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include-fixed") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include") - include_directories("$ENV{HOME}/.platformio/packages/tool-unity") - - FILE(GLOB_RECURSE EXTRA_LIB_SOURCES - ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk/*.* - ) -endif() -if (CMAKE_BUILD_TYPE MATCHES "nrf52840dk-geeksville") - add_definitions(-D'PLATFORMIO=50100') - add_definitions(-D'ARDUINO_NRF52840_PCA10056') - add_definitions(-D'NRF52840_XXAA') - add_definitions(-D'HW_VERSION_') - add_definitions(-D'HW_VERSION=') - add_definitions(-D'USE_THREAD_NAMES') - add_definitions(-D'TINYGPS_OPTION_NO_CUSTOM_FIELDS') - add_definitions(-D'F_CPU=64000000L') - add_definitions(-D'ARDUINO=10804') - add_definitions(-D'ARDUINO_ARCH_NRF52') - add_definitions(-D'ARDUINO_BSP_VERSION=\"0.21.0\"') - add_definitions(-D'ARDUINO_FEATHER52') - add_definitions(-D'ARDUINO_NRF52_ADAFRUIT') - add_definitions(-D'NRF52_SERIES') - add_definitions(-D'LFS_NAME_MAX=64') - add_definitions(-D'NRF52840') - add_definitions(-D'S113') - add_definitions(-D'NRF52_S113') - add_definitions(-D'SOFTDEVICE_PRESENT') - add_definitions(-D'USBCON') - add_definitions(-D'USE_TINYUSB') - add_definitions(-D'USB_VID=0x239A') - add_definitions(-D'USB_PID=0x4404') - add_definitions(-D'USB_PRODUCT=\"nrf52840dk\"') - add_definitions(-D'USB_MANUFACTURER=\"Nordic Semi\"') - add_definitions(-D'CFG_DEBUG=0') - add_definitions(-D'__PLATFORMIO_BUILD_DEBUG__') - - include_directories("${CMAKE_CURRENT_LIST_DIR}/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Bluefruit52Lib/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/InternalFileSytem/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Adafruit_LittleFS/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/Thread") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/AXP202X_Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/TinyGPSPlus/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/RadioLib/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SoftwareSerial") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/SparkFun Ublox Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/arduino-fsm") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/CRC32/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/OneButton/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/ESP8266_SSD1306/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SPI") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Wire") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/mesh") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/gps") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/nrf52") - include_directories("${CMAKE_CURRENT_LIST_DIR}/sdk-nrfxlib/crypto/nrf_oberon/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/variants/pca10056-rc-clock") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/Core/Include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/hal") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/mdk") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/soc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s113_nrf52_7.2.0_API/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s113_nrf52_7.2.0_API/include/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/Source/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/GCC/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/CMSIS/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/SEGGER") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/Config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore/tinyusb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/variants/pca10056-rc-clock") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/ESP8266_SSD1306@src-4ab3ad976e5f12b4a61f839d23a3c46d/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/OneButton@0.0.0-alpha+sha.eb583d713a/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/RadioLib@src-73ec3f00ee50ec53c3e35f8f57cb805b/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/RadioLib@src-7defea5cd18ca13be529349922fbc9bd/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/RadioLib@src-9f0ee4ef0997cdc8a439cbeb678d52cd/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/RadioLib@src-eaad48fc571e663359162082157944f2/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/SparkFun Ublox Arduino Library@src-c2b16aac179b750f0dd483f91954d27c/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/Thread@src-a2b7660c81ffe1635912fa2f065bc3ce") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/TinyGPSPlus@src-2765db9a05cb947ced769bf56fedd1f5/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/TinyGPSPlus@src-addcdb46757d61b29d61d7a3c8d2c6aa/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/arduino-fsm@src-47e2e1a833a6aba34dc6f0811d801e49") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/arduino-fsm@src-4bf5152e2f279002470ccf60d567d9e6") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEAdafruitService/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEHomekit/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/PDM/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/RotaryEncoder") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Servo/src") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1/arm-none-eabi") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include-fixed") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include") - include_directories("$ENV{HOME}/.platformio/packages/tool-unity") - - FILE(GLOB_RECURSE EXTRA_LIB_SOURCES - ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/nrf52840dk-geeksville/*.* - ) -endif() -if (CMAKE_BUILD_TYPE MATCHES "feather_nrf52832") - add_definitions(-D'PLATFORMIO=50100') - add_definitions(-D'NRF52832_XXAA') - add_definitions(-D'NRF52') - add_definitions(-D'HW_VERSION_') - add_definitions(-D'HW_VERSION=') - add_definitions(-D'USE_THREAD_NAMES') - add_definitions(-D'TINYGPS_OPTION_NO_CUSTOM_FIELDS') - add_definitions(-D'F_CPU=64000000L') - add_definitions(-D'ARDUINO=10804') - add_definitions(-D'ARDUINO_ARCH_NRF52') - add_definitions(-D'ARDUINO_BSP_VERSION=\"0.21.0\"') - add_definitions(-D'ARDUINO_FEATHER52') - add_definitions(-D'ARDUINO_NRF52_ADAFRUIT') - add_definitions(-D'NRF52_SERIES') - add_definitions(-D'LFS_NAME_MAX=64') - add_definitions(-D'NRF52832') - add_definitions(-D'S132') - add_definitions(-D'NRF52_S132') - add_definitions(-D'SOFTDEVICE_PRESENT') - add_definitions(-D'USB_VID=0x239A') - add_definitions(-D'USB_PID=0x8029') - add_definitions(-D'USB_PRODUCT=\"Feather nRF52832 Express\"') - add_definitions(-D'USB_MANUFACTURER=\"Adafruit\"') - add_definitions(-D'CFG_DEBUG=0') - add_definitions(-D'__PLATFORMIO_BUILD_DEBUG__') - - include_directories("${CMAKE_CURRENT_LIST_DIR}/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Bluefruit52Lib/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/InternalFileSytem/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Adafruit_LittleFS/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/feather_nrf52832/Thread") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/feather_nrf52832/AXP202X_Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/feather_nrf52832/TinyGPSPlus/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/feather_nrf52832/RadioLib/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SoftwareSerial") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/feather_nrf52832/SparkFun Ublox Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/feather_nrf52832/arduino-fsm") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/feather_nrf52832/CRC32/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/feather_nrf52832/OneButton/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/feather_nrf52832/ESP8266_SSD1306/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SPI") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Wire") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/mesh") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/gps") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/nrf52") - include_directories("${CMAKE_CURRENT_LIST_DIR}/sdk-nrfxlib/crypto/nrf_oberon/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/Core/Include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/hal") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/mdk") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/soc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s132_nrf52_6.1.1_API/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s132_nrf52_6.1.1_API/include/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/Source/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/GCC/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/CMSIS/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/SEGGER") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/Config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore/tinyusb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/variants/feather_nrf52832") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/feather_nrf52832/ESP8266_SSD1306@src-4ab3ad976e5f12b4a61f839d23a3c46d/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/feather_nrf52832/RadioLib@src-eaad48fc571e663359162082157944f2/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/feather_nrf52832/Thread@src-a2b7660c81ffe1635912fa2f065bc3ce") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/feather_nrf52832/TinyGPSPlus@src-addcdb46757d61b29d61d7a3c8d2c6aa/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/feather_nrf52832/arduino-fsm@src-47e2e1a833a6aba34dc6f0811d801e49") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEAdafruitService/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEHomekit/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/PDM/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/RotaryEncoder") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Servo/src") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1/arm-none-eabi") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include-fixed") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include") - include_directories("$ENV{HOME}/.platformio/packages/tool-unity") - - FILE(GLOB_RECURSE EXTRA_LIB_SOURCES - ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/feather_nrf52832/*.* - ) -endif() -if (CMAKE_BUILD_TYPE MATCHES "rak815") - add_definitions(-D'PLATFORMIO=50100') - add_definitions(-D'NRF52832_XXAA') - add_definitions(-D'NRF52') - add_definitions(-D'HW_VERSION_') - add_definitions(-D'HW_VERSION=') - add_definitions(-D'USE_THREAD_NAMES') - add_definitions(-D'TINYGPS_OPTION_NO_CUSTOM_FIELDS') - add_definitions(-D'F_CPU=64000000L') - add_definitions(-D'ARDUINO=10804') - add_definitions(-D'ARDUINO_ARCH_NRF52') - add_definitions(-D'ARDUINO_BSP_VERSION=\"0.21.0\"') - add_definitions(-D'ARDUINO_FEATHER52') - add_definitions(-D'ARDUINO_NRF52_ADAFRUIT') - add_definitions(-D'NRF52_SERIES') - add_definitions(-D'LFS_NAME_MAX=64') - add_definitions(-D'NRF52832') - add_definitions(-D'S132') - add_definitions(-D'NRF52_S132') - add_definitions(-D'SOFTDEVICE_PRESENT') - add_definitions(-D'USB_VID=0x10c4') - add_definitions(-D'USB_PID=0xea60') - add_definitions(-D'USB_PRODUCT=\"RAK815\"') - add_definitions(-D'USB_MANUFACTURER=\"RAK\"') - add_definitions(-D'CFG_DEBUG=0') - add_definitions(-D'__PLATFORMIO_BUILD_DEBUG__') - - include_directories("${CMAKE_CURRENT_LIST_DIR}/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Bluefruit52Lib/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/InternalFileSytem/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Adafruit_LittleFS/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/rak815/Thread") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/rak815/AXP202X_Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/rak815/TinyGPSPlus/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/rak815/RadioLib/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SoftwareSerial") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/rak815/SparkFun Ublox Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/rak815/arduino-fsm") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/rak815/CRC32/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/rak815/OneButton/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/rak815/ESP8266_SSD1306/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SPI") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Wire") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/mesh") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/gps") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/nrf52") - include_directories("${CMAKE_CURRENT_LIST_DIR}/sdk-nrfxlib/crypto/nrf_oberon/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/Core/Include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/hal") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/mdk") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/soc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s132_nrf52_6.1.1_API/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s132_nrf52_6.1.1_API/include/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/Source/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/GCC/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/CMSIS/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/SEGGER") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/Config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore/tinyusb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/variants/rak815") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/rak815/ESP8266_SSD1306@src-4ab3ad976e5f12b4a61f839d23a3c46d/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/rak815/RadioLib@src-eaad48fc571e663359162082157944f2/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/rak815/Thread@src-a2b7660c81ffe1635912fa2f065bc3ce") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/rak815/TinyGPSPlus@src-2765db9a05cb947ced769bf56fedd1f5/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/rak815/TinyGPSPlus@src-addcdb46757d61b29d61d7a3c8d2c6aa/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/rak815/arduino-fsm@src-47e2e1a833a6aba34dc6f0811d801e49") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEAdafruitService/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEHomekit/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/PDM/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/RotaryEncoder") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Servo/src") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1/arm-none-eabi") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include-fixed") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include") - include_directories("$ENV{HOME}/.platformio/packages/tool-unity") - - FILE(GLOB_RECURSE EXTRA_LIB_SOURCES - ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/rak815/*.* - ) -endif() -if (CMAKE_BUILD_TYPE MATCHES "ppr") - add_definitions(-D'PLATFORMIO=50100') - add_definitions(-D'ARDUINO_NRF52840_PPR') - add_definitions(-D'NRF52840_XXAA') - add_definitions(-D'HW_VERSION_') - add_definitions(-D'HW_VERSION=') - add_definitions(-D'USE_THREAD_NAMES') - add_definitions(-D'TINYGPS_OPTION_NO_CUSTOM_FIELDS') - add_definitions(-D'F_CPU=64000000L') - add_definitions(-D'ARDUINO=10804') - add_definitions(-D'ARDUINO_ARCH_NRF52') - add_definitions(-D'ARDUINO_BSP_VERSION=\"0.21.0\"') - add_definitions(-D'ARDUINO_FEATHER52') - add_definitions(-D'ARDUINO_NRF52_ADAFRUIT') - add_definitions(-D'NRF52_SERIES') - add_definitions(-D'LFS_NAME_MAX=64') - add_definitions(-D'NRF52840') - add_definitions(-D'S140') - add_definitions(-D'NRF52_S140') - add_definitions(-D'SOFTDEVICE_PRESENT') - add_definitions(-D'USBCON') - add_definitions(-D'USE_TINYUSB') - add_definitions(-D'USB_VID=0x239A') - add_definitions(-D'USB_PID=0x4403') - add_definitions(-D'USB_PRODUCT=\"PPR\"') - add_definitions(-D'USB_MANUFACTURER=\"Othernet\"') - add_definitions(-D'CFG_DEBUG=0') - add_definitions(-D'__PLATFORMIO_BUILD_DEBUG__') - - include_directories("${CMAKE_CURRENT_LIST_DIR}/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Bluefruit52Lib/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/InternalFileSytem/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Adafruit_LittleFS/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr/UC1701/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr/Thread") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr/AXP202X_Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr/TinyGPSPlus/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr/RadioLib/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SoftwareSerial") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr/SparkFun Ublox Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr/arduino-fsm") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr/CRC32/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr/OneButton/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr/ESP8266_SSD1306/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SPI") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Wire") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/mesh") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/gps") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/nrf52") - include_directories("${CMAKE_CURRENT_LIST_DIR}/sdk-nrfxlib/crypto/nrf_oberon/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/Core/Include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/hal") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/mdk") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/soc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s140_nrf52_6.1.1_API/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s140_nrf52_6.1.1_API/include/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/Source/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/GCC/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/CMSIS/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/SEGGER") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/Config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore/tinyusb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/variants/ppr") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr/ESP8266_SSD1306@src-4ab3ad976e5f12b4a61f839d23a3c46d/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr/RadioLib@src-eaad48fc571e663359162082157944f2/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr/SparkFun Ublox Arduino Library@src-c2b16aac179b750f0dd483f91954d27c/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr/Thread@src-a2b7660c81ffe1635912fa2f065bc3ce") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr/TinyGPSPlus@src-addcdb46757d61b29d61d7a3c8d2c6aa/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr/arduino-fsm@src-47e2e1a833a6aba34dc6f0811d801e49") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr/arduino-fsm@src-4bf5152e2f279002470ccf60d567d9e6") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEAdafruitService/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEHomekit/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/PDM/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/RotaryEncoder") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Servo/src") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1/arm-none-eabi") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include-fixed") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include") - include_directories("$ENV{HOME}/.platformio/packages/tool-unity") - - FILE(GLOB_RECURSE EXTRA_LIB_SOURCES - ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr/*.* - ) -endif() -if (CMAKE_BUILD_TYPE MATCHES "ppr1") - add_definitions(-D'PLATFORMIO=50100') - add_definitions(-D'ARDUINO_NRF52833_PPR') - add_definitions(-D'NRF52833_XXAA') - add_definitions(-D'HW_VERSION_') - add_definitions(-D'HW_VERSION=') - add_definitions(-D'USE_THREAD_NAMES') - add_definitions(-D'TINYGPS_OPTION_NO_CUSTOM_FIELDS') - add_definitions(-D'F_CPU=64000000L') - add_definitions(-D'ARDUINO=10804') - add_definitions(-D'ARDUINO_ARCH_NRF52') - add_definitions(-D'ARDUINO_BSP_VERSION=\"0.21.0\"') - add_definitions(-D'ARDUINO_FEATHER52') - add_definitions(-D'ARDUINO_NRF52_ADAFRUIT') - add_definitions(-D'NRF52_SERIES') - add_definitions(-D'LFS_NAME_MAX=64') - add_definitions(-D'NRF52833') - add_definitions(-D'S113') - add_definitions(-D'NRF52_S113') - add_definitions(-D'SOFTDEVICE_PRESENT') - add_definitions(-D'USBCON') - add_definitions(-D'USE_TINYUSB') - add_definitions(-D'USB_VID=0x239A') - add_definitions(-D'USB_PID=0x4406') - add_definitions(-D'USB_PRODUCT=\"PPR\"') - add_definitions(-D'USB_MANUFACTURER=\"Othernet\"') - add_definitions(-D'CFG_DEBUG=0') - add_definitions(-D'__PLATFORMIO_BUILD_DEBUG__') - - include_directories("${CMAKE_CURRENT_LIST_DIR}/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Bluefruit52Lib/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/InternalFileSytem/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Adafruit_LittleFS/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr1/Thread") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr1/AXP202X_Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr1/TinyGPSPlus/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr1/RadioLib/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SoftwareSerial") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr1/SparkFun Ublox Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr1/arduino-fsm") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr1/CRC32/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr1/OneButton/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr1/ESP8266_SSD1306/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SPI") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Wire") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/mesh") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/gps") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/nrf52") - include_directories("${CMAKE_CURRENT_LIST_DIR}/sdk-nrfxlib/crypto/nrf_oberon/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/variants/ppr1") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/Core/Include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/hal") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/mdk") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/soc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s113_nrf52_7.2.0_API/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s113_nrf52_7.2.0_API/include/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/Source/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/GCC/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/CMSIS/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/SEGGER") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/Config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore/tinyusb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/variants/ppr") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr1/ESP8266_SSD1306@src-4ab3ad976e5f12b4a61f839d23a3c46d/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr1/RadioLib@src-eaad48fc571e663359162082157944f2/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr1/Thread@src-a2b7660c81ffe1635912fa2f065bc3ce") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr1/TinyGPSPlus@src-2765db9a05cb947ced769bf56fedd1f5/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr1/TinyGPSPlus@src-addcdb46757d61b29d61d7a3c8d2c6aa/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr1/UC1701/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr1/arduino-fsm@src-47e2e1a833a6aba34dc6f0811d801e49") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEAdafruitService/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEHomekit/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/PDM/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/RotaryEncoder") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Servo/src") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1/arm-none-eabi") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include-fixed") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include") - include_directories("$ENV{HOME}/.platformio/packages/tool-unity") - - FILE(GLOB_RECURSE EXTRA_LIB_SOURCES - ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/ppr1/*.* - ) -endif() -if (CMAKE_BUILD_TYPE MATCHES "eink") - add_definitions(-D'PLATFORMIO=50100') - add_definitions(-D'ARDUINO_NRF52840_TTGO_EINK') - add_definitions(-D'NRF52840_XXAA') - add_definitions(-D'HW_VERSION_') - add_definitions(-D'HW_VERSION=') - add_definitions(-D'USE_THREAD_NAMES') - add_definitions(-D'TINYGPS_OPTION_NO_CUSTOM_FIELDS') - add_definitions(-D'BUSY_PIN=3') - add_definitions(-D'RST_PIN=2') - add_definitions(-D'DC_PIN=28') - add_definitions(-D'CS_PIN=30') - add_definitions(-D'F_CPU=64000000L') - add_definitions(-D'ARDUINO=10804') - add_definitions(-D'ARDUINO_ARCH_NRF52') - add_definitions(-D'ARDUINO_BSP_VERSION=\"0.21.0\"') - add_definitions(-D'ARDUINO_FEATHER52') - add_definitions(-D'ARDUINO_NRF52_ADAFRUIT') - add_definitions(-D'NRF52_SERIES') - add_definitions(-D'LFS_NAME_MAX=64') - add_definitions(-D'NRF52840') - add_definitions(-D'S140') - add_definitions(-D'NRF52_S140') - add_definitions(-D'SOFTDEVICE_PRESENT') - add_definitions(-D'USBCON') - add_definitions(-D'USE_TINYUSB') - add_definitions(-D'USB_VID=0x239A') - add_definitions(-D'USB_PID=0x4405') - add_definitions(-D'USB_PRODUCT=\"TTGO_eink\"') - add_definitions(-D'USB_MANUFACTURER=\"TTGO\"') - add_definitions(-D'CFG_DEBUG=0') - add_definitions(-D'__PLATFORMIO_BUILD_DEBUG__') - - include_directories("${CMAKE_CURRENT_LIST_DIR}/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Bluefruit52Lib/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/InternalFileSytem/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Adafruit_LittleFS/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink/TFT_eSPI") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink/EPD_Libraries/epd1in54") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink/Thread") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink/AXP202X_Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink/TinyGPSPlus/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink/RadioLib/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SoftwareSerial") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink/SparkFun Ublox Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink/arduino-fsm") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink/CRC32/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink/OneButton/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink/ESP8266_SSD1306/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SPI") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Wire") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/mesh") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/gps") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/nrf52") - include_directories("${CMAKE_CURRENT_LIST_DIR}/sdk-nrfxlib/crypto/nrf_oberon/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/variants/eink") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/Core/Include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/hal") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/mdk") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/soc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s140_nrf52_6.1.1_API/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s140_nrf52_6.1.1_API/include/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/Source/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/GCC/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/CMSIS/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/SEGGER") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/Config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore/tinyusb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/variants/eink") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink/ESP8266_SSD1306@src-4ab3ad976e5f12b4a61f839d23a3c46d/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink/OneButton@0.0.0-alpha+sha.eb583d713a/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink/RadioLib@src-73ec3f00ee50ec53c3e35f8f57cb805b/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink/RadioLib@src-9f0ee4ef0997cdc8a439cbeb678d52cd/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink/RadioLib@src-eaad48fc571e663359162082157944f2/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink/SparkFun Ublox Arduino Library@src-c2b16aac179b750f0dd483f91954d27c/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEAdafruitService/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEHomekit/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/PDM/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/RotaryEncoder") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Servo/src") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1/arm-none-eabi") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include-fixed") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include") - include_directories("$ENV{HOME}/.platformio/packages/tool-unity") - - FILE(GLOB_RECURSE EXTRA_LIB_SOURCES - ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink/*.* - ) -endif() -if (CMAKE_BUILD_TYPE MATCHES "eink0.1") - add_definitions(-D'PLATFORMIO=50100') - add_definitions(-D'ARDUINO_NRF52840_TTGO_EINK') - add_definitions(-D'NRF52840_XXAA') - add_definitions(-D'HW_VERSION_') - add_definitions(-D'HW_VERSION=') - add_definitions(-D'USE_THREAD_NAMES') - add_definitions(-D'TINYGPS_OPTION_NO_CUSTOM_FIELDS') - add_definitions(-D'BUSY_PIN=3') - add_definitions(-D'RST_PIN=2') - add_definitions(-D'DC_PIN=28') - add_definitions(-D'CS_PIN=30') - add_definitions(-D'F_CPU=64000000L') - add_definitions(-D'ARDUINO=10804') - add_definitions(-D'ARDUINO_ARCH_NRF52') - add_definitions(-D'ARDUINO_BSP_VERSION=\"0.21.0\"') - add_definitions(-D'ARDUINO_FEATHER52') - add_definitions(-D'ARDUINO_NRF52_ADAFRUIT') - add_definitions(-D'NRF52_SERIES') - add_definitions(-D'LFS_NAME_MAX=64') - add_definitions(-D'NRF52840') - add_definitions(-D'S140') - add_definitions(-D'NRF52_S140') - add_definitions(-D'SOFTDEVICE_PRESENT') - add_definitions(-D'USBCON') - add_definitions(-D'USE_TINYUSB') - add_definitions(-D'USB_VID=0x239A') - add_definitions(-D'USB_PID=0x4405') - add_definitions(-D'USB_PRODUCT=\"TTGO_eink\"') - add_definitions(-D'USB_MANUFACTURER=\"TTGO\"') - add_definitions(-D'CFG_DEBUG=0') - add_definitions(-D'__PLATFORMIO_BUILD_DEBUG__') - - include_directories("${CMAKE_CURRENT_LIST_DIR}/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Bluefruit52Lib/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/InternalFileSytem/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Adafruit_LittleFS/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink0.1/TFT_eSPI") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink0.1/EPD_Libraries/epd1in54") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink0.1/Thread") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink0.1/AXP202X_Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink0.1/TinyGPSPlus/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink0.1/RadioLib/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SoftwareSerial") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink0.1/SparkFun Ublox Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink0.1/arduino-fsm") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink0.1/CRC32/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink0.1/OneButton/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink0.1/ESP8266_SSD1306/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SPI") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Wire") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/mesh") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/gps") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/nrf52") - include_directories("${CMAKE_CURRENT_LIST_DIR}/sdk-nrfxlib/crypto/nrf_oberon/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/variants/eink0.1") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/Core/Include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/hal") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/mdk") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/soc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s140_nrf52_6.1.1_API/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s140_nrf52_6.1.1_API/include/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/Source/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/GCC/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/CMSIS/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/SEGGER") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/Config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore/tinyusb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/variants/eink0.1") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink0.1/ESP8266_SSD1306@src-4ab3ad976e5f12b4a61f839d23a3c46d/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink0.1/Thread@src-a2b7660c81ffe1635912fa2f065bc3ce") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink0.1/TinyGPSPlus@src-2765db9a05cb947ced769bf56fedd1f5/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink0.1/arduino-fsm@src-47e2e1a833a6aba34dc6f0811d801e49") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEAdafruitService/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEHomekit/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/PDM/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/RotaryEncoder") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Servo/src") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1/arm-none-eabi") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include-fixed") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include") - include_directories("$ENV{HOME}/.platformio/packages/tool-unity") - - FILE(GLOB_RECURSE EXTRA_LIB_SOURCES - ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/eink0.1/*.* - ) -endif() -if (CMAKE_BUILD_TYPE MATCHES "lora-relay-v1") - add_definitions(-D'PLATFORMIO=50100') - add_definitions(-D'ARDUINO_NRF52840_LORA_RELAY_V1') - add_definitions(-D'NRF52840_XXAA') - add_definitions(-D'HW_VERSION_') - add_definitions(-D'HW_VERSION=') - add_definitions(-D'USE_THREAD_NAMES') - add_definitions(-D'TINYGPS_OPTION_NO_CUSTOM_FIELDS') - add_definitions(-D'USER_SETUP_LOADED') - add_definitions(-D'TFT_WIDTH=80') - add_definitions(-D'TFT_HEIGHT=160') - add_definitions(-D'ST7735_GREENTAB160x80') - add_definitions(-D'ST7735_DRIVER') - add_definitions(-D'TFT_CS=ST7735_CS') - add_definitions(-D'TFT_DC=ST7735_RS') - add_definitions(-D'TFT_RST=ST7735_RESET') - add_definitions(-D'SPI_FREQUENCY=27000000') - add_definitions(-D'F_CPU=64000000L') - add_definitions(-D'ARDUINO=10804') - add_definitions(-D'ARDUINO_ARCH_NRF52') - add_definitions(-D'ARDUINO_BSP_VERSION=\"0.21.0\"') - add_definitions(-D'ARDUINO_FEATHER52') - add_definitions(-D'ARDUINO_NRF52_ADAFRUIT') - add_definitions(-D'NRF52_SERIES') - add_definitions(-D'LFS_NAME_MAX=64') - add_definitions(-D'NRF52840') - add_definitions(-D'S140') - add_definitions(-D'NRF52_S140') - add_definitions(-D'SOFTDEVICE_PRESENT') - add_definitions(-D'USBCON') - add_definitions(-D'USE_TINYUSB') - add_definitions(-D'USB_VID=0x239A') - add_definitions(-D'USB_PID=0x4404') - add_definitions(-D'USB_PRODUCT=\"LORA_RELAY\"') - add_definitions(-D'USB_MANUFACTURER=\"BigCorvus\"') - add_definitions(-D'CFG_DEBUG=0') - add_definitions(-D'__PLATFORMIO_BUILD_DEBUG__') - - include_directories("${CMAKE_CURRENT_LIST_DIR}/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Bluefruit52Lib/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/InternalFileSytem/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Adafruit_LittleFS/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/TFT_eSPI") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/SparkFun BQ27441 LiPo Fuel Gauge Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/Thread") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/AXP202X_Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/TinyGPSPlus/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/RadioLib/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SoftwareSerial") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/SparkFun Ublox Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/arduino-fsm") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/CRC32/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/OneButton/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/ESP8266_SSD1306/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SPI") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Wire") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/mesh") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/gps") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/nrf52") - include_directories("${CMAKE_CURRENT_LIST_DIR}/sdk-nrfxlib/crypto/nrf_oberon/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/variants/lora_relay_v1") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/Core/Include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/hal") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/mdk") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/soc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s140_nrf52_6.1.1_API/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s140_nrf52_6.1.1_API/include/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/Source/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/GCC/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/CMSIS/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/SEGGER") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/Config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore/tinyusb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/variants/lora_relay_v1") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/Adafruit BusIO") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/Adafruit GFX Library") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/Adafruit ST7735 and ST7789 Library") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/Adafruit seesaw Library") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/ESP8266_SSD1306@src-4ab3ad976e5f12b4a61f839d23a3c46d/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/OneButton@0.0.0-alpha+sha.eb583d713a/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/RadioLib@src-04c34ef49d4ad9f955bfeccb187cbfb4/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/RadioLib@src-73ec3f00ee50ec53c3e35f8f57cb805b/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/RadioLib@src-7defea5cd18ca13be529349922fbc9bd/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/RadioLib@src-9f0ee4ef0997cdc8a439cbeb678d52cd/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/RadioLib@src-eaad48fc571e663359162082157944f2/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/SD") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/SparkFun Ublox Arduino Library@src-8ce11c31a386d7fec113d205dac8fee5/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/SparkFun Ublox Arduino Library@src-c2b16aac179b750f0dd483f91954d27c/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/Thread@src-2d5aa05a470baa9e9e00a0bae2a87c62") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/Thread@src-a2b7660c81ffe1635912fa2f065bc3ce") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/TinyGPSPlus@src-2765db9a05cb947ced769bf56fedd1f5/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/TinyGPSPlus@src-addcdb46757d61b29d61d7a3c8d2c6aa/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/arduino-fsm@src-47e2e1a833a6aba34dc6f0811d801e49") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/arduino-fsm@src-4bf5152e2f279002470ccf60d567d9e6") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEAdafruitService/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEHomekit/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/PDM/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/RotaryEncoder") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Servo/src") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1/arm-none-eabi") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include-fixed") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include") - include_directories("$ENV{HOME}/.platformio/packages/tool-unity") - - FILE(GLOB_RECURSE EXTRA_LIB_SOURCES - ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v1/*.* - ) -endif() -if (CMAKE_BUILD_TYPE MATCHES "lora-relay-v2") - add_definitions(-D'PLATFORMIO=50100') - add_definitions(-D'ARDUINO_NRF52840_LORA_RELAY_V2') - add_definitions(-D'NRF52840_XXAA') - add_definitions(-D'HW_VERSION_') - add_definitions(-D'HW_VERSION=') - add_definitions(-D'USE_THREAD_NAMES') - add_definitions(-D'TINYGPS_OPTION_NO_CUSTOM_FIELDS') - add_definitions(-D'USER_SETUP_LOADED') - add_definitions(-D'TFT_WIDTH=80') - add_definitions(-D'TFT_HEIGHT=160') - add_definitions(-D'ST7735_GREENTAB160x80') - add_definitions(-D'ST7735_DRIVER') - add_definitions(-D'TFT_CS=ST7735_CS') - add_definitions(-D'TFT_DC=ST7735_RS') - add_definitions(-D'TFT_RST=ST7735_RESET') - add_definitions(-D'SPI_FREQUENCY=27000000') - add_definitions(-D'TFT_WR=ST7735_SDA') - add_definitions(-D'TFT_SCLK=ST7735_SCK') - add_definitions(-D'F_CPU=64000000L') - add_definitions(-D'ARDUINO=10804') - add_definitions(-D'ARDUINO_ARCH_NRF52') - add_definitions(-D'ARDUINO_BSP_VERSION=\"0.21.0\"') - add_definitions(-D'ARDUINO_FEATHER52') - add_definitions(-D'ARDUINO_NRF52_ADAFRUIT') - add_definitions(-D'NRF52_SERIES') - add_definitions(-D'LFS_NAME_MAX=64') - add_definitions(-D'NRF52840') - add_definitions(-D'S140') - add_definitions(-D'NRF52_S140') - add_definitions(-D'SOFTDEVICE_PRESENT') - add_definitions(-D'USBCON') - add_definitions(-D'USE_TINYUSB') - add_definitions(-D'USB_VID=0x239A') - add_definitions(-D'USB_PID=0x4406') - add_definitions(-D'USB_PRODUCT=\"LORA_RELAY\"') - add_definitions(-D'USB_MANUFACTURER=\"BigCorvus\"') - add_definitions(-D'CFG_DEBUG=0') - add_definitions(-D'__PLATFORMIO_BUILD_DEBUG__') - - include_directories("${CMAKE_CURRENT_LIST_DIR}/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Bluefruit52Lib/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/InternalFileSytem/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Adafruit_LittleFS/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v2/TFT_eSPI") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v2/SparkFun BQ27441 LiPo Fuel Gauge Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v2/Thread") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v2/AXP202X_Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v2/TinyGPSPlus/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v2/RadioLib/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SoftwareSerial") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v2/SparkFun Ublox Arduino Library/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v2/arduino-fsm") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v2/CRC32/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v2/OneButton/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v2/ESP8266_SSD1306/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/SPI") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Wire") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/mesh") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/gps") - include_directories("${CMAKE_CURRENT_LIST_DIR}/lib/nanopb/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/src/nrf52") - include_directories("${CMAKE_CURRENT_LIST_DIR}/sdk-nrfxlib/crypto/nrf_oberon/include") - include_directories("${CMAKE_CURRENT_LIST_DIR}/variants/lora_relay_v2") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/cmsis/Core/Include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/hal") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/mdk") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/soc") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/nrfx/drivers/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s140_nrf52_6.1.1_API/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/nordic/softdevice/s140_nrf52_6.1.1_API/include/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/Source/include") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/GCC/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/freertos/portable/CMSIS/nrf52") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/SEGGER") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/sysview/Config") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5/TinyUSB/Adafruit_TinyUSB_ArduinoCore/tinyusb/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/cores/nRF5") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/variants/lora_relay_v2") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v2/ESP8266_SSD1306@src-4ab3ad976e5f12b4a61f839d23a3c46d/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v2/RadioLib@src-eaad48fc571e663359162082157944f2/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v2/Thread@src-a2b7660c81ffe1635912fa2f065bc3ce") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v2/TinyGPSPlus@src-2765db9a05cb947ced769bf56fedd1f5/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v2/TinyGPSPlus@src-addcdb46757d61b29d61d7a3c8d2c6aa/src") - include_directories("${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v2/arduino-fsm@src-47e2e1a833a6aba34dc6f0811d801e49") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEAdafruitService/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/BLEHomekit/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/PDM/src") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/RotaryEncoder") - include_directories("$ENV{HOME}/.platformio/packages/framework-arduinoadafruitnrf52/libraries/Servo/src") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include/c++/7.2.1/arm-none-eabi") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/lib/gcc/arm-none-eabi/7.2.1/include-fixed") - include_directories("$ENV{HOME}/.platformio/packages/toolchain-gccarmnoneeabi@1.70201.0/arm-none-eabi/include") - include_directories("$ENV{HOME}/.platformio/packages/tool-unity") - - FILE(GLOB_RECURSE EXTRA_LIB_SOURCES - ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/lora-relay-v2/*.* - ) -endif() - -FILE(GLOB_RECURSE SRC_LIST - ${CMAKE_CURRENT_LIST_DIR}/src/*.* - ${CMAKE_CURRENT_LIST_DIR}/lib/*.* -) - -list(APPEND SRC_LIST ${EXTRA_LIB_SOURCES}) diff --git a/README-docker.md b/README-docker.md deleted file mode 100644 index 8c7b8eab5..000000000 --- a/README-docker.md +++ /dev/null @@ -1,72 +0,0 @@ -## What is Docker used for - -Developers can simulate Device hardware by compiling and running -a linux native binary application. If you do not own a Linux -machine, or you just want to separate things, you might want -to run simulator inside a docker container - -## The Image -To build docker image, type - - `docker build -t meshtastic/device .` - -## Usage - -To run a container, type - - `docker run --rm -p 4403:4403 meshtastic/device` - -or, to get an interactive shell on the docker created container: - - `docker run -it -p 4403:4403 meshtastic/device bash` - -You might want to mount your local development folder: - - `docker run -it --mount type=bind,source=/PathToMyProjects/Meshtastic/Meshtastic-device-mybranch,target=/Meshtastic-device-mybranch -p 4403:4403 meshtastic/device bash` - -## Build the native application - -Linux native application should be built inside the container. -For this you must run container with interactive console -"-it", as seen above. - -First, some environment variables need to be set up with command: - - `. ~/.platformio/penv/bin/activate` - -You also want to make some adjustments in the bin/build-all.sh to conform the amd64 build: - -``` - sed -i 's/^BOARDS_ESP32.*/BOARDS_ESP32=""/' bin/build-all.sh - sed -i 's/^BOARDS_NRF52.*/BOARDS_NRF52=""/' bin/build-all.sh - sed -i 's/echo "Building SPIFFS.*/exit/' bin/build-all.sh -``` - -You can build amd64 image with command - -`bin/build-all.sh` - -## Executing the application interactively - -The built binary file should be found under name -`release/latest/bins/universal/meshtastic_linux_amd64`. -If this is not the case, you can also use direct program name: -`.pio/build/native/program` - -To use python cli against exposed port 4403, -type this in the host machine: - -`meshtastic --info --host localhost` - -## Stop the container - -Run this to get the ID: - -`docker ps` - -Stop the container with command: - -`docker kill ` - -> Tip: you can just use the first few characters of the ID in docker commands - diff --git a/bin/qspi-flash-test.sh b/bin/qspi-flash-test.sh deleted file mode 100755 index 542b96a78..000000000 --- a/bin/qspi-flash-test.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -# You probably don't need this - it is a basic test of the serial flash on the TTGO eink board - -nrfjprog --qspiini nrf52/ttgo_eink_qpsi.ini --qspieraseall -nrfjprog --qspiini nrf52/ttgo_eink_qpsi.ini --memwr 0x12000000 --val 0xdeadbeef --verify -nrfjprog --qspiini nrf52/ttgo_eink_qpsi.ini --readqspi spi.hex -objdump -s spi.hex | less diff --git a/geeksville-private/TODO.md b/geeksville-private/TODO.md deleted file mode 100644 index 3c43508e4..000000000 --- a/geeksville-private/TODO.md +++ /dev/null @@ -1,353 +0,0 @@ -# Geeksville's current work queue - -You probably don't care about this section - skip to the next one. - -* usb lora dongle from pine64, add end user instructions -* measure rak4630 power draw and turn off power for GPS most of the time. We should be able to run on the small solar panel. -* turn on watchdog reset if app hangs on nrf52 or esp32 -* pine64 solar boards -* for the matrix gateway? recommended by @sam-uk https://github.com/matrix-org/coap-proxy -* figure our wss for mqtt.meshtastic - use cloudflare? 2052 ws, 2053 crypt -* ask for vercel access -* finish plan for riot.im -* turn on setTx(timeout) and state = setDioIrqParams(SX126X_IRQ_TX_DONE | SX126X_IRQ_TIMEOUT, SX126X_IRQ_TX_DONE | SX126X_IRQ_TIMEOUT); in sx1262 code -* NO add rak4600 support (with rf95 radio and limited ram) -* store esp32 crashes to flash (and 64KB coredump partition) - https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/core_dump.html -* If more nodes appear than the nodedb can hold, delete oldest entries from DB -* send debug info 'in-band' -* DONE @luxonn reports that after a while the android app stops showing new messages -* DONE release android APK - fix recent 1.2.28 crash report -* DONE remote admin busted? -* DONE check android code - @havealoha comments about odd sleep behavior -* ABANDONED test github actions locally on linux -* DONE fix github actions per sasha tip -* tell ttgo to preinstall new bins -* DONE sendtext busted in portduino, due to bytetime calculations -* remove linux dependency in native build -* DONE tcp stream problem in python+pordtuino, server thinks client dropped when client DID NOT DROP -* DONE TCP mode for android, localhost is at 10.0.2.2 -* DONE make sure USB still works in android -* add license to portduino and make announcement -* DONE naks are being dropped (though enqueuedLocal) sometimes before phone/PC gets them -* DONE have android fill in if local GPS has poor signal -* optionally restrict position sends to a named channel -* release to beta and amazon -* add reference counting to mesh packets -* allow multiple simultanteous phoneapi connections -* DONE split position.time and last_heard -* DONE update android app to use last_heard -* DONE turn off bluetooth interface ENTIRELY while using serial API (was python client times out on connect sometimes) -* DONE gps assistance from phone not working? -* DONE test latest firmware update with is_router -* DONE firmware OTA updates of is_router true nodes fails? -* DONE add UI in android app to reset to defaults https://github.com/meshtastic/Meshtastic-Android/issues/263 -* DONE TEST THIS! changing channels requires a reboot to take effect https://github.com/meshtastic/Meshtastic-device/issues/752 -* DONE bug report with remote info request timing out -* DONE retest channel changing in android (using sim?) -* DONE move remote admin doc from forum into git -* DONE check crashlytics -* DONE ask for a documentation czar -* DONE timestamps on oled screen are wrong - don't seem to be updating based on message rx (actually: this is expected behavior when no node on the mesh has GPS time) -* DONE add ch-del -* DONE channel hash suffixes are wrong on android -* DONE before next relase: test empty channel sets on android -* DONE channel sharing in android -* DONE test 1.0 firmware update on android -* DONE test 1.1 firmwhttps://github.com/meshtastic/Meshtastic-Android/issues/271are update on android -* DONE test 1.2.10 firmware update on android -* DONE test link sharing on android -* FIXED? luxon bug report - seeing rx acks for nodes that are not on the network -* DONE release py -* DONE show GPS time only if we know what global time is -* DONE android should always provide time to nodes - so that it is easier for the mesh to learn the current time - -## Multichannel support - -* DONE cleanup the external notification and serial modules -* non ack version of stress test fails sometimes! -* tx fault test has a bug #734 - * turn off fault 8: https://github.com/meshtastic/Meshtastic-device/issues/734 -* DONE move device types into an enum in nodeinfo -* DONE fix android to use new device types for firmware update -* nrf52 should preserve local time across reset -* cdcacm bug on nrf52: emittx thinks it emitted but client sees nothing. works again later -* nrf52: segger logs have errors in formatting that should be impossible (because not going through serial, try stalling on segger) -* DONE call RouterModule for *all* packets - not just Router packets -* DONE generate channel hash from the name of the channel+the psk (not just one or the other) -* DONE send a hint that can be used to select which channel to try and hash against with each message -* DONE remove deprecated -* DONE fix setchannel in phoneapi.cpp -* DONE set mynodeinfo.max_channels -* DONE set mynodeinfo.num_bands (formerly num_channels) -* DONE fix sniffing of non Routing packets -* DONE enable remote setttings access by moving settings operations into a regular module (move settings ops out of PhoneAPI) -* DONE move portnum up? -* DONE remove region specific builds from the firmware -* DONE test single channel without python -* DONE Use "default" for name if name is empty -* DONE fix python data packet receiving (nothing showing in log?) -* DONE implement 'get channels' Admin module operation -* DONE use get-channels from python -* DONE use get channels & get settings from android -* DONE use set-channel from python -* DONE make settings changes from python work -* DONE pthon should stop fetching channels once we've reached our first empty channel definition (hasSettings == true) -* DONE add check for old devices with new API library -* DONE release python api -* DONE release protobufs -* DONE release to developers -* DONE fix setch-fast in python tool -* age out pendingrequests in the python API -* DONE stress test channel download from python, sometimes it seems like we don't get all replies, bug was due to simultaneous android connection -* DONE combine acks and responses in a single message if possible (do routing module LAST and drop ACK if someone else has already replied) -* DONE don't send packets we received from the phone BACK TOWARDS THE PHONE (possibly use fromnode 0 for packets the phone sends?) -* DONE fix 1.1.50 android debug panel display -* DONE test android channel setting -* DONE release to users -* DONE warn in android app about unset regions -* DONE use set-channel from android -* DONE add gui in android app for setting region -* DONE clean up python channel usage -* DONE use bindToChannel to limit admin access for remote nodes -* DONE move channels and radio config out of device settings -* DONE test remote info and remote settings changes -* make python tests more exhaustive -* DONE pick default random admin key -* exclude admin channels from URL? -* make a way to share just secondary channels via URL -* generalize the concept of "shortstrings" use it for both PSKs and well known channel names. Possibly use a ShortString class. -* use single byte 'well known' channel names for admin, gpio, etc... -* use presence of gpio channel to enable gpio ops, same for serial etc... -* DONE restrict gpio & serial & settings operations to the admin channel (unless local to the current node) -* DONE add channel restrictions for modules (and restrict routing module to the "control" channel) -* stress test multi channel -* DONE investigate @mc-hamster report of heap corruption -* DONE use set-user from android -* untrusted users should not be allowed to provide bogus times (via position broadcasts) to the rest of the mesh. Invent a new lowest quality notion of UntrustedTime. -* use portuino TCP connection to debug with python API -* document the relationship between want_response (indicating remote node received it) and want_ack (indicating that this message should be sent reliably - and also get acks from the first rx node and naks if it is never delivered) -* DONE android should stop fetching channels once we've reached our first empty channel definition (hasSettings == true) -* DONE warn in python api if we are too new to talk to the device code -* DONE make a post warning about 1.2, telling how to stay on old android & python clients. link to this from the android dialog message and python version warning. -* DONE "FIXME - move the radioconfig/user/channel READ operations into SettingsMessage as well" -* DONE scrub protobufs to make sure they are absoloute minimum wiresize (in particular Data, ChannelSets and positions) -* DONE change syncword (now ox2b) -* allow chaning packets in single transmission - to increase airtime efficiency and amortize packet overhead -* DONE move most parts of meshpacket into the Data packet, so that we can chain multiple Data for sending when they all have a common destination and key. -* when selecting a MeshPacket for transmit, scan the TX queue for any Data packets we can merge together as a WirePayload. In the low level send/rx code expand that into multiple MeshPackets as needed (thus 'hiding' from MeshPacket that over the wire we send multiple datapackets -* DONE confirm we are still calling the modules for messages inbound from the phone (or generated locally) -* DONE confirm we are still multi hop routing flood broadcasts -* DONE confirm we are still doing resends on unicast reliable packets -* add history to routed packets: https://meshtastic.discourse.group/t/packet-source-tracking/2764/2 -* add support for full DSR unicast delivery -* DONE move acks into routing -* DONE make all subpackets different versions of data -* DONE move routing control into a data packet -* have phoneapi done via module (will allow multiple simultaneous API clients - stop disabling BLE while using phone API) -* use reference counting and dynamic sizing for meshpackets. - use https://docs.microsoft.com/en-us/cpp/cpp/how-to-create-and-use-shared-ptr-instances?view=msvc-160 (already used in arduino) -* let multiple PhoneAPI endpoints work at once -* allow multiple simultaneous bluetooth connections (create the bluetooth phoneapi instance dynamically based on client id) -* DONE figure out how to add micro_delta to position, make it so that phone apps don't need to understand it? -* only send battery updates a max of once a minute -* DONE add python channel selection for sending -* DONE record recevied channel in meshpacket -* test remote settings operations (confirm it works 3 hops away) -* DONE make a primaryChannel global and properly maintain it when the phone sends setChannel -* DONE move setCrypto call into packet send and packet decode code -* implement 'small location diffs' change -* move battery level out of position? -* consider "A special exception (FIXME, not sure if this is a good idea) - packets that arrive on the local interface - are allowed on any channel (this lets the local user do anything)." Probably by adding a "secure_local_interface" settings bool. -* DOUBLE CHECK android app can still upgrade 1.1 and 1.0 loads - -For app cleanup: - -* don't store redundant User admin or position broadcasts in the ToPhone queue (only keep one per sending node per proto type, and only most recent) -* use structured logging to kep logs in ram. Also send logs as packets to api clients -* DONE writeup nice python options docs (common cases, link to protobuf docs) -* have android app link to user manual -* DONE only do wantReplies once per packet type, if we change network settings force it again -* update positions and nodeinfos based on packets we just merely witness on the mesh. via isPromsciousPort bool, remove sniffing -* DONE make device build always have a valid version -* DONE do fixed position bug https://github.com/meshtastic/Meshtastic-device/issues/536 -* DONE check build guide -* DONE write devapi user guide -* DONE update android code: https://developer.android.com/topic/libraries/view-binding/migration -* DONE test GPIO watch -* DONE set --set-chan-fast, --set-chan-default -* writeup docs on gpio -* DONE make python ping command -* DONE make hello world example service -* DONE have python tool check max packet size before sending to device -* DONE if request was sent reliably, send reply reliably -* DONE require a recent python api to talk to these new device loads -* DONE require a recent android app to talk to these new device loads -* DONE fix handleIncomingPosition -* DONE move want_replies handling into modules -* DONE on android for received positions handle either old or new positions / user messages -* DONE on android side send old or new positions as needed / user messages -* DONE test python side handle new position/user messages -* DONE make a gpio example. --gpiowrb 4 1, --gpiord 0x444, --gpiowatch 0x3ff -* DONE fix position sending to use new module -* DONE Add SinglePortNumModule - as the new most useful baseclass -* DONE move positions into regular data packets (use new app framework) -* DONE move user info into regular data packets (use new app framework) -* DONE test that positions, text messages and user info still work -* DONE test that position, text messages and user info work properly with new android app and old device code -* DONE do UDP tunnel -* DONE fix the RTC drift bug -* move python ping functionality into device, reply with rxsnr info -* use channels for gpio security https://github.com/meshtastic/Meshtastic-device/issues/104 -* MeshPackets for sending should be reference counted so that API clients would have the option of checking sent status (would allow removing the nasty 30 sec timer in gpio watch sending) - -For high speed/lots of devices/short range tasks: - -- When guessing numhops for sending: if I've heard from many local (0 hop neighbors) decrease hopcount by 2 rather than 1. -This should nicely help 'router' nodes do the right thing when long range, or if there are many local nodes for short range. -- fix timeouts/delays to be based on packet length at current radio settings - -* update faq with antennas https://meshtastic.discourse.group/t/range-test-ideas-requested/738/2 -* update faq on recommended android version and phones -* add help link inside the app, reference a page on the wiki -* turn on amazon reviews support -* add a tablet layout (with map next to messages) in the android app - -# Completed - -## eink 1.0 - -* DONE check email of reported issues -* DONE turn off vbus driving (in bootloader) -* new battery level sensing -* current draw no good -* DONE: fix backlight -* DONE - USB is busted because of power enable mode? -* test CPU voltage? something is bad with RAM (removing eink module does not help) -* test that board leaves bootloader always -* test USB - works in bootloader -* test LEDs -* Test BME280 -* test gps -* check GPS fast locking -* tested! dlora -* test eink backlight -* tested! eink -* test buttons -* test battery charging -* test serial flash -* send updated app and bootloader image -* OHH BME280! THAT IS GREAT! -* make new screen work, ask for datasheet -* say I think you could ship this -* leds seem busted -* fix hw_model: "nrf52unknown" -* use larger icon for meshtastic logo -* send email about variants & faster flash programming - https://github.com/geeksville/Meshtastic-esp32/commit/f110225173a77326aac029321cdb6491bfa640f6 -* send PR for bootloader -* fix nrf52 time/date -* send new master bin file -* send email about low power mode problems -* support new flash chip in appload, possibly use low power mode -* swbug! stuck busy tx occurred! - -# Old docs to merge - -MESH RADIO PROTOCOL - -Old TODO notes on the mesh radio protocol, merge into real docs someday... - -for each named group we have a pre-shared key known by all group members and -wrapped around the device. you can only be in one group at a time (FIXME?!) To -join the group we read a qr code with the preshared key and ParamsCodeEnum. that -gets sent via bluetooth to the device. ParamsCodeEnum maps to a set of various -radio params (regulatory region, center freq, SF, bandwidth, bitrate, power -etc...) so all members of the mesh can have their radios set the same way. - -once in that group, we can talk between 254 node numbers. -to get our node number (and announce our presence in the channel) we pick a -random node number and broadcast as that node with WANT-NODENUM(my globally -unique name). If anyone on the channel has seen someone _else_ using that name -within the last 24 hrs(?) they reply with DENY-NODENUM. Note: we might receive -multiple denies. Note: this allows others to speak up for some other node that -might be saving battery right now. Any time we hear from another node (for any -message type), we add that node number to the unpickable list. To dramatically -decrease the odds a node number we request is already used by someone. If no one -denies within TBD seconds, we assume that we have that node number. As long as -we keep talking to folks at least once every 24 hrs, others should remember we -have it. - -Once we have a node number we can broadcast POSITION-UPDATE(my globally unique -name, lat, lon, alt, amt battery remaining). All receivers will use this to a) -update the mapping of who is at what node nums, b) the time of last rx, c) -position. If we haven't heard from that node in a while we reply to that node -(only) with our current POSITION_UPDATE state - so that node (presumably just -rejoined the network) can build a map of all participants. - -We will periodically broadcast POSITION-UPDATE as needed based on distance moved -or a periodic minimum heartbeat. - -If user wants to send a text they can SEND_TEXT(dest user, short text message). -Dest user is a node number, or 0xff for broadcast. - -# Medium priority - -Items to complete before 1.0. - -# Post 1.0 ideas - -- finish DSR for unicast -- check fcc rules on duty cycle. we might not need to freq hop. https://www.sunfiretesting.com/LoRa-FCC-Certification-Guide/ . Might need to add enforcement for europe though. -- make a no bluetooth configured yet screen - include this screen in the loop if the user hasn't yet paired -- if radio params change fundamentally, discard the nodedb -- re-enable the bluetooth battery level service on the T-BEAM -- provide generalized (but slow) internet message forwarding service if one of our nodes has internet connectivity (MQTT) [ Not a requirement but a personal interest ] - -# Low priority ideas - -Items after the first final candidate release. - -- implement nimble battery level service -- Nimble implement device info service remaining fields (hw version etc) -- Turn on RPA addresses for the device side in Nimble -- Try to teardown less of the Nimble protocol stack across sleep -- dynamic frequency scaling could save a lot of power on ESP32, but it seems to corrupt uart (even with ref_tick set correctly) -- Change back to using a fixed sized MemoryPool rather than MemoryDynamic (see bug #149) -- scan to find channels with low background noise? (Use CAD mode of the RF95 to automatically find low noise channels) -- If the phone doesn't read fromradio mailbox within X seconds, assume the phone is gone and we can stop queing location msgs - for it (because it will redownload the nodedb when it comes back) -- add frequency hopping, dependent on the gps time, make the switch moment far from the time anyone is going to be transmitting -- assign every "channel" a random shared 8 bit sync word (per 4.2.13.6 of datasheet) - use that word to filter packets before even checking CRC. This will ensure our CPU will only wake for packets on our "channel" -- the BLE stack is leaking about 200 bytes each time we go to light sleep -- use fuse bits to store the board type and region. So one load can be used on all boards -- Don't store position packets in the to phone fifo if we are disconnected. The phone will get that info for 'free' when it - fetches the fresh nodedb. -- Use the RFM95 sequencer to stay in idle mode most of the time, then automatically go to receive mode and automatically go from transmit to receive mode. See 4.2.8.2 of manual. -- Use fixed32 for node IDs, packetIDs, successid, failid, and lat/lon - will require all nodes to be updated, but make messages slightly smaller. -- add "store and forward" support for messages, or move to the DB sync model. This would allow messages to be eventually delivered even if nodes are out of contact at the moment. -- use variable length Strings in protobufs (instead of current fixed buffers). This would save lots of RAM -- use BLEDevice::setPower to lower our BLE transmit power - extra range doesn't help us, it costs amps and it increases snoopability -- make a Ham build: just a new frequency list, a bool to say 'never do encryption' and use the callsign as that node's unique id. -from Girts -- don't forward redundant pings or ping responses to the phone, it just wastes phone battery -- don't send location packets if we haven't moved significantly -- scrub default radio config settings for bandwidth/range/speed -- show radio and gps signal strength as an image -- only BLE advertise for a short time after the screen is on and button pressed - to save power and prevent people for sniffing for our BT app. -- make mesh aware network timing state machine (sync wake windows to gps time) - this can save LOTS of battery -- split out the software update utility so other projects can use it. Have the appload specify the URL for downloads. -- read the PMU battery fault indicators and blink/led/warn user on screen -- discard very old nodedb records (> 1wk) -- handle millis() rollover in GPS.getTime - otherwise we will break after 50 days -- report esp32 device code bugs back to the mothership via android -- change BLE bonding to something more secure. see comment by pSecurity->setAuthenticationMode(ESP_LE_AUTH_BOND) - -Changes related to wifi support on ESP32: - -- iram space: https://esp32.com/viewtopic.php?t=8460 -- set https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/external-ram.html spi ram bss -- figure out if iram or bluetooth classic caused ble problems -- post bug on esp32-arduino with BLE bug findings - -# Spinoff project ideas - -- an open source version of https://www.burnair.ch/skynet/ -- a paragliding app like http://airwhere.co.uk/ -- How do avalanche beacons work? Could this do that as well? possibly by using beacon mode feature of the RF95? diff --git a/geeksville-private/bl602.md b/geeksville-private/bl602.md deleted file mode 100644 index 6f42f4c66..000000000 --- a/geeksville-private/bl602.md +++ /dev/null @@ -1,25 +0,0 @@ - -* nutcracker https://www.pine64.org/2020/10/28/nutcracker-challenge-blob-free-wifi-ble/ -* https://github.com/pine64/bl_iot_sdk -* https://github.com/pine64/bl602-docs / https://pine64.github.io/bl602-docs/ -* https://github.com/pine64/ArduinoCore-bouffalo - - -cd ~/packages -git clone --recursive https://github.com/pine64/bl_iot_sdk - -https://github.com/spacemeowx2/blflash/releases - - -# FIXME or BL604 -cd bl_iot_sdk -export BL60X_SDK_PATH=/home/kevinh/packages/bl_iot_sdk -export CONFIG_CHIP_NAME=BL602 -cd customer_app/bl602_boot2 -make - -* todo run hello world on hardware (check for bl604 vs bl602 first) -* build/run in the crummy arduino environment -* build in platformio - -https://lupyuen.github.io/articles/lorawan2 diff --git a/geeksville-private/pine64.md b/geeksville-private/pine64.md deleted file mode 100644 index 86691277a..000000000 --- a/geeksville-private/pine64.md +++ /dev/null @@ -1,51 +0,0 @@ -# Notes on the pine64 lora board - -like before but sx1262 based? - -Since both DIO3 and DIO2 not apply to PINE64 LoRa situation, I will wire SX1262 INT [DIO1] pin, contact to CS341F pin 7 INT# and pin 5. - -FIX ch341 GPIO access from linux -RF95 packet RX seems busted FIX FIRST - -USE ch341 devboard if needed - -SX1262 BUSY seems to come out on pin 15 of the RFM90 HOPE module. The 'footprint' seems rotated on the pine64 board schematic and that becomes pin 7 on U4 which is "DIO5" on that schematic. Which goes to pin 8 on the CH341F, which that datasheet calls "IN3" - -FIXME - see if possible to read BUSY from "IN3"? - -on a ch341a - * - Pin 15 (D0/CS0 ) as input/output/CS (CH341_PIN_MODE_IN/CH341_PIN_MODE_OUT/CH341_PIN_MODE_CS) (confirm hooked to CS) - * - Pin 16 (D1/CS1 ) as input/output/CS (CH341_PIN_MODE_IN/CH341_PIN_MODE_OUT/CH341_PIN_MODE_CS) - * - Pin 17 (D2/CS2 ) as input/output/CS (CH341_PIN_MODE_IN/CH341_PIN_MODE_OUT/CH341_PIN_MODE_CS) - * - Pin 19 (D4/DOUT2) as input/output (CH341_PIN_MODE_IN/CH341_PIN_MODE_OUT) / gpio4 in linux driver / (FIXME: confirm hooked to IRQ also?) - * - Pin 21 (D6/DIN2 ) as input (CH341_PIN_MODE_IN) / called RTS when in UART mode - -## ch341-driver - -driver busted in 5.11 kernels (rf95 init fails). 5.8.0 is okay, 5.8.18 is okay. fails on 5.10.31, 5.9.16 is okay. Therefore breakage happened in 5.10 kernels! Possibly not really breakage, possibly just sloppy caching or something that is more easily caught with modern threading. - -cs_change is not being set on the way into the driver! - -## gpio - -the new GPIO interface https://embeddedbits.org/new-linux-kernel-gpio-user-space-interface/ - -~/development/meshtastic/meshtastic-esp32$ gpiodetect -gpiochip0 [INT34BB:00] (312 lines) -gpiochip1 [ch341] (2 lines) -~/development/meshtastic/meshtastic-esp32$ gpioinfo 1 -gpiochip1 - 2 lines: - line 0: "gpio4" unused input active-high - line 1: "gpio5" unused input active-high -gpiofind gpio4 -gpiochip1 0 - -DO NOT "apt install libgpiod-dev" It doesn't work with kernels newer than about 5.8. Instead build and install from source: https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/ - -## Send in patch -Fix drivers/spi/spi.c transfer_once - -read about spi: https://elinux.org/images/2/20/Whats_going_on_with_SPI--mark_brown.pdf - -https://www.kernel.org/doc/html/v4.17/process/submitting-patches.html -git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git \ No newline at end of file diff --git a/lib/BluetoothOTA/library.json b/lib/BluetoothOTA/library.json deleted file mode 100644 index 6f700e03b..000000000 --- a/lib/BluetoothOTA/library.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "BluetoothOTA", - "keywords": "esp32, bluetooth", - "description": "A BTLE based software OTA update tool", - "repository": { - "type": "git", - "url": "https://github.com/geeksville/fixme.git" - }, - "authors": [ - { - "name": "Kevin Hester", - "email": "kevinh@geeksville.com", - "url": "https://github.com/geeksville", - "maintainer": true - } - ], - "version": "0.0.1", - "frameworks": "arduino", - "platforms": "*", - "dependencies": [ - { - "name": "Update" - }, - { - "name": "ESP32 BLE Arduino" - }, - { - "name": "arduino-fsm", - "version": "https://github.com/meshtastic/arduino-fsm.git" - } - ] -} \ No newline at end of file diff --git a/lib/nanopb/include/pb.h b/lib/nanopb/include/pb.h deleted file mode 100644 index a9cd9df98..000000000 --- a/lib/nanopb/include/pb.h +++ /dev/null @@ -1,878 +0,0 @@ -/* Common parts of the nanopb library. Most of these are quite low-level - * stuff. For the high-level interface, see pb_encode.h and pb_decode.h. - */ - -#ifndef PB_H_INCLUDED -#define PB_H_INCLUDED - -/***************************************************************** - * Nanopb compilation time options. You can change these here by * - * uncommenting the lines, or on the compiler command line. * - *****************************************************************/ - -/* Enable support for dynamically allocated fields */ -#define PB_ENABLE_MALLOC 1 - -/* Define this if your CPU / compiler combination does not support - * unaligned memory access to packed structures. */ -/* #define PB_NO_PACKED_STRUCTS 1 */ - -/* Increase the number of required fields that are tracked. - * A compiler warning will tell if you need this. */ -/* #define PB_MAX_REQUIRED_FIELDS 256 */ - -/* Add support for tag numbers > 65536 and fields larger than 65536 bytes. */ -/* #define PB_FIELD_32BIT 1 */ - -/* Disable support for error messages in order to save some code space. */ -/* #define PB_NO_ERRMSG 1 */ - -/* Disable support for custom streams (support only memory buffers). */ -/* #define PB_BUFFER_ONLY 1 */ - -/* Disable support for 64-bit datatypes, for compilers without int64_t - or to save some code space. */ -/* #define PB_WITHOUT_64BIT 1 */ - -/* Don't encode scalar arrays as packed. This is only to be used when - * the decoder on the receiving side cannot process packed scalar arrays. - * Such example is older protobuf.js. */ -/* #define PB_ENCODE_ARRAYS_UNPACKED 1 */ - -/* Enable conversion of doubles to floats for platforms that do not - * support 64-bit doubles. Most commonly AVR. */ -/* #define PB_CONVERT_DOUBLE_FLOAT 1 */ - -/* Check whether incoming strings are valid UTF-8 sequences. Slows down - * the string processing slightly and slightly increases code size. */ -/* #define PB_VALIDATE_UTF8 1 */ - -/****************************************************************** - * You usually don't need to change anything below this line. * - * Feel free to look around and use the defined macros, though. * - ******************************************************************/ - -/* Version of the nanopb library. Just in case you want to check it in - * your own program. */ -#define NANOPB_VERSION nanopb - 0.4.4 - -/* Include all the system headers needed by nanopb. You will need the - * definitions of the following: - * - strlen, memcpy, memset functions - * - [u]int_least8_t, uint_fast8_t, [u]int_least16_t, [u]int32_t, [u]int64_t - * - size_t - * - bool - * - * If you don't have the standard header files, you can instead provide - * a custom header that defines or includes all this. In that case, - * define PB_SYSTEM_HEADER to the path of this file. - */ -#ifdef PB_SYSTEM_HEADER -#include PB_SYSTEM_HEADER -#else -#include -#include -#include -#include -#include - -#ifdef PB_ENABLE_MALLOC -#include -#endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* Macro for defining packed structures (compiler dependent). - * This just reduces memory requirements, but is not required. - */ -#if defined(PB_NO_PACKED_STRUCTS) -/* Disable struct packing */ -#define PB_PACKED_STRUCT_START -#define PB_PACKED_STRUCT_END -#define pb_packed -#elif defined(__GNUC__) || defined(__clang__) -/* For GCC and clang */ -#define PB_PACKED_STRUCT_START -#define PB_PACKED_STRUCT_END -#define pb_packed __attribute__((packed)) -#elif defined(__ICCARM__) || defined(__CC_ARM) -/* For IAR ARM and Keil MDK-ARM compilers */ -#define PB_PACKED_STRUCT_START _Pragma("pack(push, 1)") -#define PB_PACKED_STRUCT_END _Pragma("pack(pop)") -#define pb_packed -#elif defined(_MSC_VER) && (_MSC_VER >= 1500) -/* For Microsoft Visual C++ */ -#define PB_PACKED_STRUCT_START __pragma(pack(push, 1)) -#define PB_PACKED_STRUCT_END __pragma(pack(pop)) -#define pb_packed -#else -/* Unknown compiler */ -#define PB_PACKED_STRUCT_START -#define PB_PACKED_STRUCT_END -#define pb_packed -#endif - -/* Handly macro for suppressing unreferenced-parameter compiler warnings. */ -#ifndef PB_UNUSED -#define PB_UNUSED(x) (void)(x) -#endif - -/* Harvard-architecture processors may need special attributes for storing - * field information in program memory. */ -#ifndef PB_PROGMEM -#ifdef __AVR__ -#include -#define PB_PROGMEM PROGMEM -#define PB_PROGMEM_READU32(x) pgm_read_dword(&x) -#else -#define PB_PROGMEM -#define PB_PROGMEM_READU32(x) (x) -#endif -#endif - -/* Compile-time assertion, used for checking compatible compilation options. - * If this does not work properly on your compiler, use - * #define PB_NO_STATIC_ASSERT to disable it. - * - * But before doing that, check carefully the error message / place where it - * comes from to see if the error has a real cause. Unfortunately the error - * message is not always very clear to read, but you can see the reason better - * in the place where the PB_STATIC_ASSERT macro was called. - */ -#ifndef PB_NO_STATIC_ASSERT -#ifndef PB_STATIC_ASSERT -#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L -/* C11 standard _Static_assert mechanism */ -#define PB_STATIC_ASSERT(COND, MSG) _Static_assert(COND, #MSG); -#else -/* Classic negative-size-array static assert mechanism */ -#define PB_STATIC_ASSERT(COND, MSG) typedef char PB_STATIC_ASSERT_MSG(MSG, __LINE__, __COUNTER__)[(COND) ? 1 : -1]; -#define PB_STATIC_ASSERT_MSG(MSG, LINE, COUNTER) PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER) -#define PB_STATIC_ASSERT_MSG_(MSG, LINE, COUNTER) pb_static_assertion_##MSG##_##LINE##_##COUNTER -#endif -#endif -#else -/* Static asserts disabled by PB_NO_STATIC_ASSERT */ -#define PB_STATIC_ASSERT(COND, MSG) -#endif - -/* Number of required fields to keep track of. */ -#ifndef PB_MAX_REQUIRED_FIELDS -#define PB_MAX_REQUIRED_FIELDS 64 -#endif - -#if PB_MAX_REQUIRED_FIELDS < 64 -#error You should not lower PB_MAX_REQUIRED_FIELDS from the default value (64). -#endif - -#ifdef PB_WITHOUT_64BIT -#ifdef PB_CONVERT_DOUBLE_FLOAT -/* Cannot use doubles without 64-bit types */ -#undef PB_CONVERT_DOUBLE_FLOAT -#endif -#endif - -/* List of possible field types. These are used in the autogenerated code. - * Least-significant 4 bits tell the scalar type - * Most-significant 4 bits specify repeated/required/packed etc. - */ - -typedef uint_least8_t pb_type_t; - -/**** Field data types ****/ - -/* Numeric types */ -#define PB_LTYPE_BOOL 0x00U /* bool */ -#define PB_LTYPE_VARINT 0x01U /* int32, int64, enum, bool */ -#define PB_LTYPE_UVARINT 0x02U /* uint32, uint64 */ -#define PB_LTYPE_SVARINT 0x03U /* sint32, sint64 */ -#define PB_LTYPE_FIXED32 0x04U /* fixed32, sfixed32, float */ -#define PB_LTYPE_FIXED64 0x05U /* fixed64, sfixed64, double */ - -/* Marker for last packable field type. */ -#define PB_LTYPE_LAST_PACKABLE 0x05U - -/* Byte array with pre-allocated buffer. - * data_size is the length of the allocated PB_BYTES_ARRAY structure. */ -#define PB_LTYPE_BYTES 0x06U - -/* String with pre-allocated buffer. - * data_size is the maximum length. */ -#define PB_LTYPE_STRING 0x07U - -/* Submessage - * submsg_fields is pointer to field descriptions */ -#define PB_LTYPE_SUBMESSAGE 0x08U - -/* Submessage with pre-decoding callback - * The pre-decoding callback is stored as pb_callback_t right before pSize. - * submsg_fields is pointer to field descriptions */ -#define PB_LTYPE_SUBMSG_W_CB 0x09U - -/* Extension pseudo-field - * The field contains a pointer to pb_extension_t */ -#define PB_LTYPE_EXTENSION 0x0AU - -/* Byte array with inline, pre-allocated byffer. - * data_size is the length of the inline, allocated buffer. - * This differs from PB_LTYPE_BYTES by defining the element as - * pb_byte_t[data_size] rather than pb_bytes_array_t. */ -#define PB_LTYPE_FIXED_LENGTH_BYTES 0x0BU - -/* Number of declared LTYPES */ -#define PB_LTYPES_COUNT 0x0CU -#define PB_LTYPE_MASK 0x0FU - -/**** Field repetition rules ****/ - -#define PB_HTYPE_REQUIRED 0x00U -#define PB_HTYPE_OPTIONAL 0x10U -#define PB_HTYPE_SINGULAR 0x10U -#define PB_HTYPE_REPEATED 0x20U -#define PB_HTYPE_FIXARRAY 0x20U -#define PB_HTYPE_ONEOF 0x30U -#define PB_HTYPE_MASK 0x30U - -/**** Field allocation types ****/ - -#define PB_ATYPE_STATIC 0x00U -#define PB_ATYPE_POINTER 0x80U -#define PB_ATYPE_CALLBACK 0x40U -#define PB_ATYPE_MASK 0xC0U - -#define PB_ATYPE(x) ((x)&PB_ATYPE_MASK) -#define PB_HTYPE(x) ((x)&PB_HTYPE_MASK) -#define PB_LTYPE(x) ((x)&PB_LTYPE_MASK) -#define PB_LTYPE_IS_SUBMSG(x) (PB_LTYPE(x) == PB_LTYPE_SUBMESSAGE || PB_LTYPE(x) == PB_LTYPE_SUBMSG_W_CB) - -/* Data type used for storing sizes of struct fields - * and array counts. - */ -#if defined(PB_FIELD_32BIT) -typedef uint32_t pb_size_t; -typedef int32_t pb_ssize_t; -#else -typedef uint_least16_t pb_size_t; -typedef int_least16_t pb_ssize_t; -#endif -#define PB_SIZE_MAX ((pb_size_t)-1) - -/* Data type for storing encoded data and other byte streams. - * This typedef exists to support platforms where uint8_t does not exist. - * You can regard it as equivalent on uint8_t on other platforms. - */ -typedef uint_least8_t pb_byte_t; - -/* Forward declaration of struct types */ -typedef struct pb_istream_s pb_istream_t; -typedef struct pb_ostream_s pb_ostream_t; -typedef struct pb_field_iter_s pb_field_iter_t; - -/* This structure is used in auto-generated constants - * to specify struct fields. - */ -typedef struct pb_msgdesc_s pb_msgdesc_t; -struct pb_msgdesc_s { - const uint32_t *field_info; - const pb_msgdesc_t *const *submsg_info; - const pb_byte_t *default_value; - - bool (*field_callback)(pb_istream_t *istream, pb_ostream_t *ostream, const pb_field_iter_t *field); - - pb_size_t field_count; - pb_size_t required_field_count; - pb_size_t largest_tag; -}; - -/* Iterator for message descriptor */ -struct pb_field_iter_s { - const pb_msgdesc_t *descriptor; /* Pointer to message descriptor constant */ - void *message; /* Pointer to start of the structure */ - - pb_size_t index; /* Index of the field */ - pb_size_t field_info_index; /* Index to descriptor->field_info array */ - pb_size_t required_field_index; /* Index that counts only the required fields */ - pb_size_t submessage_index; /* Index that counts only submessages */ - - pb_size_t tag; /* Tag of current field */ - pb_size_t data_size; /* sizeof() of a single item */ - pb_size_t array_size; /* Number of array entries */ - pb_type_t type; /* Type of current field */ - - void *pField; /* Pointer to current field in struct */ - void *pData; /* Pointer to current data contents. Different than pField for arrays and pointers. */ - void *pSize; /* Pointer to count/has field */ - - const pb_msgdesc_t *submsg_desc; /* For submessage fields, pointer to field descriptor for the submessage. */ -}; - -/* For compatibility with legacy code */ -typedef pb_field_iter_t pb_field_t; - -/* Make sure that the standard integer types are of the expected sizes. - * Otherwise fixed32/fixed64 fields can break. - * - * If you get errors here, it probably means that your stdint.h is not - * correct for your platform. - */ -#ifndef PB_WITHOUT_64BIT -PB_STATIC_ASSERT(sizeof(int64_t) == 2 * sizeof(int32_t), INT64_T_WRONG_SIZE) -PB_STATIC_ASSERT(sizeof(uint64_t) == 2 * sizeof(uint32_t), UINT64_T_WRONG_SIZE) -#endif - -/* This structure is used for 'bytes' arrays. - * It has the number of bytes in the beginning, and after that an array. - * Note that actual structs used will have a different length of bytes array. - */ -#define PB_BYTES_ARRAY_T(n) \ - struct { \ - pb_size_t size; \ - pb_byte_t bytes[n]; \ - } -#define PB_BYTES_ARRAY_T_ALLOCSIZE(n) ((size_t)n + offsetof(pb_bytes_array_t, bytes)) - -struct pb_bytes_array_s { - pb_size_t size; - pb_byte_t bytes[1]; -}; -typedef struct pb_bytes_array_s pb_bytes_array_t; - -/* This structure is used for giving the callback function. - * It is stored in the message structure and filled in by the method that - * calls pb_decode. - * - * The decoding callback will be given a limited-length stream - * If the wire type was string, the length is the length of the string. - * If the wire type was a varint/fixed32/fixed64, the length is the length - * of the actual value. - * The function may be called multiple times (especially for repeated types, - * but also otherwise if the message happens to contain the field multiple - * times.) - * - * The encoding callback will receive the actual output stream. - * It should write all the data in one call, including the field tag and - * wire type. It can write multiple fields. - * - * The callback can be null if you want to skip a field. - */ -typedef struct pb_callback_s pb_callback_t; -struct pb_callback_s { - /* Callback functions receive a pointer to the arg field. - * You can access the value of the field as *arg, and modify it if needed. - */ - union { - bool (*decode)(pb_istream_t *stream, const pb_field_t *field, void **arg); - bool (*encode)(pb_ostream_t *stream, const pb_field_t *field, void *const *arg); - } funcs; - - /* Free arg for use by callback */ - void *arg; -}; - -extern bool pb_default_field_callback(pb_istream_t *istream, pb_ostream_t *ostream, const pb_field_t *field); - -/* Wire types. Library user needs these only in encoder callbacks. */ -typedef enum { PB_WT_VARINT = 0, PB_WT_64BIT = 1, PB_WT_STRING = 2, PB_WT_32BIT = 5 } pb_wire_type_t; - -/* Structure for defining the handling of unknown/extension fields. - * Usually the pb_extension_type_t structure is automatically generated, - * while the pb_extension_t structure is created by the user. However, - * if you want to catch all unknown fields, you can also create a custom - * pb_extension_type_t with your own callback. - */ -typedef struct pb_extension_type_s pb_extension_type_t; -typedef struct pb_extension_s pb_extension_t; -struct pb_extension_type_s { - /* Called for each unknown field in the message. - * If you handle the field, read off all of its data and return true. - * If you do not handle the field, do not read anything and return true. - * If you run into an error, return false. - * Set to NULL for default handler. - */ - bool (*decode)(pb_istream_t *stream, pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type); - - /* Called once after all regular fields have been encoded. - * If you have something to write, do so and return true. - * If you do not have anything to write, just return true. - * If you run into an error, return false. - * Set to NULL for default handler. - */ - bool (*encode)(pb_ostream_t *stream, const pb_extension_t *extension); - - /* Free field for use by the callback. */ - const void *arg; -}; - -struct pb_extension_s { - /* Type describing the extension field. Usually you'll initialize - * this to a pointer to the automatically generated structure. */ - const pb_extension_type_t *type; - - /* Destination for the decoded data. This must match the datatype - * of the extension field. */ - void *dest; - - /* Pointer to the next extension handler, or NULL. - * If this extension does not match a field, the next handler is - * automatically called. */ - pb_extension_t *next; - - /* The decoder sets this to true if the extension was found. - * Ignored for encoding. */ - bool found; -}; - -#define pb_extension_init_zero \ - { \ - NULL, NULL, NULL, false \ - } - -/* Memory allocation functions to use. You can define pb_realloc and - * pb_free to custom functions if you want. */ -#ifdef PB_ENABLE_MALLOC -#ifndef pb_realloc -#define pb_realloc(ptr, size) realloc(ptr, size) -#endif -#ifndef pb_free -#define pb_free(ptr) free(ptr) -#endif -#endif - -/* This is used to inform about need to regenerate .pb.h/.pb.c files. */ -#define PB_PROTO_HEADER_VERSION 40 - -/* These macros are used to declare pb_field_t's in the constant array. */ -/* Size of a structure member, in bytes. */ -#define pb_membersize(st, m) (sizeof((st *)0)->m) -/* Number of entries in an array. */ -#define pb_arraysize(st, m) (pb_membersize(st, m) / pb_membersize(st, m[0])) -/* Delta from start of one member to the start of another member. */ -#define pb_delta(st, m1, m2) ((int)offsetof(st, m1) - (int)offsetof(st, m2)) - -/* Force expansion of macro value */ -#define PB_EXPAND(x) x - -/* Binding of a message field set into a specific structure */ -#define PB_BIND(msgname, structname, width) \ - const uint32_t structname##_field_info[] PB_PROGMEM = {msgname##_FIELDLIST(PB_GEN_FIELD_INFO_##width, structname) 0}; \ - const pb_msgdesc_t *const structname##_submsg_info[] = {msgname##_FIELDLIST(PB_GEN_SUBMSG_INFO, structname) NULL}; \ - const pb_msgdesc_t structname##_msg = { \ - structname##_field_info, \ - structname##_submsg_info, \ - msgname##_DEFAULT, \ - msgname##_CALLBACK, \ - 0 msgname##_FIELDLIST(PB_GEN_FIELD_COUNT, structname), \ - 0 msgname##_FIELDLIST(PB_GEN_REQ_FIELD_COUNT, structname), \ - 0 msgname##_FIELDLIST(PB_GEN_LARGEST_TAG, structname), \ - }; \ - msgname##_FIELDLIST(PB_GEN_FIELD_INFO_ASSERT_##width, structname) - -#define PB_GEN_FIELD_COUNT(structname, atype, htype, ltype, fieldname, tag) +1 -#define PB_GEN_REQ_FIELD_COUNT(structname, atype, htype, ltype, fieldname, tag) +(PB_HTYPE_##htype == PB_HTYPE_REQUIRED) -#define PB_GEN_LARGEST_TAG(structname, atype, htype, ltype, fieldname, tag) *0 + tag - -/* X-macro for generating the entries in struct_field_info[] array. */ -#define PB_GEN_FIELD_INFO_1(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_1(tag, PB_ATYPE_##atype | PB_HTYPE_##htype | PB_LTYPE_MAP_##ltype, \ - PB_DATA_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_DATA_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_SIZE_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_ARRAY_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname)) - -#define PB_GEN_FIELD_INFO_2(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_2(tag, PB_ATYPE_##atype | PB_HTYPE_##htype | PB_LTYPE_MAP_##ltype, \ - PB_DATA_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_DATA_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_SIZE_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_ARRAY_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname)) - -#define PB_GEN_FIELD_INFO_4(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_4(tag, PB_ATYPE_##atype | PB_HTYPE_##htype | PB_LTYPE_MAP_##ltype, \ - PB_DATA_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_DATA_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_SIZE_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_ARRAY_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname)) - -#define PB_GEN_FIELD_INFO_8(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_8(tag, PB_ATYPE_##atype | PB_HTYPE_##htype | PB_LTYPE_MAP_##ltype, \ - PB_DATA_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_DATA_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_SIZE_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_ARRAY_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname)) - -#define PB_GEN_FIELD_INFO_AUTO(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_AUTO2(PB_FIELDINFO_WIDTH_AUTO(_PB_ATYPE_##atype, _PB_HTYPE_##htype, _PB_LTYPE_##ltype), tag, \ - PB_ATYPE_##atype | PB_HTYPE_##htype | PB_LTYPE_MAP_##ltype, \ - PB_DATA_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_DATA_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_SIZE_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_ARRAY_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname)) - -#define PB_FIELDINFO_AUTO2(width, tag, type, data_offset, data_size, size_offset, array_size) \ - PB_FIELDINFO_AUTO3(width, tag, type, data_offset, data_size, size_offset, array_size) - -#define PB_FIELDINFO_AUTO3(width, tag, type, data_offset, data_size, size_offset, array_size) \ - PB_FIELDINFO_##width(tag, type, data_offset, data_size, size_offset, array_size) - -/* X-macro for generating asserts that entries fit in struct_field_info[] array. - * The structure of macros here must match the structure above in PB_GEN_FIELD_INFO_x(), - * but it is not easily reused because of how macro substitutions work. */ -#define PB_GEN_FIELD_INFO_ASSERT_1(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_ASSERT_1(tag, PB_ATYPE_##atype | PB_HTYPE_##htype | PB_LTYPE_MAP_##ltype, \ - PB_DATA_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_DATA_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_SIZE_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_ARRAY_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname)) - -#define PB_GEN_FIELD_INFO_ASSERT_2(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_ASSERT_2(tag, PB_ATYPE_##atype | PB_HTYPE_##htype | PB_LTYPE_MAP_##ltype, \ - PB_DATA_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_DATA_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_SIZE_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_ARRAY_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname)) - -#define PB_GEN_FIELD_INFO_ASSERT_4(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_ASSERT_4(tag, PB_ATYPE_##atype | PB_HTYPE_##htype | PB_LTYPE_MAP_##ltype, \ - PB_DATA_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_DATA_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_SIZE_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_ARRAY_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname)) - -#define PB_GEN_FIELD_INFO_ASSERT_8(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_ASSERT_8(tag, PB_ATYPE_##atype | PB_HTYPE_##htype | PB_LTYPE_MAP_##ltype, \ - PB_DATA_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_DATA_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_SIZE_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_ARRAY_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname)) - -#define PB_GEN_FIELD_INFO_ASSERT_AUTO(structname, atype, htype, ltype, fieldname, tag) \ - PB_FIELDINFO_ASSERT_AUTO2(PB_FIELDINFO_WIDTH_AUTO(_PB_ATYPE_##atype, _PB_HTYPE_##htype, _PB_LTYPE_##ltype), tag, \ - PB_ATYPE_##atype | PB_HTYPE_##htype | PB_LTYPE_MAP_##ltype, \ - PB_DATA_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_DATA_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_SIZE_OFFSET_##atype(_PB_HTYPE_##htype, structname, fieldname), \ - PB_ARRAY_SIZE_##atype(_PB_HTYPE_##htype, structname, fieldname)) - -#define PB_FIELDINFO_ASSERT_AUTO2(width, tag, type, data_offset, data_size, size_offset, array_size) \ - PB_FIELDINFO_ASSERT_AUTO3(width, tag, type, data_offset, data_size, size_offset, array_size) - -#define PB_FIELDINFO_ASSERT_AUTO3(width, tag, type, data_offset, data_size, size_offset, array_size) \ - PB_FIELDINFO_ASSERT_##width(tag, type, data_offset, data_size, size_offset, array_size) - -#define PB_DATA_OFFSET_STATIC(htype, structname, fieldname) PB_DO##htype(structname, fieldname) -#define PB_DATA_OFFSET_POINTER(htype, structname, fieldname) PB_DO##htype(structname, fieldname) -#define PB_DATA_OFFSET_CALLBACK(htype, structname, fieldname) PB_DO##htype(structname, fieldname) -#define PB_DO_PB_HTYPE_REQUIRED(structname, fieldname) offsetof(structname, fieldname) -#define PB_DO_PB_HTYPE_SINGULAR(structname, fieldname) offsetof(structname, fieldname) -#define PB_DO_PB_HTYPE_ONEOF(structname, fieldname) offsetof(structname, PB_ONEOF_NAME(FULL, fieldname)) -#define PB_DO_PB_HTYPE_OPTIONAL(structname, fieldname) offsetof(structname, fieldname) -#define PB_DO_PB_HTYPE_REPEATED(structname, fieldname) offsetof(structname, fieldname) -#define PB_DO_PB_HTYPE_FIXARRAY(structname, fieldname) offsetof(structname, fieldname) - -#define PB_SIZE_OFFSET_STATIC(htype, structname, fieldname) PB_SO##htype(structname, fieldname) -#define PB_SIZE_OFFSET_POINTER(htype, structname, fieldname) PB_SO_PTR##htype(structname, fieldname) -#define PB_SIZE_OFFSET_CALLBACK(htype, structname, fieldname) PB_SO_CB##htype(structname, fieldname) -#define PB_SO_PB_HTYPE_REQUIRED(structname, fieldname) 0 -#define PB_SO_PB_HTYPE_SINGULAR(structname, fieldname) 0 -#define PB_SO_PB_HTYPE_ONEOF(structname, fieldname) \ - PB_SO_PB_HTYPE_ONEOF2(structname, PB_ONEOF_NAME(FULL, fieldname), PB_ONEOF_NAME(UNION, fieldname)) -#define PB_SO_PB_HTYPE_ONEOF2(structname, fullname, unionname) PB_SO_PB_HTYPE_ONEOF3(structname, fullname, unionname) -#define PB_SO_PB_HTYPE_ONEOF3(structname, fullname, unionname) pb_delta(structname, fullname, which_##unionname) -#define PB_SO_PB_HTYPE_OPTIONAL(structname, fieldname) pb_delta(structname, fieldname, has_##fieldname) -#define PB_SO_PB_HTYPE_REPEATED(structname, fieldname) pb_delta(structname, fieldname, fieldname##_count) -#define PB_SO_PB_HTYPE_FIXARRAY(structname, fieldname) 0 -#define PB_SO_PTR_PB_HTYPE_REQUIRED(structname, fieldname) 0 -#define PB_SO_PTR_PB_HTYPE_SINGULAR(structname, fieldname) 0 -#define PB_SO_PTR_PB_HTYPE_ONEOF(structname, fieldname) PB_SO_PB_HTYPE_ONEOF(structname, fieldname) -#define PB_SO_PTR_PB_HTYPE_OPTIONAL(structname, fieldname) 0 -#define PB_SO_PTR_PB_HTYPE_REPEATED(structname, fieldname) PB_SO_PB_HTYPE_REPEATED(structname, fieldname) -#define PB_SO_PTR_PB_HTYPE_FIXARRAY(structname, fieldname) 0 -#define PB_SO_CB_PB_HTYPE_REQUIRED(structname, fieldname) 0 -#define PB_SO_CB_PB_HTYPE_SINGULAR(structname, fieldname) 0 -#define PB_SO_CB_PB_HTYPE_ONEOF(structname, fieldname) PB_SO_PB_HTYPE_ONEOF(structname, fieldname) -#define PB_SO_CB_PB_HTYPE_OPTIONAL(structname, fieldname) 0 -#define PB_SO_CB_PB_HTYPE_REPEATED(structname, fieldname) 0 -#define PB_SO_CB_PB_HTYPE_FIXARRAY(structname, fieldname) 0 - -#define PB_ARRAY_SIZE_STATIC(htype, structname, fieldname) PB_AS##htype(structname, fieldname) -#define PB_ARRAY_SIZE_POINTER(htype, structname, fieldname) PB_AS_PTR##htype(structname, fieldname) -#define PB_ARRAY_SIZE_CALLBACK(htype, structname, fieldname) 1 -#define PB_AS_PB_HTYPE_REQUIRED(structname, fieldname) 1 -#define PB_AS_PB_HTYPE_SINGULAR(structname, fieldname) 1 -#define PB_AS_PB_HTYPE_OPTIONAL(structname, fieldname) 1 -#define PB_AS_PB_HTYPE_ONEOF(structname, fieldname) 1 -#define PB_AS_PB_HTYPE_REPEATED(structname, fieldname) pb_arraysize(structname, fieldname) -#define PB_AS_PB_HTYPE_FIXARRAY(structname, fieldname) pb_arraysize(structname, fieldname) -#define PB_AS_PTR_PB_HTYPE_REQUIRED(structname, fieldname) 1 -#define PB_AS_PTR_PB_HTYPE_SINGULAR(structname, fieldname) 1 -#define PB_AS_PTR_PB_HTYPE_OPTIONAL(structname, fieldname) 1 -#define PB_AS_PTR_PB_HTYPE_ONEOF(structname, fieldname) 1 -#define PB_AS_PTR_PB_HTYPE_REPEATED(structname, fieldname) 1 -#define PB_AS_PTR_PB_HTYPE_FIXARRAY(structname, fieldname) pb_arraysize(structname, fieldname[0]) - -#define PB_DATA_SIZE_STATIC(htype, structname, fieldname) PB_DS##htype(structname, fieldname) -#define PB_DATA_SIZE_POINTER(htype, structname, fieldname) PB_DS_PTR##htype(structname, fieldname) -#define PB_DATA_SIZE_CALLBACK(htype, structname, fieldname) PB_DS_CB##htype(structname, fieldname) -#define PB_DS_PB_HTYPE_REQUIRED(structname, fieldname) pb_membersize(structname, fieldname) -#define PB_DS_PB_HTYPE_SINGULAR(structname, fieldname) pb_membersize(structname, fieldname) -#define PB_DS_PB_HTYPE_OPTIONAL(structname, fieldname) pb_membersize(structname, fieldname) -#define PB_DS_PB_HTYPE_ONEOF(structname, fieldname) pb_membersize(structname, PB_ONEOF_NAME(FULL, fieldname)) -#define PB_DS_PB_HTYPE_REPEATED(structname, fieldname) pb_membersize(structname, fieldname[0]) -#define PB_DS_PB_HTYPE_FIXARRAY(structname, fieldname) pb_membersize(structname, fieldname[0]) -#define PB_DS_PTR_PB_HTYPE_REQUIRED(structname, fieldname) pb_membersize(structname, fieldname[0]) -#define PB_DS_PTR_PB_HTYPE_SINGULAR(structname, fieldname) pb_membersize(structname, fieldname[0]) -#define PB_DS_PTR_PB_HTYPE_OPTIONAL(structname, fieldname) pb_membersize(structname, fieldname[0]) -#define PB_DS_PTR_PB_HTYPE_ONEOF(structname, fieldname) pb_membersize(structname, PB_ONEOF_NAME(FULL, fieldname)[0]) -#define PB_DS_PTR_PB_HTYPE_REPEATED(structname, fieldname) pb_membersize(structname, fieldname[0]) -#define PB_DS_PTR_PB_HTYPE_FIXARRAY(structname, fieldname) pb_membersize(structname, fieldname[0][0]) -#define PB_DS_CB_PB_HTYPE_REQUIRED(structname, fieldname) pb_membersize(structname, fieldname) -#define PB_DS_CB_PB_HTYPE_SINGULAR(structname, fieldname) pb_membersize(structname, fieldname) -#define PB_DS_CB_PB_HTYPE_OPTIONAL(structname, fieldname) pb_membersize(structname, fieldname) -#define PB_DS_CB_PB_HTYPE_ONEOF(structname, fieldname) pb_membersize(structname, PB_ONEOF_NAME(FULL, fieldname)) -#define PB_DS_CB_PB_HTYPE_REPEATED(structname, fieldname) pb_membersize(structname, fieldname) -#define PB_DS_CB_PB_HTYPE_FIXARRAY(structname, fieldname) pb_membersize(structname, fieldname) - -#define PB_ONEOF_NAME(type, tuple) PB_EXPAND(PB_ONEOF_NAME_##type tuple) -#define PB_ONEOF_NAME_UNION(unionname, membername, fullname) unionname -#define PB_ONEOF_NAME_MEMBER(unionname, membername, fullname) membername -#define PB_ONEOF_NAME_FULL(unionname, membername, fullname) fullname - -#define PB_GEN_SUBMSG_INFO(structname, atype, htype, ltype, fieldname, tag) \ - PB_SUBMSG_INFO_##htype(_PB_LTYPE_##ltype, structname, fieldname) - -#define PB_SUBMSG_INFO_REQUIRED(ltype, structname, fieldname) PB_SI##ltype(structname##_##fieldname##_MSGTYPE) -#define PB_SUBMSG_INFO_SINGULAR(ltype, structname, fieldname) PB_SI##ltype(structname##_##fieldname##_MSGTYPE) -#define PB_SUBMSG_INFO_OPTIONAL(ltype, structname, fieldname) PB_SI##ltype(structname##_##fieldname##_MSGTYPE) -#define PB_SUBMSG_INFO_ONEOF(ltype, structname, fieldname) \ - PB_SUBMSG_INFO_ONEOF2(ltype, structname, PB_ONEOF_NAME(UNION, fieldname), PB_ONEOF_NAME(MEMBER, fieldname)) -#define PB_SUBMSG_INFO_ONEOF2(ltype, structname, unionname, membername) \ - PB_SUBMSG_INFO_ONEOF3(ltype, structname, unionname, membername) -#define PB_SUBMSG_INFO_ONEOF3(ltype, structname, unionname, membername) \ - PB_SI##ltype(structname##_##unionname##_##membername##_MSGTYPE) -#define PB_SUBMSG_INFO_REPEATED(ltype, structname, fieldname) PB_SI##ltype(structname##_##fieldname##_MSGTYPE) -#define PB_SUBMSG_INFO_FIXARRAY(ltype, structname, fieldname) PB_SI##ltype(structname##_##fieldname##_MSGTYPE) -#define PB_SI_PB_LTYPE_BOOL(t) -#define PB_SI_PB_LTYPE_BYTES(t) -#define PB_SI_PB_LTYPE_DOUBLE(t) -#define PB_SI_PB_LTYPE_ENUM(t) -#define PB_SI_PB_LTYPE_UENUM(t) -#define PB_SI_PB_LTYPE_FIXED32(t) -#define PB_SI_PB_LTYPE_FIXED64(t) -#define PB_SI_PB_LTYPE_FLOAT(t) -#define PB_SI_PB_LTYPE_INT32(t) -#define PB_SI_PB_LTYPE_INT64(t) -#define PB_SI_PB_LTYPE_MESSAGE(t) PB_SUBMSG_DESCRIPTOR(t) -#define PB_SI_PB_LTYPE_MSG_W_CB(t) PB_SUBMSG_DESCRIPTOR(t) -#define PB_SI_PB_LTYPE_SFIXED32(t) -#define PB_SI_PB_LTYPE_SFIXED64(t) -#define PB_SI_PB_LTYPE_SINT32(t) -#define PB_SI_PB_LTYPE_SINT64(t) -#define PB_SI_PB_LTYPE_STRING(t) -#define PB_SI_PB_LTYPE_UINT32(t) -#define PB_SI_PB_LTYPE_UINT64(t) -#define PB_SI_PB_LTYPE_EXTENSION(t) -#define PB_SI_PB_LTYPE_FIXED_LENGTH_BYTES(t) -#define PB_SUBMSG_DESCRIPTOR(t) &(t##_msg), - -/* The field descriptors use a variable width format, with width of either - * 1, 2, 4 or 8 of 32-bit words. The two lowest bytes of the first byte always - * encode the descriptor size, 6 lowest bits of field tag number, and 8 bits - * of the field type. - * - * Descriptor size is encoded as 0 = 1 word, 1 = 2 words, 2 = 4 words, 3 = 8 words. - * - * Formats, listed starting with the least significant bit of the first word. - * 1 word: [2-bit len] [6-bit tag] [8-bit type] [8-bit data_offset] [4-bit size_offset] [4-bit data_size] - * - * 2 words: [2-bit len] [6-bit tag] [8-bit type] [12-bit array_size] [4-bit size_offset] - * [16-bit data_offset] [12-bit data_size] [4-bit tag>>6] - * - * 4 words: [2-bit len] [6-bit tag] [8-bit type] [16-bit array_size] - * [8-bit size_offset] [24-bit tag>>6] - * [32-bit data_offset] - * [32-bit data_size] - * - * 8 words: [2-bit len] [6-bit tag] [8-bit type] [16-bit reserved] - * [8-bit size_offset] [24-bit tag>>6] - * [32-bit data_offset] - * [32-bit data_size] - * [32-bit array_size] - * [32-bit reserved] - * [32-bit reserved] - * [32-bit reserved] - */ - -#define PB_FIELDINFO_1(tag, type, data_offset, data_size, size_offset, array_size) \ - (0 | (((tag) << 2) & 0xFF) | ((type) << 8) | (((uint32_t)(data_offset)&0xFF) << 16) | \ - (((uint32_t)(size_offset)&0x0F) << 24) | (((uint32_t)(data_size)&0x0F) << 28)), - -#define PB_FIELDINFO_2(tag, type, data_offset, data_size, size_offset, array_size) \ - (1 | (((tag) << 2) & 0xFF) | ((type) << 8) | (((uint32_t)(array_size)&0xFFF) << 16) | \ - (((uint32_t)(size_offset)&0x0F) << 28)), \ - (((uint32_t)(data_offset)&0xFFFF) | (((uint32_t)(data_size)&0xFFF) << 16) | (((uint32_t)(tag)&0x3c0) << 22)), - -#define PB_FIELDINFO_4(tag, type, data_offset, data_size, size_offset, array_size) \ - (2 | (((tag) << 2) & 0xFF) | ((type) << 8) | (((uint32_t)(array_size)&0xFFFF) << 16)), \ - ((uint32_t)(int_least8_t)(size_offset) | (((uint32_t)(tag) << 2) & 0xFFFFFF00)), (data_offset), (data_size), - -#define PB_FIELDINFO_8(tag, type, data_offset, data_size, size_offset, array_size) \ - (3 | (((tag) << 2) & 0xFF) | ((type) << 8)), \ - ((uint32_t)(int_least8_t)(size_offset) | (((uint32_t)(tag) << 2) & 0xFFFFFF00)), (data_offset), (data_size), \ - (array_size), 0, 0, 0, - -/* These assertions verify that the field information fits in the allocated space. - * The generator tries to automatically determine the correct width that can fit all - * data associated with a message. These asserts will fail only if there has been a - * problem in the automatic logic - this may be worth reporting as a bug. As a workaround, - * you can increase the descriptor width by defining PB_FIELDINFO_WIDTH or by setting - * descriptorsize option in .options file. - */ -#define PB_FITS(value, bits) ((uint32_t)(value) < ((uint32_t)1 << bits)) -#define PB_FIELDINFO_ASSERT_1(tag, type, data_offset, data_size, size_offset, array_size) \ - PB_STATIC_ASSERT(PB_FITS(tag, 6) && PB_FITS(data_offset, 8) && PB_FITS(size_offset, 4) && PB_FITS(data_size, 4) && \ - PB_FITS(array_size, 1), \ - FIELDINFO_DOES_NOT_FIT_width1_field##tag) - -#define PB_FIELDINFO_ASSERT_2(tag, type, data_offset, data_size, size_offset, array_size) \ - PB_STATIC_ASSERT(PB_FITS(tag, 10) && PB_FITS(data_offset, 16) && PB_FITS(size_offset, 4) && PB_FITS(data_size, 12) && \ - PB_FITS(array_size, 12), \ - FIELDINFO_DOES_NOT_FIT_width2_field##tag) - -#ifndef PB_FIELD_32BIT -/* Maximum field sizes are still 16-bit if pb_size_t is 16-bit */ -#define PB_FIELDINFO_ASSERT_4(tag, type, data_offset, data_size, size_offset, array_size) \ - PB_STATIC_ASSERT(PB_FITS(tag, 16) && PB_FITS(data_offset, 16) && PB_FITS((int_least8_t)size_offset, 8) && \ - PB_FITS(data_size, 16) && PB_FITS(array_size, 16), \ - FIELDINFO_DOES_NOT_FIT_width4_field##tag) - -#define PB_FIELDINFO_ASSERT_8(tag, type, data_offset, data_size, size_offset, array_size) \ - PB_STATIC_ASSERT(PB_FITS(tag, 16) && PB_FITS(data_offset, 16) && PB_FITS((int_least8_t)size_offset, 8) && \ - PB_FITS(data_size, 16) && PB_FITS(array_size, 16), \ - FIELDINFO_DOES_NOT_FIT_width8_field##tag) -#else -/* Up to 32-bit fields supported. - * Note that the checks are against 31 bits to avoid compiler warnings about shift wider than type in the test. - * I expect that there is no reasonable use for >2GB messages with nanopb anyway. - */ -#define PB_FIELDINFO_ASSERT_4(tag, type, data_offset, data_size, size_offset, array_size) \ - PB_STATIC_ASSERT(PB_FITS(tag, 30) && PB_FITS(data_offset, 31) && PB_FITS(size_offset, 8) && PB_FITS(data_size, 31) && \ - PB_FITS(array_size, 16), \ - FIELDINFO_DOES_NOT_FIT_width4_field##tag) - -#define PB_FIELDINFO_ASSERT_8(tag, type, data_offset, data_size, size_offset, array_size) \ - PB_STATIC_ASSERT(PB_FITS(tag, 30) && PB_FITS(data_offset, 31) && PB_FITS(size_offset, 8) && PB_FITS(data_size, 31) && \ - PB_FITS(array_size, 31), \ - FIELDINFO_DOES_NOT_FIT_width8_field##tag) -#endif - -/* Automatic picking of FIELDINFO width: - * Uses width 1 when possible, otherwise resorts to width 2. - * This is used when PB_BIND() is called with "AUTO" as the argument. - * The generator will give explicit size argument when it knows that a message - * structure grows beyond 1-word format limits. - */ -#define PB_FIELDINFO_WIDTH_AUTO(atype, htype, ltype) PB_FI_WIDTH##atype(htype, ltype) -#define PB_FI_WIDTH_PB_ATYPE_STATIC(htype, ltype) PB_FI_WIDTH##htype(ltype) -#define PB_FI_WIDTH_PB_ATYPE_POINTER(htype, ltype) PB_FI_WIDTH##htype(ltype) -#define PB_FI_WIDTH_PB_ATYPE_CALLBACK(htype, ltype) 2 -#define PB_FI_WIDTH_PB_HTYPE_REQUIRED(ltype) PB_FI_WIDTH##ltype -#define PB_FI_WIDTH_PB_HTYPE_SINGULAR(ltype) PB_FI_WIDTH##ltype -#define PB_FI_WIDTH_PB_HTYPE_OPTIONAL(ltype) PB_FI_WIDTH##ltype -#define PB_FI_WIDTH_PB_HTYPE_ONEOF(ltype) PB_FI_WIDTH##ltype -#define PB_FI_WIDTH_PB_HTYPE_REPEATED(ltype) 2 -#define PB_FI_WIDTH_PB_HTYPE_FIXARRAY(ltype) 2 -#define PB_FI_WIDTH_PB_LTYPE_BOOL 1 -#define PB_FI_WIDTH_PB_LTYPE_BYTES 2 -#define PB_FI_WIDTH_PB_LTYPE_DOUBLE 1 -#define PB_FI_WIDTH_PB_LTYPE_ENUM 1 -#define PB_FI_WIDTH_PB_LTYPE_UENUM 1 -#define PB_FI_WIDTH_PB_LTYPE_FIXED32 1 -#define PB_FI_WIDTH_PB_LTYPE_FIXED64 1 -#define PB_FI_WIDTH_PB_LTYPE_FLOAT 1 -#define PB_FI_WIDTH_PB_LTYPE_INT32 1 -#define PB_FI_WIDTH_PB_LTYPE_INT64 1 -#define PB_FI_WIDTH_PB_LTYPE_MESSAGE 2 -#define PB_FI_WIDTH_PB_LTYPE_MSG_W_CB 2 -#define PB_FI_WIDTH_PB_LTYPE_SFIXED32 1 -#define PB_FI_WIDTH_PB_LTYPE_SFIXED64 1 -#define PB_FI_WIDTH_PB_LTYPE_SINT32 1 -#define PB_FI_WIDTH_PB_LTYPE_SINT64 1 -#define PB_FI_WIDTH_PB_LTYPE_STRING 2 -#define PB_FI_WIDTH_PB_LTYPE_UINT32 1 -#define PB_FI_WIDTH_PB_LTYPE_UINT64 1 -#define PB_FI_WIDTH_PB_LTYPE_EXTENSION 1 -#define PB_FI_WIDTH_PB_LTYPE_FIXED_LENGTH_BYTES 2 - -/* The mapping from protobuf types to LTYPEs is done using these macros. */ -#define PB_LTYPE_MAP_BOOL PB_LTYPE_BOOL -#define PB_LTYPE_MAP_BYTES PB_LTYPE_BYTES -#define PB_LTYPE_MAP_DOUBLE PB_LTYPE_FIXED64 -#define PB_LTYPE_MAP_ENUM PB_LTYPE_VARINT -#define PB_LTYPE_MAP_UENUM PB_LTYPE_UVARINT -#define PB_LTYPE_MAP_FIXED32 PB_LTYPE_FIXED32 -#define PB_LTYPE_MAP_FIXED64 PB_LTYPE_FIXED64 -#define PB_LTYPE_MAP_FLOAT PB_LTYPE_FIXED32 -#define PB_LTYPE_MAP_INT32 PB_LTYPE_VARINT -#define PB_LTYPE_MAP_INT64 PB_LTYPE_VARINT -#define PB_LTYPE_MAP_MESSAGE PB_LTYPE_SUBMESSAGE -#define PB_LTYPE_MAP_MSG_W_CB PB_LTYPE_SUBMSG_W_CB -#define PB_LTYPE_MAP_SFIXED32 PB_LTYPE_FIXED32 -#define PB_LTYPE_MAP_SFIXED64 PB_LTYPE_FIXED64 -#define PB_LTYPE_MAP_SINT32 PB_LTYPE_SVARINT -#define PB_LTYPE_MAP_SINT64 PB_LTYPE_SVARINT -#define PB_LTYPE_MAP_STRING PB_LTYPE_STRING -#define PB_LTYPE_MAP_UINT32 PB_LTYPE_UVARINT -#define PB_LTYPE_MAP_UINT64 PB_LTYPE_UVARINT -#define PB_LTYPE_MAP_EXTENSION PB_LTYPE_EXTENSION -#define PB_LTYPE_MAP_FIXED_LENGTH_BYTES PB_LTYPE_FIXED_LENGTH_BYTES - -/* These macros are used for giving out error messages. - * They are mostly a debugging aid; the main error information - * is the true/false return value from functions. - * Some code space can be saved by disabling the error - * messages if not used. - * - * PB_SET_ERROR() sets the error message if none has been set yet. - * msg must be a constant string literal. - * PB_GET_ERROR() always returns a pointer to a string. - * PB_RETURN_ERROR() sets the error and returns false from current - * function. - */ -#ifdef PB_NO_ERRMSG -#define PB_SET_ERROR(stream, msg) PB_UNUSED(stream) -#define PB_GET_ERROR(stream) "(errmsg disabled)" -#else -#define PB_SET_ERROR(stream, msg) (stream->errmsg = (stream)->errmsg ? (stream)->errmsg : (msg)) -#define PB_GET_ERROR(stream) ((stream)->errmsg ? (stream)->errmsg : "(none)") -#endif - -#define PB_RETURN_ERROR(stream, msg) return PB_SET_ERROR(stream, msg), false - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#ifdef __cplusplus -#if __cplusplus >= 201103L -#define PB_CONSTEXPR constexpr -#else // __cplusplus >= 201103L -#define PB_CONSTEXPR -#endif // __cplusplus >= 201103L - -#if __cplusplus >= 201703L -#define PB_INLINE_CONSTEXPR inline constexpr -#else // __cplusplus >= 201703L -#define PB_INLINE_CONSTEXPR PB_CONSTEXPR -#endif // __cplusplus >= 201703L - -namespace nanopb -{ -// Each type will be partially specialized by the generator. -template struct MessageDescriptor; -} // namespace nanopb -#endif /* __cplusplus */ - -#endif diff --git a/lib/nanopb/include/pb_common.h b/lib/nanopb/include/pb_common.h deleted file mode 100644 index 58aa90f76..000000000 --- a/lib/nanopb/include/pb_common.h +++ /dev/null @@ -1,49 +0,0 @@ -/* pb_common.h: Common support functions for pb_encode.c and pb_decode.c. - * These functions are rarely needed by applications directly. - */ - -#ifndef PB_COMMON_H_INCLUDED -#define PB_COMMON_H_INCLUDED - -#include "pb.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Initialize the field iterator structure to beginning. - * Returns false if the message type is empty. */ -bool pb_field_iter_begin(pb_field_iter_t *iter, const pb_msgdesc_t *desc, void *message); - -/* Get a field iterator for extension field. */ -bool pb_field_iter_begin_extension(pb_field_iter_t *iter, pb_extension_t *extension); - -/* Same as pb_field_iter_begin(), but for const message pointer. - * Note that the pointers in pb_field_iter_t will be non-const but shouldn't - * be written to when using these functions. */ -bool pb_field_iter_begin_const(pb_field_iter_t *iter, const pb_msgdesc_t *desc, const void *message); -bool pb_field_iter_begin_extension_const(pb_field_iter_t *iter, const pb_extension_t *extension); - -/* Advance the iterator to the next field. - * Returns false when the iterator wraps back to the first field. */ -bool pb_field_iter_next(pb_field_iter_t *iter); - -/* Advance the iterator until it points at a field with the given tag. - * Returns false if no such field exists. */ -bool pb_field_iter_find(pb_field_iter_t *iter, uint32_t tag); - -/* Find a field with type PB_LTYPE_EXTENSION, or return false if not found. - * There can be only one extension range field per message. */ -bool pb_field_iter_find_extension(pb_field_iter_t *iter); - -#ifdef PB_VALIDATE_UTF8 -/* Validate UTF-8 text string */ -bool pb_validate_utf8(const char *s); -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif - diff --git a/lib/nanopb/include/pb_decode.h b/lib/nanopb/include/pb_decode.h deleted file mode 100644 index 824acd4ea..000000000 --- a/lib/nanopb/include/pb_decode.h +++ /dev/null @@ -1,199 +0,0 @@ -/* pb_decode.h: Functions to decode protocol buffers. Depends on pb_decode.c. - * The main function is pb_decode. You also need an input stream, and the - * field descriptions created by nanopb_generator.py. - */ - -#ifndef PB_DECODE_H_INCLUDED -#define PB_DECODE_H_INCLUDED - -#include "pb.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Structure for defining custom input streams. You will need to provide - * a callback function to read the bytes from your storage, which can be - * for example a file or a network socket. - * - * The callback must conform to these rules: - * - * 1) Return false on IO errors. This will cause decoding to abort. - * 2) You can use state to store your own data (e.g. buffer pointer), - * and rely on pb_read to verify that no-body reads past bytes_left. - * 3) Your callback may be used with substreams, in which case bytes_left - * is different than from the main stream. Don't use bytes_left to compute - * any pointers. - */ -struct pb_istream_s -{ -#ifdef PB_BUFFER_ONLY - /* Callback pointer is not used in buffer-only configuration. - * Having an int pointer here allows binary compatibility but - * gives an error if someone tries to assign callback function. - */ - int *callback; -#else - bool (*callback)(pb_istream_t *stream, pb_byte_t *buf, size_t count); -#endif - - void *state; /* Free field for use by callback implementation */ - size_t bytes_left; - -#ifndef PB_NO_ERRMSG - const char *errmsg; -#endif -}; - -#ifndef PB_NO_ERRMSG -#define PB_ISTREAM_EMPTY {0,0,0,0} -#else -#define PB_ISTREAM_EMPTY {0,0,0} -#endif - -/*************************** - * Main decoding functions * - ***************************/ - -/* Decode a single protocol buffers message from input stream into a C structure. - * Returns true on success, false on any failure. - * The actual struct pointed to by dest must match the description in fields. - * Callback fields of the destination structure must be initialized by caller. - * All other fields will be initialized by this function. - * - * Example usage: - * MyMessage msg = {}; - * uint8_t buffer[64]; - * pb_istream_t stream; - * - * // ... read some data into buffer ... - * - * stream = pb_istream_from_buffer(buffer, count); - * pb_decode(&stream, MyMessage_fields, &msg); - */ -bool pb_decode(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct); - -/* Extended version of pb_decode, with several options to control - * the decoding process: - * - * PB_DECODE_NOINIT: Do not initialize the fields to default values. - * This is slightly faster if you do not need the default - * values and instead initialize the structure to 0 using - * e.g. memset(). This can also be used for merging two - * messages, i.e. combine already existing data with new - * values. - * - * PB_DECODE_DELIMITED: Input message starts with the message size as varint. - * Corresponds to parseDelimitedFrom() in Google's - * protobuf API. - * - * PB_DECODE_NULLTERMINATED: Stop reading when field tag is read as 0. This allows - * reading null terminated messages. - * NOTE: Until nanopb-0.4.0, pb_decode() also allows - * null-termination. This behaviour is not supported in - * most other protobuf implementations, so PB_DECODE_DELIMITED - * is a better option for compatibility. - * - * Multiple flags can be combined with bitwise or (| operator) - */ -#define PB_DECODE_NOINIT 0x01U -#define PB_DECODE_DELIMITED 0x02U -#define PB_DECODE_NULLTERMINATED 0x04U -bool pb_decode_ex(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct, unsigned int flags); - -/* Defines for backwards compatibility with code written before nanopb-0.4.0 */ -#define pb_decode_noinit(s,f,d) pb_decode_ex(s,f,d, PB_DECODE_NOINIT) -#define pb_decode_delimited(s,f,d) pb_decode_ex(s,f,d, PB_DECODE_DELIMITED) -#define pb_decode_delimited_noinit(s,f,d) pb_decode_ex(s,f,d, PB_DECODE_DELIMITED | PB_DECODE_NOINIT) -#define pb_decode_nullterminated(s,f,d) pb_decode_ex(s,f,d, PB_DECODE_NULLTERMINATED) - -#ifdef PB_ENABLE_MALLOC -/* Release any allocated pointer fields. If you use dynamic allocation, you should - * call this for any successfully decoded message when you are done with it. If - * pb_decode() returns with an error, the message is already released. - */ -void pb_release(const pb_msgdesc_t *fields, void *dest_struct); -#else -/* Allocation is not supported, so release is no-op */ -#define pb_release(fields, dest_struct) PB_UNUSED(fields); PB_UNUSED(dest_struct); -#endif - - -/************************************** - * Functions for manipulating streams * - **************************************/ - -/* Create an input stream for reading from a memory buffer. - * - * msglen should be the actual length of the message, not the full size of - * allocated buffer. - * - * Alternatively, you can use a custom stream that reads directly from e.g. - * a file or a network socket. - */ -pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t msglen); - -/* Function to read from a pb_istream_t. You can use this if you need to - * read some custom header data, or to read data in field callbacks. - */ -bool pb_read(pb_istream_t *stream, pb_byte_t *buf, size_t count); - - -/************************************************ - * Helper functions for writing field callbacks * - ************************************************/ - -/* Decode the tag for the next field in the stream. Gives the wire type and - * field tag. At end of the message, returns false and sets eof to true. */ -bool pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof); - -/* Skip the field payload data, given the wire type. */ -bool pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type); - -/* Decode an integer in the varint format. This works for enum, int32, - * int64, uint32 and uint64 field types. */ -#ifndef PB_WITHOUT_64BIT -bool pb_decode_varint(pb_istream_t *stream, uint64_t *dest); -#else -#define pb_decode_varint pb_decode_varint32 -#endif - -/* Decode an integer in the varint format. This works for enum, int32, - * and uint32 field types. */ -bool pb_decode_varint32(pb_istream_t *stream, uint32_t *dest); - -/* Decode a bool value in varint format. */ -bool pb_decode_bool(pb_istream_t *stream, bool *dest); - -/* Decode an integer in the zig-zagged svarint format. This works for sint32 - * and sint64. */ -#ifndef PB_WITHOUT_64BIT -bool pb_decode_svarint(pb_istream_t *stream, int64_t *dest); -#else -bool pb_decode_svarint(pb_istream_t *stream, int32_t *dest); -#endif - -/* Decode a fixed32, sfixed32 or float value. You need to pass a pointer to - * a 4-byte wide C variable. */ -bool pb_decode_fixed32(pb_istream_t *stream, void *dest); - -#ifndef PB_WITHOUT_64BIT -/* Decode a fixed64, sfixed64 or double value. You need to pass a pointer to - * a 8-byte wide C variable. */ -bool pb_decode_fixed64(pb_istream_t *stream, void *dest); -#endif - -#ifdef PB_CONVERT_DOUBLE_FLOAT -/* Decode a double value into float variable. */ -bool pb_decode_double_as_float(pb_istream_t *stream, float *dest); -#endif - -/* Make a limited-length substream for reading a PB_WT_STRING field. */ -bool pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream); -bool pb_close_string_substream(pb_istream_t *stream, pb_istream_t *substream); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/lib/nanopb/include/pb_encode.h b/lib/nanopb/include/pb_encode.h deleted file mode 100644 index 9cff22a4f..000000000 --- a/lib/nanopb/include/pb_encode.h +++ /dev/null @@ -1,185 +0,0 @@ -/* pb_encode.h: Functions to encode protocol buffers. Depends on pb_encode.c. - * The main function is pb_encode. You also need an output stream, and the - * field descriptions created by nanopb_generator.py. - */ - -#ifndef PB_ENCODE_H_INCLUDED -#define PB_ENCODE_H_INCLUDED - -#include "pb.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* Structure for defining custom output streams. You will need to provide - * a callback function to write the bytes to your storage, which can be - * for example a file or a network socket. - * - * The callback must conform to these rules: - * - * 1) Return false on IO errors. This will cause encoding to abort. - * 2) You can use state to store your own data (e.g. buffer pointer). - * 3) pb_write will update bytes_written after your callback runs. - * 4) Substreams will modify max_size and bytes_written. Don't use them - * to calculate any pointers. - */ -struct pb_ostream_s -{ -#ifdef PB_BUFFER_ONLY - /* Callback pointer is not used in buffer-only configuration. - * Having an int pointer here allows binary compatibility but - * gives an error if someone tries to assign callback function. - * Also, NULL pointer marks a 'sizing stream' that does not - * write anything. - */ - int *callback; -#else - bool (*callback)(pb_ostream_t *stream, const pb_byte_t *buf, size_t count); -#endif - void *state; /* Free field for use by callback implementation. */ - size_t max_size; /* Limit number of output bytes written (or use SIZE_MAX). */ - size_t bytes_written; /* Number of bytes written so far. */ - -#ifndef PB_NO_ERRMSG - const char *errmsg; -#endif -}; - -/*************************** - * Main encoding functions * - ***************************/ - -/* Encode a single protocol buffers message from C structure into a stream. - * Returns true on success, false on any failure. - * The actual struct pointed to by src_struct must match the description in fields. - * All required fields in the struct are assumed to have been filled in. - * - * Example usage: - * MyMessage msg = {}; - * uint8_t buffer[64]; - * pb_ostream_t stream; - * - * msg.field1 = 42; - * stream = pb_ostream_from_buffer(buffer, sizeof(buffer)); - * pb_encode(&stream, MyMessage_fields, &msg); - */ -bool pb_encode(pb_ostream_t *stream, const pb_msgdesc_t *fields, const void *src_struct); - -/* Extended version of pb_encode, with several options to control the - * encoding process: - * - * PB_ENCODE_DELIMITED: Prepend the length of message as a varint. - * Corresponds to writeDelimitedTo() in Google's - * protobuf API. - * - * PB_ENCODE_NULLTERMINATED: Append a null byte to the message for termination. - * NOTE: This behaviour is not supported in most other - * protobuf implementations, so PB_ENCODE_DELIMITED - * is a better option for compatibility. - */ -#define PB_ENCODE_DELIMITED 0x02U -#define PB_ENCODE_NULLTERMINATED 0x04U -bool pb_encode_ex(pb_ostream_t *stream, const pb_msgdesc_t *fields, const void *src_struct, unsigned int flags); - -/* Defines for backwards compatibility with code written before nanopb-0.4.0 */ -#define pb_encode_delimited(s,f,d) pb_encode_ex(s,f,d, PB_ENCODE_DELIMITED) -#define pb_encode_nullterminated(s,f,d) pb_encode_ex(s,f,d, PB_ENCODE_NULLTERMINATED) - -/* Encode the message to get the size of the encoded data, but do not store - * the data. */ -bool pb_get_encoded_size(size_t *size, const pb_msgdesc_t *fields, const void *src_struct); - -/************************************** - * Functions for manipulating streams * - **************************************/ - -/* Create an output stream for writing into a memory buffer. - * The number of bytes written can be found in stream.bytes_written after - * encoding the message. - * - * Alternatively, you can use a custom stream that writes directly to e.g. - * a file or a network socket. - */ -pb_ostream_t pb_ostream_from_buffer(pb_byte_t *buf, size_t bufsize); - -/* Pseudo-stream for measuring the size of a message without actually storing - * the encoded data. - * - * Example usage: - * MyMessage msg = {}; - * pb_ostream_t stream = PB_OSTREAM_SIZING; - * pb_encode(&stream, MyMessage_fields, &msg); - * printf("Message size is %d\n", stream.bytes_written); - */ -#ifndef PB_NO_ERRMSG -#define PB_OSTREAM_SIZING {0,0,0,0,0} -#else -#define PB_OSTREAM_SIZING {0,0,0,0} -#endif - -/* Function to write into a pb_ostream_t stream. You can use this if you need - * to append or prepend some custom headers to the message. - */ -bool pb_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count); - - -/************************************************ - * Helper functions for writing field callbacks * - ************************************************/ - -/* Encode field header based on type and field number defined in the field - * structure. Call this from the callback before writing out field contents. */ -bool pb_encode_tag_for_field(pb_ostream_t *stream, const pb_field_iter_t *field); - -/* Encode field header by manually specifying wire type. You need to use this - * if you want to write out packed arrays from a callback field. */ -bool pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, uint32_t field_number); - -/* Encode an integer in the varint format. - * This works for bool, enum, int32, int64, uint32 and uint64 field types. */ -#ifndef PB_WITHOUT_64BIT -bool pb_encode_varint(pb_ostream_t *stream, uint64_t value); -#else -bool pb_encode_varint(pb_ostream_t *stream, uint32_t value); -#endif - -/* Encode an integer in the zig-zagged svarint format. - * This works for sint32 and sint64. */ -#ifndef PB_WITHOUT_64BIT -bool pb_encode_svarint(pb_ostream_t *stream, int64_t value); -#else -bool pb_encode_svarint(pb_ostream_t *stream, int32_t value); -#endif - -/* Encode a string or bytes type field. For strings, pass strlen(s) as size. */ -bool pb_encode_string(pb_ostream_t *stream, const pb_byte_t *buffer, size_t size); - -/* Encode a fixed32, sfixed32 or float value. - * You need to pass a pointer to a 4-byte wide C variable. */ -bool pb_encode_fixed32(pb_ostream_t *stream, const void *value); - -#ifndef PB_WITHOUT_64BIT -/* Encode a fixed64, sfixed64 or double value. - * You need to pass a pointer to a 8-byte wide C variable. */ -bool pb_encode_fixed64(pb_ostream_t *stream, const void *value); -#endif - -#ifdef PB_CONVERT_DOUBLE_FLOAT -/* Encode a float value so that it appears like a double in the encoded - * message. */ -bool pb_encode_float_as_double(pb_ostream_t *stream, float value); -#endif - -/* Encode a submessage field. - * You need to pass the pb_field_t array and pointer to struct, just like - * with pb_encode(). This internally encodes the submessage twice, first to - * calculate message size and then to actually write it out. - */ -bool pb_encode_submessage(pb_ostream_t *stream, const pb_msgdesc_t *fields, const void *src_struct); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/lib/nanopb/src/pb_common.c b/lib/nanopb/src/pb_common.c deleted file mode 100644 index 6aee76b1e..000000000 --- a/lib/nanopb/src/pb_common.c +++ /dev/null @@ -1,388 +0,0 @@ -/* pb_common.c: Common support functions for pb_encode.c and pb_decode.c. - * - * 2014 Petteri Aimonen - */ - -#include "pb_common.h" - -static bool load_descriptor_values(pb_field_iter_t *iter) -{ - uint32_t word0; - uint32_t data_offset; - int_least8_t size_offset; - - if (iter->index >= iter->descriptor->field_count) - return false; - - word0 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index]); - iter->type = (pb_type_t)((word0 >> 8) & 0xFF); - - switch(word0 & 3) - { - case 0: { - /* 1-word format */ - iter->array_size = 1; - iter->tag = (pb_size_t)((word0 >> 2) & 0x3F); - size_offset = (int_least8_t)((word0 >> 24) & 0x0F); - data_offset = (word0 >> 16) & 0xFF; - iter->data_size = (pb_size_t)((word0 >> 28) & 0x0F); - break; - } - - case 1: { - /* 2-word format */ - uint32_t word1 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 1]); - - iter->array_size = (pb_size_t)((word0 >> 16) & 0x0FFF); - iter->tag = (pb_size_t)(((word0 >> 2) & 0x3F) | ((word1 >> 28) << 6)); - size_offset = (int_least8_t)((word0 >> 28) & 0x0F); - data_offset = word1 & 0xFFFF; - iter->data_size = (pb_size_t)((word1 >> 16) & 0x0FFF); - break; - } - - case 2: { - /* 4-word format */ - uint32_t word1 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 1]); - uint32_t word2 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 2]); - uint32_t word3 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 3]); - - iter->array_size = (pb_size_t)(word0 >> 16); - iter->tag = (pb_size_t)(((word0 >> 2) & 0x3F) | ((word1 >> 8) << 6)); - size_offset = (int_least8_t)(word1 & 0xFF); - data_offset = word2; - iter->data_size = (pb_size_t)word3; - break; - } - - default: { - /* 8-word format */ - uint32_t word1 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 1]); - uint32_t word2 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 2]); - uint32_t word3 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 3]); - uint32_t word4 = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index + 4]); - - iter->array_size = (pb_size_t)word4; - iter->tag = (pb_size_t)(((word0 >> 2) & 0x3F) | ((word1 >> 8) << 6)); - size_offset = (int_least8_t)(word1 & 0xFF); - data_offset = word2; - iter->data_size = (pb_size_t)word3; - break; - } - } - - if (!iter->message) - { - /* Avoid doing arithmetic on null pointers, it is undefined */ - iter->pField = NULL; - iter->pSize = NULL; - } - else - { - iter->pField = (char*)iter->message + data_offset; - - if (size_offset) - { - iter->pSize = (char*)iter->pField - size_offset; - } - else if (PB_HTYPE(iter->type) == PB_HTYPE_REPEATED && - (PB_ATYPE(iter->type) == PB_ATYPE_STATIC || - PB_ATYPE(iter->type) == PB_ATYPE_POINTER)) - { - /* Fixed count array */ - iter->pSize = &iter->array_size; - } - else - { - iter->pSize = NULL; - } - - if (PB_ATYPE(iter->type) == PB_ATYPE_POINTER && iter->pField != NULL) - { - iter->pData = *(void**)iter->pField; - } - else - { - iter->pData = iter->pField; - } - } - - if (PB_LTYPE_IS_SUBMSG(iter->type)) - { - iter->submsg_desc = iter->descriptor->submsg_info[iter->submessage_index]; - } - else - { - iter->submsg_desc = NULL; - } - - return true; -} - -static void advance_iterator(pb_field_iter_t *iter) -{ - iter->index++; - - if (iter->index >= iter->descriptor->field_count) - { - /* Restart */ - iter->index = 0; - iter->field_info_index = 0; - iter->submessage_index = 0; - iter->required_field_index = 0; - } - else - { - /* Increment indexes based on previous field type. - * All field info formats have the following fields: - * - lowest 2 bits tell the amount of words in the descriptor (2^n words) - * - bits 2..7 give the lowest bits of tag number. - * - bits 8..15 give the field type. - */ - uint32_t prev_descriptor = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index]); - pb_type_t prev_type = (prev_descriptor >> 8) & 0xFF; - pb_size_t descriptor_len = (pb_size_t)(1 << (prev_descriptor & 3)); - - /* Add to fields. - * The cast to pb_size_t is needed to avoid -Wconversion warning. - * Because the data is is constants from generator, there is no danger of overflow. - */ - iter->field_info_index = (pb_size_t)(iter->field_info_index + descriptor_len); - iter->required_field_index = (pb_size_t)(iter->required_field_index + (PB_HTYPE(prev_type) == PB_HTYPE_REQUIRED)); - iter->submessage_index = (pb_size_t)(iter->submessage_index + PB_LTYPE_IS_SUBMSG(prev_type)); - } -} - -bool pb_field_iter_begin(pb_field_iter_t *iter, const pb_msgdesc_t *desc, void *message) -{ - memset(iter, 0, sizeof(*iter)); - - iter->descriptor = desc; - iter->message = message; - - return load_descriptor_values(iter); -} - -bool pb_field_iter_begin_extension(pb_field_iter_t *iter, pb_extension_t *extension) -{ - const pb_msgdesc_t *msg = (const pb_msgdesc_t*)extension->type->arg; - bool status; - - uint32_t word0 = PB_PROGMEM_READU32(msg->field_info[0]); - if (PB_ATYPE(word0 >> 8) == PB_ATYPE_POINTER) - { - /* For pointer extensions, the pointer is stored directly - * in the extension structure. This avoids having an extra - * indirection. */ - status = pb_field_iter_begin(iter, msg, &extension->dest); - } - else - { - status = pb_field_iter_begin(iter, msg, extension->dest); - } - - iter->pSize = &extension->found; - return status; -} - -bool pb_field_iter_next(pb_field_iter_t *iter) -{ - advance_iterator(iter); - (void)load_descriptor_values(iter); - return iter->index != 0; -} - -bool pb_field_iter_find(pb_field_iter_t *iter, uint32_t tag) -{ - if (iter->tag == tag) - { - return true; /* Nothing to do, correct field already. */ - } - else if (tag > iter->descriptor->largest_tag) - { - return false; - } - else - { - pb_size_t start = iter->index; - uint32_t fieldinfo; - - if (tag < iter->tag) - { - /* Fields are in tag number order, so we know that tag is between - * 0 and our start position. Setting index to end forces - * advance_iterator() call below to restart from beginning. */ - iter->index = iter->descriptor->field_count; - } - - do - { - /* Advance iterator but don't load values yet */ - advance_iterator(iter); - - /* Do fast check for tag number match */ - fieldinfo = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index]); - - if (((fieldinfo >> 2) & 0x3F) == (tag & 0x3F)) - { - /* Good candidate, check further */ - (void)load_descriptor_values(iter); - - if (iter->tag == tag && - PB_LTYPE(iter->type) != PB_LTYPE_EXTENSION) - { - /* Found it */ - return true; - } - } - } while (iter->index != start); - - /* Searched all the way back to start, and found nothing. */ - (void)load_descriptor_values(iter); - return false; - } -} - -bool pb_field_iter_find_extension(pb_field_iter_t *iter) -{ - if (PB_LTYPE(iter->type) == PB_LTYPE_EXTENSION) - { - return true; - } - else - { - pb_size_t start = iter->index; - uint32_t fieldinfo; - - do - { - /* Advance iterator but don't load values yet */ - advance_iterator(iter); - - /* Do fast check for field type */ - fieldinfo = PB_PROGMEM_READU32(iter->descriptor->field_info[iter->field_info_index]); - - if (PB_LTYPE((fieldinfo >> 8) & 0xFF) == PB_LTYPE_EXTENSION) - { - return load_descriptor_values(iter); - } - } while (iter->index != start); - - /* Searched all the way back to start, and found nothing. */ - (void)load_descriptor_values(iter); - return false; - } -} - -static void *pb_const_cast(const void *p) -{ - /* Note: this casts away const, in order to use the common field iterator - * logic for both encoding and decoding. The cast is done using union - * to avoid spurious compiler warnings. */ - union { - void *p1; - const void *p2; - } t; - t.p2 = p; - return t.p1; -} - -bool pb_field_iter_begin_const(pb_field_iter_t *iter, const pb_msgdesc_t *desc, const void *message) -{ - return pb_field_iter_begin(iter, desc, pb_const_cast(message)); -} - -bool pb_field_iter_begin_extension_const(pb_field_iter_t *iter, const pb_extension_t *extension) -{ - return pb_field_iter_begin_extension(iter, (pb_extension_t*)pb_const_cast(extension)); -} - -bool pb_default_field_callback(pb_istream_t *istream, pb_ostream_t *ostream, const pb_field_t *field) -{ - if (field->data_size == sizeof(pb_callback_t)) - { - pb_callback_t *pCallback = (pb_callback_t*)field->pData; - - if (pCallback != NULL) - { - if (istream != NULL && pCallback->funcs.decode != NULL) - { - return pCallback->funcs.decode(istream, field, &pCallback->arg); - } - - if (ostream != NULL && pCallback->funcs.encode != NULL) - { - return pCallback->funcs.encode(ostream, field, &pCallback->arg); - } - } - } - - return true; /* Success, but didn't do anything */ - -} - -#ifdef PB_VALIDATE_UTF8 - -/* This function checks whether a string is valid UTF-8 text. - * - * Algorithm is adapted from https://www.cl.cam.ac.uk/~mgk25/ucs/utf8_check.c - * Original copyright: Markus Kuhn 2005-03-30 - * Licensed under "Short code license", which allows use under MIT license or - * any compatible with it. - */ - -bool pb_validate_utf8(const char *str) -{ - const pb_byte_t *s = (const pb_byte_t*)str; - while (*s) - { - if (*s < 0x80) - { - /* 0xxxxxxx */ - s++; - } - else if ((s[0] & 0xe0) == 0xc0) - { - /* 110XXXXx 10xxxxxx */ - if ((s[1] & 0xc0) != 0x80 || - (s[0] & 0xfe) == 0xc0) /* overlong? */ - return false; - else - s += 2; - } - else if ((s[0] & 0xf0) == 0xe0) - { - /* 1110XXXX 10Xxxxxx 10xxxxxx */ - if ((s[1] & 0xc0) != 0x80 || - (s[2] & 0xc0) != 0x80 || - (s[0] == 0xe0 && (s[1] & 0xe0) == 0x80) || /* overlong? */ - (s[0] == 0xed && (s[1] & 0xe0) == 0xa0) || /* surrogate? */ - (s[0] == 0xef && s[1] == 0xbf && - (s[2] & 0xfe) == 0xbe)) /* U+FFFE or U+FFFF? */ - return false; - else - s += 3; - } - else if ((s[0] & 0xf8) == 0xf0) - { - /* 11110XXX 10XXxxxx 10xxxxxx 10xxxxxx */ - if ((s[1] & 0xc0) != 0x80 || - (s[2] & 0xc0) != 0x80 || - (s[3] & 0xc0) != 0x80 || - (s[0] == 0xf0 && (s[1] & 0xf0) == 0x80) || /* overlong? */ - (s[0] == 0xf4 && s[1] > 0x8f) || s[0] > 0xf4) /* > U+10FFFF? */ - return false; - else - s += 4; - } - else - { - return false; - } - } - - return true; -} - -#endif - diff --git a/lib/nanopb/src/pb_decode.c b/lib/nanopb/src/pb_decode.c deleted file mode 100644 index 28f6b5799..000000000 --- a/lib/nanopb/src/pb_decode.c +++ /dev/null @@ -1,1692 +0,0 @@ -/* pb_decode.c -- decode a protobuf using minimal resources - * - * 2011 Petteri Aimonen - */ - -/* Use the GCC warn_unused_result attribute to check that all return values - * are propagated correctly. On other compilers and gcc before 3.4.0 just - * ignore the annotation. - */ -#if !defined(__GNUC__) || ( __GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 4) - #define checkreturn -#else - #define checkreturn __attribute__((warn_unused_result)) -#endif - -#include "pb.h" -#include "pb_decode.h" -#include "pb_common.h" - -/************************************** - * Declarations internal to this file * - **************************************/ - -static bool checkreturn buf_read(pb_istream_t *stream, pb_byte_t *buf, size_t count); -static bool checkreturn pb_decode_varint32_eof(pb_istream_t *stream, uint32_t *dest, bool *eof); -static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_type_t wire_type, pb_byte_t *buf, size_t *size); -static bool checkreturn decode_basic_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field); -static bool checkreturn decode_static_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field); -static bool checkreturn decode_pointer_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field); -static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field); -static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field); -static bool checkreturn default_extension_decoder(pb_istream_t *stream, pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type); -static bool checkreturn decode_extension(pb_istream_t *stream, uint32_t tag, pb_wire_type_t wire_type, pb_extension_t *extension); -static bool pb_field_set_to_default(pb_field_iter_t *field); -static bool pb_message_set_to_defaults(pb_field_iter_t *iter); -static bool checkreturn pb_dec_bool(pb_istream_t *stream, const pb_field_iter_t *field); -static bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_field_iter_t *field); -static bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_iter_t *field); -static bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_field_iter_t *field); -static bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_iter_t *field); -static bool checkreturn pb_dec_fixed_length_bytes(pb_istream_t *stream, const pb_field_iter_t *field); -static bool checkreturn pb_skip_varint(pb_istream_t *stream); -static bool checkreturn pb_skip_string(pb_istream_t *stream); - -#ifdef PB_ENABLE_MALLOC -static bool checkreturn allocate_field(pb_istream_t *stream, void *pData, size_t data_size, size_t array_size); -static void initialize_pointer_field(void *pItem, pb_field_iter_t *field); -static bool checkreturn pb_release_union_field(pb_istream_t *stream, pb_field_iter_t *field); -static void pb_release_single_field(pb_field_iter_t *field); -#endif - -#ifdef PB_WITHOUT_64BIT -#define pb_int64_t int32_t -#define pb_uint64_t uint32_t -#else -#define pb_int64_t int64_t -#define pb_uint64_t uint64_t -#endif - -#define PB_WT_PACKED ((pb_wire_type_t)0xFF) - -typedef struct { - uint32_t bitfield[(PB_MAX_REQUIRED_FIELDS + 31) / 32]; -} pb_fields_seen_t; - -/******************************* - * pb_istream_t implementation * - *******************************/ - -static bool checkreturn buf_read(pb_istream_t *stream, pb_byte_t *buf, size_t count) -{ - size_t i; - const pb_byte_t *source = (const pb_byte_t*)stream->state; - stream->state = (pb_byte_t*)stream->state + count; - - if (buf != NULL) - { - for (i = 0; i < count; i++) - buf[i] = source[i]; - } - - return true; -} - -bool checkreturn pb_read(pb_istream_t *stream, pb_byte_t *buf, size_t count) -{ - if (count == 0) - return true; - -#ifndef PB_BUFFER_ONLY - if (buf == NULL && stream->callback != buf_read) - { - /* Skip input bytes */ - pb_byte_t tmp[16]; - while (count > 16) - { - if (!pb_read(stream, tmp, 16)) - return false; - - count -= 16; - } - - return pb_read(stream, tmp, count); - } -#endif - - if (stream->bytes_left < count) - PB_RETURN_ERROR(stream, "end-of-stream"); - -#ifndef PB_BUFFER_ONLY - if (!stream->callback(stream, buf, count)) - PB_RETURN_ERROR(stream, "io error"); -#else - if (!buf_read(stream, buf, count)) - return false; -#endif - - stream->bytes_left -= count; - return true; -} - -/* Read a single byte from input stream. buf may not be NULL. - * This is an optimization for the varint decoding. */ -static bool checkreturn pb_readbyte(pb_istream_t *stream, pb_byte_t *buf) -{ - if (stream->bytes_left == 0) - PB_RETURN_ERROR(stream, "end-of-stream"); - -#ifndef PB_BUFFER_ONLY - if (!stream->callback(stream, buf, 1)) - PB_RETURN_ERROR(stream, "io error"); -#else - *buf = *(const pb_byte_t*)stream->state; - stream->state = (pb_byte_t*)stream->state + 1; -#endif - - stream->bytes_left--; - - return true; -} - -pb_istream_t pb_istream_from_buffer(const pb_byte_t *buf, size_t msglen) -{ - pb_istream_t stream; - /* Cast away the const from buf without a compiler error. We are - * careful to use it only in a const manner in the callbacks. - */ - union { - void *state; - const void *c_state; - } state; -#ifdef PB_BUFFER_ONLY - stream.callback = NULL; -#else - stream.callback = &buf_read; -#endif - state.c_state = buf; - stream.state = state.state; - stream.bytes_left = msglen; -#ifndef PB_NO_ERRMSG - stream.errmsg = NULL; -#endif - return stream; -} - -/******************** - * Helper functions * - ********************/ - -static bool checkreturn pb_decode_varint32_eof(pb_istream_t *stream, uint32_t *dest, bool *eof) -{ - pb_byte_t byte; - uint32_t result; - - if (!pb_readbyte(stream, &byte)) - { - if (stream->bytes_left == 0) - { - if (eof) - { - *eof = true; - } - } - - return false; - } - - if ((byte & 0x80) == 0) - { - /* Quick case, 1 byte value */ - result = byte; - } - else - { - /* Multibyte case */ - uint_fast8_t bitpos = 7; - result = byte & 0x7F; - - do - { - if (!pb_readbyte(stream, &byte)) - return false; - - if (bitpos >= 32) - { - /* Note: The varint could have trailing 0x80 bytes, or 0xFF for negative. */ - pb_byte_t sign_extension = (bitpos < 63) ? 0xFF : 0x01; - bool valid_extension = ((byte & 0x7F) == 0x00 || - ((result >> 31) != 0 && byte == sign_extension)); - - if (bitpos >= 64 || !valid_extension) - { - PB_RETURN_ERROR(stream, "varint overflow"); - } - } - else - { - result |= (uint32_t)(byte & 0x7F) << bitpos; - } - bitpos = (uint_fast8_t)(bitpos + 7); - } while (byte & 0x80); - - if (bitpos == 35 && (byte & 0x70) != 0) - { - /* The last byte was at bitpos=28, so only bottom 4 bits fit. */ - PB_RETURN_ERROR(stream, "varint overflow"); - } - } - - *dest = result; - return true; -} - -bool checkreturn pb_decode_varint32(pb_istream_t *stream, uint32_t *dest) -{ - return pb_decode_varint32_eof(stream, dest, NULL); -} - -#ifndef PB_WITHOUT_64BIT -bool checkreturn pb_decode_varint(pb_istream_t *stream, uint64_t *dest) -{ - pb_byte_t byte; - uint_fast8_t bitpos = 0; - uint64_t result = 0; - - do - { - if (bitpos >= 64) - PB_RETURN_ERROR(stream, "varint overflow"); - - if (!pb_readbyte(stream, &byte)) - return false; - - result |= (uint64_t)(byte & 0x7F) << bitpos; - bitpos = (uint_fast8_t)(bitpos + 7); - } while (byte & 0x80); - - *dest = result; - return true; -} -#endif - -bool checkreturn pb_skip_varint(pb_istream_t *stream) -{ - pb_byte_t byte; - do - { - if (!pb_read(stream, &byte, 1)) - return false; - } while (byte & 0x80); - return true; -} - -bool checkreturn pb_skip_string(pb_istream_t *stream) -{ - uint32_t length; - if (!pb_decode_varint32(stream, &length)) - return false; - - if ((size_t)length != length) - { - PB_RETURN_ERROR(stream, "size too large"); - } - - return pb_read(stream, NULL, (size_t)length); -} - -bool checkreturn pb_decode_tag(pb_istream_t *stream, pb_wire_type_t *wire_type, uint32_t *tag, bool *eof) -{ - uint32_t temp; - *eof = false; - *wire_type = (pb_wire_type_t) 0; - *tag = 0; - - if (!pb_decode_varint32_eof(stream, &temp, eof)) - { - return false; - } - - *tag = temp >> 3; - *wire_type = (pb_wire_type_t)(temp & 7); - return true; -} - -bool checkreturn pb_skip_field(pb_istream_t *stream, pb_wire_type_t wire_type) -{ - switch (wire_type) - { - case PB_WT_VARINT: return pb_skip_varint(stream); - case PB_WT_64BIT: return pb_read(stream, NULL, 8); - case PB_WT_STRING: return pb_skip_string(stream); - case PB_WT_32BIT: return pb_read(stream, NULL, 4); - default: PB_RETURN_ERROR(stream, "invalid wire_type"); - } -} - -/* Read a raw value to buffer, for the purpose of passing it to callback as - * a substream. Size is maximum size on call, and actual size on return. - */ -static bool checkreturn read_raw_value(pb_istream_t *stream, pb_wire_type_t wire_type, pb_byte_t *buf, size_t *size) -{ - size_t max_size = *size; - switch (wire_type) - { - case PB_WT_VARINT: - *size = 0; - do - { - (*size)++; - if (*size > max_size) - PB_RETURN_ERROR(stream, "varint overflow"); - - if (!pb_read(stream, buf, 1)) - return false; - } while (*buf++ & 0x80); - return true; - - case PB_WT_64BIT: - *size = 8; - return pb_read(stream, buf, 8); - - case PB_WT_32BIT: - *size = 4; - return pb_read(stream, buf, 4); - - case PB_WT_STRING: - /* Calling read_raw_value with a PB_WT_STRING is an error. - * Explicitly handle this case and fallthrough to default to avoid - * compiler warnings. - */ - - default: PB_RETURN_ERROR(stream, "invalid wire_type"); - } -} - -/* Decode string length from stream and return a substream with limited length. - * Remember to close the substream using pb_close_string_substream(). - */ -bool checkreturn pb_make_string_substream(pb_istream_t *stream, pb_istream_t *substream) -{ - uint32_t size; - if (!pb_decode_varint32(stream, &size)) - return false; - - *substream = *stream; - if (substream->bytes_left < size) - PB_RETURN_ERROR(stream, "parent stream too short"); - - substream->bytes_left = (size_t)size; - stream->bytes_left -= (size_t)size; - return true; -} - -bool checkreturn pb_close_string_substream(pb_istream_t *stream, pb_istream_t *substream) -{ - if (substream->bytes_left) { - if (!pb_read(substream, NULL, substream->bytes_left)) - return false; - } - - stream->state = substream->state; - -#ifndef PB_NO_ERRMSG - stream->errmsg = substream->errmsg; -#endif - return true; -} - -/************************* - * Decode a single field * - *************************/ - -static bool checkreturn decode_basic_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field) -{ - switch (PB_LTYPE(field->type)) - { - case PB_LTYPE_BOOL: - if (wire_type != PB_WT_VARINT && wire_type != PB_WT_PACKED) - PB_RETURN_ERROR(stream, "wrong wire type"); - - return pb_dec_bool(stream, field); - - case PB_LTYPE_VARINT: - case PB_LTYPE_UVARINT: - case PB_LTYPE_SVARINT: - if (wire_type != PB_WT_VARINT && wire_type != PB_WT_PACKED) - PB_RETURN_ERROR(stream, "wrong wire type"); - - return pb_dec_varint(stream, field); - - case PB_LTYPE_FIXED32: - if (wire_type != PB_WT_32BIT && wire_type != PB_WT_PACKED) - PB_RETURN_ERROR(stream, "wrong wire type"); - - return pb_decode_fixed32(stream, field->pData); - - case PB_LTYPE_FIXED64: - if (wire_type != PB_WT_64BIT && wire_type != PB_WT_PACKED) - PB_RETURN_ERROR(stream, "wrong wire type"); - -#ifdef PB_CONVERT_DOUBLE_FLOAT - if (field->data_size == sizeof(float)) - { - return pb_decode_double_as_float(stream, (float*)field->pData); - } -#endif - -#ifdef PB_WITHOUT_64BIT - PB_RETURN_ERROR(stream, "invalid data_size"); -#else - return pb_decode_fixed64(stream, field->pData); -#endif - - case PB_LTYPE_BYTES: - if (wire_type != PB_WT_STRING) - PB_RETURN_ERROR(stream, "wrong wire type"); - - return pb_dec_bytes(stream, field); - - case PB_LTYPE_STRING: - if (wire_type != PB_WT_STRING) - PB_RETURN_ERROR(stream, "wrong wire type"); - - return pb_dec_string(stream, field); - - case PB_LTYPE_SUBMESSAGE: - case PB_LTYPE_SUBMSG_W_CB: - if (wire_type != PB_WT_STRING) - PB_RETURN_ERROR(stream, "wrong wire type"); - - return pb_dec_submessage(stream, field); - - case PB_LTYPE_FIXED_LENGTH_BYTES: - if (wire_type != PB_WT_STRING) - PB_RETURN_ERROR(stream, "wrong wire type"); - - return pb_dec_fixed_length_bytes(stream, field); - - default: - PB_RETURN_ERROR(stream, "invalid field type"); - } -} - -static bool checkreturn decode_static_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field) -{ - switch (PB_HTYPE(field->type)) - { - case PB_HTYPE_REQUIRED: - return decode_basic_field(stream, wire_type, field); - - case PB_HTYPE_OPTIONAL: - if (field->pSize != NULL) - *(bool*)field->pSize = true; - return decode_basic_field(stream, wire_type, field); - - case PB_HTYPE_REPEATED: - if (wire_type == PB_WT_STRING - && PB_LTYPE(field->type) <= PB_LTYPE_LAST_PACKABLE) - { - /* Packed array */ - bool status = true; - pb_istream_t substream; - pb_size_t *size = (pb_size_t*)field->pSize; - field->pData = (char*)field->pField + field->data_size * (*size); - - if (!pb_make_string_substream(stream, &substream)) - return false; - - while (substream.bytes_left > 0 && *size < field->array_size) - { - if (!decode_basic_field(&substream, PB_WT_PACKED, field)) - { - status = false; - break; - } - (*size)++; - field->pData = (char*)field->pData + field->data_size; - } - - if (substream.bytes_left != 0) - PB_RETURN_ERROR(stream, "array overflow"); - if (!pb_close_string_substream(stream, &substream)) - return false; - - return status; - } - else - { - /* Repeated field */ - pb_size_t *size = (pb_size_t*)field->pSize; - field->pData = (char*)field->pField + field->data_size * (*size); - - if ((*size)++ >= field->array_size) - PB_RETURN_ERROR(stream, "array overflow"); - - return decode_basic_field(stream, wire_type, field); - } - - case PB_HTYPE_ONEOF: - if (PB_LTYPE_IS_SUBMSG(field->type) && - *(pb_size_t*)field->pSize != field->tag) - { - /* We memset to zero so that any callbacks are set to NULL. - * This is because the callbacks might otherwise have values - * from some other union field. - * If callbacks are needed inside oneof field, use .proto - * option submsg_callback to have a separate callback function - * that can set the fields before submessage is decoded. - * pb_dec_submessage() will set any default values. */ - memset(field->pData, 0, (size_t)field->data_size); - - /* Set default values for the submessage fields. */ - if (!pb_field_set_to_default(field)) - PB_RETURN_ERROR(stream, "failed to set defaults"); - } - *(pb_size_t*)field->pSize = field->tag; - - return decode_basic_field(stream, wire_type, field); - - default: - PB_RETURN_ERROR(stream, "invalid field type"); - } -} - -#ifdef PB_ENABLE_MALLOC -/* Allocate storage for the field and store the pointer at iter->pData. - * array_size is the number of entries to reserve in an array. - * Zero size is not allowed, use pb_free() for releasing. - */ -static bool checkreturn allocate_field(pb_istream_t *stream, void *pData, size_t data_size, size_t array_size) -{ - void *ptr = *(void**)pData; - - if (data_size == 0 || array_size == 0) - PB_RETURN_ERROR(stream, "invalid size"); - -#ifdef __AVR__ - /* Workaround for AVR libc bug 53284: http://savannah.nongnu.org/bugs/?53284 - * Realloc to size of 1 byte can cause corruption of the malloc structures. - */ - if (data_size == 1 && array_size == 1) - { - data_size = 2; - } -#endif - - /* Check for multiplication overflows. - * This code avoids the costly division if the sizes are small enough. - * Multiplication is safe as long as only half of bits are set - * in either multiplicand. - */ - { - const size_t check_limit = (size_t)1 << (sizeof(size_t) * 4); - if (data_size >= check_limit || array_size >= check_limit) - { - const size_t size_max = (size_t)-1; - if (size_max / array_size < data_size) - { - PB_RETURN_ERROR(stream, "size too large"); - } - } - } - - /* Allocate new or expand previous allocation */ - /* Note: on failure the old pointer will remain in the structure, - * the message must be freed by caller also on error return. */ - ptr = pb_realloc(ptr, array_size * data_size); - if (ptr == NULL) - PB_RETURN_ERROR(stream, "realloc failed"); - - *(void**)pData = ptr; - return true; -} - -/* Clear a newly allocated item in case it contains a pointer, or is a submessage. */ -static void initialize_pointer_field(void *pItem, pb_field_iter_t *field) -{ - if (PB_LTYPE(field->type) == PB_LTYPE_STRING || - PB_LTYPE(field->type) == PB_LTYPE_BYTES) - { - *(void**)pItem = NULL; - } - else if (PB_LTYPE_IS_SUBMSG(field->type)) - { - /* We memset to zero so that any callbacks are set to NULL. - * Default values will be set by pb_dec_submessage(). */ - memset(pItem, 0, field->data_size); - } -} -#endif - -static bool checkreturn decode_pointer_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field) -{ -#ifndef PB_ENABLE_MALLOC - PB_UNUSED(wire_type); - PB_UNUSED(field); - PB_RETURN_ERROR(stream, "no malloc support"); -#else - switch (PB_HTYPE(field->type)) - { - case PB_HTYPE_REQUIRED: - case PB_HTYPE_OPTIONAL: - case PB_HTYPE_ONEOF: - if (PB_LTYPE_IS_SUBMSG(field->type) && *(void**)field->pField != NULL) - { - /* Duplicate field, have to release the old allocation first. */ - /* FIXME: Does this work correctly for oneofs? */ - pb_release_single_field(field); - } - - if (PB_HTYPE(field->type) == PB_HTYPE_ONEOF) - { - *(pb_size_t*)field->pSize = field->tag; - } - - if (PB_LTYPE(field->type) == PB_LTYPE_STRING || - PB_LTYPE(field->type) == PB_LTYPE_BYTES) - { - /* pb_dec_string and pb_dec_bytes handle allocation themselves */ - field->pData = field->pField; - return decode_basic_field(stream, wire_type, field); - } - else - { - if (!allocate_field(stream, field->pField, field->data_size, 1)) - return false; - - field->pData = *(void**)field->pField; - initialize_pointer_field(field->pData, field); - return decode_basic_field(stream, wire_type, field); - } - - case PB_HTYPE_REPEATED: - if (wire_type == PB_WT_STRING - && PB_LTYPE(field->type) <= PB_LTYPE_LAST_PACKABLE) - { - /* Packed array, multiple items come in at once. */ - bool status = true; - pb_size_t *size = (pb_size_t*)field->pSize; - size_t allocated_size = *size; - pb_istream_t substream; - - if (!pb_make_string_substream(stream, &substream)) - return false; - - while (substream.bytes_left) - { - if (*size == PB_SIZE_MAX) - { -#ifndef PB_NO_ERRMSG - stream->errmsg = "too many array entries"; -#endif - status = false; - break; - } - - if ((size_t)*size + 1 > allocated_size) - { - /* Allocate more storage. This tries to guess the - * number of remaining entries. Round the division - * upwards. */ - size_t remain = (substream.bytes_left - 1) / field->data_size + 1; - if (remain < PB_SIZE_MAX - allocated_size) - allocated_size += remain; - else - allocated_size += 1; - - if (!allocate_field(&substream, field->pField, field->data_size, allocated_size)) - { - status = false; - break; - } - } - - /* Decode the array entry */ - field->pData = *(char**)field->pField + field->data_size * (*size); - initialize_pointer_field(field->pData, field); - if (!decode_basic_field(&substream, PB_WT_PACKED, field)) - { - status = false; - break; - } - - (*size)++; - } - if (!pb_close_string_substream(stream, &substream)) - return false; - - return status; - } - else - { - /* Normal repeated field, i.e. only one item at a time. */ - pb_size_t *size = (pb_size_t*)field->pSize; - - if (*size == PB_SIZE_MAX) - PB_RETURN_ERROR(stream, "too many array entries"); - - if (!allocate_field(stream, field->pField, field->data_size, (size_t)(*size + 1))) - return false; - - field->pData = *(char**)field->pField + field->data_size * (*size); - (*size)++; - initialize_pointer_field(field->pData, field); - return decode_basic_field(stream, wire_type, field); - } - - default: - PB_RETURN_ERROR(stream, "invalid field type"); - } -#endif -} - -static bool checkreturn decode_callback_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field) -{ - if (!field->descriptor->field_callback) - return pb_skip_field(stream, wire_type); - - if (wire_type == PB_WT_STRING) - { - pb_istream_t substream; - size_t prev_bytes_left; - - if (!pb_make_string_substream(stream, &substream)) - return false; - - do - { - prev_bytes_left = substream.bytes_left; - if (!field->descriptor->field_callback(&substream, NULL, field)) - PB_RETURN_ERROR(stream, "callback failed"); - } while (substream.bytes_left > 0 && substream.bytes_left < prev_bytes_left); - - if (!pb_close_string_substream(stream, &substream)) - return false; - - return true; - } - else - { - /* Copy the single scalar value to stack. - * This is required so that we can limit the stream length, - * which in turn allows to use same callback for packed and - * not-packed fields. */ - pb_istream_t substream; - pb_byte_t buffer[10]; - size_t size = sizeof(buffer); - - if (!read_raw_value(stream, wire_type, buffer, &size)) - return false; - substream = pb_istream_from_buffer(buffer, size); - - return field->descriptor->field_callback(&substream, NULL, field); - } -} - -static bool checkreturn decode_field(pb_istream_t *stream, pb_wire_type_t wire_type, pb_field_iter_t *field) -{ -#ifdef PB_ENABLE_MALLOC - /* When decoding an oneof field, check if there is old data that must be - * released first. */ - if (PB_HTYPE(field->type) == PB_HTYPE_ONEOF) - { - if (!pb_release_union_field(stream, field)) - return false; - } -#endif - - switch (PB_ATYPE(field->type)) - { - case PB_ATYPE_STATIC: - return decode_static_field(stream, wire_type, field); - - case PB_ATYPE_POINTER: - return decode_pointer_field(stream, wire_type, field); - - case PB_ATYPE_CALLBACK: - return decode_callback_field(stream, wire_type, field); - - default: - PB_RETURN_ERROR(stream, "invalid field type"); - } -} - -/* Default handler for extension fields. Expects to have a pb_msgdesc_t - * pointer in the extension->type->arg field, pointing to a message with - * only one field in it. */ -static bool checkreturn default_extension_decoder(pb_istream_t *stream, - pb_extension_t *extension, uint32_t tag, pb_wire_type_t wire_type) -{ - pb_field_iter_t iter; - - if (!pb_field_iter_begin_extension(&iter, extension)) - PB_RETURN_ERROR(stream, "invalid extension"); - - if (iter.tag != tag || !iter.message) - return true; - - extension->found = true; - return decode_field(stream, wire_type, &iter); -} - -/* Try to decode an unknown field as an extension field. Tries each extension - * decoder in turn, until one of them handles the field or loop ends. */ -static bool checkreturn decode_extension(pb_istream_t *stream, - uint32_t tag, pb_wire_type_t wire_type, pb_extension_t *extension) -{ - size_t pos = stream->bytes_left; - - while (extension != NULL && pos == stream->bytes_left) - { - bool status; - if (extension->type->decode) - status = extension->type->decode(stream, extension, tag, wire_type); - else - status = default_extension_decoder(stream, extension, tag, wire_type); - - if (!status) - return false; - - extension = extension->next; - } - - return true; -} - -/* Initialize message fields to default values, recursively */ -static bool pb_field_set_to_default(pb_field_iter_t *field) -{ - pb_type_t type; - type = field->type; - - if (PB_LTYPE(type) == PB_LTYPE_EXTENSION) - { - pb_extension_t *ext = *(pb_extension_t* const *)field->pData; - while (ext != NULL) - { - pb_field_iter_t ext_iter; - if (pb_field_iter_begin_extension(&ext_iter, ext)) - { - ext->found = false; - if (!pb_message_set_to_defaults(&ext_iter)) - return false; - } - ext = ext->next; - } - } - else if (PB_ATYPE(type) == PB_ATYPE_STATIC) - { - bool init_data = true; - if (PB_HTYPE(type) == PB_HTYPE_OPTIONAL && field->pSize != NULL) - { - /* Set has_field to false. Still initialize the optional field - * itself also. */ - *(bool*)field->pSize = false; - } - else if (PB_HTYPE(type) == PB_HTYPE_REPEATED || - PB_HTYPE(type) == PB_HTYPE_ONEOF) - { - /* REPEATED: Set array count to 0, no need to initialize contents. - ONEOF: Set which_field to 0. */ - *(pb_size_t*)field->pSize = 0; - init_data = false; - } - - if (init_data) - { - if (PB_LTYPE_IS_SUBMSG(field->type) && - (field->submsg_desc->default_value != NULL || - field->submsg_desc->field_callback != NULL || - field->submsg_desc->submsg_info[0] != NULL)) - { - /* Initialize submessage to defaults. - * Only needed if it has default values - * or callback/submessage fields. */ - pb_field_iter_t submsg_iter; - if (pb_field_iter_begin(&submsg_iter, field->submsg_desc, field->pData)) - { - if (!pb_message_set_to_defaults(&submsg_iter)) - return false; - } - } - else - { - /* Initialize to zeros */ - memset(field->pData, 0, (size_t)field->data_size); - } - } - } - else if (PB_ATYPE(type) == PB_ATYPE_POINTER) - { - /* Initialize the pointer to NULL. */ - *(void**)field->pField = NULL; - - /* Initialize array count to 0. */ - if (PB_HTYPE(type) == PB_HTYPE_REPEATED || - PB_HTYPE(type) == PB_HTYPE_ONEOF) - { - *(pb_size_t*)field->pSize = 0; - } - } - else if (PB_ATYPE(type) == PB_ATYPE_CALLBACK) - { - /* Don't overwrite callback */ - } - - return true; -} - -static bool pb_message_set_to_defaults(pb_field_iter_t *iter) -{ - pb_istream_t defstream = PB_ISTREAM_EMPTY; - uint32_t tag = 0; - pb_wire_type_t wire_type = PB_WT_VARINT; - bool eof; - - if (iter->descriptor->default_value) - { - defstream = pb_istream_from_buffer(iter->descriptor->default_value, (size_t)-1); - if (!pb_decode_tag(&defstream, &wire_type, &tag, &eof)) - return false; - } - - do - { - if (!pb_field_set_to_default(iter)) - return false; - - if (tag != 0 && iter->tag == tag) - { - /* We have a default value for this field in the defstream */ - if (!decode_field(&defstream, wire_type, iter)) - return false; - if (!pb_decode_tag(&defstream, &wire_type, &tag, &eof)) - return false; - - if (iter->pSize) - *(bool*)iter->pSize = false; - } - } while (pb_field_iter_next(iter)); - - return true; -} - -/********************* - * Decode all fields * - *********************/ - -static bool checkreturn pb_decode_inner(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct, unsigned int flags) -{ - uint32_t extension_range_start = 0; - pb_extension_t *extensions = NULL; - - /* 'fixed_count_field' and 'fixed_count_size' track position of a repeated fixed - * count field. This can only handle _one_ repeated fixed count field that - * is unpacked and unordered among other (non repeated fixed count) fields. - */ - pb_size_t fixed_count_field = PB_SIZE_MAX; - pb_size_t fixed_count_size = 0; - pb_size_t fixed_count_total_size = 0; - - pb_fields_seen_t fields_seen = {{0, 0}}; - const uint32_t allbits = ~(uint32_t)0; - pb_field_iter_t iter; - - if (pb_field_iter_begin(&iter, fields, dest_struct)) - { - if ((flags & PB_DECODE_NOINIT) == 0) - { - if (!pb_message_set_to_defaults(&iter)) - PB_RETURN_ERROR(stream, "failed to set defaults"); - } - } - - while (stream->bytes_left) - { - uint32_t tag; - pb_wire_type_t wire_type; - bool eof; - - if (!pb_decode_tag(stream, &wire_type, &tag, &eof)) - { - if (eof) - break; - else - return false; - } - - if (tag == 0) - { - if (flags & PB_DECODE_NULLTERMINATED) - { - break; - } - else - { - PB_RETURN_ERROR(stream, "zero tag"); - } - } - - if (!pb_field_iter_find(&iter, tag) || PB_LTYPE(iter.type) == PB_LTYPE_EXTENSION) - { - /* No match found, check if it matches an extension. */ - if (extension_range_start == 0) - { - if (pb_field_iter_find_extension(&iter)) - { - extensions = *(pb_extension_t* const *)iter.pData; - extension_range_start = iter.tag; - } - - if (!extensions) - { - extension_range_start = (uint32_t)-1; - } - } - - if (tag >= extension_range_start) - { - size_t pos = stream->bytes_left; - - if (!decode_extension(stream, tag, wire_type, extensions)) - return false; - - if (pos != stream->bytes_left) - { - /* The field was handled */ - continue; - } - } - - /* No match found, skip data */ - if (!pb_skip_field(stream, wire_type)) - return false; - continue; - } - - /* If a repeated fixed count field was found, get size from - * 'fixed_count_field' as there is no counter contained in the struct. - */ - if (PB_HTYPE(iter.type) == PB_HTYPE_REPEATED && iter.pSize == &iter.array_size) - { - if (fixed_count_field != iter.index) { - /* If the new fixed count field does not match the previous one, - * check that the previous one is NULL or that it finished - * receiving all the expected data. - */ - if (fixed_count_field != PB_SIZE_MAX && - fixed_count_size != fixed_count_total_size) - { - PB_RETURN_ERROR(stream, "wrong size for fixed count field"); - } - - fixed_count_field = iter.index; - fixed_count_size = 0; - fixed_count_total_size = iter.array_size; - } - - iter.pSize = &fixed_count_size; - } - - if (PB_HTYPE(iter.type) == PB_HTYPE_REQUIRED - && iter.required_field_index < PB_MAX_REQUIRED_FIELDS) - { - uint32_t tmp = ((uint32_t)1 << (iter.required_field_index & 31)); - fields_seen.bitfield[iter.required_field_index >> 5] |= tmp; - } - - if (!decode_field(stream, wire_type, &iter)) - return false; - } - - /* Check that all elements of the last decoded fixed count field were present. */ - if (fixed_count_field != PB_SIZE_MAX && - fixed_count_size != fixed_count_total_size) - { - PB_RETURN_ERROR(stream, "wrong size for fixed count field"); - } - - /* Check that all required fields were present. */ - { - pb_size_t req_field_count = iter.descriptor->required_field_count; - - if (req_field_count > 0) - { - pb_size_t i; - - if (req_field_count > PB_MAX_REQUIRED_FIELDS) - req_field_count = PB_MAX_REQUIRED_FIELDS; - - /* Check the whole words */ - for (i = 0; i < (req_field_count >> 5); i++) - { - if (fields_seen.bitfield[i] != allbits) - PB_RETURN_ERROR(stream, "missing required field"); - } - - /* Check the remaining bits (if any) */ - if ((req_field_count & 31) != 0) - { - if (fields_seen.bitfield[req_field_count >> 5] != - (allbits >> (uint_least8_t)(32 - (req_field_count & 31)))) - { - PB_RETURN_ERROR(stream, "missing required field"); - } - } - } - } - - return true; -} - -bool checkreturn pb_decode_ex(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct, unsigned int flags) -{ - bool status; - - if ((flags & PB_DECODE_DELIMITED) == 0) - { - status = pb_decode_inner(stream, fields, dest_struct, flags); - } - else - { - pb_istream_t substream; - if (!pb_make_string_substream(stream, &substream)) - return false; - - status = pb_decode_inner(&substream, fields, dest_struct, flags); - - if (!pb_close_string_substream(stream, &substream)) - return false; - } - -#ifdef PB_ENABLE_MALLOC - if (!status) - pb_release(fields, dest_struct); -#endif - - return status; -} - -bool checkreturn pb_decode(pb_istream_t *stream, const pb_msgdesc_t *fields, void *dest_struct) -{ - bool status; - - status = pb_decode_inner(stream, fields, dest_struct, 0); - -#ifdef PB_ENABLE_MALLOC - if (!status) - pb_release(fields, dest_struct); -#endif - - return status; -} - -#ifdef PB_ENABLE_MALLOC -/* Given an oneof field, if there has already been a field inside this oneof, - * release it before overwriting with a different one. */ -static bool pb_release_union_field(pb_istream_t *stream, pb_field_iter_t *field) -{ - pb_field_iter_t old_field = *field; - pb_size_t old_tag = *(pb_size_t*)field->pSize; /* Previous which_ value */ - pb_size_t new_tag = field->tag; /* New which_ value */ - - if (old_tag == 0) - return true; /* Ok, no old data in union */ - - if (old_tag == new_tag) - return true; /* Ok, old data is of same type => merge */ - - /* Release old data. The find can fail if the message struct contains - * invalid data. */ - if (!pb_field_iter_find(&old_field, old_tag)) - PB_RETURN_ERROR(stream, "invalid union tag"); - - pb_release_single_field(&old_field); - - return true; -} - -static void pb_release_single_field(pb_field_iter_t *field) -{ - pb_type_t type; - type = field->type; - - if (PB_HTYPE(type) == PB_HTYPE_ONEOF) - { - if (*(pb_size_t*)field->pSize != field->tag) - return; /* This is not the current field in the union */ - } - - /* Release anything contained inside an extension or submsg. - * This has to be done even if the submsg itself is statically - * allocated. */ - if (PB_LTYPE(type) == PB_LTYPE_EXTENSION) - { - /* Release fields from all extensions in the linked list */ - pb_extension_t *ext = *(pb_extension_t**)field->pData; - while (ext != NULL) - { - pb_field_iter_t ext_iter; - if (pb_field_iter_begin_extension(&ext_iter, ext)) - { - pb_release_single_field(&ext_iter); - } - ext = ext->next; - } - } - else if (PB_LTYPE_IS_SUBMSG(type) && PB_ATYPE(type) != PB_ATYPE_CALLBACK) - { - /* Release fields in submessage or submsg array */ - pb_size_t count = 1; - - if (PB_ATYPE(type) == PB_ATYPE_POINTER) - { - field->pData = *(void**)field->pField; - } - else - { - field->pData = field->pField; - } - - if (PB_HTYPE(type) == PB_HTYPE_REPEATED) - { - count = *(pb_size_t*)field->pSize; - - if (PB_ATYPE(type) == PB_ATYPE_STATIC && count > field->array_size) - { - /* Protect against corrupted _count fields */ - count = field->array_size; - } - } - - if (field->pData) - { - for (; count > 0; count--) - { - pb_release(field->submsg_desc, field->pData); - field->pData = (char*)field->pData + field->data_size; - } - } - } - - if (PB_ATYPE(type) == PB_ATYPE_POINTER) - { - if (PB_HTYPE(type) == PB_HTYPE_REPEATED && - (PB_LTYPE(type) == PB_LTYPE_STRING || - PB_LTYPE(type) == PB_LTYPE_BYTES)) - { - /* Release entries in repeated string or bytes array */ - void **pItem = *(void***)field->pField; - pb_size_t count = *(pb_size_t*)field->pSize; - for (; count > 0; count--) - { - pb_free(*pItem); - *pItem++ = NULL; - } - } - - if (PB_HTYPE(type) == PB_HTYPE_REPEATED) - { - /* We are going to release the array, so set the size to 0 */ - *(pb_size_t*)field->pSize = 0; - } - - /* Release main pointer */ - pb_free(*(void**)field->pField); - *(void**)field->pField = NULL; - } -} - -void pb_release(const pb_msgdesc_t *fields, void *dest_struct) -{ - pb_field_iter_t iter; - - if (!dest_struct) - return; /* Ignore NULL pointers, similar to free() */ - - if (!pb_field_iter_begin(&iter, fields, dest_struct)) - return; /* Empty message type */ - - do - { - pb_release_single_field(&iter); - } while (pb_field_iter_next(&iter)); -} -#endif - -/* Field decoders */ - -bool pb_decode_bool(pb_istream_t *stream, bool *dest) -{ - uint32_t value; - if (!pb_decode_varint32(stream, &value)) - return false; - - *(bool*)dest = (value != 0); - return true; -} - -bool pb_decode_svarint(pb_istream_t *stream, pb_int64_t *dest) -{ - pb_uint64_t value; - if (!pb_decode_varint(stream, &value)) - return false; - - if (value & 1) - *dest = (pb_int64_t)(~(value >> 1)); - else - *dest = (pb_int64_t)(value >> 1); - - return true; -} - -bool pb_decode_fixed32(pb_istream_t *stream, void *dest) -{ - union { - uint32_t fixed32; - pb_byte_t bytes[4]; - } u; - - if (!pb_read(stream, u.bytes, 4)) - return false; - -#if defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN && CHAR_BIT == 8 - /* fast path - if we know that we're on little endian, assign directly */ - *(uint32_t*)dest = u.fixed32; -#else - *(uint32_t*)dest = ((uint32_t)u.bytes[0] << 0) | - ((uint32_t)u.bytes[1] << 8) | - ((uint32_t)u.bytes[2] << 16) | - ((uint32_t)u.bytes[3] << 24); -#endif - return true; -} - -#ifndef PB_WITHOUT_64BIT -bool pb_decode_fixed64(pb_istream_t *stream, void *dest) -{ - union { - uint64_t fixed64; - pb_byte_t bytes[8]; - } u; - - if (!pb_read(stream, u.bytes, 8)) - return false; - -#if defined(__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN && CHAR_BIT == 8 - /* fast path - if we know that we're on little endian, assign directly */ - *(uint64_t*)dest = u.fixed64; -#else - *(uint64_t*)dest = ((uint64_t)u.bytes[0] << 0) | - ((uint64_t)u.bytes[1] << 8) | - ((uint64_t)u.bytes[2] << 16) | - ((uint64_t)u.bytes[3] << 24) | - ((uint64_t)u.bytes[4] << 32) | - ((uint64_t)u.bytes[5] << 40) | - ((uint64_t)u.bytes[6] << 48) | - ((uint64_t)u.bytes[7] << 56); -#endif - return true; -} -#endif - -static bool checkreturn pb_dec_bool(pb_istream_t *stream, const pb_field_iter_t *field) -{ - return pb_decode_bool(stream, (bool*)field->pData); -} - -static bool checkreturn pb_dec_varint(pb_istream_t *stream, const pb_field_iter_t *field) -{ - if (PB_LTYPE(field->type) == PB_LTYPE_UVARINT) - { - pb_uint64_t value, clamped; - if (!pb_decode_varint(stream, &value)) - return false; - - /* Cast to the proper field size, while checking for overflows */ - if (field->data_size == sizeof(pb_uint64_t)) - clamped = *(pb_uint64_t*)field->pData = value; - else if (field->data_size == sizeof(uint32_t)) - clamped = *(uint32_t*)field->pData = (uint32_t)value; - else if (field->data_size == sizeof(uint_least16_t)) - clamped = *(uint_least16_t*)field->pData = (uint_least16_t)value; - else if (field->data_size == sizeof(uint_least8_t)) - clamped = *(uint_least8_t*)field->pData = (uint_least8_t)value; - else - PB_RETURN_ERROR(stream, "invalid data_size"); - - if (clamped != value) - PB_RETURN_ERROR(stream, "integer too large"); - - return true; - } - else - { - pb_uint64_t value; - pb_int64_t svalue; - pb_int64_t clamped; - - if (PB_LTYPE(field->type) == PB_LTYPE_SVARINT) - { - if (!pb_decode_svarint(stream, &svalue)) - return false; - } - else - { - if (!pb_decode_varint(stream, &value)) - return false; - - /* See issue 97: Google's C++ protobuf allows negative varint values to - * be cast as int32_t, instead of the int64_t that should be used when - * encoding. Nanopb versions before 0.2.5 had a bug in encoding. In order to - * not break decoding of such messages, we cast <=32 bit fields to - * int32_t first to get the sign correct. - */ - if (field->data_size == sizeof(pb_int64_t)) - svalue = (pb_int64_t)value; - else - svalue = (int32_t)value; - } - - /* Cast to the proper field size, while checking for overflows */ - if (field->data_size == sizeof(pb_int64_t)) - clamped = *(pb_int64_t*)field->pData = svalue; - else if (field->data_size == sizeof(int32_t)) - clamped = *(int32_t*)field->pData = (int32_t)svalue; - else if (field->data_size == sizeof(int_least16_t)) - clamped = *(int_least16_t*)field->pData = (int_least16_t)svalue; - else if (field->data_size == sizeof(int_least8_t)) - clamped = *(int_least8_t*)field->pData = (int_least8_t)svalue; - else - PB_RETURN_ERROR(stream, "invalid data_size"); - - if (clamped != svalue) - PB_RETURN_ERROR(stream, "integer too large"); - - return true; - } -} - -static bool checkreturn pb_dec_bytes(pb_istream_t *stream, const pb_field_iter_t *field) -{ - uint32_t size; - size_t alloc_size; - pb_bytes_array_t *dest; - - if (!pb_decode_varint32(stream, &size)) - return false; - - if (size > PB_SIZE_MAX) - PB_RETURN_ERROR(stream, "bytes overflow"); - - alloc_size = PB_BYTES_ARRAY_T_ALLOCSIZE(size); - if (size > alloc_size) - PB_RETURN_ERROR(stream, "size too large"); - - if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) - { -#ifndef PB_ENABLE_MALLOC - PB_RETURN_ERROR(stream, "no malloc support"); -#else - if (stream->bytes_left < size) - PB_RETURN_ERROR(stream, "end-of-stream"); - - if (!allocate_field(stream, field->pData, alloc_size, 1)) - return false; - dest = *(pb_bytes_array_t**)field->pData; -#endif - } - else - { - if (alloc_size > field->data_size) - PB_RETURN_ERROR(stream, "bytes overflow"); - dest = (pb_bytes_array_t*)field->pData; - } - - dest->size = (pb_size_t)size; - return pb_read(stream, dest->bytes, (size_t)size); -} - -static bool checkreturn pb_dec_string(pb_istream_t *stream, const pb_field_iter_t *field) -{ - uint32_t size; - size_t alloc_size; - pb_byte_t *dest = (pb_byte_t*)field->pData; - - if (!pb_decode_varint32(stream, &size)) - return false; - - if (size == (uint32_t)-1) - PB_RETURN_ERROR(stream, "size too large"); - - /* Space for null terminator */ - alloc_size = (size_t)(size + 1); - - if (alloc_size < size) - PB_RETURN_ERROR(stream, "size too large"); - - if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) - { -#ifndef PB_ENABLE_MALLOC - PB_RETURN_ERROR(stream, "no malloc support"); -#else - if (stream->bytes_left < size) - PB_RETURN_ERROR(stream, "end-of-stream"); - - if (!allocate_field(stream, field->pData, alloc_size, 1)) - return false; - dest = *(pb_byte_t**)field->pData; -#endif - } - else - { - if (alloc_size > field->data_size) - PB_RETURN_ERROR(stream, "string overflow"); - } - - dest[size] = 0; - - if (!pb_read(stream, dest, (size_t)size)) - return false; - -#ifdef PB_VALIDATE_UTF8 - if (!pb_validate_utf8((const char*)dest)) - PB_RETURN_ERROR(stream, "invalid utf8"); -#endif - - return true; -} - -static bool checkreturn pb_dec_submessage(pb_istream_t *stream, const pb_field_iter_t *field) -{ - bool status = true; - bool submsg_consumed = false; - pb_istream_t substream; - - if (!pb_make_string_substream(stream, &substream)) - return false; - - if (field->submsg_desc == NULL) - PB_RETURN_ERROR(stream, "invalid field descriptor"); - - /* Submessages can have a separate message-level callback that is called - * before decoding the message. Typically it is used to set callback fields - * inside oneofs. */ - if (PB_LTYPE(field->type) == PB_LTYPE_SUBMSG_W_CB && field->pSize != NULL) - { - /* Message callback is stored right before pSize. */ - pb_callback_t *callback = (pb_callback_t*)field->pSize - 1; - if (callback->funcs.decode) - { - status = callback->funcs.decode(&substream, field, &callback->arg); - - if (substream.bytes_left == 0) - { - submsg_consumed = true; - } - } - } - - /* Now decode the submessage contents */ - if (status && !submsg_consumed) - { - unsigned int flags = 0; - - /* Static required/optional fields are already initialized by top-level - * pb_decode(), no need to initialize them again. */ - if (PB_ATYPE(field->type) == PB_ATYPE_STATIC && - PB_HTYPE(field->type) != PB_HTYPE_REPEATED) - { - flags = PB_DECODE_NOINIT; - } - - status = pb_decode_inner(&substream, field->submsg_desc, field->pData, flags); - } - - if (!pb_close_string_substream(stream, &substream)) - return false; - - return status; -} - -static bool checkreturn pb_dec_fixed_length_bytes(pb_istream_t *stream, const pb_field_iter_t *field) -{ - uint32_t size; - - if (!pb_decode_varint32(stream, &size)) - return false; - - if (size > PB_SIZE_MAX) - PB_RETURN_ERROR(stream, "bytes overflow"); - - if (size == 0) - { - /* As a special case, treat empty bytes string as all zeros for fixed_length_bytes. */ - memset(field->pData, 0, (size_t)field->data_size); - return true; - } - - if (size != field->data_size) - PB_RETURN_ERROR(stream, "incorrect fixed length bytes size"); - - return pb_read(stream, (pb_byte_t*)field->pData, (size_t)field->data_size); -} - -#ifdef PB_CONVERT_DOUBLE_FLOAT -bool pb_decode_double_as_float(pb_istream_t *stream, float *dest) -{ - uint_least8_t sign; - int exponent; - uint32_t mantissa; - uint64_t value; - union { float f; uint32_t i; } out; - - if (!pb_decode_fixed64(stream, &value)) - return false; - - /* Decompose input value */ - sign = (uint_least8_t)((value >> 63) & 1); - exponent = (int)((value >> 52) & 0x7FF) - 1023; - mantissa = (value >> 28) & 0xFFFFFF; /* Highest 24 bits */ - - /* Figure if value is in range representable by floats. */ - if (exponent == 1024) - { - /* Special value */ - exponent = 128; - mantissa >>= 1; - } - else - { - if (exponent > 127) - { - /* Too large, convert to infinity */ - exponent = 128; - mantissa = 0; - } - else if (exponent < -150) - { - /* Too small, convert to zero */ - exponent = -127; - mantissa = 0; - } - else if (exponent < -126) - { - /* Denormalized */ - mantissa |= 0x1000000; - mantissa >>= (-126 - exponent); - exponent = -127; - } - - /* Round off mantissa */ - mantissa = (mantissa + 1) >> 1; - - /* Check if mantissa went over 2.0 */ - if (mantissa & 0x800000) - { - exponent += 1; - mantissa &= 0x7FFFFF; - mantissa >>= 1; - } - } - - /* Combine fields */ - out.i = mantissa; - out.i |= (uint32_t)(exponent + 127) << 23; - out.i |= (uint32_t)sign << 31; - - *dest = out.f; - return true; -} -#endif diff --git a/lib/nanopb/src/pb_encode.c b/lib/nanopb/src/pb_encode.c deleted file mode 100644 index de716f7a5..000000000 --- a/lib/nanopb/src/pb_encode.c +++ /dev/null @@ -1,987 +0,0 @@ -/* pb_encode.c -- encode a protobuf using minimal resources - * - * 2011 Petteri Aimonen - */ - -#include "pb.h" -#include "pb_encode.h" -#include "pb_common.h" - -/* Use the GCC warn_unused_result attribute to check that all return values - * are propagated correctly. On other compilers and gcc before 3.4.0 just - * ignore the annotation. - */ -#if !defined(__GNUC__) || ( __GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 4) - #define checkreturn -#else - #define checkreturn __attribute__((warn_unused_result)) -#endif - -/************************************** - * Declarations internal to this file * - **************************************/ -static bool checkreturn buf_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count); -static bool checkreturn encode_array(pb_ostream_t *stream, pb_field_iter_t *field); -static bool checkreturn pb_check_proto3_default_value(const pb_field_iter_t *field); -static bool checkreturn encode_basic_field(pb_ostream_t *stream, const pb_field_iter_t *field); -static bool checkreturn encode_callback_field(pb_ostream_t *stream, const pb_field_iter_t *field); -static bool checkreturn encode_field(pb_ostream_t *stream, pb_field_iter_t *field); -static bool checkreturn encode_extension_field(pb_ostream_t *stream, const pb_field_iter_t *field); -static bool checkreturn default_extension_encoder(pb_ostream_t *stream, const pb_extension_t *extension); -static bool checkreturn pb_encode_varint_32(pb_ostream_t *stream, uint32_t low, uint32_t high); -static bool checkreturn pb_enc_bool(pb_ostream_t *stream, const pb_field_iter_t *field); -static bool checkreturn pb_enc_varint(pb_ostream_t *stream, const pb_field_iter_t *field); -static bool checkreturn pb_enc_fixed(pb_ostream_t *stream, const pb_field_iter_t *field); -static bool checkreturn pb_enc_bytes(pb_ostream_t *stream, const pb_field_iter_t *field); -static bool checkreturn pb_enc_string(pb_ostream_t *stream, const pb_field_iter_t *field); -static bool checkreturn pb_enc_submessage(pb_ostream_t *stream, const pb_field_iter_t *field); -static bool checkreturn pb_enc_fixed_length_bytes(pb_ostream_t *stream, const pb_field_iter_t *field); - -#ifdef PB_WITHOUT_64BIT -#define pb_int64_t int32_t -#define pb_uint64_t uint32_t -#else -#define pb_int64_t int64_t -#define pb_uint64_t uint64_t -#endif - -/******************************* - * pb_ostream_t implementation * - *******************************/ - -static bool checkreturn buf_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count) -{ - size_t i; - pb_byte_t *dest = (pb_byte_t*)stream->state; - stream->state = dest + count; - - for (i = 0; i < count; i++) - dest[i] = buf[i]; - - return true; -} - -pb_ostream_t pb_ostream_from_buffer(pb_byte_t *buf, size_t bufsize) -{ - pb_ostream_t stream; -#ifdef PB_BUFFER_ONLY - stream.callback = (void*)1; /* Just a marker value */ -#else - stream.callback = &buf_write; -#endif - stream.state = buf; - stream.max_size = bufsize; - stream.bytes_written = 0; -#ifndef PB_NO_ERRMSG - stream.errmsg = NULL; -#endif - return stream; -} - -bool checkreturn pb_write(pb_ostream_t *stream, const pb_byte_t *buf, size_t count) -{ - if (count > 0 && stream->callback != NULL) - { - if (stream->bytes_written + count < stream->bytes_written || - stream->bytes_written + count > stream->max_size) - { - PB_RETURN_ERROR(stream, "stream full"); - } - -#ifdef PB_BUFFER_ONLY - if (!buf_write(stream, buf, count)) - PB_RETURN_ERROR(stream, "io error"); -#else - if (!stream->callback(stream, buf, count)) - PB_RETURN_ERROR(stream, "io error"); -#endif - } - - stream->bytes_written += count; - return true; -} - -/************************* - * Encode a single field * - *************************/ - -/* Read a bool value without causing undefined behavior even if the value - * is invalid. See issue #434 and - * https://stackoverflow.com/questions/27661768/weird-results-for-conditional - */ -static bool safe_read_bool(const void *pSize) -{ - const char *p = (const char *)pSize; - size_t i; - for (i = 0; i < sizeof(bool); i++) - { - if (p[i] != 0) - return true; - } - return false; -} - -/* Encode a static array. Handles the size calculations and possible packing. */ -static bool checkreturn encode_array(pb_ostream_t *stream, pb_field_iter_t *field) -{ - pb_size_t i; - pb_size_t count; -#ifndef PB_ENCODE_ARRAYS_UNPACKED - size_t size; -#endif - - count = *(pb_size_t*)field->pSize; - - if (count == 0) - return true; - - if (PB_ATYPE(field->type) != PB_ATYPE_POINTER && count > field->array_size) - PB_RETURN_ERROR(stream, "array max size exceeded"); - -#ifndef PB_ENCODE_ARRAYS_UNPACKED - /* We always pack arrays if the datatype allows it. */ - if (PB_LTYPE(field->type) <= PB_LTYPE_LAST_PACKABLE) - { - if (!pb_encode_tag(stream, PB_WT_STRING, field->tag)) - return false; - - /* Determine the total size of packed array. */ - if (PB_LTYPE(field->type) == PB_LTYPE_FIXED32) - { - size = 4 * (size_t)count; - } - else if (PB_LTYPE(field->type) == PB_LTYPE_FIXED64) - { - size = 8 * (size_t)count; - } - else - { - pb_ostream_t sizestream = PB_OSTREAM_SIZING; - void *pData_orig = field->pData; - for (i = 0; i < count; i++) - { - if (!pb_enc_varint(&sizestream, field)) - PB_RETURN_ERROR(stream, PB_GET_ERROR(&sizestream)); - field->pData = (char*)field->pData + field->data_size; - } - field->pData = pData_orig; - size = sizestream.bytes_written; - } - - if (!pb_encode_varint(stream, (pb_uint64_t)size)) - return false; - - if (stream->callback == NULL) - return pb_write(stream, NULL, size); /* Just sizing.. */ - - /* Write the data */ - for (i = 0; i < count; i++) - { - if (PB_LTYPE(field->type) == PB_LTYPE_FIXED32 || PB_LTYPE(field->type) == PB_LTYPE_FIXED64) - { - if (!pb_enc_fixed(stream, field)) - return false; - } - else - { - if (!pb_enc_varint(stream, field)) - return false; - } - - field->pData = (char*)field->pData + field->data_size; - } - } - else /* Unpacked fields */ -#endif - { - for (i = 0; i < count; i++) - { - /* Normally the data is stored directly in the array entries, but - * for pointer-type string and bytes fields, the array entries are - * actually pointers themselves also. So we have to dereference once - * more to get to the actual data. */ - if (PB_ATYPE(field->type) == PB_ATYPE_POINTER && - (PB_LTYPE(field->type) == PB_LTYPE_STRING || - PB_LTYPE(field->type) == PB_LTYPE_BYTES)) - { - bool status; - void *pData_orig = field->pData; - field->pData = *(void* const*)field->pData; - - if (!field->pData) - { - /* Null pointer in array is treated as empty string / bytes */ - status = pb_encode_tag_for_field(stream, field) && - pb_encode_varint(stream, 0); - } - else - { - status = encode_basic_field(stream, field); - } - - field->pData = pData_orig; - - if (!status) - return false; - } - else - { - if (!encode_basic_field(stream, field)) - return false; - } - field->pData = (char*)field->pData + field->data_size; - } - } - - return true; -} - -/* In proto3, all fields are optional and are only encoded if their value is "non-zero". - * This function implements the check for the zero value. */ -static bool checkreturn pb_check_proto3_default_value(const pb_field_iter_t *field) -{ - pb_type_t type = field->type; - - if (PB_ATYPE(type) == PB_ATYPE_STATIC) - { - if (PB_HTYPE(type) == PB_HTYPE_REQUIRED) - { - /* Required proto2 fields inside proto3 submessage, pretty rare case */ - return false; - } - else if (PB_HTYPE(type) == PB_HTYPE_REPEATED) - { - /* Repeated fields inside proto3 submessage: present if count != 0 */ - return *(const pb_size_t*)field->pSize == 0; - } - else if (PB_HTYPE(type) == PB_HTYPE_ONEOF) - { - /* Oneof fields */ - return *(const pb_size_t*)field->pSize == 0; - } - else if (PB_HTYPE(type) == PB_HTYPE_OPTIONAL && field->pSize != NULL) - { - /* Proto2 optional fields inside proto3 message, or proto3 - * submessage fields. */ - return safe_read_bool(field->pSize) == false; - } - else if (field->descriptor->default_value) - { - /* Proto3 messages do not have default values, but proto2 messages - * can contain optional fields without has_fields (generator option 'proto3'). - * In this case they must always be encoded, to make sure that the - * non-zero default value is overwritten. - */ - return false; - } - - /* Rest is proto3 singular fields */ - if (PB_LTYPE(type) <= PB_LTYPE_LAST_PACKABLE) - { - /* Simple integer / float fields */ - pb_size_t i; - const char *p = (const char*)field->pData; - for (i = 0; i < field->data_size; i++) - { - if (p[i] != 0) - { - return false; - } - } - - return true; - } - else if (PB_LTYPE(type) == PB_LTYPE_BYTES) - { - const pb_bytes_array_t *bytes = (const pb_bytes_array_t*)field->pData; - return bytes->size == 0; - } - else if (PB_LTYPE(type) == PB_LTYPE_STRING) - { - return *(const char*)field->pData == '\0'; - } - else if (PB_LTYPE(type) == PB_LTYPE_FIXED_LENGTH_BYTES) - { - /* Fixed length bytes is only empty if its length is fixed - * as 0. Which would be pretty strange, but we can check - * it anyway. */ - return field->data_size == 0; - } - else if (PB_LTYPE_IS_SUBMSG(type)) - { - /* Check all fields in the submessage to find if any of them - * are non-zero. The comparison cannot be done byte-per-byte - * because the C struct may contain padding bytes that must - * be skipped. Note that usually proto3 submessages have - * a separate has_field that is checked earlier in this if. - */ - pb_field_iter_t iter; - if (pb_field_iter_begin(&iter, field->submsg_desc, field->pData)) - { - do - { - if (!pb_check_proto3_default_value(&iter)) - { - return false; - } - } while (pb_field_iter_next(&iter)); - } - return true; - } - } - else if (PB_ATYPE(type) == PB_ATYPE_POINTER) - { - return field->pData == NULL; - } - else if (PB_ATYPE(type) == PB_ATYPE_CALLBACK) - { - if (PB_LTYPE(type) == PB_LTYPE_EXTENSION) - { - const pb_extension_t *extension = *(const pb_extension_t* const *)field->pData; - return extension == NULL; - } - else if (field->descriptor->field_callback == pb_default_field_callback) - { - pb_callback_t *pCallback = (pb_callback_t*)field->pData; - return pCallback->funcs.encode == NULL; - } - else - { - return field->descriptor->field_callback == NULL; - } - } - - return false; /* Not typically reached, safe default for weird special cases. */ -} - -/* Encode a field with static or pointer allocation, i.e. one whose data - * is available to the encoder directly. */ -static bool checkreturn encode_basic_field(pb_ostream_t *stream, const pb_field_iter_t *field) -{ - if (!field->pData) - { - /* Missing pointer field */ - return true; - } - - if (!pb_encode_tag_for_field(stream, field)) - return false; - - switch (PB_LTYPE(field->type)) - { - case PB_LTYPE_BOOL: - return pb_enc_bool(stream, field); - - case PB_LTYPE_VARINT: - case PB_LTYPE_UVARINT: - case PB_LTYPE_SVARINT: - return pb_enc_varint(stream, field); - - case PB_LTYPE_FIXED32: - case PB_LTYPE_FIXED64: - return pb_enc_fixed(stream, field); - - case PB_LTYPE_BYTES: - return pb_enc_bytes(stream, field); - - case PB_LTYPE_STRING: - return pb_enc_string(stream, field); - - case PB_LTYPE_SUBMESSAGE: - case PB_LTYPE_SUBMSG_W_CB: - return pb_enc_submessage(stream, field); - - case PB_LTYPE_FIXED_LENGTH_BYTES: - return pb_enc_fixed_length_bytes(stream, field); - - default: - PB_RETURN_ERROR(stream, "invalid field type"); - } -} - -/* Encode a field with callback semantics. This means that a user function is - * called to provide and encode the actual data. */ -static bool checkreturn encode_callback_field(pb_ostream_t *stream, const pb_field_iter_t *field) -{ - if (field->descriptor->field_callback != NULL) - { - if (!field->descriptor->field_callback(NULL, stream, field)) - PB_RETURN_ERROR(stream, "callback error"); - } - return true; -} - -/* Encode a single field of any callback, pointer or static type. */ -static bool checkreturn encode_field(pb_ostream_t *stream, pb_field_iter_t *field) -{ - /* Check field presence */ - if (PB_HTYPE(field->type) == PB_HTYPE_ONEOF) - { - if (*(const pb_size_t*)field->pSize != field->tag) - { - /* Different type oneof field */ - return true; - } - } - else if (PB_HTYPE(field->type) == PB_HTYPE_OPTIONAL) - { - if (field->pSize) - { - if (safe_read_bool(field->pSize) == false) - { - /* Missing optional field */ - return true; - } - } - else if (PB_ATYPE(field->type) == PB_ATYPE_STATIC) - { - /* Proto3 singular field */ - if (pb_check_proto3_default_value(field)) - return true; - } - } - - if (!field->pData) - { - if (PB_HTYPE(field->type) == PB_HTYPE_REQUIRED) - PB_RETURN_ERROR(stream, "missing required field"); - - /* Pointer field set to NULL */ - return true; - } - - /* Then encode field contents */ - if (PB_ATYPE(field->type) == PB_ATYPE_CALLBACK) - { - return encode_callback_field(stream, field); - } - else if (PB_HTYPE(field->type) == PB_HTYPE_REPEATED) - { - return encode_array(stream, field); - } - else - { - return encode_basic_field(stream, field); - } -} - -/* Default handler for extension fields. Expects to have a pb_msgdesc_t - * pointer in the extension->type->arg field, pointing to a message with - * only one field in it. */ -static bool checkreturn default_extension_encoder(pb_ostream_t *stream, const pb_extension_t *extension) -{ - pb_field_iter_t iter; - - if (!pb_field_iter_begin_extension_const(&iter, extension)) - PB_RETURN_ERROR(stream, "invalid extension"); - - return encode_field(stream, &iter); -} - - -/* Walk through all the registered extensions and give them a chance - * to encode themselves. */ -static bool checkreturn encode_extension_field(pb_ostream_t *stream, const pb_field_iter_t *field) -{ - const pb_extension_t *extension = *(const pb_extension_t* const *)field->pData; - - while (extension) - { - bool status; - if (extension->type->encode) - status = extension->type->encode(stream, extension); - else - status = default_extension_encoder(stream, extension); - - if (!status) - return false; - - extension = extension->next; - } - - return true; -} - -/********************* - * Encode all fields * - *********************/ - -bool checkreturn pb_encode(pb_ostream_t *stream, const pb_msgdesc_t *fields, const void *src_struct) -{ - pb_field_iter_t iter; - if (!pb_field_iter_begin_const(&iter, fields, src_struct)) - return true; /* Empty message type */ - - do { - if (PB_LTYPE(iter.type) == PB_LTYPE_EXTENSION) - { - /* Special case for the extension field placeholder */ - if (!encode_extension_field(stream, &iter)) - return false; - } - else - { - /* Regular field */ - if (!encode_field(stream, &iter)) - return false; - } - } while (pb_field_iter_next(&iter)); - - return true; -} - -bool checkreturn pb_encode_ex(pb_ostream_t *stream, const pb_msgdesc_t *fields, const void *src_struct, unsigned int flags) -{ - if ((flags & PB_ENCODE_DELIMITED) != 0) - { - return pb_encode_submessage(stream, fields, src_struct); - } - else if ((flags & PB_ENCODE_NULLTERMINATED) != 0) - { - const pb_byte_t zero = 0; - - if (!pb_encode(stream, fields, src_struct)) - return false; - - return pb_write(stream, &zero, 1); - } - else - { - return pb_encode(stream, fields, src_struct); - } -} - -bool pb_get_encoded_size(size_t *size, const pb_msgdesc_t *fields, const void *src_struct) -{ - pb_ostream_t stream = PB_OSTREAM_SIZING; - - if (!pb_encode(&stream, fields, src_struct)) - return false; - - *size = stream.bytes_written; - return true; -} - -/******************** - * Helper functions * - ********************/ - -/* This function avoids 64-bit shifts as they are quite slow on many platforms. */ -static bool checkreturn pb_encode_varint_32(pb_ostream_t *stream, uint32_t low, uint32_t high) -{ - size_t i = 0; - pb_byte_t buffer[10]; - pb_byte_t byte = (pb_byte_t)(low & 0x7F); - low >>= 7; - - while (i < 4 && (low != 0 || high != 0)) - { - byte |= 0x80; - buffer[i++] = byte; - byte = (pb_byte_t)(low & 0x7F); - low >>= 7; - } - - if (high) - { - byte = (pb_byte_t)(byte | ((high & 0x07) << 4)); - high >>= 3; - - while (high) - { - byte |= 0x80; - buffer[i++] = byte; - byte = (pb_byte_t)(high & 0x7F); - high >>= 7; - } - } - - buffer[i++] = byte; - - return pb_write(stream, buffer, i); -} - -bool checkreturn pb_encode_varint(pb_ostream_t *stream, pb_uint64_t value) -{ - if (value <= 0x7F) - { - /* Fast path: single byte */ - pb_byte_t byte = (pb_byte_t)value; - return pb_write(stream, &byte, 1); - } - else - { -#ifdef PB_WITHOUT_64BIT - return pb_encode_varint_32(stream, value, 0); -#else - return pb_encode_varint_32(stream, (uint32_t)value, (uint32_t)(value >> 32)); -#endif - } -} - -bool checkreturn pb_encode_svarint(pb_ostream_t *stream, pb_int64_t value) -{ - pb_uint64_t zigzagged; - if (value < 0) - zigzagged = ~((pb_uint64_t)value << 1); - else - zigzagged = (pb_uint64_t)value << 1; - - return pb_encode_varint(stream, zigzagged); -} - -bool checkreturn pb_encode_fixed32(pb_ostream_t *stream, const void *value) -{ - uint32_t val = *(const uint32_t*)value; - pb_byte_t bytes[4]; - bytes[0] = (pb_byte_t)(val & 0xFF); - bytes[1] = (pb_byte_t)((val >> 8) & 0xFF); - bytes[2] = (pb_byte_t)((val >> 16) & 0xFF); - bytes[3] = (pb_byte_t)((val >> 24) & 0xFF); - return pb_write(stream, bytes, 4); -} - -#ifndef PB_WITHOUT_64BIT -bool checkreturn pb_encode_fixed64(pb_ostream_t *stream, const void *value) -{ - uint64_t val = *(const uint64_t*)value; - pb_byte_t bytes[8]; - bytes[0] = (pb_byte_t)(val & 0xFF); - bytes[1] = (pb_byte_t)((val >> 8) & 0xFF); - bytes[2] = (pb_byte_t)((val >> 16) & 0xFF); - bytes[3] = (pb_byte_t)((val >> 24) & 0xFF); - bytes[4] = (pb_byte_t)((val >> 32) & 0xFF); - bytes[5] = (pb_byte_t)((val >> 40) & 0xFF); - bytes[6] = (pb_byte_t)((val >> 48) & 0xFF); - bytes[7] = (pb_byte_t)((val >> 56) & 0xFF); - return pb_write(stream, bytes, 8); -} -#endif - -bool checkreturn pb_encode_tag(pb_ostream_t *stream, pb_wire_type_t wiretype, uint32_t field_number) -{ - pb_uint64_t tag = ((pb_uint64_t)field_number << 3) | wiretype; - return pb_encode_varint(stream, tag); -} - -bool pb_encode_tag_for_field ( pb_ostream_t* stream, const pb_field_iter_t* field ) -{ - pb_wire_type_t wiretype; - switch (PB_LTYPE(field->type)) - { - case PB_LTYPE_BOOL: - case PB_LTYPE_VARINT: - case PB_LTYPE_UVARINT: - case PB_LTYPE_SVARINT: - wiretype = PB_WT_VARINT; - break; - - case PB_LTYPE_FIXED32: - wiretype = PB_WT_32BIT; - break; - - case PB_LTYPE_FIXED64: - wiretype = PB_WT_64BIT; - break; - - case PB_LTYPE_BYTES: - case PB_LTYPE_STRING: - case PB_LTYPE_SUBMESSAGE: - case PB_LTYPE_SUBMSG_W_CB: - case PB_LTYPE_FIXED_LENGTH_BYTES: - wiretype = PB_WT_STRING; - break; - - default: - PB_RETURN_ERROR(stream, "invalid field type"); - } - - return pb_encode_tag(stream, wiretype, field->tag); -} - -bool checkreturn pb_encode_string(pb_ostream_t *stream, const pb_byte_t *buffer, size_t size) -{ - if (!pb_encode_varint(stream, (pb_uint64_t)size)) - return false; - - return pb_write(stream, buffer, size); -} - -bool checkreturn pb_encode_submessage(pb_ostream_t *stream, const pb_msgdesc_t *fields, const void *src_struct) -{ - /* First calculate the message size using a non-writing substream. */ - pb_ostream_t substream = PB_OSTREAM_SIZING; - size_t size; - bool status; - - if (!pb_encode(&substream, fields, src_struct)) - { -#ifndef PB_NO_ERRMSG - stream->errmsg = substream.errmsg; -#endif - return false; - } - - size = substream.bytes_written; - - if (!pb_encode_varint(stream, (pb_uint64_t)size)) - return false; - - if (stream->callback == NULL) - return pb_write(stream, NULL, size); /* Just sizing */ - - if (stream->bytes_written + size > stream->max_size) - PB_RETURN_ERROR(stream, "stream full"); - - /* Use a substream to verify that a callback doesn't write more than - * what it did the first time. */ - substream.callback = stream->callback; - substream.state = stream->state; - substream.max_size = size; - substream.bytes_written = 0; -#ifndef PB_NO_ERRMSG - substream.errmsg = NULL; -#endif - - status = pb_encode(&substream, fields, src_struct); - - stream->bytes_written += substream.bytes_written; - stream->state = substream.state; -#ifndef PB_NO_ERRMSG - stream->errmsg = substream.errmsg; -#endif - - if (substream.bytes_written != size) - PB_RETURN_ERROR(stream, "submsg size changed"); - - return status; -} - -/* Field encoders */ - -static bool checkreturn pb_enc_bool(pb_ostream_t *stream, const pb_field_iter_t *field) -{ - uint32_t value = safe_read_bool(field->pData) ? 1 : 0; - PB_UNUSED(field); - return pb_encode_varint(stream, value); -} - -static bool checkreturn pb_enc_varint(pb_ostream_t *stream, const pb_field_iter_t *field) -{ - if (PB_LTYPE(field->type) == PB_LTYPE_UVARINT) - { - /* Perform unsigned integer extension */ - pb_uint64_t value = 0; - - if (field->data_size == sizeof(uint_least8_t)) - value = *(const uint_least8_t*)field->pData; - else if (field->data_size == sizeof(uint_least16_t)) - value = *(const uint_least16_t*)field->pData; - else if (field->data_size == sizeof(uint32_t)) - value = *(const uint32_t*)field->pData; - else if (field->data_size == sizeof(pb_uint64_t)) - value = *(const pb_uint64_t*)field->pData; - else - PB_RETURN_ERROR(stream, "invalid data_size"); - - return pb_encode_varint(stream, value); - } - else - { - /* Perform signed integer extension */ - pb_int64_t value = 0; - - if (field->data_size == sizeof(int_least8_t)) - value = *(const int_least8_t*)field->pData; - else if (field->data_size == sizeof(int_least16_t)) - value = *(const int_least16_t*)field->pData; - else if (field->data_size == sizeof(int32_t)) - value = *(const int32_t*)field->pData; - else if (field->data_size == sizeof(pb_int64_t)) - value = *(const pb_int64_t*)field->pData; - else - PB_RETURN_ERROR(stream, "invalid data_size"); - - if (PB_LTYPE(field->type) == PB_LTYPE_SVARINT) - return pb_encode_svarint(stream, value); -#ifdef PB_WITHOUT_64BIT - else if (value < 0) - return pb_encode_varint_32(stream, (uint32_t)value, (uint32_t)-1); -#endif - else - return pb_encode_varint(stream, (pb_uint64_t)value); - - } -} - -static bool checkreturn pb_enc_fixed(pb_ostream_t *stream, const pb_field_iter_t *field) -{ -#ifdef PB_CONVERT_DOUBLE_FLOAT - if (field->data_size == sizeof(float) && PB_LTYPE(field->type) == PB_LTYPE_FIXED64) - { - return pb_encode_float_as_double(stream, *(float*)field->pData); - } -#endif - - if (field->data_size == sizeof(uint32_t)) - { - return pb_encode_fixed32(stream, field->pData); - } -#ifndef PB_WITHOUT_64BIT - else if (field->data_size == sizeof(uint64_t)) - { - return pb_encode_fixed64(stream, field->pData); - } -#endif - else - { - PB_RETURN_ERROR(stream, "invalid data_size"); - } -} - -static bool checkreturn pb_enc_bytes(pb_ostream_t *stream, const pb_field_iter_t *field) -{ - const pb_bytes_array_t *bytes = NULL; - - bytes = (const pb_bytes_array_t*)field->pData; - - if (bytes == NULL) - { - /* Treat null pointer as an empty bytes field */ - return pb_encode_string(stream, NULL, 0); - } - - if (PB_ATYPE(field->type) == PB_ATYPE_STATIC && - bytes->size > field->data_size - offsetof(pb_bytes_array_t, bytes)) - { - PB_RETURN_ERROR(stream, "bytes size exceeded"); - } - - return pb_encode_string(stream, bytes->bytes, (size_t)bytes->size); -} - -static bool checkreturn pb_enc_string(pb_ostream_t *stream, const pb_field_iter_t *field) -{ - size_t size = 0; - size_t max_size = (size_t)field->data_size; - const char *str = (const char*)field->pData; - - if (PB_ATYPE(field->type) == PB_ATYPE_POINTER) - { - max_size = (size_t)-1; - } - else - { - /* pb_dec_string() assumes string fields end with a null - * terminator when the type isn't PB_ATYPE_POINTER, so we - * shouldn't allow more than max-1 bytes to be written to - * allow space for the null terminator. - */ - if (max_size == 0) - PB_RETURN_ERROR(stream, "zero-length string"); - - max_size -= 1; - } - - - if (str == NULL) - { - size = 0; /* Treat null pointer as an empty string */ - } - else - { - const char *p = str; - - /* strnlen() is not always available, so just use a loop */ - while (size < max_size && *p != '\0') - { - size++; - p++; - } - - if (*p != '\0') - { - PB_RETURN_ERROR(stream, "unterminated string"); - } - } - -#ifdef PB_VALIDATE_UTF8 - if (!pb_validate_utf8(str)) - PB_RETURN_ERROR(stream, "invalid utf8"); -#endif - - return pb_encode_string(stream, (const pb_byte_t*)str, size); -} - -static bool checkreturn pb_enc_submessage(pb_ostream_t *stream, const pb_field_iter_t *field) -{ - if (field->submsg_desc == NULL) - PB_RETURN_ERROR(stream, "invalid field descriptor"); - - if (PB_LTYPE(field->type) == PB_LTYPE_SUBMSG_W_CB && field->pSize != NULL) - { - /* Message callback is stored right before pSize. */ - pb_callback_t *callback = (pb_callback_t*)field->pSize - 1; - if (callback->funcs.encode) - { - if (!callback->funcs.encode(stream, field, &callback->arg)) - return false; - } - } - - return pb_encode_submessage(stream, field->submsg_desc, field->pData); -} - -static bool checkreturn pb_enc_fixed_length_bytes(pb_ostream_t *stream, const pb_field_iter_t *field) -{ - return pb_encode_string(stream, (const pb_byte_t*)field->pData, (size_t)field->data_size); -} - -#ifdef PB_CONVERT_DOUBLE_FLOAT -bool pb_encode_float_as_double(pb_ostream_t *stream, float value) -{ - union { float f; uint32_t i; } in; - uint_least8_t sign; - int exponent; - uint64_t mantissa; - - in.f = value; - - /* Decompose input value */ - sign = (uint_least8_t)((in.i >> 31) & 1); - exponent = (int)((in.i >> 23) & 0xFF) - 127; - mantissa = in.i & 0x7FFFFF; - - if (exponent == 128) - { - /* Special value (NaN etc.) */ - exponent = 1024; - } - else if (exponent == -127) - { - if (!mantissa) - { - /* Zero */ - exponent = -1023; - } - else - { - /* Denormalized */ - mantissa <<= 1; - while (!(mantissa & 0x800000)) - { - mantissa <<= 1; - exponent--; - } - mantissa &= 0x7FFFFF; - } - } - - /* Combine fields */ - mantissa <<= 29; - mantissa |= (uint64_t)(exponent + 1023) << 52; - mantissa |= (uint64_t)sign << 63; - - return pb_encode_fixed64(stream, &mantissa); -} -#endif diff --git a/linker/esp32.extram.bss.ld b/linker/esp32.extram.bss.ld deleted file mode 100644 index 582f6eb6e..000000000 --- a/linker/esp32.extram.bss.ld +++ /dev/null @@ -1,18 +0,0 @@ -/* This section is only included if CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY - is set, to link some sections to BSS in PSRAM */ - -SECTIONS -{ - /* external memory bss, from any global variable with EXT_RAM_ATTR attribute*/ - .ext_ram.bss (NOLOAD) : - { - _ext_ram_bss_start = ABSOLUTE(.); - *(.ext_ram.bss*) - *libnet80211.a:(.dynsbss .sbss .sbss.* .gnu.linkonce.sb.* .scommon .sbss2.* .gnu.linkonce.sb2.* .dynbss .bss .bss.* .share.mem .gnu.linkonce.b.* COMMON) - *libpp.a:(.dynsbss .sbss .sbss.* .gnu.linkonce.sb.* .scommon .sbss2.* .gnu.linkonce.sb2.* .dynbss .bss .bss.* .share.mem .gnu.linkonce.b.* COMMON) - *liblwip.a:(.dynsbss .sbss .sbss.* .gnu.linkonce.sb.* .scommon .sbss2.* .gnu.linkonce.sb2.* .dynbss .bss .bss.* .share.mem .gnu.linkonce.b.* COMMON) - *libbt.a:(EXCLUDE_FILE (libbtdm_app.a) .dynsbss .sbss .sbss.* .gnu.linkonce.sb.* .scommon .sbss2.* .gnu.linkonce.sb2.* .dynbss .bss .bss.* .share.mem .gnu.linkonce.b.* COMMON) - . = ALIGN(4); - _ext_ram_bss_end = ABSOLUTE(.); - } > extern_ram_seg -} diff --git a/linker/nrf52840_s140_sim832.ld b/linker/nrf52840_s140_sim832.ld deleted file mode 100644 index 273746683..000000000 --- a/linker/nrf52840_s140_sim832.ld +++ /dev/null @@ -1,46 +0,0 @@ -/* Linker script to configure memory regions. - -geeksville: modified this to simulate a nrf52832 but with a sd140 soft device. So I can -see how the memory footprint works on this lower end CPU. Note: to work with sd140 in my bootloader -I need to start ram at 0x6000 (instead of the correct 0x3600 for sd132) - so I have less -RAM available than on a real 832. -*/ - -SEARCH_DIR(.) -GROUP(-lgcc -lc -lnosys) - -MEMORY -{ - FLASH (rx) : ORIGIN = 0x26000, LENGTH = 0x6D000 - 0x26000 - /* FLASH (rx) : ORIGIN = 0x26000, LENGTH = 0xED000 - 0x26000 */ - - /* SRAM required by S132 depend on - * - Attribute Table Size - * - Vendor UUID count - * - Max ATT MTU - * - Concurrent connection peripheral + central + secure links - * - Event Len, HVN queue, Write CMD queue - */ - /* RAM (rwx) : ORIGIN = 0x20003600, LENGTH = 0x20010000 - 0x20003600 */ - RAM (rwx) : ORIGIN = 0x20006000, LENGTH = 0x20010000 - 0x20006000 -} - -SECTIONS -{ - . = ALIGN(4); - .svc_data : - { - PROVIDE(__start_svc_data = .); - KEEP(*(.svc_data)) - PROVIDE(__stop_svc_data = .); - } > RAM - - .fs_data : - { - PROVIDE(__start_fs_data = .); - KEEP(*(.fs_data)) - PROVIDE(__stop_fs_data = .); - } > RAM -} INSERT AFTER .data; - -INCLUDE "nrf52_common.ld" diff --git a/nrf52/ttgo_eink_qpsi.ini b/nrf52/ttgo_eink_qpsi.ini deleted file mode 100644 index 053c86755..000000000 --- a/nrf52/ttgo_eink_qpsi.ini +++ /dev/null @@ -1,62 +0,0 @@ -; nrfjprog.exe configuration file. - -; Note: QSPI flash is mapped into memory at address 0x12000000 - -[DEFAULT_CONFIGURATION] -; Define the capacity of the flash memory device in bytes. Set to 0 if no external memory device is present in your board. -; MX25R1635F is 16Mbit/2Mbyte -MemSize = 0x200000 - -; Define the desired ReadMode. Valid options are FASTREAD, READ2O, READ2IO, READ4O and READ4IO -ReadMode = READ4IO - -; Define the desired WriteMode. Valid options are PP, PP2O, PP4O and PP4IO -WriteMode = PP4IO - -; Define the desired AddressMode. Valid options are BIT24 and BIT32 -AddressMode = BIT24 - -; Define the desired Frequency. Valid options are M2, M4, M8, M16 and M32 -Frequency = M16 - -; Define the desired SPI mode. Valid options are MODE0 and MODE3 -SpiMode = MODE0 - -; Define the desired SckDelay. Valid options are in the range 0 to 255 -SckDelay = 0x80 - -; Define the desired IO level for DIO2 and DIO3 during a custom instruction. Valid options are LEVEL_HIGH and LEVEL_LOW -CustomInstructionIO2Level = LEVEL_LOW -CustomInstructionIO3Level = LEVEL_HIGH - -; Define the assigned pins for the QSPI peripheral. Valid options are those existing in your device -CSNPin = 15 -CSNPort = 1 -SCKPin = 14 -SCKPort = 1 -DIO0Pin = 12 -DIO0Port = 1 -DIO1Pin = 13 -DIO1Port = 1 -DIO2Pin = 7 -DIO2Port = 0 -DIO3Pin = 5 -DIO3Port = 0 - -; Define the Index of the Write In Progress (WIP) bit in the status register. Valid options are in the range of 0 to 7. -WIPIndex = 0 - -; Define page size for commands. Valid sizes are PAGE256 and PAGE512. -PPSize = PAGE256 - -; Custom instructions to send to the external memory after initialization. Format is instruction code plus data to send in between optional brakets. -; These instructions will be executed each time the qspi peripheral is initiated by nrfjprog. -; To improve execution speed on consecutive interations with QSPI, you can run nrfjprog once with custom initialization, and then comment out the lines below. -; Numbers can be given in decimal, hex (starting with either 0x or 0X) and binary (starting with either 0b or 0B) formats. -; The custom instructions will be executed in the order found. - -; For MX25R1635F on TTGO board, only two data lines are connected -; This example includes two commands, first a WREN (WRite ENable) and then a WRSR (WRite Satus Register) enabling Quad Operation and the High Performance -; mode. For normal operation you might want low power mode instead. -InitializationCustomInstruction = 0x06 -InitializationCustomInstruction = 0x01, [0x40, 0, 0x2] diff --git a/nrf52/ttgo_eink_qpsi0.1.ini b/nrf52/ttgo_eink_qpsi0.1.ini deleted file mode 100644 index d477db8ef..000000000 --- a/nrf52/ttgo_eink_qpsi0.1.ini +++ /dev/null @@ -1,69 +0,0 @@ -; nrfjprog.exe configuration file. - -; Note: QSPI flash is mapped into memory at address 0x12000000 - -[DEFAULT_CONFIGURATION] -; Define the capacity of the flash memory device in bytes. Set to 0 if no external memory device is present in your board. -; MX25R1635F is 16Mbit/2Mbyte -MemSize = 0x200000 - -; Define the desired ReadMode. Valid options are FASTREAD, READ2O, READ2IO, READ4O and READ4IO -ReadMode = READ2IO - -; Define the desired WriteMode. Valid options are PP, PP2O, PP4O and PP4IO -WriteMode = PP - -; Define the desired AddressMode. Valid options are BIT24 and BIT32 -AddressMode = BIT24 - -; Define the desired Frequency. Valid options are M2, M4, M8, M16 and M32 -Frequency = M16 - -; Define the desired SPI mode. Valid options are MODE0 and MODE3 -SpiMode = MODE0 - -; Define the desired SckDelay. Valid options are in the range 0 to 255 -SckDelay = 0x80 - -; Define the desired IO level for DIO2 and DIO3 during a custom instruction. Valid options are LEVEL_HIGH and LEVEL_LOW -CustomInstructionIO2Level = LEVEL_LOW -CustomInstructionIO3Level = LEVEL_HIGH - -; Define the assigned pins for the QSPI peripheral. Valid options are those existing in your device -CSNPin = 15 -CSNPort = 1 -SCKPin = 14 -SCKPort = 1 -DIO0Pin = 12 -DIO0Port = 1 -DIO1Pin = 13 -DIO1Port = 1 - -;These two pins are not connected, but we must name something -DIO2Pin = 3 -DIO2Port = 1 -DIO3Pin = 5 -DIO3Port = 1 - -; Define the Index of the Write In Progress (WIP) bit in the status register. Valid options are in the range of 0 to 7. -WIPIndex = 0 - -; Define page size for commands. Valid sizes are PAGE256 and PAGE512. -PPSize = PAGE256 - -; Custom instructions to send to the external memory after initialization. Format is instruction code plus data to send in between optional brakets. -; These instructions will be executed each time the qspi peripheral is initiated by nrfjprog. -; To improve execution speed on consecutive interations with QSPI, you can run nrfjprog once with custom initialization, and then comment out the lines below. -; Numbers can be given in decimal, hex (starting with either 0x or 0X) and binary (starting with either 0b or 0B) formats. -; The custom instructions will be executed in the order found. - -; This example includes two commands, first a WREN (WRite ENable) and then a WRSR (WRite Satus Register) enabling the Quad Operation and the High Performance -; mode for the MX25R6435F memory present in the nRF52840 DK. -;InitializationCustomInstruction = 0x06 -;InitializationCustomInstruction = 0x01, [0x40, 0, 0x2] - -; For MX25R1635F on TTGO board, only two data lines are connected -; This example includes two commands, first a WREN (WRite ENable) and then a WRSR (WRite Satus Register) disabling Quad Operation and the High Performance -; mode. For normal operation you might want low power mode instead. -InitializationCustomInstruction = 0x06 -InitializationCustomInstruction = 0x01, [0x00, 0, 0x2] diff --git a/platformio.ini b/platformio.ini index f19c6a526..284d0492a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -79,7 +79,7 @@ debug_tool = jlink lib_deps = https://github.com/meshtastic/esp8266-oled-ssd1306.git#d90231dedbb2f52bd7a32fb8ed8edec52cf4a8cb ; ESP8266_SSD1306 - https://github.com/meshtastic/OneButton.git#3bcba9492d01e2a8a86f46700ab16f96dd2cf1f5 ; OneButton library for non-blocking button debounce + mathertel/OneButton@^2.0.3 ; OneButton library for non-blocking button debounce 1202 ; CRC32, explicitly needed because dependency is missing in the ble ota update lib https://github.com/meshtastic/arduino-fsm.git https://github.com/meshtastic/SparkFun_Ublox_Arduino_Library.git#31015a55e630a2df77d9d714669c621a5bf355ad @@ -90,6 +90,8 @@ lib_deps = SPI https://github.com/geeksville/ArduinoThread.git#72921ac222eed6f526ba1682023cee290d9aa1b3 PubSubClient + nanopb/Nanopb@^0.4.6 + meshtastic/json11@^1.0.2 ; Used for the code analysis in PIO Home / Inspect check_tool = cppcheck @@ -118,7 +120,7 @@ lib_deps = adafruit/Adafruit BME280 Library@^2.2.2 adafruit/Adafruit BME680 Library@^2.0.1 adafruit/Adafruit MCP9808 Library@^2.0.0 - + ; Common settings for ESP targes, mixin with extends = esp32_base [esp32_base] extends = arduino_base @@ -131,21 +133,20 @@ debug_init_break = tbreak setup # Remove -DMYNEWT_VAL_BLE_HS_LOG_LVL=LOG_LEVEL_CRITICAL for low level BLE logging. # See library directory for BLE logging possible values: .pio/libdeps/tbeam/NimBLE-Arduino/src/log_common/log_common.h # This overrides the BLE logging default of LOG_LEVEL_INFO (1) from: .pio/libdeps/tbeam/NimBLE-Arduino/src/esp_nimble_cfg.h +# -DUSE_NEW_ESP32_BLUETOOTH will enable the new NimBLE C++ api build_flags = ${arduino_base.build_flags} -Wall -Wextra -Isrc/esp32 -Isrc/esp32-mfix-esp32-psram-cache-issue -lnimble -std=c++11 -DLOG_LOCAL_LEVEL=ESP_LOG_DEBUG -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG -DMYNEWT_VAL_BLE_HS_LOG_LVL=LOG_LEVEL_CRITICAL - -DAXP_DEBUG_PORT=Serial + -DAXP_DEBUG_PORT=Serial -DUSE_NEW_ESP32_BLUETOOTH lib_deps = ${arduino_base.lib_deps} ${environmental.lib_deps} https://github.com/meshtastic/esp32_https_server.git - h2zero/NimBLE-Arduino@1.3.6 + h2zero/NimBLE-Arduino@1.3.7 tobozo/ESP32-targz@^1.1.4 arduino-libraries/NTPClient#531eff39d9fbc831f3d03f706a161739203fbe2a lorol/LittleFS_esp32@^1.0.6 -# Hmm - this doesn't work yet -# board_build.ldscript = linker/esp32.extram.bss.ld lib_ignore = segger_rtt ESP32 BLE Arduino @@ -263,7 +264,4 @@ debug_tool = jlink upload_protocol = jlink monitor_port = /dev/ttyUSB0 ; this board's serial chip can only run at 115200, not faster -monitor_speed = 115200 - -# For experimenting with RAM sizes -# board_build.ldscript = linker/nrf52840_s140_sim832.ld +monitor_speed = 115200 \ No newline at end of file diff --git a/proto b/proto index f6ba3722b..82bc2e2fd 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit f6ba3722be8a51c3c0c1446bb08e730a0be568e0 +Subproject commit 82bc2e2fdd0ca15d472e369360341a099eb4c7ae diff --git a/src/esp32/BluetoothSoftwareUpdate.cpp b/src/esp32/BluetoothSoftwareUpdate.cpp index 4c6e94be9..174a64fca 100644 --- a/src/esp32/BluetoothSoftwareUpdate.cpp +++ b/src/esp32/BluetoothSoftwareUpdate.cpp @@ -1,3 +1,5 @@ +#ifndef USE_NEW_ESP32_BLUETOOTH + #include #include "../concurrency/LockGuard.h" @@ -154,3 +156,5 @@ void reinitUpdateService() res = ble_gatts_add_svcs(gatt_update_svcs); assert(res == 0); } + +#endif //#ifndef USE_NEW_ESP32_BLUETOOTH \ No newline at end of file diff --git a/src/esp32/BluetoothSoftwareUpdate.h b/src/esp32/BluetoothSoftwareUpdate.h index 478d478d5..468cc6060 100644 --- a/src/esp32/BluetoothSoftwareUpdate.h +++ b/src/esp32/BluetoothSoftwareUpdate.h @@ -1,3 +1,5 @@ +#ifndef USE_NEW_ESP32_BLUETOOTH + #pragma once #include "nimble/NimbleDefs.h" @@ -22,4 +24,6 @@ extern int16_t updateResultHandle; #ifdef __cplusplus }; -#endif \ No newline at end of file +#endif + +#endif //#ifndef USE_NEW_ESP32_BLUETOOTH \ No newline at end of file diff --git a/src/esp32/ESP32Bluetooth.cpp b/src/esp32/ESP32Bluetooth.cpp new file mode 100644 index 000000000..b7e8d47aa --- /dev/null +++ b/src/esp32/ESP32Bluetooth.cpp @@ -0,0 +1,262 @@ +#ifdef USE_NEW_ESP32_BLUETOOTH + +#include "configuration.h" +#include "ESP32Bluetooth.h" +#include "BluetoothCommon.h" +#include "PowerFSM.h" +#include "sleep.h" +#include "main.h" +#include "mesh/PhoneAPI.h" +#include "mesh/mesh-pb-constants.h" +#include + +//static BLEService meshBleService = BLEService(BLEUuid(MESH_SERVICE_UUID_16)); +//static BLECharacteristic fromNum = BLECharacteristic(BLEUuid(FROMNUM_UUID_16)); +//static BLECharacteristic fromRadio = BLECharacteristic(BLEUuid(FROMRADIO_UUID_16)); +//static BLECharacteristic toRadio = BLECharacteristic(BLEUuid(TORADIO_UUID_16)); + +//static BLEDis bledis; // DIS (Device Information Service) helper class instance +//static BLEBas blebas; // BAS (Battery Service) helper class instance +//static BLEDfu bledfu; // DFU software update helper service + +// This scratch buffer is used for various bluetooth reads/writes - but it is safe because only one bt operation can be in +// proccess at once +// static uint8_t trBytes[_max(_max(_max(_max(ToRadio_size, RadioConfig_size), User_size), MyNodeInfo_size), FromRadio_size)]; +static uint8_t fromRadioBytes[FromRadio_size]; +static uint8_t toRadioBytes[ToRadio_size]; + +static bool bleConnected; + +NimBLECharacteristic *FromNumCharacteristic; +NimBLEServer *bleServer; + +static bool passkeyShowing; +static uint32_t doublepressed; + +/** + * Subclasses can use this as a hook to provide custom notifications for their transport (i.e. bluetooth notifies) + */ +void BluetoothPhoneAPI::onNowHasData(uint32_t fromRadioNum) +{ + PhoneAPI::onNowHasData(fromRadioNum); + + DEBUG_MSG("BLE notify fromNum\n"); + //fromNum.notify32(fromRadioNum); + + uint8_t val[4]; + put_le32(val, fromRadioNum); + + std::string fromNumByteString(&val[0], &val[0] + sizeof(val)); + + FromNumCharacteristic->setValue(fromNumByteString); + FromNumCharacteristic->notify(); +} + +/// Check the current underlying physical link to see if the client is currently connected +bool BluetoothPhoneAPI::checkIsConnected() { + if (bleServer && bleServer->getConnectedCount() > 0) { + return true; + } + return false; +} + +PhoneAPI *bluetoothPhoneAPI; + +class ESP32BluetoothToRadioCallback : public NimBLECharacteristicCallbacks { + virtual void onWrite(NimBLECharacteristic *pCharacteristic) { + DEBUG_MSG("To Radio onwrite\n"); + auto valueString = pCharacteristic->getValue(); + + bluetoothPhoneAPI->handleToRadio(reinterpret_cast(&valueString[0]), pCharacteristic->getDataLength()); + } +}; + +class ESP32BluetoothFromRadioCallback : public NimBLECharacteristicCallbacks { + virtual void onRead(NimBLECharacteristic *pCharacteristic) { + DEBUG_MSG("From Radio onread\n"); + size_t numBytes = bluetoothPhoneAPI->getFromRadio(fromRadioBytes); + + std::string fromRadioByteString(fromRadioBytes, fromRadioBytes + numBytes); + + pCharacteristic->setValue(fromRadioByteString); + } +}; + +class ESP32BluetoothServerCallback : public NimBLEServerCallbacks { + virtual uint32_t onPassKeyRequest() { + + uint32_t passkey = 0; + + if (doublepressed > 0 && (doublepressed + (30 * 1000)) > millis()) { + DEBUG_MSG("User has overridden passkey\n"); + passkey = defaultBLEPin; + } else { + DEBUG_MSG("Using random passkey\n"); + passkey = random( + 100000, 999999); // This is the passkey to be entered on peer - we pick a number >100,000 to ensure 6 digits + } + DEBUG_MSG("*** Enter passkey %d on the peer side ***\n", passkey); + + powerFSM.trigger(EVENT_BLUETOOTH_PAIR); + screen->startBluetoothPinScreen(passkey); + passkeyShowing = true; + + return passkey; + } + + virtual void onAuthenticationComplete(ble_gap_conn_desc *desc) { + DEBUG_MSG("BLE authentication complete\n"); + + if (passkeyShowing) { + passkeyShowing = false; + screen->stopBluetoothPinScreen(); + } + } +}; + + +static ESP32BluetoothToRadioCallback *toRadioCallbacks; +static ESP32BluetoothFromRadioCallback *fromRadioCallbacks; + +void ESP32Bluetooth::shutdown() +{ + // Shutdown bluetooth for minimum power draw + DEBUG_MSG("Disable bluetooth\n"); + //Bluefruit.Advertising.stop(); +} + +void ESP32Bluetooth::setup() +{ + // Initialise the Bluefruit module + DEBUG_MSG("Initialise the ESP32 bluetooth module\n"); + //Bluefruit.autoConnLed(false); + //Bluefruit.begin(); + + // Set the advertised device name (keep it short!) + //Bluefruit.setName(getDeviceName()); + + // Set the connect/disconnect callback handlers + //Bluefruit.Periph.setConnectCallback(connect_callback); + //Bluefruit.Periph.setDisconnectCallback(disconnect_callback); + + // Configure and Start the Device Information Service + DEBUG_MSG("Configuring the Device Information Service\n"); + // FIXME, we should set a mfg string based on our HW_VENDOR enum + // bledis.setManufacturer(HW_VENDOR); + //bledis.setModel(optstr(HW_VERSION)); + //bledis.setFirmwareRev(optstr(APP_VERSION)); + //bledis.begin(); + + // Start the BLE Battery Service and set it to 100% + //DEBUG_MSG("Configuring the Battery Service\n"); + //blebas.begin(); + //blebas.write(0); // Unknown battery level for now + + //bledfu.begin(); // Install the DFU helper + + // Setup the Heart Rate Monitor service using + // BLEService and BLECharacteristic classes + DEBUG_MSG("Configuring the Mesh bluetooth service\n"); + //setupMeshService(); + + // Supposedly debugging works with soft device if you disable advertising + //if (isSoftDeviceAllowed) { + // Setup the advertising packet(s) + // DEBUG_MSG("Setting up the advertising payload(s)\n"); + // startAdv(); + + // DEBUG_MSG("Advertising\n"); + //} + + //NimBLEDevice::deleteAllBonds(); + + NimBLEDevice::init("Meshtastic_1234"); + NimBLEDevice::setPower(ESP_PWR_LVL_P9); + + NimBLEDevice::setSecurityAuth(true, true, true); + NimBLEDevice::setSecurityIOCap(BLE_HS_IO_DISPLAY_ONLY); + bleServer = NimBLEDevice::createServer(); + + ESP32BluetoothServerCallback *serverCallbacks = new ESP32BluetoothServerCallback(); + bleServer->setCallbacks(serverCallbacks); + + NimBLEService *bleService = bleServer->createService(MESH_SERVICE_UUID); + //NimBLECharacteristic *pNonSecureCharacteristic = bleService->createCharacteristic("1234", NIMBLE_PROPERTY::READ ); + //NimBLECharacteristic *pSecureCharacteristic = bleService->createCharacteristic("1235", NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::READ_ENC | NIMBLE_PROPERTY::READ_AUTHEN); + + //define the characteristics that the app is looking for + NimBLECharacteristic *ToRadioCharacteristic = bleService->createCharacteristic(TORADIO_UUID, NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::WRITE_AUTHEN | NIMBLE_PROPERTY::WRITE_ENC); + NimBLECharacteristic *FromRadioCharacteristic = bleService->createCharacteristic(FROMRADIO_UUID, NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::READ_AUTHEN | NIMBLE_PROPERTY::READ_ENC); + FromNumCharacteristic = bleService->createCharacteristic(FROMNUM_UUID, NIMBLE_PROPERTY::NOTIFY | NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::READ_AUTHEN | NIMBLE_PROPERTY::READ_ENC); + + bluetoothPhoneAPI = new BluetoothPhoneAPI(); + + toRadioCallbacks = new ESP32BluetoothToRadioCallback(); + ToRadioCharacteristic->setCallbacks(toRadioCallbacks); + + fromRadioCallbacks = new ESP32BluetoothFromRadioCallback(); + FromRadioCharacteristic->setCallbacks(fromRadioCallbacks); + + //uint8_t val[4]; + //uint32_t zero = 0; + //put_le32(val, zero); + //std::string fromNumByteString(&val[0], &val[0] + sizeof(val)); + //FromNumCharacteristic->setValue(fromNumByteString); + + bleService->start(); + //pNonSecureCharacteristic->setValue("Hello Non Secure BLE"); + //pSecureCharacteristic->setValue("Hello Secure BLE"); + + //FromRadioCharacteristic->setValue("FromRadioString"); + //ToRadioCharacteristic->setCallbacks() + + NimBLEAdvertising *pAdvertising = NimBLEDevice::getAdvertising(); + pAdvertising->addServiceUUID(MESH_SERVICE_UUID); + pAdvertising->start(); + +} + + +/// Given a level between 0-100, update the BLE attribute +void updateBatteryLevel(uint8_t level) +{ + //blebas.write(level); +} + +void ESP32Bluetooth::clearBonds() +{ + DEBUG_MSG("Clearing bluetooth bonds!\n"); + //bond_print_list(BLE_GAP_ROLE_PERIPH); + //bond_print_list(BLE_GAP_ROLE_CENTRAL); + + //Bluefruit.Periph.clearBonds(); + //Bluefruit.Central.clearBonds(); + +} + +void clearNVS() { + NimBLEDevice::deleteAllBonds(); + ESP.restart(); +} + +void disablePin() { + DEBUG_MSG("User Override, disabling bluetooth pin requirement\n"); + // keep track of when it was pressed, so we know it was within X seconds + + // Flash the LED + setLed(true); + delay(100); + setLed(false); + delay(100); + setLed(true); + delay(100); + setLed(false); + delay(100); + setLed(true); + delay(100); + setLed(false); + + doublepressed = millis(); +} + +#endif \ No newline at end of file diff --git a/src/esp32/ESP32Bluetooth.h b/src/esp32/ESP32Bluetooth.h new file mode 100644 index 000000000..b839a7926 --- /dev/null +++ b/src/esp32/ESP32Bluetooth.h @@ -0,0 +1,33 @@ +#ifdef USE_NEW_ESP32_BLUETOOTH + +#pragma once + +extern uint16_t fromNumValHandle; + +class BluetoothPhoneAPI : public PhoneAPI +{ +protected: + /** + * Subclasses can use this as a hook to provide custom notifications for their transport (i.e. bluetooth notifies) + */ + virtual void onNowHasData(uint32_t fromRadioNum) override; + + /// Check the current underlying physical link to see if the client is currently connected + virtual bool checkIsConnected() override; +}; + +extern PhoneAPI *bluetoothPhoneAPI; + +class ESP32Bluetooth +{ + public: + void setup(); + void shutdown(); + void clearBonds(); +}; + +void setBluetoothEnable(bool on); +void clearNVS(); +void disablePin(); + +#endif \ No newline at end of file diff --git a/src/esp32/NimbleSoftwareUpdate.c b/src/esp32/NimbleSoftwareUpdate.c index 956fdf53f..6f7ebf6cc 100644 --- a/src/esp32/NimbleSoftwareUpdate.c +++ b/src/esp32/NimbleSoftwareUpdate.c @@ -1,3 +1,4 @@ +#ifndef USE_NEW_ESP32_BLUETOOTH #include "BluetoothSoftwareUpdate.h" // NRF52 wants these constants as byte arrays @@ -68,3 +69,5 @@ const struct ble_gatt_svc_def gatt_update_svcs[] = { 0, /* No more services. */ }, }; + +#endif //#ifndef USE_NEW_ESP32_BLUETOOTH \ No newline at end of file diff --git a/src/esp32/main-esp32.cpp b/src/esp32/main-esp32.cpp index b0afab656..2e012297b 100644 --- a/src/esp32/main-esp32.cpp +++ b/src/esp32/main-esp32.cpp @@ -3,7 +3,13 @@ #include "configuration.h" #include "esp_task_wdt.h" #include "main.h" + +#ifdef USE_NEW_ESP32_BLUETOOTH +#include "ESP32Bluetooth.h" +#else #include "nimble/BluetoothUtil.h" +#endif + #include "sleep.h" #include "target_specific.h" #include "utils.h" @@ -12,6 +18,10 @@ #include #include +#ifdef USE_NEW_ESP32_BLUETOOTH +ESP32Bluetooth *esp32Bluetooth; +#endif + void getMacAddr(uint8_t *dmac) { assert(esp_efuse_mac_get_default(dmac) == ESP_OK); @@ -28,6 +38,19 @@ static void printBLEinfo() { } } */ +#ifdef USE_NEW_ESP32_BLUETOOTH +void setBluetoothEnable(bool on) { + + if (!esp32Bluetooth) { + esp32Bluetooth = new ESP32Bluetooth(); + } + if (on) { + esp32Bluetooth->setup(); + } else { + esp32Bluetooth->shutdown(); + } +} +#endif void esp32Setup() { @@ -92,11 +115,12 @@ uint32_t axpDebugRead() Periodic axpDebugOutput(axpDebugRead); #endif + /// loop code specific to ESP32 targets void esp32Loop() { esp_task_wdt_reset(); // service our app level watchdog - loopBLE(); + //loopBLE(); // for debug printing // radio.radioIf.canSleep(); diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index a1a4dffa7..94d997a8c 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -69,7 +69,7 @@ uint32_t dopThresholds[5] = {2000, 1000, 500, 200, 100}; // At some point, we're going to ask all of the modules if they would like to display a screen frame // we'll need to hold onto pointers for the modules that can draw a frame. -std::vector moduleFrames; +std::vector moduleFrames; // Stores the last 4 of our hardware ID, to make finding the device for pairing easier static char ourId[5]; @@ -194,7 +194,7 @@ static void drawModuleFrame(OLEDDisplay *display, OLEDDisplayUiState *state, int // DEBUG_MSG("Screen is not in transition. Frame: %d\n\n", module_frame); } // DEBUG_MSG("Drawing Module Frame %d\n\n", module_frame); - MeshPlugin &pi = *moduleFrames.at(module_frame); + MeshModule &pi = *moduleFrames.at(module_frame); pi.drawFrame(display, state, x, y); } @@ -828,7 +828,7 @@ void Screen::setup() textMessageObserver.observe(textMessageModule); // Modules can notify screen about refresh - MeshPlugin::observeUIEvents(&uiFrameEventObserver); + MeshModule::observeUIEvents(&uiFrameEventObserver); } void Screen::forceDisplay() @@ -976,7 +976,7 @@ void Screen::setFrames() DEBUG_MSG("showing standard frames\n"); showingNormalScreen = true; - moduleFrames = MeshPlugin::GetMeshModulesWithUIFrames(); + moduleFrames = MeshModule::GetMeshModulesWithUIFrames(); DEBUG_MSG("Showing %d module frames\n", moduleFrames.size()); int totalFrameCount = MAX_NUM_NODES + NUM_EXTRA_FRAMES + moduleFrames.size(); DEBUG_MSG("Total frame count: %d\n", totalFrameCount); diff --git a/src/graphics/Screen.h b/src/graphics/Screen.h index 9c178cd0a..2b0e3209b 100644 --- a/src/graphics/Screen.h +++ b/src/graphics/Screen.h @@ -40,7 +40,7 @@ class Screen #include "concurrency/OSThread.h" #include "power.h" #include -#include "mesh/MeshPlugin.h" +#include "mesh/MeshModule.h" // 0 to 255, though particular variants might define different defaults #ifndef BRIGHTNESS_DEFAULT diff --git a/src/input/RotaryEncoderInterruptBase.h b/src/input/RotaryEncoderInterruptBase.h index 72732261b..58e7b80e8 100644 --- a/src/input/RotaryEncoderInterruptBase.h +++ b/src/input/RotaryEncoderInterruptBase.h @@ -1,6 +1,6 @@ #pragma once -#include "SinglePortPlugin.h" // TODO: what header file to include? +#include "SinglePortModule.h" // TODO: what header file to include? #include "InputBroker.h" enum RotaryEncoderInterruptBaseStateType diff --git a/src/main.cpp b/src/main.cpp index fcbe8d912..a293cb3a6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -30,8 +30,14 @@ #include "mesh/http/WiFiAPClient.h" #ifndef NO_ESP32 -#include "mesh/http/WebServer.h" -#include "nimble/BluetoothUtil.h" + #include "mesh/http/WebServer.h" + + #ifdef USE_NEW_ESP32_BLUETOOTH + #include "esp32/ESP32Bluetooth.h" + #else + #include "nimble/BluetoothUtil.h" + #endif + #endif #if defined(HAS_WIFI) || defined(PORTDUINO) diff --git a/src/mesh/MeshPlugin.cpp b/src/mesh/MeshModule.cpp similarity index 92% rename from src/mesh/MeshPlugin.cpp rename to src/mesh/MeshModule.cpp index d3e0f584e..3e85cba71 100644 --- a/src/mesh/MeshPlugin.cpp +++ b/src/mesh/MeshModule.cpp @@ -1,38 +1,38 @@ #include "configuration.h" -#include "MeshPlugin.h" +#include "MeshModule.h" #include "Channels.h" #include "MeshService.h" #include "NodeDB.h" #include "modules/RoutingModule.h" #include -std::vector *MeshPlugin::modules; +std::vector *MeshModule::modules; -const MeshPacket *MeshPlugin::currentRequest; +const MeshPacket *MeshModule::currentRequest; /** * If any of the current chain of modules has already sent a reply, it will be here. This is useful to allow * the RoutingPlugin to avoid sending redundant acks */ -MeshPacket *MeshPlugin::currentReply; +MeshPacket *MeshModule::currentReply; -MeshPlugin::MeshPlugin(const char *_name) : name(_name) +MeshModule::MeshModule(const char *_name) : name(_name) { // Can't trust static initalizer order, so we check each time if (!modules) - modules = new std::vector(); + modules = new std::vector(); modules->push_back(this); } -void MeshPlugin::setup() {} +void MeshModule::setup() {} -MeshPlugin::~MeshPlugin() +MeshModule::~MeshModule() { assert(0); // FIXME - remove from list of modules once someone needs this feature } -MeshPacket *MeshPlugin::allocAckNak(Routing_Error err, NodeNum to, PacketId idFrom, ChannelIndex chIndex) +MeshPacket *MeshModule::allocAckNak(Routing_Error err, NodeNum to, PacketId idFrom, ChannelIndex chIndex) { Routing c = Routing_init_default; @@ -57,7 +57,7 @@ MeshPacket *MeshPlugin::allocAckNak(Routing_Error err, NodeNum to, PacketId idFr return p; } -MeshPacket *MeshPlugin::allocErrorResponse(Routing_Error err, const MeshPacket *p) +MeshPacket *MeshModule::allocErrorResponse(Routing_Error err, const MeshPacket *p) { auto r = allocAckNak(err, getFrom(p), p->id, p->channel); @@ -66,7 +66,7 @@ MeshPacket *MeshPlugin::allocErrorResponse(Routing_Error err, const MeshPacket * return r; } -void MeshPlugin::callPlugins(const MeshPacket &mp, RxSource src) +void MeshModule::callPlugins(const MeshPacket &mp, RxSource src) { // DEBUG_MSG("In call modules\n"); bool moduleFound = false; @@ -183,7 +183,7 @@ void MeshPlugin::callPlugins(const MeshPacket &mp, RxSource src) (src == RX_SRC_LOCAL) ? "LOCAL":"REMOTE"); } -MeshPacket *MeshPlugin::allocReply() +MeshPacket *MeshModule::allocReply() { auto r = myReply; myReply = NULL; // Only use each reply once @@ -194,7 +194,7 @@ MeshPacket *MeshPlugin::allocReply() * so that subclasses can (optionally) send a response back to the original sender. Implementing this method * is optional */ -void MeshPlugin::sendResponse(const MeshPacket &req) +void MeshModule::sendResponse(const MeshPacket &req) { auto r = allocReply(); if (r) { @@ -222,10 +222,10 @@ void setReplyTo(MeshPacket *p, const MeshPacket &to) p->decoded.request_id = to.id; } -std::vector MeshPlugin::GetMeshModulesWithUIFrames() +std::vector MeshModule::GetMeshModulesWithUIFrames() { - std::vector modulesWithUIFrames; + std::vector modulesWithUIFrames; if (modules) { for (auto i = modules->begin(); i != modules->end(); ++i) { auto &pi = **i; @@ -238,7 +238,7 @@ std::vector MeshPlugin::GetMeshModulesWithUIFrames() return modulesWithUIFrames; } -void MeshPlugin::observeUIEvents( +void MeshModule::observeUIEvents( Observer *observer) { if (modules) { @@ -254,7 +254,7 @@ void MeshPlugin::observeUIEvents( } } -AdminMessageHandleResult MeshPlugin::handleAdminMessageForAllPlugins(const MeshPacket &mp, AdminMessage *request, AdminMessage *response) +AdminMessageHandleResult MeshModule::handleAdminMessageForAllPlugins(const MeshPacket &mp, AdminMessage *request, AdminMessage *response) { AdminMessageHandleResult handled = AdminMessageHandleResult::NOT_HANDLED; if (modules) { diff --git a/src/mesh/MeshPlugin.h b/src/mesh/MeshModule.h similarity index 97% rename from src/mesh/MeshPlugin.h rename to src/mesh/MeshModule.h index 7abd56e14..cfc715497 100644 --- a/src/mesh/MeshPlugin.h +++ b/src/mesh/MeshModule.h @@ -52,23 +52,23 @@ typedef struct _UIFrameEvent { * Interally we use modules to implement the core meshtastic text messaging and gps position sharing features. You * can use these classes as examples for how to write your own custom module. See here: (FIXME) */ -class MeshPlugin +class MeshModule { - static std::vector *modules; + static std::vector *modules; public: /** Constructor * name is for debugging output */ - MeshPlugin(const char *_name); + MeshModule(const char *_name); - virtual ~MeshPlugin(); + virtual ~MeshModule(); /** For use only by MeshService */ static void callPlugins(const MeshPacket &mp, RxSource src = RX_SRC_RADIO); - static std::vector GetMeshModulesWithUIFrames(); + static std::vector GetMeshModulesWithUIFrames(); static void observeUIEvents(Observer *observer); static AdminMessageHandleResult handleAdminMessageForAllPlugins( const MeshPacket &mp, AdminMessage *request, AdminMessage *response); diff --git a/src/mesh/NodeDB.cpp b/src/mesh/NodeDB.cpp index 13e3812af..8c64c6f10 100644 --- a/src/mesh/NodeDB.cpp +++ b/src/mesh/NodeDB.cpp @@ -438,7 +438,7 @@ size_t NodeDB::getNumOnlineNodes() return numseen; } -#include "MeshPlugin.h" +#include "MeshModule.h" /** Update position info for this node based on received position data */ diff --git a/src/mesh/ProtobufPlugin.cpp b/src/mesh/ProtobufModule.cpp similarity index 50% rename from src/mesh/ProtobufPlugin.cpp rename to src/mesh/ProtobufModule.cpp index 9cb4b9c2d..cea2ecbf6 100644 --- a/src/mesh/ProtobufPlugin.cpp +++ b/src/mesh/ProtobufModule.cpp @@ -1,4 +1,4 @@ #include "configuration.h" -#include "ProtobufPlugin.h" +#include "ProtobufModule.h" diff --git a/src/mesh/ProtobufPlugin.h b/src/mesh/ProtobufModule.h similarity index 92% rename from src/mesh/ProtobufPlugin.h rename to src/mesh/ProtobufModule.h index 72d80e0f3..e7eaac57a 100644 --- a/src/mesh/ProtobufPlugin.h +++ b/src/mesh/ProtobufModule.h @@ -1,5 +1,5 @@ #pragma once -#include "SinglePortPlugin.h" +#include "SinglePortModule.h" /** * A base class for mesh modules that assume that they are sending/receiving one particular protobuf based @@ -8,7 +8,7 @@ * If you are using protobufs to encode your packets (recommended) you can use this as a baseclass for your module * and avoid a bunch of boilerplate code. */ -template class ProtobufPlugin : protected SinglePortPlugin +template class ProtobufModule : protected SinglePortModule { const pb_msgdesc_t *fields; @@ -16,8 +16,8 @@ template class ProtobufPlugin : protected SinglePortPlugin /** Constructor * name is for debugging output */ - ProtobufPlugin(const char *_name, PortNum _ourPortNum, const pb_msgdesc_t *_fields) - : SinglePortPlugin(_name, _ourPortNum), fields(_fields) + ProtobufModule(const char *_name, PortNum _ourPortNum, const pb_msgdesc_t *_fields) + : SinglePortModule(_name, _ourPortNum), fields(_fields) { } diff --git a/src/mesh/ReliableRouter.cpp b/src/mesh/ReliableRouter.cpp index 96aca5026..ee513bae0 100644 --- a/src/mesh/ReliableRouter.cpp +++ b/src/mesh/ReliableRouter.cpp @@ -1,6 +1,6 @@ #include "configuration.h" #include "ReliableRouter.h" -#include "MeshPlugin.h" +#include "MeshModule.h" #include "MeshTypes.h" #include "mesh-pb-constants.h" @@ -92,7 +92,7 @@ void ReliableRouter::sniffReceived(const MeshPacket *p, const Routing *c) if (p->to == ourNode) { // ignore ack/nak/want_ack packets that are not address to us (we only handle 0 hop reliability // - not DSR routing) if (p->want_ack) { - if (MeshPlugin::currentReply) + if (MeshModule::currentReply) DEBUG_MSG("Someone else has replied to this message, no need for a 2nd ack\n"); else sendAckNak(Routing_Error_NONE, getFrom(p), p->id, p->channel); diff --git a/src/mesh/Router.cpp b/src/mesh/Router.cpp index f3210f1ec..08de01ccd 100644 --- a/src/mesh/Router.cpp +++ b/src/mesh/Router.cpp @@ -377,7 +377,7 @@ void Router::handleReceived(MeshPacket *p, RxSource src) } // call modules here - MeshPlugin::callPlugins(*p, src); + MeshModule::callPlugins(*p, src); } void Router::perhapsHandleReceived(MeshPacket *p) diff --git a/src/mesh/SinglePortPlugin.h b/src/mesh/SinglePortModule.h similarity index 84% rename from src/mesh/SinglePortPlugin.h rename to src/mesh/SinglePortModule.h index 564c03cdb..2e587cb89 100644 --- a/src/mesh/SinglePortPlugin.h +++ b/src/mesh/SinglePortModule.h @@ -1,12 +1,12 @@ #pragma once -#include "MeshPlugin.h" +#include "MeshModule.h" #include "Router.h" /** * Most modules are only interested in sending/receving one particular portnum. This baseclass simplifies that common * case. */ -class SinglePortPlugin : public MeshPlugin +class SinglePortModule : public MeshModule { protected: PortNum ourPortNum; @@ -15,7 +15,7 @@ class SinglePortPlugin : public MeshPlugin /** Constructor * name is for debugging output */ - SinglePortPlugin(const char *_name, PortNum _ourPortNum) : MeshPlugin(_name), ourPortNum(_ourPortNum) {} + SinglePortModule(const char *_name, PortNum _ourPortNum) : MeshModule(_name), ourPortNum(_ourPortNum) {} protected: /** diff --git a/src/mesh/generated/radioconfig.pb.h b/src/mesh/generated/radioconfig.pb.h index 182be895e..064587903 100644 --- a/src/mesh/generated/radioconfig.pb.h +++ b/src/mesh/generated/radioconfig.pb.h @@ -148,12 +148,12 @@ typedef struct _RadioConfig_UserPreferences { bool debug_log_enabled; pb_size_t ignore_incoming_count; uint32_t ignore_incoming[3]; - bool serialmodule_enabled; - bool serialmodule_echo; - uint32_t serialmodule_rxd; - uint32_t serialmodule_txd; - uint32_t serialmodule_timeout; - uint32_t serialmodule_mode; + bool serial_module_enabled; + bool serial_module_echo; + uint32_t serial_module_rxd; + uint32_t serial_module_txd; + uint32_t serial_module_timeout; + uint32_t serial_module_mode; bool ext_notification_module_enabled; uint32_t ext_notification_module_output_ms; uint32_t ext_notification_module_output; @@ -197,7 +197,7 @@ typedef struct _RadioConfig_UserPreferences { bool canned_message_module_send_bell; bool mqtt_encryption_enabled; float adc_multiplier_override; - uint32_t serialmodule_baud; + uint32_t serial_module_baud; } RadioConfig_UserPreferences; typedef struct _RadioConfig { @@ -289,12 +289,12 @@ extern "C" { #define RadioConfig_UserPreferences_factory_reset_tag 100 #define RadioConfig_UserPreferences_debug_log_enabled_tag 101 #define RadioConfig_UserPreferences_ignore_incoming_tag 103 -#define RadioConfig_UserPreferences_serialmodule_enabled_tag 120 -#define RadioConfig_UserPreferences_serialmodule_echo_tag 121 -#define RadioConfig_UserPreferences_serialmodule_rxd_tag 122 -#define RadioConfig_UserPreferences_serialmodule_txd_tag 123 -#define RadioConfig_UserPreferences_serialmodule_timeout_tag 124 -#define RadioConfig_UserPreferences_serialmodule_mode_tag 125 +#define RadioConfig_UserPreferences_serial_module_enabled_tag 120 +#define RadioConfig_UserPreferences_serial_module_echo_tag 121 +#define RadioConfig_UserPreferences_serial_module_rxd_tag 122 +#define RadioConfig_UserPreferences_serial_module_txd_tag 123 +#define RadioConfig_UserPreferences_serial_module_timeout_tag 124 +#define RadioConfig_UserPreferences_serial_module_mode_tag 125 #define RadioConfig_UserPreferences_ext_notification_module_enabled_tag 126 #define RadioConfig_UserPreferences_ext_notification_module_output_ms_tag 127 #define RadioConfig_UserPreferences_ext_notification_module_output_tag 128 @@ -338,7 +338,7 @@ extern "C" { #define RadioConfig_UserPreferences_canned_message_module_send_bell_tag 173 #define RadioConfig_UserPreferences_mqtt_encryption_enabled_tag 174 #define RadioConfig_UserPreferences_adc_multiplier_override_tag 175 -#define RadioConfig_UserPreferences_serialmodule_baud_tag 176 +#define RadioConfig_UserPreferences_serial_module_baud_tag 176 #define RadioConfig_preferences_tag 1 /* Struct field encoding specification for nanopb */ @@ -383,12 +383,12 @@ X(a, STATIC, SINGULAR, UINT32, gps_max_dop, 46) \ X(a, STATIC, SINGULAR, BOOL, factory_reset, 100) \ X(a, STATIC, SINGULAR, BOOL, debug_log_enabled, 101) \ X(a, STATIC, REPEATED, UINT32, ignore_incoming, 103) \ -X(a, STATIC, SINGULAR, BOOL, serialmodule_enabled, 120) \ -X(a, STATIC, SINGULAR, BOOL, serialmodule_echo, 121) \ -X(a, STATIC, SINGULAR, UINT32, serialmodule_rxd, 122) \ -X(a, STATIC, SINGULAR, UINT32, serialmodule_txd, 123) \ -X(a, STATIC, SINGULAR, UINT32, serialmodule_timeout, 124) \ -X(a, STATIC, SINGULAR, UINT32, serialmodule_mode, 125) \ +X(a, STATIC, SINGULAR, BOOL, serial_module_enabled, 120) \ +X(a, STATIC, SINGULAR, BOOL, serial_module_echo, 121) \ +X(a, STATIC, SINGULAR, UINT32, serial_module_rxd, 122) \ +X(a, STATIC, SINGULAR, UINT32, serial_module_txd, 123) \ +X(a, STATIC, SINGULAR, UINT32, serial_module_timeout, 124) \ +X(a, STATIC, SINGULAR, UINT32, serial_module_mode, 125) \ X(a, STATIC, SINGULAR, BOOL, ext_notification_module_enabled, 126) \ X(a, STATIC, SINGULAR, UINT32, ext_notification_module_output_ms, 127) \ X(a, STATIC, SINGULAR, UINT32, ext_notification_module_output, 128) \ @@ -432,7 +432,7 @@ X(a, STATIC, SINGULAR, STRING, canned_message_module_allow_input_source, 171 X(a, STATIC, SINGULAR, BOOL, canned_message_module_send_bell, 173) \ X(a, STATIC, SINGULAR, BOOL, mqtt_encryption_enabled, 174) \ X(a, STATIC, SINGULAR, FLOAT, adc_multiplier_override, 175) \ -X(a, STATIC, SINGULAR, UINT32, serialmodule_baud, 176) +X(a, STATIC, SINGULAR, UINT32, serial_module_baud, 176) #define RadioConfig_UserPreferences_CALLBACK NULL #define RadioConfig_UserPreferences_DEFAULT NULL diff --git a/src/mesh/http/WiFiAPClient.cpp b/src/mesh/http/WiFiAPClient.cpp index 208bd6c25..afda19702 100644 --- a/src/mesh/http/WiFiAPClient.cpp +++ b/src/mesh/http/WiFiAPClient.cpp @@ -205,11 +205,12 @@ bool initWifi(bool forceSoftAP) if (forcedSoftAP) { const char *softAPssid = "meshtasticAdmin"; const char *softAPpasswd = "12345678"; - - DEBUG_MSG("Starting (Forced) WIFI AP: ssid=%s, ok=%d\n", softAPssid, WiFi.softAP(softAPssid, softAPpasswd)); + int ok = WiFi.softAP(softAPssid, softAPpasswd); + DEBUG_MSG("Starting (Forced) WIFI AP: ssid=%s, ok=%d\n", softAPssid, ok); } else { - DEBUG_MSG("Starting WIFI AP: ssid=%s, ok=%d\n", wifiName, WiFi.softAP(wifiName, wifiPsw)); + int ok = WiFi.softAP(wifiName, wifiPsw); + DEBUG_MSG("Starting WIFI AP: ssid=%s, ok=%d\n", wifiName, ok); } WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0)); @@ -362,4 +363,4 @@ void handleDNSResponse() uint8_t getWifiDisconnectReason() { return wifiDisconnectReason; -} \ No newline at end of file +} diff --git a/src/modules/AdminModule.cpp b/src/modules/AdminModule.cpp index 41acfeeed..32f89da2f 100644 --- a/src/modules/AdminModule.cpp +++ b/src/modules/AdminModule.cpp @@ -61,6 +61,18 @@ void AdminModule::handleGetRadio(const MeshPacket &req) } } +void AdminModule::handleGetOwner(const MeshPacket &req) +{ + if (req.decoded.want_response) { + // We create the reply here + AdminMessage r = AdminMessage_init_default; + r.get_owner_response = owner; + + r.which_variant = AdminMessage_get_owner_response_tag; + myReply = allocDataProtobuf(r); + } +} + bool AdminModule::handleReceivedProtobuf(const MeshPacket &mp, AdminMessage *r) { // if handled == false, then let others look at this message also if they want @@ -101,6 +113,11 @@ bool AdminModule::handleReceivedProtobuf(const MeshPacket &mp, AdminMessage *r) handleGetRadio(mp); break; + case AdminMessage_get_owner_request_tag: + DEBUG_MSG("Client is getting owner\n"); + handleGetOwner(mp); + break; + case AdminMessage_reboot_seconds_tag: { int32_t s = r->reboot_seconds; DEBUG_MSG("Rebooting in %d seconds\n", s); @@ -123,7 +140,7 @@ bool AdminModule::handleReceivedProtobuf(const MeshPacket &mp, AdminMessage *r) default: AdminMessage response = AdminMessage_init_default; - AdminMessageHandleResult handleResult = MeshPlugin::handleAdminMessageForAllPlugins(mp, r, &response); + AdminMessageHandleResult handleResult = MeshModule::handleAdminMessageForAllPlugins(mp, r, &response); if (handleResult == AdminMessageHandleResult::HANDLED_WITH_RESPONSE) { @@ -195,7 +212,7 @@ void AdminModule::handleSetRadio(RadioConfig &r) service.reloadConfig(); } -AdminModule::AdminModule() : ProtobufPlugin("Admin", PortNum_ADMIN_APP, AdminMessage_fields) +AdminModule::AdminModule() : ProtobufModule("Admin", PortNum_ADMIN_APP, AdminMessage_fields) { // restrict to the admin channel for rx boundChannel = Channels::adminChannel; diff --git a/src/modules/AdminModule.h b/src/modules/AdminModule.h index 98af9a677..dfe1e6c07 100644 --- a/src/modules/AdminModule.h +++ b/src/modules/AdminModule.h @@ -1,10 +1,10 @@ #pragma once -#include "ProtobufPlugin.h" +#include "ProtobufModule.h" /** * Routing module for router control messages */ -class AdminModule : public ProtobufPlugin +class AdminModule : public ProtobufModule { public: /** Constructor @@ -26,6 +26,7 @@ class AdminModule : public ProtobufPlugin void handleGetChannel(const MeshPacket &req, uint32_t channelIndex); void handleGetRadio(const MeshPacket &req); + void handleGetOwner(const MeshPacket &req); }; extern AdminModule *adminModule; diff --git a/src/modules/CannedMessageModule.cpp b/src/modules/CannedMessageModule.cpp index 204330e8f..6bb048acf 100644 --- a/src/modules/CannedMessageModule.cpp +++ b/src/modules/CannedMessageModule.cpp @@ -23,7 +23,7 @@ extern bool loadProto(const char *filename, size_t protoSize, size_t objSize, co extern bool saveProto(const char *filename, size_t protoSize, size_t objSize, const pb_msgdesc_t *fields, const void *dest_struct); CannedMessageModule::CannedMessageModule() - : SinglePortPlugin("canned", PortNum_TEXT_MESSAGE_APP), + : SinglePortModule("canned", PortNum_TEXT_MESSAGE_APP), concurrency::OSThread("CannedMessageModule") { if (radioConfig.preferences.canned_message_module_enabled) diff --git a/src/modules/CannedMessageModule.h b/src/modules/CannedMessageModule.h index 3a33b6acf..9a755c54e 100644 --- a/src/modules/CannedMessageModule.h +++ b/src/modules/CannedMessageModule.h @@ -1,5 +1,5 @@ #pragma once -#include "ProtobufPlugin.h" +#include "ProtobufModule.h" #include "input/InputBroker.h" enum cannedMessageModuleRunState @@ -21,7 +21,7 @@ enum cannedMessageModuleRunState #define CANNED_MESSAGE_MODULE_MESSAGES_SIZE 800 class CannedMessageModule : - public SinglePortPlugin, + public SinglePortModule, public Observable, private concurrency::OSThread { diff --git a/src/modules/ExternalNotificationModule.cpp b/src/modules/ExternalNotificationModule.cpp index d9f9f7d09..7412eb1d3 100644 --- a/src/modules/ExternalNotificationModule.cpp +++ b/src/modules/ExternalNotificationModule.cpp @@ -108,7 +108,7 @@ void ExternalNotificationModule::setExternalOff() // -------- ExternalNotificationModule::ExternalNotificationModule() - : SinglePortPlugin("ExternalNotificationModule", PortNum_TEXT_MESSAGE_APP), concurrency::OSThread( + : SinglePortModule("ExternalNotificationModule", PortNum_TEXT_MESSAGE_APP), concurrency::OSThread( "ExternalNotificationModule") { // restrict to the admin channel for rx diff --git a/src/modules/ExternalNotificationModule.h b/src/modules/ExternalNotificationModule.h index 40593aa83..a671d67c2 100644 --- a/src/modules/ExternalNotificationModule.h +++ b/src/modules/ExternalNotificationModule.h @@ -1,6 +1,6 @@ #pragma once -#include "SinglePortPlugin.h" +#include "SinglePortModule.h" #include "concurrency/OSThread.h" #include "configuration.h" #include @@ -10,7 +10,7 @@ * Radio interface for ExternalNotificationModule * */ -class ExternalNotificationModule : public SinglePortPlugin, private concurrency::OSThread +class ExternalNotificationModule : public SinglePortModule, private concurrency::OSThread { public: ExternalNotificationModule(); diff --git a/src/modules/NodeInfoModule.cpp b/src/modules/NodeInfoModule.cpp index 9994d314f..4eeac349d 100644 --- a/src/modules/NodeInfoModule.cpp +++ b/src/modules/NodeInfoModule.cpp @@ -51,7 +51,7 @@ MeshPacket *NodeInfoModule::allocReply() } NodeInfoModule::NodeInfoModule() - : ProtobufPlugin("nodeinfo", PortNum_NODEINFO_APP, User_fields), concurrency::OSThread("NodeInfoModule") + : ProtobufModule("nodeinfo", PortNum_NODEINFO_APP, User_fields), concurrency::OSThread("NodeInfoModule") { isPromiscuous = true; // We always want to update our nodedb, even if we are sniffing on others setIntervalFromNow(30 * diff --git a/src/modules/NodeInfoModule.h b/src/modules/NodeInfoModule.h index 9030a83a9..db1b35575 100644 --- a/src/modules/NodeInfoModule.h +++ b/src/modules/NodeInfoModule.h @@ -1,10 +1,10 @@ #pragma once -#include "ProtobufPlugin.h" +#include "ProtobufModule.h" /** * NodeInfo module for sending/receiving NodeInfos into the mesh */ -class NodeInfoModule : public ProtobufPlugin, private concurrency::OSThread +class NodeInfoModule : public ProtobufModule, private concurrency::OSThread { /// The id of the last packet we sent, to allow us to cancel it if we make something fresher PacketId prevPacketId = 0; diff --git a/src/modules/PositionModule.cpp b/src/modules/PositionModule.cpp index 1deabae0f..e7556f440 100644 --- a/src/modules/PositionModule.cpp +++ b/src/modules/PositionModule.cpp @@ -10,7 +10,7 @@ PositionModule *positionModule; PositionModule::PositionModule() - : ProtobufPlugin("position", PortNum_POSITION_APP, Position_fields), concurrency::OSThread("PositionModule") + : ProtobufModule("position", PortNum_POSITION_APP, Position_fields), concurrency::OSThread("PositionModule") { isPromiscuous = true; // We always want to update our nodedb, even if we are sniffing on others setIntervalFromNow(60 * 1000); // Send our initial position 60 seconds after we start (to give GPS time to setup) diff --git a/src/modules/PositionModule.h b/src/modules/PositionModule.h index 8fbc5865c..2c964dca1 100644 --- a/src/modules/PositionModule.h +++ b/src/modules/PositionModule.h @@ -1,11 +1,11 @@ #pragma once -#include "ProtobufPlugin.h" +#include "ProtobufModule.h" #include "concurrency/OSThread.h" /** * Position module for sending/receiving positions into the mesh */ -class PositionModule : public ProtobufPlugin, private concurrency::OSThread +class PositionModule : public ProtobufModule, private concurrency::OSThread { /// The id of the last packet we sent, to allow us to cancel it if we make something fresher PacketId prevPacketId = 0; diff --git a/src/modules/RemoteHardwareModule.cpp b/src/modules/RemoteHardwareModule.cpp index 7ceaffeab..b031f06e8 100644 --- a/src/modules/RemoteHardwareModule.cpp +++ b/src/modules/RemoteHardwareModule.cpp @@ -47,7 +47,7 @@ static uint64_t digitalReads(uint64_t mask) } RemoteHardwareModule::RemoteHardwareModule() - : ProtobufPlugin("remotehardware", PortNum_REMOTE_HARDWARE_APP, HardwareMessage_fields), concurrency::OSThread( + : ProtobufModule("remotehardware", PortNum_REMOTE_HARDWARE_APP, HardwareMessage_fields), concurrency::OSThread( "remotehardware") { } diff --git a/src/modules/RemoteHardwareModule.h b/src/modules/RemoteHardwareModule.h index 19811705a..e9c7794fb 100644 --- a/src/modules/RemoteHardwareModule.h +++ b/src/modules/RemoteHardwareModule.h @@ -1,12 +1,12 @@ #pragma once -#include "ProtobufPlugin.h" +#include "ProtobufModule.h" #include "mesh/generated/remote_hardware.pb.h" #include "concurrency/OSThread.h" /** * A module that provides easy low-level remote access to device hardware. */ -class RemoteHardwareModule : public ProtobufPlugin, private concurrency::OSThread +class RemoteHardwareModule : public ProtobufModule, private concurrency::OSThread { /// The current set of GPIOs we've been asked to watch for changes uint64_t watchGpios = 0; diff --git a/src/modules/ReplyModule.h b/src/modules/ReplyModule.h index af17224a6..28a57a4bd 100644 --- a/src/modules/ReplyModule.h +++ b/src/modules/ReplyModule.h @@ -1,17 +1,17 @@ #pragma once -#include "SinglePortPlugin.h" +#include "SinglePortModule.h" /** * A simple example module that just replies with "Message received" to any message it receives. */ -class ReplyModule : public SinglePortPlugin +class ReplyModule : public SinglePortModule { public: /** Constructor * name is for debugging output */ - ReplyModule() : SinglePortPlugin("reply", PortNum_REPLY_APP) {} + ReplyModule() : SinglePortModule("reply", PortNum_REPLY_APP) {} protected: diff --git a/src/modules/RoutingModule.cpp b/src/modules/RoutingModule.cpp index 070231032..6acf5fe59 100644 --- a/src/modules/RoutingModule.cpp +++ b/src/modules/RoutingModule.cpp @@ -41,7 +41,7 @@ void RoutingModule::sendAckNak(Routing_Error err, NodeNum to, PacketId idFrom, C router->sendLocal(p); // we sometimes send directly to the local node } -RoutingModule::RoutingModule() : ProtobufPlugin("routing", PortNum_ROUTING_APP, Routing_fields) +RoutingModule::RoutingModule() : ProtobufModule("routing", PortNum_ROUTING_APP, Routing_fields) { isPromiscuous = true; } diff --git a/src/modules/RoutingModule.h b/src/modules/RoutingModule.h index 66a326c7b..b2840ff58 100644 --- a/src/modules/RoutingModule.h +++ b/src/modules/RoutingModule.h @@ -1,11 +1,11 @@ #pragma once -#include "ProtobufPlugin.h" +#include "ProtobufModule.h" #include "Channels.h" /** * Routing module for router control messages */ -class RoutingModule : public ProtobufPlugin +class RoutingModule : public ProtobufModule { public: /** Constructor diff --git a/src/modules/Telemetry/Telemetry.h b/src/modules/Telemetry/Telemetry.h index 40da90986..4e66b4b85 100644 --- a/src/modules/Telemetry/Telemetry.h +++ b/src/modules/Telemetry/Telemetry.h @@ -1,15 +1,15 @@ #pragma once #include "../mesh/generated/telemetry.pb.h" -#include "ProtobufPlugin.h" +#include "ProtobufModule.h" #include #include -class TelemetryModule : private concurrency::OSThread, public ProtobufPlugin +class TelemetryModule : private concurrency::OSThread, public ProtobufModule { public: TelemetryModule() : concurrency::OSThread("TelemetryModule"), - ProtobufPlugin("Telemetry", PortNum_TELEMETRY_APP, &Telemetry_msg) + ProtobufModule("Telemetry", PortNum_TELEMETRY_APP, &Telemetry_msg) { lastMeasurementPacket = nullptr; } diff --git a/src/modules/TextMessageModule.h b/src/modules/TextMessageModule.h index 184bb9e11..3b12dee48 100644 --- a/src/modules/TextMessageModule.h +++ b/src/modules/TextMessageModule.h @@ -1,17 +1,17 @@ #pragma once -#include "SinglePortPlugin.h" +#include "SinglePortModule.h" #include "Observer.h" /** * Text message handling for meshtastic - draws on the OLED display the most recent received message */ -class TextMessageModule : public SinglePortPlugin, public Observable +class TextMessageModule : public SinglePortModule, public Observable { public: /** Constructor * name is for debugging output */ - TextMessageModule() : SinglePortPlugin("text", PortNum_TEXT_MESSAGE_APP) {} + TextMessageModule() : SinglePortModule("text", PortNum_TEXT_MESSAGE_APP) {} protected: diff --git a/src/modules/esp32/RangeTestModule.h b/src/modules/esp32/RangeTestModule.h index 23ef0aaf6..76735d376 100644 --- a/src/modules/esp32/RangeTestModule.h +++ b/src/modules/esp32/RangeTestModule.h @@ -1,6 +1,6 @@ #pragma once -#include "SinglePortPlugin.h" +#include "SinglePortModule.h" #include "concurrency/OSThread.h" #include "configuration.h" #include @@ -23,12 +23,12 @@ extern RangeTestModule *rangeTestModule; * Radio interface for RangeTestModule * */ -class RangeTestModuleRadio : public SinglePortPlugin +class RangeTestModuleRadio : public SinglePortModule { uint32_t lastRxID = 0; public: - RangeTestModuleRadio() : SinglePortPlugin("RangeTestModuleRadio", PortNum_TEXT_MESSAGE_APP) {} + RangeTestModuleRadio() : SinglePortModule("RangeTestModuleRadio", PortNum_TEXT_MESSAGE_APP) {} /** * Send our payload into the mesh diff --git a/src/modules/esp32/SerialModule.cpp b/src/modules/esp32/SerialModule.cpp index a29e03bbf..0c8e15853 100644 --- a/src/modules/esp32/SerialModule.cpp +++ b/src/modules/esp32/SerialModule.cpp @@ -20,18 +20,18 @@ Basic Usage: - 1) Enable the module by setting serialmodule_enabled to 1. - 2) Set the pins (serialmodule_rxd / serialmodule_rxd) for your preferred RX and TX GPIO pins. + 1) Enable the module by setting serial_module_enabled to 1. + 2) Set the pins (serial_module_rxd / serial_module_rxd) for your preferred RX and TX GPIO pins. On tbeam, recommend to use: RXD 35 TXD 15 - 3) Set serialmodule_timeout to the amount of time to wait before we consider + 3) Set serial_module_timeout to the amount of time to wait before we consider your packet as "done". 4) (Optional) In SerialModule.h set the port to PortNum_TEXT_MESSAGE_APP if you want to send messages to/from the general text message channel. 5) Connect to your device over the serial interface at 38400 8N1. 6) Send a packet up to 240 bytes in length. This will get relayed over the mesh network. - 7) (Optional) Set serialmodule_echo to 1 and any message you send out will be echoed back + 7) (Optional) Set serial_module_echo to 1 and any message you send out will be echoed back to your device. TODO (in this order): @@ -48,11 +48,11 @@ #define RXD2 16 #define TXD2 17 -#define SERIALMODULE_RX_BUFFER 128 -#define SERIALMODULE_STRING_MAX Constants_DATA_PAYLOAD_LEN -#define SERIALMODULE_TIMEOUT 250 -#define SERIALMODULE_BAUD 38400 -#define SERIALMODULE_ACK 1 +#define SERIAL_MODULE_RX_BUFFER 128 +#define SERIAL_MODULE_STRING_MAX Constants_DATA_PAYLOAD_LEN +#define SERIAL_MODULE_TIMEOUT 250 +#define SERIAL_MODULE_BAUD 38400 +#define SERIAL_MODULE_ACK 1 SerialModule *serialModule; SerialModuleRadio *serialModuleRadio; @@ -61,7 +61,7 @@ SerialModule::SerialModule() : concurrency::OSThread("SerialModule") {} char serialStringChar[Constants_DATA_PAYLOAD_LEN]; -SerialModuleRadio::SerialModuleRadio() : SinglePortPlugin("SerialModuleRadio", PortNum_SERIAL_APP) +SerialModuleRadio::SerialModuleRadio() : SinglePortModule("SerialModuleRadio", PortNum_SERIAL_APP) { // restrict to the admin channel for rx boundChannel = Channels::serialChannel; @@ -76,36 +76,36 @@ int32_t SerialModule::runOnce() without having to configure it from the PythonAPI or WebUI. */ - // radioConfig.preferences.serialmodule_enabled = 1; - // radioConfig.preferences.serialmodule_rxd = 35; - // radioConfig.preferences.serialmodule_txd = 15; - // radioConfig.preferences.serialmodule_timeout = 1000; - // radioConfig.preferences.serialmodule_echo = 1; + // radioConfig.preferences.serial_module_enabled = 1; + // radioConfig.preferences.serial_module_rxd = 35; + // radioConfig.preferences.serial_module_txd = 15; + // radioConfig.preferences.serial_module_timeout = 1000; + // radioConfig.preferences.serial_module_echo = 1; - if (radioConfig.preferences.serialmodule_enabled) { + if (radioConfig.preferences.serial_module_enabled) { if (firstTime) { // Interface with the serial peripheral from in here. DEBUG_MSG("Initializing serial peripheral interface\n"); - if (radioConfig.preferences.serialmodule_rxd && radioConfig.preferences.serialmodule_txd) { - Serial2.begin(SERIALMODULE_BAUD, SERIAL_8N1, radioConfig.preferences.serialmodule_rxd, - radioConfig.preferences.serialmodule_txd); + if (radioConfig.preferences.serial_module_rxd && radioConfig.preferences.serial_module_txd) { + Serial2.begin(SERIAL_MODULE_BAUD, SERIAL_8N1, radioConfig.preferences.serial_module_rxd, + radioConfig.preferences.serial_module_txd); } else { - Serial2.begin(SERIALMODULE_BAUD, SERIAL_8N1, RXD2, TXD2); + Serial2.begin(SERIAL_MODULE_BAUD, SERIAL_8N1, RXD2, TXD2); } - if (radioConfig.preferences.serialmodule_timeout) { + if (radioConfig.preferences.serial_module_timeout) { Serial2.setTimeout( - radioConfig.preferences.serialmodule_timeout); // Number of MS to wait to set the timeout for the string. + radioConfig.preferences.serial_module_timeout); // Number of MS to wait to set the timeout for the string. } else { - Serial2.setTimeout(SERIALMODULE_TIMEOUT); // Number of MS to wait to set the timeout for the string. + Serial2.setTimeout(SERIAL_MODULE_TIMEOUT); // Number of MS to wait to set the timeout for the string. } - Serial2.setRxBufferSize(SERIALMODULE_RX_BUFFER); + Serial2.setRxBufferSize(SERIAL_MODULE_RX_BUFFER); serialModuleRadio = new SerialModuleRadio(); @@ -149,7 +149,7 @@ void SerialModuleRadio::sendPayload(NodeNum dest, bool wantReplies) p->to = dest; p->decoded.want_response = wantReplies; - p->want_ack = SERIALMODULE_ACK; + p->want_ack = SERIAL_MODULE_ACK; p->decoded.payload.size = strlen(serialStringChar); // You must specify how many bytes are in the reply memcpy(p->decoded.payload.bytes, serialStringChar, p->decoded.payload.size); @@ -161,7 +161,7 @@ ProcessMessage SerialModuleRadio::handleReceived(const MeshPacket &mp) { #ifndef NO_ESP32 - if (radioConfig.preferences.serialmodule_enabled) { + if (radioConfig.preferences.serial_module_enabled) { auto &p = mp.decoded; // DEBUG_MSG("Received text msg self=0x%0x, from=0x%0x, to=0x%0x, id=%d, msg=%.*s\n", @@ -170,10 +170,10 @@ ProcessMessage SerialModuleRadio::handleReceived(const MeshPacket &mp) if (getFrom(&mp) == nodeDB.getNodeNum()) { /* - * If radioConfig.preferences.serialmodule_echo is true, then echo the packets that are sent out back to the TX + * If radioConfig.preferences.serial_module_echo is true, then echo the packets that are sent out back to the TX * of the serial interface. */ - if (radioConfig.preferences.serialmodule_echo) { + if (radioConfig.preferences.serial_module_echo) { // For some reason, we get the packet back twice when we send out of the radio. // TODO: need to find out why. @@ -187,12 +187,12 @@ ProcessMessage SerialModuleRadio::handleReceived(const MeshPacket &mp) } else { - if (radioConfig.preferences.serialmodule_mode == 0 || radioConfig.preferences.serialmodule_mode == 1) { + if (radioConfig.preferences.serial_module_mode == 0 || radioConfig.preferences.serial_module_mode == 1) { // DEBUG_MSG("* * Message came from the mesh\n"); // Serial2.println("* * Message came from the mesh"); Serial2.printf("%s", p.payload.bytes); - } else if (radioConfig.preferences.serialmodule_mode == 10) { + } else if (radioConfig.preferences.serial_module_mode == 10) { /* @jobionekabnoi Add code here to handle what gets sent out to the serial interface. diff --git a/src/modules/esp32/SerialModule.h b/src/modules/esp32/SerialModule.h index 860f53082..f92b13422 100644 --- a/src/modules/esp32/SerialModule.h +++ b/src/modules/esp32/SerialModule.h @@ -1,6 +1,6 @@ #pragma once -#include "SinglePortPlugin.h" +#include "SinglePortModule.h" #include "concurrency/OSThread.h" #include "configuration.h" #include @@ -23,7 +23,7 @@ extern SerialModule *serialModule; * Radio interface for SerialModule * */ -class SerialModuleRadio : public SinglePortPlugin +class SerialModuleRadio : public SinglePortModule { uint32_t lastRxID = 0; diff --git a/src/modules/esp32/StoreForwardModule.cpp b/src/modules/esp32/StoreForwardModule.cpp index a8c775236..41e7077b7 100644 --- a/src/modules/esp32/StoreForwardModule.cpp +++ b/src/modules/esp32/StoreForwardModule.cpp @@ -378,7 +378,7 @@ ProcessMessage StoreForwardModule::handleReceivedProtobuf(const MeshPacket &mp, } StoreForwardModule::StoreForwardModule() - : SinglePortPlugin("StoreForwardModule", PortNum_TEXT_MESSAGE_APP), concurrency::OSThread("StoreForwardModule") + : SinglePortModule("StoreForwardModule", PortNum_TEXT_MESSAGE_APP), concurrency::OSThread("StoreForwardModule") { #ifndef NO_ESP32 diff --git a/src/modules/esp32/StoreForwardModule.h b/src/modules/esp32/StoreForwardModule.h index 4d610c667..2c6d6ec6e 100644 --- a/src/modules/esp32/StoreForwardModule.h +++ b/src/modules/esp32/StoreForwardModule.h @@ -1,6 +1,6 @@ #pragma once -#include "SinglePortPlugin.h" +#include "SinglePortModule.h" #include "concurrency/OSThread.h" #include "mesh/generated/storeforward.pb.h" @@ -18,7 +18,7 @@ struct PacketHistoryStruct { pb_size_t payload_size; }; -class StoreForwardModule : public SinglePortPlugin, private concurrency::OSThread +class StoreForwardModule : public SinglePortModule, private concurrency::OSThread { // bool firstTime = 1; bool busy = 0; diff --git a/src/mqtt/MQTT.cpp b/src/mqtt/MQTT.cpp index 26ef2a3e7..6df41e829 100644 --- a/src/mqtt/MQTT.cpp +++ b/src/mqtt/MQTT.cpp @@ -1,18 +1,22 @@ #include "MQTT.h" +#include "MeshService.h" #include "NodeDB.h" #include "PowerFSM.h" #include "main.h" #include "mesh/Channels.h" #include "mesh/Router.h" #include "mesh/generated/mqtt.pb.h" +#include "mesh/generated/telemetry.pb.h" #include "sleep.h" #include #include +#include MQTT *mqtt; String statusTopic = "msh/1/stat/"; -String cryptTopic = "msh/1/c/"; // msh/1/c/CHANNELID/NODEID +String cryptTopic = "msh/1/c/"; // msh/1/c/CHANNELID/NODEID +String jsonTopic = "msh/1/json/"; // msh/1/json/CHANNELID/NODEID void MQTT::mqttCallback(char *topic, byte *payload, unsigned int length) { @@ -24,7 +28,43 @@ void MQTT::onPublish(char *topic, byte *payload, unsigned int length) // parsing ServiceEnvelope ServiceEnvelope e = ServiceEnvelope_init_default; if (!pb_decode_from_bytes(payload, length, ServiceEnvelope_fields, &e)) { - DEBUG_MSG("Invalid MQTT service envelope, topic %s, len %u!\n", topic, length); + + // check if this is a json payload message + using namespace json11; + char payloadStr[length + 1]; + memcpy(payloadStr, payload, length); + payloadStr[length] = 0; // null terminated string + std::string err; + auto json = Json::parse(payloadStr, err); + if (err.empty()) { + DEBUG_MSG("Received json payload on MQTT, parsing..\n"); + // check if it is a valid envelope + if (json.object_items().count("sender") != 0 && json.object_items().count("payload") != 0) { + // this is a valid envelope + if (json["sender"].string_value().compare(owner.id) != 0) { + std::string jsonPayloadStr = json["payload"].dump(); + DEBUG_MSG("Received json payload %s, length %u\n", jsonPayloadStr.c_str(), jsonPayloadStr.length()); + // construct protobuf data packet using TEXT_MESSAGE, send it to the mesh + MeshPacket *p = router->allocForSending(); + p->decoded.portnum = PortNum_TEXT_MESSAGE_APP; + if (jsonPayloadStr.length() <= sizeof(p->decoded.payload.bytes)) { + memcpy(p->decoded.payload.bytes, jsonPayloadStr.c_str(), jsonPayloadStr.length()); + p->decoded.payload.size = jsonPayloadStr.length(); + MeshPacket *packet = packetPool.allocCopy(*p); + service.sendToMesh(packet, RX_SRC_LOCAL); + } else { + DEBUG_MSG("Received MQTT json payload too long, dropping\n"); + } + } else { + DEBUG_MSG("Ignoring downlink message we originally sent.\n"); + } + } else { + DEBUG_MSG("Received json payload on MQTT but not a valid envelope\n"); + } + } else { + // no json, this is an invalid payload + DEBUG_MSG("Invalid MQTT service envelope, topic %s, len %u!\n", topic, length); + } } else { if (strcmp(e.gateway_id, owner.id) == 0) DEBUG_MSG("Ignoring downlink message we originally sent.\n"); @@ -72,11 +112,11 @@ void MQTT::reconnect() const char *mqttPassword = "large4cats"; if (*radioConfig.preferences.mqtt_server) { - serverAddr = radioConfig.preferences.mqtt_server; // Override the default - mqttUsername = radioConfig.preferences.mqtt_username; //do not use the hardcoded credentials for a custom mqtt server + serverAddr = radioConfig.preferences.mqtt_server; // Override the default + mqttUsername = radioConfig.preferences.mqtt_username; // do not use the hardcoded credentials for a custom mqtt server mqttPassword = radioConfig.preferences.mqtt_password; } else { - //we are using the default server. Use the hardcoded credentials by default, but allow overriding + // we are using the default server. Use the hardcoded credentials by default, but allow overriding if (*radioConfig.preferences.mqtt_username && radioConfig.preferences.mqtt_username[0] != '\0') { mqttUsername = radioConfig.preferences.mqtt_username; } @@ -95,7 +135,8 @@ void MQTT::reconnect() } pubSub.setServer(serverAddr, serverPort); - DEBUG_MSG("Connecting to MQTT server %s, port: %d, username: %s, password: %s\n", serverAddr, serverPort, mqttUsername, mqttPassword); + DEBUG_MSG("Connecting to MQTT server %s, port: %d, username: %s, password: %s\n", serverAddr, serverPort, mqttUsername, + mqttPassword); auto myStatus = (statusTopic + owner.id); bool connected = pubSub.connect(owner.id, mqttUsername, mqttPassword, myStatus.c_str(), 1, true, "offline"); if (connected) { @@ -122,6 +163,9 @@ void MQTT::sendSubscriptions() String topic = cryptTopic + channels.getGlobalId(i) + "/#"; DEBUG_MSG("Subscribing to %s\n", topic.c_str()); pubSub.subscribe(topic.c_str(), 1); // FIXME, is QOS 1 right? + String topicDecoded = jsonTopic + channels.getGlobalId(i) + "/#"; + DEBUG_MSG("Subscribing to %s\n", topicDecoded.c_str()); + pubSub.subscribe(topicDecoded.c_str(), 1); // FIXME, is QOS 1 right? } } } @@ -193,5 +237,125 @@ void MQTT::onSend(const MeshPacket &mp, ChannelIndex chIndex) DEBUG_MSG("publish %s, %u bytes\n", topic.c_str(), numBytes); pubSub.publish(topic.c_str(), bytes, numBytes, false); + + // handle json topic + using namespace json11; + auto jsonString = this->downstreamPacketToJson((MeshPacket *)&mp); + if (jsonString.length() != 0) { + String topicJson = jsonTopic + channelId + "/" + owner.id; + DEBUG_MSG("publish json message to %s, %u bytes: %s\n", topicJson.c_str(), jsonString.length(), jsonString.c_str()); + pubSub.publish(topicJson.c_str(), jsonString.c_str(), false); + } } } + +// converts a downstream packet into a json message +String MQTT::downstreamPacketToJson(MeshPacket *mp) +{ + using namespace json11; + + // the created jsonObj is immutable after creation, so + // we need to do the heavy lifting before assembling it. + String msgType; + Json msgPayload; + + switch (mp->decoded.portnum) { + case PortNum_TEXT_MESSAGE_APP: { + msgType = "text"; + // convert bytes to string + DEBUG_MSG("got text message of size %u\n", mp->decoded.payload.size); + char payloadStr[(mp->decoded.payload.size) + 1]; + memcpy(payloadStr, mp->decoded.payload.bytes, mp->decoded.payload.size); + payloadStr[mp->decoded.payload.size] = 0; // null terminated string + // check if this is a JSON payload + std::string err; + auto json = Json::parse(payloadStr, err); + if (err.empty()) { + DEBUG_MSG("text message payload is of type json\n"); + // if it is, then we can just use the json object + msgPayload = json; + } else { + // if it isn't, then we need to create a json object + // with the string as the value + DEBUG_MSG("text message payload is of type plaintext\n"); + msgPayload = Json::object({{"text", payloadStr}}); + } + break; + } + case PortNum_TELEMETRY_APP: { + msgType = "telemetry"; + Telemetry scratch; + Telemetry *decoded = NULL; + if (mp->which_payloadVariant == MeshPacket_decoded_tag) { + memset(&scratch, 0, sizeof(scratch)); + if (pb_decode_from_bytes(mp->decoded.payload.bytes, mp->decoded.payload.size, &Telemetry_msg, + &scratch)) { + decoded = &scratch; + msgPayload = Json::object{ + {"temperature", decoded->temperature}, + {"relative_humidity", decoded->relative_humidity}, + {"barometric_pressure", decoded->barometric_pressure}, + {"gas_resistance", decoded->gas_resistance}, + {"voltage", decoded->voltage}, + {"current", decoded->current}, + }; + } else + DEBUG_MSG("Error decoding protobuf for telemetry message!\n"); + }; + break; + } + case PortNum_NODEINFO_APP: { + msgType = "nodeinfo"; + User scratch; + User *decoded = NULL; + if (mp->which_payloadVariant == MeshPacket_decoded_tag) { + memset(&scratch, 0, sizeof(scratch)); + if (pb_decode_from_bytes(mp->decoded.payload.bytes, mp->decoded.payload.size, &User_msg, &scratch)) { + decoded = &scratch; + msgPayload = Json::object{{"id", decoded->id}, + {"longname", decoded->long_name}, + {"shortname", decoded->short_name}, + {"hardware", decoded->hw_model}}; + + } else + DEBUG_MSG("Error decoding protobuf for nodeinfo message!\n"); + }; + break; + } + case PortNum_POSITION_APP: { + msgType = "position"; + Position scratch; + Position *decoded = NULL; + if (mp->which_payloadVariant == MeshPacket_decoded_tag) { + memset(&scratch, 0, sizeof(scratch)); + if (pb_decode_from_bytes(mp->decoded.payload.bytes, mp->decoded.payload.size, &Position_msg, &scratch)) { + decoded = &scratch; + msgPayload = Json::object{ + {"latitude_i", decoded->latitude_i}, {"longitude_i", decoded->longitude_i}, {"altitude", decoded->altitude}}; + } else { + DEBUG_MSG("Error decoding protobuf for position message!\n"); + } + }; + break; + } + // add more packet types here if needed + default: + break; + } + + // assemble the final jsonObj + Json jsonObj = Json::object{{"id", Json((int)mp->id)}, + {"timestamp", Json((int)mp->rx_time)}, + {"to", Json((int)mp->to)}, + {"from", Json((int)mp->from)}, + {"channel", Json((int)mp->channel)}, + {"type", msgType.c_str()}, + {"sender", owner.id}, + {"payload", msgPayload}}; + + // serialize and return it + std::string jsonStr = jsonObj.dump(); + DEBUG_MSG("serialized json message: %s\n", jsonStr.c_str()); + + return jsonStr.c_str(); +} \ No newline at end of file diff --git a/src/mqtt/MQTT.h b/src/mqtt/MQTT.h index e03ad67b3..cfb68354e 100644 --- a/src/mqtt/MQTT.h +++ b/src/mqtt/MQTT.h @@ -57,6 +57,9 @@ class MQTT : private concurrency::OSThread /// Called when a new publish arrives from the MQTT server void onPublish(char *topic, byte *payload, unsigned int length); + /// Called when a new publish arrives from the MQTT server + String downstreamPacketToJson(MeshPacket *mp); + /// Return 0 if sleep is okay, veto sleep if we are connected to pubsub server // int preflightSleepCb(void *unused = NULL) { return pubSub.connected() ? 1 : 0; } }; diff --git a/src/nimble/BluetoothUtil.cpp b/src/nimble/BluetoothUtil.cpp index 016eafe06..fc4501ccb 100644 --- a/src/nimble/BluetoothUtil.cpp +++ b/src/nimble/BluetoothUtil.cpp @@ -1,3 +1,5 @@ +#ifndef USE_NEW_ESP32_BLUETOOTH + #include "BluetoothUtil.h" #include "BluetoothSoftwareUpdate.h" #include "NimbleBluetoothAPI.h" @@ -23,6 +25,8 @@ static uint32_t doublepressed; static bool bluetoothActive; +//put the wider device into a bluetooth pairing mode, and show the pin on screen. +//called in this file only static void startCb(uint32_t pin) { pinShowing = true; @@ -30,6 +34,8 @@ static void startCb(uint32_t pin) screen->startBluetoothPinScreen(pin); }; +//pairing has ended +//called in this file only static void stopCb() { if (pinShowing) { @@ -52,6 +58,8 @@ void updateBatteryLevel(uint8_t level) // FIXME } +//shutdown the bluetooth and tear down all the data structures. to prevent memory leaks +//called here only void deinitBLE() { if (bluetoothActive) { @@ -85,6 +93,7 @@ void loopBLE() extern "C" void ble_store_config_init(void); /// Print a macaddr - bytes are sometimes stored in reverse order +//called here only static void print_addr(const uint8_t v[], bool isReversed = true) { const int macaddrlen = 6; @@ -96,6 +105,7 @@ static void print_addr(const uint8_t v[], bool isReversed = true) /** * Logs information about a connection to the console. + * called here only */ static void print_conn_desc(struct ble_gap_conn_desc *desc) { @@ -260,6 +270,8 @@ static int gap_event(struct ble_gap_event *event, void *arg) * Enables advertising with the following parameters: * o General discoverable mode. * o Undirected connectable mode. + * + * Called here only */ static void advertise(void) { @@ -324,12 +336,16 @@ static void advertise(void) } } +//callback +//doesn't do anything static void on_reset(int reason) { // 19 == BLE_HS_ETIMEOUT_HCI DEBUG_MSG("Resetting state; reason=%d\n", reason); } +//callback +// static void on_sync(void) { int rc; @@ -356,6 +372,7 @@ static void on_sync(void) advertise(); } +//do the bluetooth tasks static void ble_host_task(void *param) { DEBUG_MSG("BLE task running\n"); @@ -366,6 +383,7 @@ static void ble_host_task(void *param) nimble_port_freertos_deinit(); // delete the task } +//saves the stream handles when characteristics are successfully registered void gatt_svr_register_cb(struct ble_gatt_register_ctxt *ctxt, void *arg) { char buf[BLE_UUID_STR_LEN]; @@ -405,6 +423,8 @@ void gatt_svr_register_cb(struct ble_gatt_register_ctxt *ctxt, void *arg) * * If a read, the provided value will be returned over bluetooth. If a write, the value from the received packet * will be written into the variable. + * + * used a few places */ int chr_readwrite32le(uint32_t *v, struct ble_gatt_access_ctxt *ctxt) { @@ -637,4 +657,6 @@ void updateBatteryLevel(uint8_t level) BLEServer *serve = initBLE(, , getDeviceName(), HW_VENDOR, optstr(APP_VERSION), optstr(HW_VERSION)); // FIXME, use a real name based on the macaddr -#endif \ No newline at end of file +#endif + +#endif //#ifndef USE_NEW_ESP32_BLUETOOTH \ No newline at end of file diff --git a/src/nimble/BluetoothUtil.h b/src/nimble/BluetoothUtil.h index 8d02c0afc..bd2c08e27 100644 --- a/src/nimble/BluetoothUtil.h +++ b/src/nimble/BluetoothUtil.h @@ -1,3 +1,5 @@ +#ifndef USE_NEW_ESP32_BLUETOOTH + #pragma once #include @@ -28,4 +30,6 @@ int chr_readwrite32le(uint32_t *v, struct ble_gatt_access_ctxt *ctxt); /** * A helper for readwrite access to an array of bytes (with no endian conversion) */ -int chr_readwrite8(uint8_t *v, size_t vlen, struct ble_gatt_access_ctxt *ctxt); \ No newline at end of file +int chr_readwrite8(uint8_t *v, size_t vlen, struct ble_gatt_access_ctxt *ctxt); + +#endif //#ifndef USE_NEW_ESP32_BLUETOOTH \ No newline at end of file diff --git a/src/nimble/NimbleBluetoothAPI.cpp b/src/nimble/NimbleBluetoothAPI.cpp index 6b44e44d0..a2bd718d7 100644 --- a/src/nimble/NimbleBluetoothAPI.cpp +++ b/src/nimble/NimbleBluetoothAPI.cpp @@ -1,3 +1,5 @@ +#ifndef USE_NEW_ESP32_BLUETOOTH + #include "NimbleBluetoothAPI.h" #include "PhoneAPI.h" #include "configuration.h" @@ -69,3 +71,5 @@ int fromnum_callback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt { return chr_readwrite32le(&fromNum, ctxt); } + +#endif //#ifndef USE_NEW_ESP32_BLUETOOTH \ No newline at end of file diff --git a/src/nimble/NimbleBluetoothAPI.h b/src/nimble/NimbleBluetoothAPI.h index 4df2498b8..0945ae422 100644 --- a/src/nimble/NimbleBluetoothAPI.h +++ b/src/nimble/NimbleBluetoothAPI.h @@ -1,3 +1,5 @@ +#ifndef USE_NEW_ESP32_BLUETOOTH + #pragma once #include "PhoneAPI.h" @@ -17,3 +19,5 @@ protected: }; extern PhoneAPI *bluetoothPhoneAPI; + +#endif //#ifndef USE_NEW_ESP32_BLUETOOTH \ No newline at end of file diff --git a/src/nimble/NimbleDefs.c b/src/nimble/NimbleDefs.c index 179cbebf6..8be1401ae 100644 --- a/src/nimble/NimbleDefs.c +++ b/src/nimble/NimbleDefs.c @@ -1,3 +1,5 @@ +#ifndef USE_NEW_ESP32_BLUETOOTH + #include "NimbleDefs.h" // NRF52 wants these constants as byte arrays @@ -44,3 +46,5 @@ const struct ble_gatt_svc_def gatt_svr_svcs[] = { 0, /* No more services. */ }, }; + +#endif //#ifndef USE_NEW_ESP32_BLUETOOTH \ No newline at end of file diff --git a/src/nimble/NimbleDefs.h b/src/nimble/NimbleDefs.h index 7a2b0b46a..e7c2c4c0f 100644 --- a/src/nimble/NimbleDefs.h +++ b/src/nimble/NimbleDefs.h @@ -1,3 +1,5 @@ +#ifndef USE_NEW_ESP32_BLUETOOTH + #pragma once // Keep nimble #defs from messing up the build @@ -28,4 +30,6 @@ extern const ble_uuid128_t mesh_service_uuid, fromnum_uuid; #ifdef __cplusplus }; -#endif \ No newline at end of file +#endif + +#endif //#ifndef USE_NEW_ESP32_BLUETOOTH \ No newline at end of file diff --git a/src/sleep.cpp b/src/sleep.cpp index 998645dcd..fce4f02a3 100644 --- a/src/sleep.cpp +++ b/src/sleep.cpp @@ -289,6 +289,7 @@ void enableModemSleep() config.max_freq_mhz = CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ; config.min_freq_mhz = 20; // 10Mhz is minimum recommended config.light_sleep_enable = false; - DEBUG_MSG("Sleep request result %x\n", esp_pm_configure(&config)); + int rv = esp_pm_configure(&config); + DEBUG_MSG("Sleep request result %x\n", rv); } #endif diff --git a/version.properties b/version.properties index 75bab9547..8ec26fb45 100644 --- a/version.properties +++ b/version.properties @@ -1,4 +1,4 @@ [VERSION] major = 1 minor = 3 -build = 3 +build = 4