Amap and PVS Studio reports in CI/CD (#1526)
This commit is contained in:
		
							parent
							
								
									57328761cf
								
							
						
					
					
						commit
						a7a9c38036
					
				
							
								
								
									
										4
									
								
								.github/CODEOWNERS
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/CODEOWNERS
									
									
									
									
										vendored
									
									
								
							| @ -44,10 +44,6 @@ | |||||||
| # Debug tools and plugins | # Debug tools and plugins | ||||||
| /debug/ @skotopes @DrZlo13 @hedger | /debug/ @skotopes @DrZlo13 @hedger | ||||||
| 
 | 
 | ||||||
| # Docker |  | ||||||
| /docker/ @skotopes @DrZlo13 @hedger @drunkbatya |  | ||||||
| /docker-compose.yml @skotopes @DrZlo13 @hedger @drunkbatya |  | ||||||
| 
 |  | ||||||
| # Documentation | # Documentation | ||||||
| /documentation/ @skotopes @DrZlo13 @hedger @drunkbatya | /documentation/ @skotopes @DrZlo13 @hedger @drunkbatya | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										11
									
								
								.github/actions/docker/action.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										11
									
								
								.github/actions/docker/action.yml
									
									
									
									
										vendored
									
									
								
							| @ -1,11 +0,0 @@ | |||||||
| name: 'Run in docker' |  | ||||||
| inputs: |  | ||||||
|   run:  # id of input |  | ||||||
|     description: 'A command to run' |  | ||||||
|     required: true |  | ||||||
|     default: '' |  | ||||||
| runs: |  | ||||||
|   using: 'docker' |  | ||||||
|   image: '../../../docker/Dockerfile' |  | ||||||
|   args: |  | ||||||
|     - ${{ inputs.run }} |  | ||||||
							
								
								
									
										120
									
								
								.github/workflows/amap_analyse.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								.github/workflows/amap_analyse.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,120 @@ | |||||||
|  | name: 'Analyze .map file with Amap' | ||||||
|  | 
 | ||||||
|  | on: | ||||||
|  |   push: | ||||||
|  |     branches: | ||||||
|  |       - dev | ||||||
|  |       - "release*" | ||||||
|  |     tags: | ||||||
|  |       - '*' | ||||||
|  |   pull_request: | ||||||
|  | 
 | ||||||
|  | env: | ||||||
|  |   TARGETS: f7 | ||||||
|  | 
 | ||||||
|  | jobs: | ||||||
|  |   amap_analyse: | ||||||
|  |     runs-on: [self-hosted,FlipperZeroMacShell] | ||||||
|  |     steps: | ||||||
|  |       - name: 'Wait Build workflow' | ||||||
|  |         uses: fountainhead/action-wait-for-check@v1.0.0 | ||||||
|  |         id: wait-for-build | ||||||
|  |         with: | ||||||
|  |           token: ${{ secrets.GITHUB_TOKEN }} | ||||||
|  |           checkName: 'main' | ||||||
|  |           ref: ${{ github.event.pull_request.head.sha || github.sha }} | ||||||
|  |           intervalSeconds: 20 | ||||||
|  | 
 | ||||||
|  |       - name: 'Check Build workflow status' | ||||||
|  |         if: steps.wait-for-build.outputs.conclusion == 'failure' | ||||||
|  |         run: | | ||||||
|  |           exit 1 | ||||||
|  | 
 | ||||||
|  |       - name: 'Decontaminate previous build leftovers' | ||||||
|  |         run: | | ||||||
|  |           if [ -d .git ]; then | ||||||
|  |             git submodule status \ | ||||||
|  |               || git checkout `git rev-list --max-parents=0 HEAD | tail -n 1` | ||||||
|  |           fi | ||||||
|  | 
 | ||||||
|  |       - name: 'Checkout code' | ||||||
|  |         uses: actions/checkout@v2 | ||||||
|  |         with: | ||||||
|  |           fetch-depth: 0 | ||||||
|  |           ref: ${{ github.event.pull_request.head.sha }} | ||||||
|  | 
 | ||||||
|  |       - name: 'Generate prefixes by commit' | ||||||
|  |         id: names | ||||||
|  |         run: | | ||||||
|  |           REF="${{github.ref}}" | ||||||
|  |           COMMIT_HASH="$(git rev-parse HEAD)" | ||||||
|  |           SHA="$(git rev-parse --short HEAD)" | ||||||
|  |           COMMIT_MSG="${{github.event.head_commit.message}}" | ||||||
|  |           if [[ ${{ github.event_name }} == 'pull_request' ]]; then | ||||||
|  |             REF="${{github.head_ref}}" | ||||||
|  |             COMMIT_HASH="$(git log -1 --pretty=oneline | awk '{print $1}')" | ||||||
|  |             SHA="$(cut -c -8 <<< "$COMMIT_HASH")" | ||||||
|  |             COMMIT_MSG="$(git log -1 --pretty=format:"%s")" | ||||||
|  |             PULL_ID="${{github.event.pull_request.number}}" | ||||||
|  |             PULL_NAME="${{github.event.pull_request.title}}" | ||||||
|  |           fi | ||||||
|  |           BRANCH_NAME=${REF#refs/*/} | ||||||
|  |           SUFFIX=${BRANCH_NAME//\//_}-$(date +'%d%m%Y')-${SHA} | ||||||
|  |           if [[ "${{ github.ref }}" == "refs/tags/"* ]]; then | ||||||
|  |             SUFFIX=${BRANCH_NAME//\//_} | ||||||
|  |           fi | ||||||
|  |           echo "::set-output name=commit-hash::${COMMIT_HASH}" | ||||||
|  |           echo "::set-output name=commit-msg::${COMMIT_MSG}" | ||||||
|  |           echo "::set-output name=pull-id::${PULL_ID}" | ||||||
|  |           echo "::set-output name=pull-name::${PULL_NAME}" | ||||||
|  |           echo "::set-output name=branch-name::${BRANCH_NAME}" | ||||||
|  |           echo "::set-output name=suffix::${SUFFIX}" | ||||||
|  | 
 | ||||||
|  |       - name: 'Make artifacts directory' | ||||||
|  |         run: | | ||||||
|  |           rm -rf artifacts | ||||||
|  |           mkdir artifacts | ||||||
|  | 
 | ||||||
|  |       - name: 'Download build artifacts' | ||||||
|  |         if: ${{ !github.event.pull_request.head.repo.fork }} | ||||||
|  |         run: | | ||||||
|  |           echo "${{ secrets.RSYNC_DEPLOY_KEY }}" > deploy_key; | ||||||
|  |           chmod 600 ./deploy_key; | ||||||
|  |           rsync -avzP \ | ||||||
|  |               -e 'ssh -p ${{ secrets.RSYNC_DEPLOY_PORT }} -i ./deploy_key' \ | ||||||
|  |               ${{ secrets.RSYNC_DEPLOY_USER }}@${{ secrets.RSYNC_DEPLOY_HOST }}:"${{ secrets.RSYNC_DEPLOY_BASE_PATH }}${{steps.names.outputs.branch-name}}/" artifacts/; | ||||||
|  |           rm ./deploy_key; | ||||||
|  | 
 | ||||||
|  |       - name: 'Make .map file analyse' | ||||||
|  |         run: | | ||||||
|  |           cd artifacts/ | ||||||
|  |           /Applications/amap/Contents/MacOS/amap -f flipper-z-f7-firmware-${{steps.names.outputs.suffix}}.elf.map | ||||||
|  | 
 | ||||||
|  |       - name: 'Upload report to DB' | ||||||
|  |         run: | | ||||||
|  |           FBT_TOOLCHAIN_PATH=/opt source scripts/toolchain/fbtenv.sh | ||||||
|  |           get_size() | ||||||
|  |           { | ||||||
|  |             SECTION="$1"; | ||||||
|  |             arm-none-eabi-size \ | ||||||
|  |               -A artifacts/flipper-z-f7-firmware-${{steps.names.outputs.suffix}}.elf \ | ||||||
|  |               | grep "^$SECTION" | awk '{print $2}' | ||||||
|  |           } | ||||||
|  |           export COMMIT_HASH="${{steps.names.outputs.commit-hash}}" | ||||||
|  |           export COMMIT_MSG="${{steps.names.outputs.commit-msg}}" | ||||||
|  |           export BRANCH_NAME="${{steps.names.outputs.branch-name}}" | ||||||
|  |           export PULL_ID="${{steps.names.outputs.pull-id}}" | ||||||
|  |           export PULL_NAME="${{steps.names.outputs.pull-name}}" | ||||||
|  |           export BSS_SIZE="$(get_size ".bss")" | ||||||
|  |           export TEXT_SIZE="$(get_size ".text")" | ||||||
|  |           export RODATA_SIZE="$(get_size ".rodata")" | ||||||
|  |           export DATA_SIZE="$(get_size ".data")" | ||||||
|  |           export FREE_FLASH_SIZE="$(get_size ".free_flash")" | ||||||
|  |           python3 -m pip install mariadb | ||||||
|  |           python3 scripts/amap_mariadb_insert.py \ | ||||||
|  |             ${{ secrets.AMAP_MARIADB_USER }} \ | ||||||
|  |             ${{ secrets.AMAP_MARIADB_PASSWORD }} \ | ||||||
|  |             ${{ secrets.AMAP_MARIADB_HOST }} \ | ||||||
|  |             ${{ secrets.AMAP_MARIADB_PORT }} \ | ||||||
|  |             ${{ secrets.AMAP_MARIADB_DATABASE }} \ | ||||||
|  |             artifacts/flipper-z-f7-firmware-${{steps.names.outputs.suffix}}.elf.map.all | ||||||
							
								
								
									
										4
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							| @ -108,6 +108,10 @@ jobs: | |||||||
|           FBT_TOOLCHAIN_PATH=/opt ./fbt copro_dist |           FBT_TOOLCHAIN_PATH=/opt ./fbt copro_dist | ||||||
|           tar czpf artifacts/flipper-z-any-core2_firmware-${{steps.names.outputs.suffix}}.tgz -C assets core2_firmware |           tar czpf artifacts/flipper-z-any-core2_firmware-${{steps.names.outputs.suffix}}.tgz -C assets core2_firmware | ||||||
| 
 | 
 | ||||||
|  |       - name: 'Copy .map file' | ||||||
|  |         run: | | ||||||
|  |           cp build/f7-firmware-D/firmware.elf.map artifacts/flipper-z-f7-firmware-${{steps.names.outputs.suffix}}.elf.map | ||||||
|  | 
 | ||||||
|       - name: 'Upload artifacts to update server' |       - name: 'Upload artifacts to update server' | ||||||
|         if: ${{ !github.event.pull_request.head.repo.fork }} |         if: ${{ !github.event.pull_request.head.repo.fork }} | ||||||
|         run: | |         run: | | ||||||
|  | |||||||
							
								
								
									
										1
									
								
								.github/workflows/check_submodules.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/workflows/check_submodules.yml
									
									
									
									
										vendored
									
									
								
							| @ -25,6 +25,7 @@ jobs: | |||||||
|         uses: actions/checkout@v2 |         uses: actions/checkout@v2 | ||||||
|         with: |         with: | ||||||
|           fetch-depth: 0 |           fetch-depth: 0 | ||||||
|  |           ref: ${{ github.event.pull_request.head.sha }} | ||||||
| 
 | 
 | ||||||
|       - name: 'Check protobuf branch' |       - name: 'Check protobuf branch' | ||||||
|         run: | |         run: | | ||||||
|  | |||||||
							
								
								
									
										1
									
								
								.github/workflows/lint_c.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/workflows/lint_c.yml
									
									
									
									
										vendored
									
									
								
							| @ -28,6 +28,7 @@ jobs: | |||||||
|         uses: actions/checkout@v2 |         uses: actions/checkout@v2 | ||||||
|         with: |         with: | ||||||
|           fetch-depth: 0 |           fetch-depth: 0 | ||||||
|  |           ref: ${{ github.event.pull_request.head.sha }} | ||||||
| 
 | 
 | ||||||
|       - name: 'Check code formatting' |       - name: 'Check code formatting' | ||||||
|         id: syntax_check |         id: syntax_check | ||||||
|  | |||||||
							
								
								
									
										1
									
								
								.github/workflows/lint_python.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/workflows/lint_python.yml
									
									
									
									
										vendored
									
									
								
							| @ -25,6 +25,7 @@ jobs: | |||||||
|         uses: actions/checkout@v2 |         uses: actions/checkout@v2 | ||||||
|         with: |         with: | ||||||
|           fetch-depth: 0 |           fetch-depth: 0 | ||||||
|  |           ref: ${{ github.event.pull_request.head.sha }} | ||||||
| 
 | 
 | ||||||
|       - name: 'Check code formatting' |       - name: 'Check code formatting' | ||||||
|         run: SET_GH_OUTPUT=1 FBT_TOOLCHAIN_PATH=/opt ./fbt lint_py |         run: SET_GH_OUTPUT=1 FBT_TOOLCHAIN_PATH=/opt ./fbt lint_py | ||||||
|  | |||||||
							
								
								
									
										107
									
								
								.github/workflows/pvs_studio.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								.github/workflows/pvs_studio.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,107 @@ | |||||||
|  | name: 'Static C/C++ analysis with PVS-Studio' | ||||||
|  | 
 | ||||||
|  | on: | ||||||
|  |   push: | ||||||
|  |     branches: | ||||||
|  |       - dev | ||||||
|  |       - "release*" | ||||||
|  |     tags: | ||||||
|  |       - '*' | ||||||
|  |   pull_request: | ||||||
|  | 
 | ||||||
|  | env: | ||||||
|  |   TARGETS: f7 | ||||||
|  |   DEFAULT_TARGET: f7 | ||||||
|  | 
 | ||||||
|  | jobs: | ||||||
|  |   analyse_c_cpp: | ||||||
|  |     runs-on: [self-hosted, FlipperZeroShell] | ||||||
|  |     steps: | ||||||
|  |       - name: 'Decontaminate previous build leftovers' | ||||||
|  |         run: | | ||||||
|  |           if [ -d .git ] | ||||||
|  |           then | ||||||
|  |             git submodule status \ | ||||||
|  |               || git checkout `git rev-list --max-parents=0 HEAD | tail -n 1` | ||||||
|  |           fi | ||||||
|  | 
 | ||||||
|  |       - name: 'Checkout code' | ||||||
|  |         uses: actions/checkout@v2 | ||||||
|  |         with: | ||||||
|  |           fetch-depth: 0 | ||||||
|  |           ref: ${{ github.event.pull_request.head.sha }} | ||||||
|  | 
 | ||||||
|  |       - name: 'Generate suffix and folder name' | ||||||
|  |         id: names | ||||||
|  |         run: | | ||||||
|  |           REF=${{ github.ref }} | ||||||
|  |           if [[ ${{ github.event_name }} == 'pull_request' ]]; then | ||||||
|  |             REF=${{ github.head_ref }} | ||||||
|  |           fi | ||||||
|  |           BRANCH_OR_TAG=${REF#refs/*/} | ||||||
|  |           SHA=$(git rev-parse --short HEAD) | ||||||
|  | 
 | ||||||
|  |           if [[ "${{ github.ref }}" == "refs/tags/"* ]]; then | ||||||
|  |             SUFFIX=${BRANCH_OR_TAG//\//_} | ||||||
|  |           else | ||||||
|  |             SUFFIX=${BRANCH_OR_TAG//\//_}-$(date +'%d%m%Y')-${SHA} | ||||||
|  |           fi | ||||||
|  | 
 | ||||||
|  |           echo "WORKFLOW_BRANCH_OR_TAG=${BRANCH_OR_TAG}" >> $GITHUB_ENV | ||||||
|  |           echo "DIST_SUFFIX=${SUFFIX}" >> $GITHUB_ENV | ||||||
|  |           echo "::set-output name=artifacts-path::${BRANCH_OR_TAG}" | ||||||
|  |           echo "::set-output name=suffix::${SUFFIX}" | ||||||
|  |           echo "::set-output name=short-hash::${SHA}" | ||||||
|  |           echo "::set-output name=default-target::${DEFAULT_TARGET}" | ||||||
|  | 
 | ||||||
|  |       - name: 'Make reports directory' | ||||||
|  |         run: | | ||||||
|  |           rm -rf reports/ | ||||||
|  |           mkdir reports | ||||||
|  | 
 | ||||||
|  |       - name: 'Generate compile_comands.json' | ||||||
|  |         run: | | ||||||
|  |           FBT_TOOLCHAIN_PATH=/opt ./fbt COMPACT=1 version_json proto_ver icons firmware_cdb dolphin_internal dolphin_blocking | ||||||
|  | 
 | ||||||
|  |       - name: 'Static code analysis' | ||||||
|  |         run: | | ||||||
|  |           FBT_TOOLCHAIN_PATH=/opt source scripts/toolchain/fbtenv.sh | ||||||
|  |           pvs-studio-analyzer credentials ${{ secrets.PVS_STUDIO_CREDENTIALS }} | ||||||
|  |           pvs-studio-analyzer analyze \ | ||||||
|  |               @.pvsoptions \ | ||||||
|  |               -j$(grep -c processor /proc/cpuinfo) \ | ||||||
|  |               -f build/f7-firmware-DC/compile_commands.json \ | ||||||
|  |               -o PVS-Studio.log | ||||||
|  | 
 | ||||||
|  |       - name: 'Convert PVS-Studio output to html page' | ||||||
|  |         run: plog-converter -a GA:1,2,3 -t fullhtml PVS-Studio.log -o reports/${{steps.names.outputs.default-target}}-${{steps.names.outputs.suffix}} | ||||||
|  | 
 | ||||||
|  |       - name: 'Upload artifacts to update server' | ||||||
|  |         if: ${{ !github.event.pull_request.head.repo.fork }} | ||||||
|  |         run: | | ||||||
|  |           echo "${{ secrets.RSYNC_DEPLOY_KEY }}" > deploy_key; | ||||||
|  |           chmod 600 ./deploy_key; | ||||||
|  |           rsync -avrzP --mkpath \ | ||||||
|  |               -e 'ssh -p ${{ secrets.RSYNC_DEPLOY_PORT }} -i ./deploy_key' \ | ||||||
|  |               reports/ ${{ secrets.RSYNC_DEPLOY_USER }}@${{ secrets.RSYNC_DEPLOY_HOST }}:/home/data/firmware-pvs-studio-report/"${{steps.names.outputs.artifacts-path}}/"; | ||||||
|  |           rm ./deploy_key; | ||||||
|  | 
 | ||||||
|  |       - name: 'Find Previous Comment' | ||||||
|  |         if: ${{ !github.event.pull_request.head.repo.fork && github.event.pull_request }} | ||||||
|  |         uses: peter-evans/find-comment@v1 | ||||||
|  |         id: fc | ||||||
|  |         with: | ||||||
|  |           issue-number: ${{ github.event.pull_request.number }} | ||||||
|  |           comment-author: 'github-actions[bot]' | ||||||
|  |           body-includes: 'PVS-Studio report for commit' | ||||||
|  | 
 | ||||||
|  |       - name: 'Create or update comment' | ||||||
|  |         if: ${{ !github.event.pull_request.head.repo.fork && github.event.pull_request}} | ||||||
|  |         uses: peter-evans/create-or-update-comment@v1 | ||||||
|  |         with: | ||||||
|  |           comment-id: ${{ steps.fc.outputs.comment-id }} | ||||||
|  |           issue-number: ${{ github.event.pull_request.number }} | ||||||
|  |           body: | | ||||||
|  |             **PVS-Studio report for commit `${{steps.names.outputs.short-hash}}`:** | ||||||
|  |             - [Report](https://update.flipperzero.one/builds/firmware-pvs-studio-report/${{steps.names.outputs.artifacts-path}}/${{steps.names.outputs.default-target}}-${{steps.names.outputs.suffix}}/index.html) | ||||||
|  |           edit-mode: replace | ||||||
| @ -1 +1 @@ | |||||||
| --rules-config .pvsconfig -e lib/fatfs -e lib/fnv1a-hash -e lib/FreeRTOS-Kernel -e lib/heatshrink -e lib/libusb_stm32 -e lib/littlefs -e lib/mbedtls -e lib/micro-ecc -e lib/microtar -e lib/mlib -e lib/qrcode -e lib/ST25RFAL002 -e lib/STM32CubeWB -e lib/u8g2 -e toolchain/ | --rules-config .pvsconfig -e lib/fatfs -e lib/fnv1a-hash -e lib/FreeRTOS-Kernel -e lib/heatshrink -e lib/libusb_stm32 -e lib/littlefs -e lib/mbedtls -e lib/micro-ecc -e lib/microtar -e lib/mlib -e lib/qrcode -e lib/ST25RFAL002 -e lib/STM32CubeWB -e lib/u8g2 -e */arm-none-eabi/* | ||||||
|  | |||||||
							
								
								
									
										24
									
								
								ReadMe.md
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								ReadMe.md
									
									
									
									
									
								
							| @ -61,29 +61,6 @@ One liner: `./fbt firmware_flash` | |||||||
| 
 | 
 | ||||||
| 3. Run `dfu-util -D full.dfu -a 0` | 3. Run `dfu-util -D full.dfu -a 0` | ||||||
| 
 | 
 | ||||||
| # Build with Docker |  | ||||||
| 
 |  | ||||||
| ## Prerequisites |  | ||||||
| 
 |  | ||||||
| 1. Install [Docker Engine and Docker Compose](https://www.docker.com/get-started) |  | ||||||
| 2. Prepare the container: |  | ||||||
| 
 |  | ||||||
|  ```sh |  | ||||||
|  docker-compose up -d |  | ||||||
|  ``` |  | ||||||
| 
 |  | ||||||
| ## Compile everything |  | ||||||
| 
 |  | ||||||
| ```sh |  | ||||||
| docker-compose exec dev ./fbt |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| Check `dist/` for build outputs. |  | ||||||
| 
 |  | ||||||
| Use **`flipper-z-{target}-full-{suffix}.dfu`** to flash your device. |  | ||||||
| 
 |  | ||||||
| If compilation fails, make sure all submodules are all initialized. Either clone with `--recursive` or use `git submodule update --init --recursive`. |  | ||||||
| 
 |  | ||||||
| # Build on Linux/macOS | # Build on Linux/macOS | ||||||
| 
 | 
 | ||||||
| Check out `documentation/fbt.md` for details on building and flashing firmware.  | Check out `documentation/fbt.md` for details on building and flashing firmware.  | ||||||
| @ -157,7 +134,6 @@ Connect your device via ST-Link and run: | |||||||
| - `assets`          - Assets used by applications and services | - `assets`          - Assets used by applications and services | ||||||
| - `furi`            - Furi Core: os level primitives and helpers | - `furi`            - Furi Core: os level primitives and helpers | ||||||
| - `debug`           - Debug tool: GDB-plugins, SVD-file and etc | - `debug`           - Debug tool: GDB-plugins, SVD-file and etc | ||||||
| - `docker`          - Docker image sources (used for firmware build automation) |  | ||||||
| - `documentation`   - Documentation generation system configs and input files | - `documentation`   - Documentation generation system configs and input files | ||||||
| - `firmware`        - Firmware source code | - `firmware`        - Firmware source code | ||||||
| - `lib`             - Our and 3rd party libraries, drivers and etc... | - `lib`             - Our and 3rd party libraries, drivers and etc... | ||||||
|  | |||||||
| @ -446,15 +446,15 @@ const char* subghz_setting_get_preset_name(SubGhzSetting* instance, size_t idx) | |||||||
| int subghz_setting_get_inx_preset_by_name(SubGhzSetting* instance, const char* preset_name) { | int subghz_setting_get_inx_preset_by_name(SubGhzSetting* instance, const char* preset_name) { | ||||||
|     furi_assert(instance); |     furi_assert(instance); | ||||||
|     size_t idx = 0; |     size_t idx = 0; | ||||||
|      for |     for | ||||||
|          M_EACH(item, instance->preset->data, SubGhzSettingCustomPresetItemArray_t) { |         M_EACH(item, instance->preset->data, SubGhzSettingCustomPresetItemArray_t) { | ||||||
|              if(strcmp(string_get_cstr(item->custom_preset_name), preset_name) == 0) { |             if(strcmp(string_get_cstr(item->custom_preset_name), preset_name) == 0) { | ||||||
|                  return idx; |                 return idx; | ||||||
|              } |             } | ||||||
|              idx++; |             idx++; | ||||||
|          } |         } | ||||||
|      furi_crash("SubGhz: No name preset."); |     furi_crash("SubGhz: No name preset."); | ||||||
|      return -1; |     return -1; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool subghz_setting_load_custom_preset( | bool subghz_setting_load_custom_preset( | ||||||
|  | |||||||
| @ -9,12 +9,6 @@ | |||||||
| ./fbt icons proto dolphin_internal dolphin_blocking dolphin_ext resources | ./fbt icons proto dolphin_internal dolphin_blocking dolphin_ext resources | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| # Compiling with Docker-Compose |  | ||||||
| 
 |  | ||||||
| ```bash |  | ||||||
| docker-compose exec dev ./fbt icons proto dolphin_internal dolphin_blocking dolphin_ext resources |  | ||||||
| ``` |  | ||||||
| 
 |  | ||||||
| # Asset naming rules | # Asset naming rules | ||||||
| 
 | 
 | ||||||
| ## Images and Animations | ## Images and Animations | ||||||
|  | |||||||
| @ -1,12 +0,0 @@ | |||||||
| version: '3' |  | ||||||
| services: |  | ||||||
|   dev: |  | ||||||
|     image: flipperdevices/flipperzero-toolchain |  | ||||||
|     network_mode: host |  | ||||||
|     privileged: true |  | ||||||
|     tty: true |  | ||||||
|     stdin_open: true |  | ||||||
|     volumes: |  | ||||||
|       - .:/project |  | ||||||
|       - /dev/bus/usb:/dev/bus/usb |  | ||||||
|     working_dir: '/project' |  | ||||||
| @ -1,41 +0,0 @@ | |||||||
| FROM ubuntu:hirsute |  | ||||||
| 
 |  | ||||||
| RUN apt-get update \ |  | ||||||
|     && DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \ |  | ||||||
|         ca-certificates \ |  | ||||||
|         build-essential \ |  | ||||||
|         python3 \ |  | ||||||
|         git \ |  | ||||||
|         clang-format-12 \ |  | ||||||
|         dfu-util \ |  | ||||||
|         openocd \ |  | ||||||
|         libncurses5 \ |  | ||||||
|         python-setuptools \ |  | ||||||
|         libpython2.7-dev \ |  | ||||||
|         libxml2-dev \ |  | ||||||
|         libxslt1-dev \ |  | ||||||
|         zlib1g-dev \ |  | ||||||
|         wget \ |  | ||||||
|         python3-protobuf \ |  | ||||||
|         protobuf-compiler \ |  | ||||||
|         python3-pip \ |  | ||||||
|         libpython3-dev \ |  | ||||||
|         ccache \ |  | ||||||
|     && apt-get clean \ |  | ||||||
|     && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* |  | ||||||
| 
 |  | ||||||
| RUN wget --progress=dot:giga "https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.07/gcc-arm-none-eabi-10.3-2021.07-$(uname -m)-linux.tar.bz2" && \ |  | ||||||
|     tar xjf gcc-arm-none-eabi-10.3-2021.07-$(uname -m)-linux.tar.bz2 && \ |  | ||||||
|     rm gcc-arm-none-eabi-10.3-2021.07-$(uname -m)-linux.tar.bz2 && \ |  | ||||||
|     cd gcc-arm-none-eabi-10.3-2021.07/bin/ && \ |  | ||||||
|     rm -rf ../share && \ |  | ||||||
|     for file in * ; do ln -s "${PWD}/${file}" "/usr/bin/${file}" ; done && \ |  | ||||||
|     cd / && arm-none-eabi-gcc -v && arm-none-eabi-gdb -v |  | ||||||
| 
 |  | ||||||
| RUN pip3 install heatshrink2==0.11.0 Pillow==9.1.1 |  | ||||||
| 
 |  | ||||||
| RUN ln -s `which clang-format-12` /usr/local/bin/clang-format |  | ||||||
| 
 |  | ||||||
| COPY entrypoint.sh / |  | ||||||
| 
 |  | ||||||
| ENTRYPOINT ["/entrypoint.sh"] |  | ||||||
| @ -1,9 +0,0 @@ | |||||||
| #!/bin/bash |  | ||||||
| 
 |  | ||||||
| if [ -z "$1" ]; then |  | ||||||
|     bash |  | ||||||
| else |  | ||||||
|     echo "Running $1" |  | ||||||
|     set -ex |  | ||||||
|     bash -c "$1" |  | ||||||
| fi |  | ||||||
							
								
								
									
										136
									
								
								scripts/amap_mariadb_insert.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										136
									
								
								scripts/amap_mariadb_insert.py
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,136 @@ | |||||||
|  | #!/usr/bin/env python3 | ||||||
|  | 
 | ||||||
|  | from datetime import datetime | ||||||
|  | import argparse | ||||||
|  | import mariadb | ||||||
|  | import sys | ||||||
|  | import os | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def parseArgs(): | ||||||
|  |     parser = argparse.ArgumentParser() | ||||||
|  |     parser.add_argument("db_user", help="MariaDB user") | ||||||
|  |     parser.add_argument("db_pass", help="MariaDB password") | ||||||
|  |     parser.add_argument("db_host", help="MariaDB hostname") | ||||||
|  |     parser.add_argument("db_port", type=int, help="MariaDB port") | ||||||
|  |     parser.add_argument("db_name", help="MariaDB database") | ||||||
|  |     parser.add_argument("report_file", help="Report file(.map.all)") | ||||||
|  |     args = parser.parse_args() | ||||||
|  |     return args | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def mariadbConnect(args): | ||||||
|  |     try: | ||||||
|  |         conn = mariadb.connect( | ||||||
|  |             user=args.db_user, | ||||||
|  |             password=args.db_pass, | ||||||
|  |             host=args.db_host, | ||||||
|  |             port=args.db_port, | ||||||
|  |             database=args.db_name, | ||||||
|  |         ) | ||||||
|  |     except mariadb.Error as e: | ||||||
|  |         print(f"Error connecting to MariaDB: {e}") | ||||||
|  |         sys.exit(1) | ||||||
|  |     return conn | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def parseEnv(): | ||||||
|  |     outArr = [] | ||||||
|  |     outArr.append(datetime.now().strftime("%Y-%m-%d %H:%M:%S")) | ||||||
|  |     outArr.append(os.getenv("COMMIT_HASH", default=None)) | ||||||
|  |     outArr.append(os.getenv("COMMIT_MSG", default=None)) | ||||||
|  |     outArr.append(os.getenv("BRANCH_NAME", default=None)) | ||||||
|  |     outArr.append(os.getenv("BSS_SIZE", default=None)) | ||||||
|  |     outArr.append(os.getenv("TEXT_SIZE", default=None)) | ||||||
|  |     outArr.append(os.getenv("RODATA_SIZE", default=None)) | ||||||
|  |     outArr.append(os.getenv("DATA_SIZE", default=None)) | ||||||
|  |     outArr.append(os.getenv("FREE_FLASH_SIZE", default=None)) | ||||||
|  |     outArr.append(os.getenv("PULL_ID", default=None)) | ||||||
|  |     outArr.append(os.getenv("PULL_NAME", default=None)) | ||||||
|  |     return outArr | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def createTables(cur, conn): | ||||||
|  |     headerTable = "CREATE TABLE IF NOT EXISTS `header` ( \ | ||||||
|  |             `id` int(10) unsigned NOT NULL AUTO_INCREMENT, \ | ||||||
|  |             `datetime` datetime NOT NULL, \ | ||||||
|  |             `commit` varchar(40) NOT NULL, \ | ||||||
|  |             `commit_msg` text NOT NULL, \ | ||||||
|  |             `branch_name` text NOT NULL, \ | ||||||
|  |             `bss_size` int(10) unsigned NOT NULL, \ | ||||||
|  |             `text_size` int(10) unsigned NOT NULL, \ | ||||||
|  |             `rodata_size` int(10) unsigned NOT NULL, \ | ||||||
|  |             `data_size` int(10) unsigned NOT NULL, \ | ||||||
|  |             `free_flash_size` int(10) unsigned NOT NULL, \ | ||||||
|  |             `pullrequest_id` int(10) unsigned DEFAULT NULL, \ | ||||||
|  |             `pullrequest_name` text DEFAULT NULL, \ | ||||||
|  |             PRIMARY KEY (`id`), \ | ||||||
|  |             KEY `header_id_index` (`id`) )" | ||||||
|  |     dataTable = "CREATE TABLE IF NOT EXISTS `data` ( \ | ||||||
|  |             `header_id` int(10) unsigned NOT NULL, \ | ||||||
|  |             `id` int(10) unsigned NOT NULL AUTO_INCREMENT, \ | ||||||
|  |             `section` text NOT NULL, \ | ||||||
|  |             `address` text NOT NULL, \ | ||||||
|  |             `size` int(10) unsigned NOT NULL, \ | ||||||
|  |             `name` text NOT NULL, \ | ||||||
|  |             `lib` text NOT NULL, \ | ||||||
|  |             `obj_name` text NOT NULL, \ | ||||||
|  |             PRIMARY KEY (`id`), \ | ||||||
|  |             KEY `data_id_index` (`id`), \ | ||||||
|  |             KEY `data_header_id_index` (`header_id`), \ | ||||||
|  |             CONSTRAINT `data_header_id_foreign` FOREIGN KEY (`header_id`) REFERENCES `header` (`id`) )" | ||||||
|  |     cur.execute(headerTable) | ||||||
|  |     cur.execute(dataTable) | ||||||
|  |     conn.commit() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def insertHeader(data, cur, conn): | ||||||
|  |     query = "INSERT INTO `header` ( \ | ||||||
|  |             datetime, commit, commit_msg, branch_name, bss_size, text_size, \ | ||||||
|  |             rodata_size, data_size, free_flash_size, pullrequest_id, pullrequest_name) \ | ||||||
|  |             VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" | ||||||
|  |     cur.execute(query, data) | ||||||
|  |     conn.commit() | ||||||
|  |     return cur.lastrowid | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def parseFile(fileObj, headerID): | ||||||
|  |     arr = [] | ||||||
|  |     fileLines = fileObj.readlines() | ||||||
|  |     for line in fileLines: | ||||||
|  |         lineArr = [] | ||||||
|  |         tempLineArr = line.split("\t") | ||||||
|  |         lineArr.append(headerID) | ||||||
|  |         lineArr.append(tempLineArr[0])  # section | ||||||
|  |         lineArr.append(int(tempLineArr[2], 16))  # address hex | ||||||
|  |         lineArr.append(int(tempLineArr[3]))  # size | ||||||
|  |         lineArr.append(tempLineArr[4])  # name | ||||||
|  |         lineArr.append(tempLineArr[5])  # lib | ||||||
|  |         lineArr.append(tempLineArr[6])  # obj_name | ||||||
|  |         arr.append(tuple(lineArr)) | ||||||
|  |     return arr | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def insertData(data, cur, conn): | ||||||
|  |     query = "INSERT INTO `data` ( \ | ||||||
|  |             header_id, section, address, size, \ | ||||||
|  |             name, lib, obj_name) \ | ||||||
|  |             VALUES (?, ?, ?, ?, ? ,?, ?)" | ||||||
|  |     cur.executemany(query, data) | ||||||
|  |     conn.commit() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def main(): | ||||||
|  |     args = parseArgs() | ||||||
|  |     dbConn = mariadbConnect(args) | ||||||
|  |     reportFile = open(args.report_file) | ||||||
|  |     dbCurs = dbConn.cursor() | ||||||
|  |     createTables(dbCurs, dbConn) | ||||||
|  |     headerID = insertHeader(parseEnv(), dbCurs, dbConn) | ||||||
|  |     insertData(parseFile(reportFile, headerID), dbCurs, dbConn) | ||||||
|  |     reportFile.close() | ||||||
|  |     dbCurs.close() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | if __name__ == "__main__": | ||||||
|  |     main() | ||||||
| @ -13,7 +13,7 @@ if not [%FBT_NOENV%] == [] ( | |||||||
|     exit /b 0 |     exit /b 0 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| set "FLIPPER_TOOLCHAIN_VERSION=8" | set "FLIPPER_TOOLCHAIN_VERSION=9" | ||||||
| set "FBT_TOOLCHAIN_ROOT=%FBT_ROOT%\toolchain\i686-windows" | set "FBT_TOOLCHAIN_ROOT=%FBT_ROOT%\toolchain\i686-windows" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -5,7 +5,7 @@ | |||||||
| # public variables | # public variables | ||||||
| DEFAULT_SCRIPT_PATH="$(pwd -P)"; | DEFAULT_SCRIPT_PATH="$(pwd -P)"; | ||||||
| SCRIPT_PATH="${SCRIPT_PATH:-$DEFAULT_SCRIPT_PATH}"; | SCRIPT_PATH="${SCRIPT_PATH:-$DEFAULT_SCRIPT_PATH}"; | ||||||
| FBT_TOOLCHAIN_VERSION="${FBT_TOOLCHAIN_VERSION:-"8"}"; | FBT_TOOLCHAIN_VERSION="${FBT_TOOLCHAIN_VERSION:-"9"}"; | ||||||
| FBT_TOOLCHAIN_PATH="${FBT_TOOLCHAIN_PATH:-$SCRIPT_PATH}"; | FBT_TOOLCHAIN_PATH="${FBT_TOOLCHAIN_PATH:-$SCRIPT_PATH}"; | ||||||
| 
 | 
 | ||||||
| fbtenv_check_sourced() | fbtenv_check_sourced() | ||||||
| @ -13,12 +13,9 @@ fbtenv_check_sourced() | |||||||
|     case "${ZSH_EVAL_CONTEXT:-""}" in *:file:*) |     case "${ZSH_EVAL_CONTEXT:-""}" in *:file:*) | ||||||
|         return 0;; |         return 0;; | ||||||
|     esac |     esac | ||||||
|     case ${0##*/} in dash|-dash|bash|-bash|ksh|-ksh|sh|-sh) |     case ${0##*/} in dash|-dash|bash|-bash|ksh|-ksh|sh|-sh|*.sh|fbt) | ||||||
|         return 0;; |         return 0;; | ||||||
|     esac |     esac | ||||||
|     if [ "$(basename $0)" = "fbt" ]; then |  | ||||||
|         return 0; |  | ||||||
|     fi |  | ||||||
|     echo "Running this script manually is wrong, please source it"; |     echo "Running this script manually is wrong, please source it"; | ||||||
|     echo "Example:"; |     echo "Example:"; | ||||||
|     printf "\tsource scripts/toolchain/fbtenv.sh\n"; |     printf "\tsource scripts/toolchain/fbtenv.sh\n"; | ||||||
| @ -202,6 +199,7 @@ fbtenv_main() | |||||||
|     fbtenv_check_script_path || return 1; |     fbtenv_check_script_path || return 1; | ||||||
|     fbtenv_get_kernel_type || return 1; |     fbtenv_get_kernel_type || return 1; | ||||||
|     fbtenv_check_download_toolchain || return 1; |     fbtenv_check_download_toolchain || return 1; | ||||||
|  |     PS1="[FBT]$PS1"; | ||||||
|     PATH="$TOOLCHAIN_ARCH_DIR/python/bin:$PATH"; |     PATH="$TOOLCHAIN_ARCH_DIR/python/bin:$PATH"; | ||||||
|     PATH="$TOOLCHAIN_ARCH_DIR/bin:$PATH"; |     PATH="$TOOLCHAIN_ARCH_DIR/bin:$PATH"; | ||||||
|     PATH="$TOOLCHAIN_ARCH_DIR/protobuf/bin:$PATH"; |     PATH="$TOOLCHAIN_ARCH_DIR/protobuf/bin:$PATH"; | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Max Andreev
						Max Andreev