# Makefile using arduino-cli

ARDUINO_HOME=$(HOME)/.arduino15
ESP32_VER=2.0.3
ESP32_TOOLS=$(ARDUINO_HOME)/packages/esp32/hardware/esp32/$(ESP32_VER)/tools
ESPTOOL=$(ESP32_TOOLS)/esptool.py

ESP32_FQBN=esp32:esp32:$(CHIP)
SERDEV := $(wildcard /dev/serial/by-id/usb-Espressif_*)
ARDUINO_CLI=../bin/arduino-cli
APP_PARTITION_SIZE=2031616 # 给程序分配0x1F0000空间 目前 0x165560

# ensure python tools are in $PATH
export PATH := $(HOME)/.local/bin:$(PATH)

.PHONY: headers
# 不管你的文件夹里有没有叫 headers 的文件 / 文件夹，只要你在终端敲 make headers，
# 电脑就必须执行你给 headers 定好的那些命令（比如复制头文件、生成文件），不会找任何借口偷懒。 
# 没有 .PHONY 时：电脑会先看有没有叫 headers 的文件，如果有，就觉得 “这事儿已经做完了”，直接说 “不用弄了”，不执行你写的命令
# 加了 .PHONY: headers 后：电脑不管有没有这个文件，都当 “这事儿还没做”，乖乖执行你安排的命令，绝不偷懒

# all: headers esp32s3dev esp32c3dev bluemark-db200 bluemark-db110 jw-tbd mro-rid jwrid-esp32s3 bluemark-db202 bluemark-db210 bluemark-db203 holybro-RemoteID CUAV-RID VKUAV-RID
# 电脑会按你写的顺序来 —— 先跑 headers 的命令，跑完再跑 esp32s3dev，以此类推，前面的没做完，后面的不会开始
# 如果你不想全做，只想做其中一个（比如只编译 esp32c3dev），也可以敲 make esp32c3dev，电脑只会执行这一个指令
all: headers CUAV-RID
# esp32s3dev
esp32s3dev: CHIP=esp32s3
esp32s3dev: ArduRemoteID-ESP32S3_DEV.bin

esp32c3dev: CHIP=esp32c3
esp32c3dev: ArduRemoteID-ESP32C3_DEV.bin

bluemark-db200: CHIP=esp32c3
bluemark-db200: ArduRemoteID-BLUEMARK_DB200.bin

bluemark-db110: CHIP=esp32c3
bluemark-db110: ArduRemoteID-BLUEMARK_DB110.bin

jw-tbd: CHIP=esp32s3
jw-tbd: ArduRemoteID-JW_TBD.bin

jwrid-esp32s3: CHIP=esp32s3
jwrid-esp32s3: ArduRemoteID-JWRID_ESP32S3.bin

mro-rid: CHIP=esp32c3
mro-rid: ArduRemoteID-MRO_RID.bin

bluemark-db202: CHIP=esp32c3
bluemark-db202: ArduRemoteID-BLUEMARK_DB202.bin

bluemark-db210: CHIP=esp32s3
bluemark-db210: ArduRemoteID-BLUEMARK_DB210.bin

bluemark-db203: CHIP=esp32c3
bluemark-db203: ArduRemoteID-BLUEMARK_DB203.bin

holybro-RemoteID: CHIP=esp32c3
holybro-RemoteID: ArduRemoteID-Holybro_RemoteID.bin

CUAV-RID: CHIP=esp32s3
CUAV-RID: ArduRemoteID-CUAV_RID.bin

VKUAV-RID: CHIP=esp32s3
VKUAV-RID: ArduRemoteID-VKUAV_RID.bin
# 让 Arduino 命令行工具（arduino-cli）更新硬件库的 “索引列表”
# 安装指定版本（$(ESP32_VER) 是提前定义的版本号，比如 2.0.14）的 ESP32 核心开发包
# 自动安装 “Adafruit NeoPixel” 这个第三方库（用来控制灯带的常用库）
setup:
	@echo "Installing ESP32 support"
	$(ARDUINO_CLI) core update-index --config-file arduino-cli.yaml
	$(ARDUINO_CLI) core install esp32:esp32@$(ESP32_VER)
	$(ARDUINO_CLI) lib install "Adafruit NeoPixel"
# 电脑会自动去执行上级目录下 scripts 文件夹里的 git-version.sh 这个脚本文件 
gitversion:
	@../scripts/git-version.sh
# 根据刚获取的 Git 版本信息，重新生成项目的头文件 具体
# 主要做两件事：生成 MAVLink2 和 DroneCAN 通信协议的头文件（让 ESP32 能和无人机 / 飞控通信）
# 再更新 RemoteIDModule 模块的 Git 版本信息，全程自动化不用手动改代码
headers: gitversion
	@cd .. && scripts/regen_headers.sh

romfs_files.h: web/*.html web/js/*.js web/styles/*css web/images/*.jpg web/images/*.png public_keys/*.dat
	@../scripts/make_romfs.py romfs_files.h web/*.html web/js/*.js web/styles/*css web/images/*.jpg web/images/*.png public_keys/*.dat

ArduRemoteID-%.bin: gitversion *.cpp *.ino *.h romfs_files.h
	@echo "Building $* on $(CHIP)"
	@BUILD_FLAGS="-DBOARD_$*"
	@rm -rf build build-$*
	@$(ARDUINO_CLI) compile -b esp32:esp32:$(CHIP) --export-binaries --build-property build.extra_flags="-DBOARD_$* -DESP32" --build-property upload.maximum_size=$(APP_PARTITION_SIZE)
	@cp build/esp32.esp32.$(CHIP)/RemoteIDModule.ino.bin ArduRemoteID_$*_OTA.bin
	@echo "Merging $*"
	@python3 $(ESPTOOL) --chip $(CHIP) merge_bin -o ArduRemoteID-$*.bin --flash_size 4MB 0x0 build/esp32.esp32.$(CHIP)/RemoteIDModule.ino.bootloader.bin 0x8000 build/esp32.esp32.$(CHIP)/RemoteIDModule.ino.partitions.bin 0xe000 $(ESP32_TOOLS)/partitions/boot_app0.bin 0x10000 build/esp32.esp32.$(CHIP)/RemoteIDModule.ino.bin
	@mv build build-$*

boards:
	@echo "Listing boards"
	@$(ARDUINO_CLI) board list

checkdev:
	@[ "${SERDEV}" ] && echo "Using device $(SERDEV)" || ( echo "Failed to find serial device"; exit 1 )

upload-%: checkdev
	@echo "Flashing ArduRemoteID-$*.bin"
	@python3 $(ESPTOOL) --port $(SERDEV) write_flash 0x0 ArduRemoteID-$*.bin

uploadota-%: checkdev
	@echo "Flashing ArduRemoteID-$*_OTA.bin"
	@python3 $(ESPTOOL) --port $(SERDEV) write_flash 0x10000 ArduRemoteID_$*_OTA.bin

upload: upload-ESP32S3_DEV

submodule_update:
	git submodule update --recursive --force --init

clean:
	rm -rf ..esp32* *.bin build* romfs_files.h

