#!/bin/sh
set -eu

ROOT=$(CDPATH= cd -- "$(dirname -- "$0")/../.." && pwd)
TARGET="$ROOT/固件/lamp_target"
OUT=${ARM_OUT:-"$TARGET/build"}
CC=${ARM_GCC:-arm-none-eabi-gcc}
OBJCOPY=${ARM_OBJCOPY:-arm-none-eabi-objcopy}
SIZE=${ARM_SIZE:-arm-none-eabi-size}

mkdir -p "$OUT"
FLAGS="-mcpu=cortex-m0plus -mthumb -mfloat-abi=soft -DSTM32G030xx -std=c11 -Os -g3 -ffreestanding -fno-builtin -fno-common -Wall -Wextra -Werror"
INCLUDES="-I$TARGET/include -I$TARGET/CMSIS/Core/Include -I$TARGET/Device/Include -I$ROOT/固件/lamp_control"

# shellcheck disable=SC2086
$CC $FLAGS $INCLUDES -c "$TARGET/Device/Source/Templates/system_stm32g0xx.c" -o "$OUT/system_stm32g0xx.o"
# shellcheck disable=SC2086
$CC $FLAGS $INCLUDES -c "$TARGET/src/runtime.c" -o "$OUT/runtime.o"
# shellcheck disable=SC2086
$CC $FLAGS $INCLUDES -c "$TARGET/src/main.c" -o "$OUT/main.o"
$CC $FLAGS $INCLUDES -c "$TARGET/src/lamp_board_inputs.c" -o "$OUT/lamp_board_inputs.o"
$CC $FLAGS $INCLUDES -c "$TARGET/src/lamp_ir_filter.c" -o "$OUT/lamp_ir_filter.o"
$CC $FLAGS $INCLUDES -c "$TARGET/src/lamp_ntc.c" -o "$OUT/lamp_ntc.o"
$CC $FLAGS $INCLUDES -c "$TARGET/src/lamp_measurement.c" -o "$OUT/lamp_measurement.o"
 $CC $FLAGS $INCLUDES -c "$TARGET/src/lamp_i2c_read.c" -o "$OUT/lamp_i2c_read.o"
 $CC $FLAGS $INCLUDES -c "$TARGET/src/lamp_i2c_pins.c" -o "$OUT/lamp_i2c_pins.o"
$CC $FLAGS $INCLUDES -c "$TARGET/src/lamp_adc.c" -o "$OUT/lamp_adc.o"
# shellcheck disable=SC2086
$CC $FLAGS $INCLUDES -c "$TARGET/src/lamp_uart.c" -o "$OUT/lamp_uart.o"
$CC $FLAGS $INCLUDES -c "$TARGET/src/lamp_tx_queue.c" -o "$OUT/lamp_tx_queue.o"
# shellcheck disable=SC2086
$CC -mcpu=cortex-m0plus -mthumb -mfloat-abi=soft -x assembler-with-cpp -c "$TARGET/Device/Source/Templates/gcc/startup_stm32g030xx.s" -o "$OUT/startup.o"

for source in ai_wire aiw_stream lamp_guard lamp_guard_wire_adapter lamp_ticket_dispatch \
              lamp_program lamp_ui_policy lamp_ui_dispatch lamp_ui_wire_service lamp_output_adapter \
              pca9956b_register_driver pca9956b_fault_monitor is31fl3236a is31fl3236a_lamp_backend; do
    # shellcheck disable=SC2086
    $CC $FLAGS $INCLUDES -c "$ROOT/固件/lamp_control/$source.c" -o "$OUT/$source.o"
done

$CC -mcpu=cortex-m0plus -mthumb -mfloat-abi=soft -nostdlib \
    -T "$TARGET/linker/stm32g030f6.ld" \
    -Wl,-Map="$OUT/lamp_safety_g030f6.map",--cref,--build-id=none,--no-undefined,--print-memory-usage \
    "$OUT/startup.o" "$OUT/system_stm32g0xx.o" "$OUT/runtime.o" "$OUT/main.o" "$OUT/lamp_i2c_read.o" "$OUT/lamp_i2c_pins.o" "$OUT/lamp_board_inputs.o" "$OUT/lamp_ir_filter.o" "$OUT/lamp_adc.o" "$OUT/lamp_measurement.o" "$OUT/lamp_ntc.o" \
    "$OUT/lamp_uart.o" "$OUT/lamp_tx_queue.o" "$OUT/ai_wire.o" "$OUT/aiw_stream.o" \
    "$OUT/lamp_guard.o" "$OUT/lamp_guard_wire_adapter.o" "$OUT/lamp_ticket_dispatch.o" \
    "$OUT/lamp_program.o" "$OUT/lamp_ui_policy.o" "$OUT/lamp_ui_dispatch.o" \
    "$OUT/lamp_ui_wire_service.o" \
    "$OUT/lamp_output_adapter.o" "$OUT/pca9956b_register_driver.o" "$OUT/pca9956b_fault_monitor.o" \
    "$OUT/is31fl3236a.o" "$OUT/is31fl3236a_lamp_backend.o" -lgcc \
    -o "$OUT/lamp_safety_g030f6.elf"

$OBJCOPY -O binary "$OUT/lamp_safety_g030f6.elf" "$OUT/lamp_safety_g030f6.bin"
$SIZE "$OUT/lamp_safety_g030f6.elf" | tee "$OUT/size.txt"

python3 "$TARGET/verify_image.py" "$OUT/lamp_safety_g030f6.elf" "$OUT/lamp_safety_g030f6.bin" "$OUT/lamp_safety_g030f6.map" > "$OUT/build_verification.json"
rm -f "$OUT"/*.o
cat "$OUT/build_verification.json"
