# STM8S003F3P6TR 固件第一阶段构建文件。
# 本阶段只验证工程结构和模块接口，硬件寄存器驱动将在后续阶段逐步接入。

PROJECT := mesh_relay
BUILD_DIR := build
SRC_DIR := src
INC_DIR := include

CC := sdcc
OBJCOPY := packihx
MAKEBIN := makebin

CFLAGS := -mstm8 --std-c99 --opt-code-size -I$(INC_DIR)
# Bootloader占用0x8000~0x84FF，主程序必须从0x8500开始链接。
LDFLAGS := -mstm8 --out-fmt-ihx --code-loc 0x8500

SOURCES := $(shell find $(SRC_DIR) -name '*.c' -print)
# 当前验证固件暂时关闭 OTA：外部 SPI Flash 驱动和 OTA 状态机源码保留在仓库中，
# 但不参与本次主程序链接，避免 SDCC 将未使用的 OTA 代码整体放入固件。
SOURCES := $(filter-out $(SRC_DIR)/protocol/ota_manager.c \
                     $(SRC_DIR)/drivers/w25q64_app.c,$(SOURCES))
OBJECTS := $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.rel,$(SOURCES))
IHX := $(BUILD_DIR)/$(PROJECT).ihx
HEX := $(BUILD_DIR)/$(PROJECT).hex
BIN := $(BUILD_DIR)/$(PROJECT).bin

.PHONY: all full clean size

all: $(HEX) $(BIN)

# 整片初次烧录目标：构建Bootloader和主程序后合并绝对地址HEX。
# OTA仍使用主程序单独生成的BIN，不使用这个完整镜像。
full: bootloader $(BUILD_DIR)/stm8_mesh_full.hex $(BUILD_DIR)/stm8_mesh_full.bin

bootloader:
	$(MAKE) -C STM8_Bootloader

$(BUILD_DIR)/stm8_mesh_full.hex: STM8_Bootloader/build/stm8_bootloader.hex $(HEX) tools/merge_intel_hex.py
	@mkdir -p $(dir $@)
	python3 tools/merge_intel_hex.py $@ $< $(HEX)

$(BUILD_DIR)/stm8_mesh_full.bin: $(BUILD_DIR)/stm8_mesh_full.hex
	$(MAKEBIN) -p -s 0x10000 -o 0x8000 $< $@

$(HEX): $(IHX)
	@mkdir -p $(dir $@)
	$(OBJCOPY) $< > $@

# 生成OTA使用的裸二进制：跳过0x0000~0x84FF，只保留0x8500之后的应用程序数据。
# -s 0x10000确保按STM8完整地址空间解析IHX；-o 0x8500去除Bootloader区域；
# -p再截断到应用程序最后一个实际占用地址，避免生成无意义的尾部空洞。
$(BIN): $(IHX)
	@mkdir -p $(dir $@)
	$(MAKEBIN) -p -s 0x10000 -o 0x8500 $< $@

$(IHX): $(OBJECTS)
	@mkdir -p $(dir $@)
	$(CC) $(LDFLAGS) -o $@ $(OBJECTS)

$(BUILD_DIR)/%.rel: $(SRC_DIR)/%.c
	@mkdir -p $(dir $@)
	$(CC) $(CFLAGS) -c $< -o $@

size: $(IHX)
	@ls -lh $(IHX) $(HEX) $(BIN)

clean:
	rm -rf $(BUILD_DIR)
