# Smart Golf Ball Firmware - Makefile
# Target: Nordic nRF52832
# Toolchain: GCC ARM Embedded
# SDK: nRF5 SDK 17.x

PROJECT_NAME    := smart_golf_ball
SDK_ROOT        := $(HOME)/nrf5_sdk
SOFTDEVICE_HEX  := $(SDK_ROOT)/components/softdevice/s132/hex/s132_nrf52_7.3.0_softdevice.hex

# Source files
SRC_FILES := \
  src/main.c \
  src/imu_driver.c \
  src/ble_manager.c \
  src/golf_service.c \
  src/shot_detector.c \
  src/power_manager.c \
  $(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_twi.c \
  $(SDK_ROOT)/modules/nrfx/drivers/src/nrfx_gpiote.c \
  $(SDK_ROOT)/components/ble/ble_advertising/ble_advertising.c \
  $(SDK_ROOT)/components/ble/ble_services/ble_srv_common/ble_srv_common.c \
  $(SDK_ROOT)/components/ble/nrf_ble_gatt/nrf_ble_gatt.c \
  $(SDK_ROOT)/components/libraries/timer/app_timer2.c \
  $(SDK_ROOT)/components/libraries/pwr_mgmt/nrf_pwr_mgmt.c \
  $(SDK_ROOT)/components/libraries/log/src/nrf_log_frontend.c \
  $(SDK_ROOT)/components/libraries/log/src/nrf_log_backend_rtt.c \
  $(SDK_ROOT)/components/softdevice/common/nrf_sdh.c \
  $(SDK_ROOT)/components/softdevice/common/nrf_sdh_ble.c \
  $(SDK_ROOT)/components/softdevice/common/nrf_sdh_soc.c

# Include paths
INC_FOLDERS := \
  include \
  config \
  $(SDK_ROOT)/components/softdevice/s132/headers \
  $(SDK_ROOT)/components/softdevice/common \
  $(SDK_ROOT)/components/ble/common \
  $(SDK_ROOT)/components/ble/ble_advertising \
  $(SDK_ROOT)/components/ble/nrf_ble_gatt \
  $(SDK_ROOT)/components/libraries/timer \
  $(SDK_ROOT)/components/libraries/pwr_mgmt \
  $(SDK_ROOT)/components/libraries/log \
  $(SDK_ROOT)/modules/nrfx/drivers/include \
  $(SDK_ROOT)/integration/nrfx

# Compiler flags
CFLAGS += -DNRF52832_XXAA
CFLAGS += -DBOARD_CUSTOM
CFLAGS += -DS132
CFLAGS += -DSOFTDEVICE_PRESENT
CFLAGS += -DCONFIG_GPIO_AS_PINRESET
CFLAGS += -mcpu=cortex-m4
CFLAGS += -mthumb
CFLAGS += -mfloat-abi=hard
CFLAGS += -mfpu=fpv4-sp-d16
CFLAGS += -ffunction-sections
CFLAGS += -fdata-sections
CFLAGS += -fno-strict-aliasing
CFLAGS += -fno-builtin
CFLAGS += -Os        # Optimize for size
CFLAGS += -Wall

# Linker flags
LDFLAGS += -mthumb -mabi=aapcs
LDFLAGS += -mcpu=cortex-m4
LDFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
LDFLAGS += -Wl,--gc-sections
LDFLAGS += -T$(SDK_ROOT)/modules/nrfx/mdk/nrf52832_xxaa.ld

GNU_PREFIX  := arm-none-eabi
CC          := $(GNU_PREFIX)-gcc
LD          := $(GNU_PREFIX)-gcc
OBJCOPY     := $(GNU_PREFIX)-objcopy
SIZE        := $(GNU_PREFIX)-size

OBJ_DIR     := _build
OBJECTS     := $(addprefix $(OBJ_DIR)/,$(notdir $(SRC_FILES:.c=.o)))
VPATH       := $(dir $(SRC_FILES))

.PHONY: all clean flash flash_softdevice

all: $(OBJ_DIR)/$(PROJECT_NAME).hex
	@echo "Build complete."
	@$(SIZE) $(OBJ_DIR)/$(PROJECT_NAME).elf

$(OBJ_DIR)/%.o: %.c | $(OBJ_DIR)
	@echo "CC $<"
	$(CC) $(CFLAGS) $(addprefix -I,$(INC_FOLDERS)) -c -o $@ $<

$(OBJ_DIR)/$(PROJECT_NAME).elf: $(OBJECTS)
	@echo "Linking..."
	$(LD) $(LDFLAGS) $^ -o $@

$(OBJ_DIR)/$(PROJECT_NAME).hex: $(OBJ_DIR)/$(PROJECT_NAME).elf
	$(OBJCOPY) -O ihex $< $@

$(OBJ_DIR):
	mkdir -p $@

# Flash SoftDevice first, then application
flash_softdevice:
	nrfjprog --program $(SOFTDEVICE_HEX) -f nrf52 --sectorerase
	nrfjprog --reset -f nrf52

flash: all
	nrfjprog --program $(OBJ_DIR)/$(PROJECT_NAME).hex -f nrf52 --sectorerase
	nrfjprog --reset -f nrf52

clean:
	rm -rf $(OBJ_DIR)
