PROJECT_NAME := blinky_FreeRTOS_pca10040
SDK_PATH := C:/nello_firmware/nRF5_SDK_11_0_0_89a8197
IOT_SDK_PATH := C:/nello_firmware/nrf5_iot_sdk_3288530

export OUTPUT_FILENAME
#MAKEFILE_NAME := $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
MAKEFILE_NAME := $(MAKEFILE_LIST)
MAKEFILE_DIR := $(dir $(MAKEFILE_NAME) ) 

TEMPLATE_PATH = $(SDK_PATH)/components/toolchain/gcc
ifeq ($(OS),Windows_NT)
include $(TEMPLATE_PATH)/Makefile.windows
else
include $(TEMPLATE_PATH)/Makefile.posix
endif

MK := mkdir
RM := rm -rf

#echo suspend
ifeq ("$(VERBOSE)","1")
NO_ECHO := 
else
NO_ECHO := @
endif

# Toolchain commands
CC              := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-gcc'
AS              := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-as'
AR              := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-ar' -r
LD              := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-ld'
NM              := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-nm'
OBJDUMP         := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-objdump'
OBJCOPY         := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-objcopy'
SIZE            := '$(GNU_INSTALL_ROOT)/bin/$(GNU_PREFIX)-size'

#function for removing duplicates in a list
remduplicates = $(strip $(if $1,$(firstword $1) $(call remduplicates,$(filter-out $(firstword $1),$1))))

#source common to all targets
C_SOURCE_FILES += \
$(SDK_PATH)/components/libraries/util/app_error.c \
$(SDK_PATH)/components/libraries/util/app_error_weak.c \
$(SDK_PATH)/components/libraries/util/app_util_platform.c \
$(SDK_PATH)/components/libraries/util/nrf_assert.c \
$(SDK_PATH)/components/libraries/fifo/app_fifo.c \
$(SDK_PATH)/components/drivers_nrf/clock/nrf_drv_clock.c \
$(SDK_PATH)/components/drivers_nrf/common/nrf_drv_common.c \
$(SDK_PATH)/components/drivers_nrf/nrf_soc_nosd/nrf_nvic.c \
$(SDK_PATH)/components/drivers_nrf/nrf_soc_nosd/nrf_soc.c \
$(SDK_PATH)/components/drivers_nrf/comp/nrf_drv_comp.c \
$(SDK_PATH)/components/drivers_nrf/timer/nrf_drv_timer.c \
$(SDK_PATH)/components/drivers_nrf/delay/nrf_delay.c \
$(SDK_PATH)/components/drivers_nrf/hal/nrf_nvmc.c\
$(SDK_PATH)/components/toolchain/system_nrf52.c \
$(SDK_PATH)/components/drivers_nrf/spi_master/nrf_drv_spi.c \
$(SDK_PATH)/components/libraries/button/app_button.c \
$(SDK_PATH)/components/libraries/util/nrf_log.c \
$(SDK_PATH)/components/drivers_nrf/gpiote/nrf_drv_gpiote.c \
$(SDK_PATH)/external/segger_rtt/RTT_Syscalls_GCC.c \
$(SDK_PATH)/external/segger_rtt/SEGGER_RTT.c \
$(SDK_PATH)/external/segger_rtt/SEGGER_RTT_printf.c \
$(SDK_PATH)/components/drivers_nrf/saadc/nrf_drv_saadc.c \
$(SDK_PATH)/components/drivers_nrf/ppi/nrf_drv_ppi.c \
$(SDK_PATH)/components/drivers_nrf/hal/nrf_saadc.c \
$(SDK_PATH)/components/drivers_nrf/pwm/nrf_drv_pwm.c \
../Atmel_libraries/common/source/nm_common.c \
$(SDK_PATH)/components/libraries/fds/fds.c \
$(SDK_PATH)/components/serialization/application/hal/ser_app_hal_nrf51.c \
$(SDK_PATH)/components/libraries/fstorage/fstorage.c \
$(SDK_PATH)/components/libraries/fstorage/fstorage_nosd.c \
../Atmel_libraries/driver/source/nmdrv.c \
../Atmel_libraries/driver/source/nmspi.c \
../Atmel_libraries/driver/source/nmbus.c \
../Atmel_libraries/driver/source/nmasic.c \
../Atmel_libraries/driver/source/m2m_hif.c \
../Atmel_libraries/driver/source/m2m_wifi.c \
../Atmel_libraries/socket/source/socket.c \
../src/main.c \
../src/gpio_nello_one.c \
../src/wifi_nello_one.c \
../src/mqtt_nello_one.c \
../src/hw_timer_nello_one.c \
../src/comp_nello_one.c \
../src/optical_data_reception.c \
../src/inter_bus_communication_nello_one.c \
../src/inter_dw_communication.c \
../src/saadc_nello_one.c \
../src/status_led_nello_one.c \
../src/power_managment_nello_one.c \
../src/flash_data_storage_nello_one.c \
../src/tcp_client_new_nello_one.c \
../src/demo_core_sm_nello_one.c \
../Atmel_libraries/bsp/source/nm_bsp_samd21.c \
../Atmel_libraries/bus_wrapper/source/nm_bus_wrapper_samd21.c \
$(IOT_SDK_PATH)/components/iot/mqtt/mqtt.c \
$(IOT_SDK_PATH)/components/iot/mqtt/mqtt_decoder.c \
$(IOT_SDK_PATH)/components/iot/mqtt/mqtt_encoder.c \
$(IOT_SDK_PATH)/components/iot/mqtt/mqtt_transport.c \
$(IOT_SDK_PATH)/components/libraries/mem_manager/mem_manager.c \
$(IOT_SDK_PATH)/components/iot/tls/mbedtls/tls_interface.c \
$(IOT_SDK_PATH)/components/iot/iot_timer/iot_timer.c \
$(IOT_SDK_PATH)/components/drivers_nrf/rng/nrf_drv_rng.c \
$(IOT_SDK_PATH)/components/libraries/timer/app_timer.c \
$(IOT_SDK_PATH)/external/mbedtls/library/platform.c \
$(IOT_SDK_PATH)/external/mbedtls/library/ssl_tls.c \
$(IOT_SDK_PATH)/external/mbedtls/library/cipher.c \
$(IOT_SDK_PATH)/external/mbedtls/library/md.c \
$(IOT_SDK_PATH)/external/mbedtls/library/md5.c \
$(IOT_SDK_PATH)/external/mbedtls/library/sha1.c \
$(IOT_SDK_PATH)/external/mbedtls/library/sha256.c \
$(IOT_SDK_PATH)/external/mbedtls/library/sha512.c \
$(IOT_SDK_PATH)/external/mbedtls/library/dhm.c \
$(IOT_SDK_PATH)/external/mbedtls/library/ecdh.c \
$(IOT_SDK_PATH)/external/mbedtls/library/bignum.c \
$(IOT_SDK_PATH)/external/mbedtls/library/x509_crt.c \
$(IOT_SDK_PATH)/external/mbedtls/library/pk.c \
$(IOT_SDK_PATH)/external/mbedtls/library/pkparse.c \
$(IOT_SDK_PATH)/external/lwip/src/core/tcp.c \
$(IOT_SDK_PATH)/external/lwip/src/core/tcp_out.c \
$(IOT_SDK_PATH)/external/mbedtls/library/ssl_cli.c \
$(IOT_SDK_PATH)/external/mbedtls/library/ssl_srv.c \
$(IOT_SDK_PATH)/external/mbedtls/library/ssl_ciphersuites.c \
$(IOT_SDK_PATH)/external/mbedtls/library/cipher_wrap.c \
$(IOT_SDK_PATH)/external/mbedtls/library/gcm.c \
$(IOT_SDK_PATH)/external/mbedtls/library/ccm.c \
$(IOT_SDK_PATH)/external/mbedtls/library/md_wrap.c \
$(IOT_SDK_PATH)/external/mbedtls/library/asn1parse.c \
$(IOT_SDK_PATH)/external/mbedtls/library/pem.c \
$(IOT_SDK_PATH)/external/mbedtls/library/pk_wrap.c \
$(IOT_SDK_PATH)/external/mbedtls/library/rsa.c \
$(IOT_SDK_PATH)/external/mbedtls/library/ecp_curves.c \
$(IOT_SDK_PATH)/external/mbedtls/library/oid.c \
$(IOT_SDK_PATH)/external/mbedtls/library/pkcs12.c \
$(IOT_SDK_PATH)/external/mbedtls/library/aes.c \
$(IOT_SDK_PATH)/external/mbedtls/library/tcp_in.c \
$(IOT_SDK_PATH)/external/mbedtls/library/memp.c \
$(IOT_SDK_PATH)/external/mbedtls/library/pbuf.c \
$(IOT_SDK_PATH)/external/mbedtls/library/camellia.c \
$(IOT_SDK_PATH)/external/mbedtls/library/des.c \
$(IOT_SDK_PATH)/external/mbedtls/library/blowfish.c \
$(IOT_SDK_PATH)/external/mbedtls/library/arc4.c \
$(IOT_SDK_PATH)/external/mbedtls/library/x509.c \
$(IOT_SDK_PATH)/external/mbedtls/library/pkcs5.c \
$(IOT_SDK_PATH)/external/mbedtls/library/ripemd160.c \
$(IOT_SDK_PATH)/external/mbedtls/library/base64.c \
$(IOT_SDK_PATH)/external/mbedtls/library/ecdsa.c \
$(IOT_SDK_PATH)/external/mbedtls/library/asn1write.c \
$(IOT_SDK_PATH)/external/mbedtls/library/hmac_drbg.c \
$(IOT_SDK_PATH)/external/lwip/src/core/timers.c \
$(IOT_SDK_PATH)/external/lwip/src/core/ipv4/ip4.c \
$(IOT_SDK_PATH)/external/lwip/src/core/def.c \
$(IOT_SDK_PATH)/external/lwip/src/core/stats.c \
$(IOT_SDK_PATH)/external/lwip/src/core/inet_chksum.c \
$(IOT_SDK_PATH)/external/lwip/src/core/mem.c \
$(IOT_SDK_PATH)/external/lwip/src/core/netif.c \
$(IOT_SDK_PATH)/external/lwip/src/core/ip_frag.c \
$(IOT_SDK_PATH)/external/lwip/src/port/nrf_platform_port.c \
$(IOT_SDK_PATH)/external/lwip/src/core/ipv4/ip4_addr.c \
$(IOT_SDK_PATH)/external/mbedtls/library/ecp.c \



#assembly files common to all targets
ASM_SOURCE_FILES  = $(SDK_PATH)/components/toolchain/gcc/gcc_startup_nrf52.s

#includes common to all targets
INC_PATHS = -I../src
INC_PATHS += -I../config
INC_PATHS += -I$(SDK_PATH)/examples/bsp
INC_PATHS += -I$(SDK_PATH)/components/device
#INC_PATHS += -I$(SDK_PATH)/components/drivers_nrf/config
INC_PATHS += -I$(SDK_PATH)/components/drivers_nrf/nrf_soc_nosd
INC_PATHS += -I$(SDK_PATH)/components/drivers_nrf/hal
INC_PATHS += -I$(SDK_PATH)/components/drivers_nrf/common
INC_PATHS += -I$(SDK_PATH)/components/drivers_nrf/clock
INC_PATHS += -I$(SDK_PATH)/components/drivers_nrf/comp
INC_PATHS += -I$(SDK_PATH)/components/drivers_nrf/timer
INC_PATHS += -I$(SDK_PATH)/components/drivers_nrf/delay
INC_PATHS += -I$(SDK_PATH)/components/toolchain
INC_PATHS += -I$(SDK_PATH)/components/toolchain/gcc
INC_PATHS += -I$(SDK_PATH)/components/toolchain/CMSIS/Include
INC_PATHS += -I$(SDK_PATH)/components/libraries/util
INC_PATHS += -I$(SDK_PATH)/components/libraries/fifo
INC_PATHS += -I$(SDK_PATH)/components/drivers_nrf/spi_master
INC_PATHS += -I$(SDK_PATH)/components/libraries/button
INC_PATHS += -I$(SDK_PATH)/external/segger_rtt
#INC_PATHS += -I$(SDK_PATH)/examples/peripheral
#INC_PATHS += -I$(SDK_PATH)/examples/peripheral/spi/config/spi_pca10040
#INC_PATHS += -I$(SDK_PATH)/examples/peripheral/spi/config
INC_PATHS += -I$(SDK_PATH)/components/libraries/timer
INC_PATHS += -I$(SDK_PATH)/components/drivers_nrf/gpiote
INC_PATHS += -I$(SDK_PATH)/../nello_one/src
INC_PATHS += -I$(IOT_SDK_PATH)/components/iot/mqtt
INC_PATHS += -I$(IOT_SDK_PATH)/components/iot/common
INC_PATHS += -I$(IOT_SDK_PATH)/components/iot/iot_timer
INC_PATHS += -I$(IOT_SDK_PATH)/components/iot/tls
INC_PATHS += -I$(IOT_SDK_PATH)/components/iot/iot_timer
INC_PATHS += -I$(IOT_SDK_PATH)/components/libraries/mem_manager
INC_PATHS += -I$(IOT_SDK_PATH)/components/libraries/trace
INC_PATHS += -I$(IOT_SDK_PATH)/external/mbedtls
INC_PATHS += -I$(IOT_SDK_PATH)/external/mbedtls/include
INC_PATHS += -I$(IOT_SDK_PATH)/external/mbedtls/include/mbedtls
INC_PATHS += -I$(IOT_SDK_PATH)/external/mbedtls/library
INC_PATHS += -I$(IOT_SDK_PATH)/components/drivers_nrf/rng
INC_PATHS += -I$(IOT_SDK_PATH)/components/iot/tls/mbedtls
INC_PATHS += -I$(IOT_SDK_PATH)/external/lwip/src/include
INC_PATHS += -I$(IOT_SDK_PATH)/external/lwip/src/include/lwip
INC_PATHS += -I$(IOT_SDK_PATH)/external/lwip/test/unit
INC_PATHS += -I$(IOT_SDK_PATH)/external/lwip/src/port
INC_PATHS += -I$(IOT_SDK_PATH)/external/lwip/src/port/arch
# ATMEL Includes
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/Src
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/bsp
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/bsp/include
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/bsp/source
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/bus_wrapper
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/bus_wrapper/include
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/bus_wrapper/source
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/common
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/common/include
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/common/source
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/driver
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/driver/include
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/driver/source
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/socket
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/socket/include
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/socket/source
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/spi_flash
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/spi_flash/include
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/spi_flash/source
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/config
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/Inc
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/MDK-ARM
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/MDK-ARM/Wifi_Chip_id_Configuration
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/Drivers
INC_PATHS += -I$(SDK_PATH)/../nello_one/Atmel_libraries/Drivers/CMSIS
# SAADC includes
INC_PATHS += -I$(SDK_PATH)/examples/peripheral/examples/peripheral/saadc
INC_PATHS += -I$(SDK_PATH)/components/drivers_nrf/saadc
INC_PATHS += -I$(SDK_PATH)/components/drivers_nrf/ppi
INC_PATHS += -I$(SDK_PATH)/components/drivers_nrf/hal
# PWM Includes
INC_PATHS += -I$(SDK_PATH)/components/libraries/pwm
INC_PATHS += -I$(SDK_PATH)/components/drivers_nrf/ppi
INC_PATHS += -I$(SDK_PATH)/components/drivers_nrf/pwm
#Flash Data Storage
INC_PATHS += -I$(SDK_PATH)/components/libraries/fds
INC_PATHS += -I$(SDK_PATH)/components/libraries/fds/config
INC_PATHS += -I$(SDK_PATH)/components/libraries/fstorage
INC_PATHS += -I$(SDK_PATH)/components/libraries/fstorage/config
INC_PATHS += -I$(SDK_PATH)/components/libraries/experimental_section_vars
INC_PATHS += -I$(SDK_PATH)/components/serialization/application/hal
INC_PATHS += -I$(SDK_PATH)/components/serialization/common/transport/ser_phy
INC_PATHS += -I$(SDK_PATH)/components/serialization/common/transport/ser_phy/config
INC_PATHS += -I$(SDK_PATH)/components/serialization/common


OBJECT_DIRECTORY = _build
LISTING_DIRECTORY = $(OBJECT_DIRECTORY)
OUTPUT_BINARY_DIRECTORY = $(OBJECT_DIRECTORY)

# Sorting removes duplicates
BUILD_DIRECTORIES := $(sort $(OBJECT_DIRECTORY) $(OUTPUT_BINARY_DIRECTORY) $(LISTING_DIRECTORY) )

#flags common to all targets
CFLAGS  = -DNRF_LOG_USES_UART=0
CFLAGS += -DNRF52_PAN_12
CFLAGS += -DNRF52_PAN_15
CFLAGS += -DNRF52_PAN_58
CFLAGS += -DSWI_DISABLE0
CFLAGS += -DNRF52_PAN_20
CFLAGS += -DNRF52_PAN_54
CFLAGS += -DNRF52_PAN_31
CFLAGS += -DNRF52_PAN_30
CFLAGS += -DNRF52_PAN_51
CFLAGS += -DNRF52_PAN_36
CFLAGS += -DNRF52_PAN_53
CFLAGS += -DCONFIG_GPIO_AS_PINRESET
CFLAGS += -DNRF52_PAN_64
CFLAGS += -DNRF52_PAN_55
CFLAGS += -DNRF_LOG_USES_RTT=1
CFLAGS += -DNRF52_PAN_62
CFLAGS += -DNRF52_PAN_63
CFLAGS += -DBOARD_PCA10040
CFLAGS += -DNRF52
CFLAGS += -DBSP_DEFINES_ONLY
CFLAGS += -mcpu=cortex-m4
CFLAGS += -mthumb -mabi=aapcs --std=gnu99
CFLAGS += -Wall -W -O3 -g3 #original line
CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
# keep every function in separate section. This will allow linker to dump unused functions
CFLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing
CFLAGS += -fno-builtin --short-enums 
# Di: "error: r7 cannot be used in asm here" error
CFLAGS += -fomit-frame-pointer
# keep every function in separate section. This will allow linker to dump unused functions
LDFLAGS += -Xlinker -Map=$(LISTING_DIRECTORY)/$(OUTPUT_FILENAME).map
LDFLAGS += -mthumb -mabi=aapcs -L $(TEMPLATE_PATH) -T$(LINKER_SCRIPT)
LDFLAGS += -mcpu=cortex-m4
LDFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
# let linker to dump unused sections
LDFLAGS += -Wl,--gc-sections
# use newlib in nano version
LDFLAGS += --specs=nano.specs -lc -lnosys

# Assembler flags
ASMFLAGS += -x assembler-with-cpp
ASMFLAGS += -DNRF_LOG_USES_UART=0
ASMFLAGS += -DNRF52_PAN_12
ASMFLAGS += -DNRF52_PAN_15
ASMFLAGS += -DNRF52_PAN_58
ASMFLAGS += -DSWI_DISABLE0
ASMFLAGS += -DNRF52_PAN_20
ASMFLAGS += -DNRF52_PAN_54
ASMFLAGS += -DNRF52_PAN_31
ASMFLAGS += -DNRF52_PAN_30
ASMFLAGS += -DNRF52_PAN_51
ASMFLAGS += -DNRF52_PAN_36
ASMFLAGS += -DNRF52_PAN_53
ASMFLAGS += -DCONFIG_GPIO_AS_PINRESET
ASMFLAGS += -DNRF52_PAN_64
ASMFLAGS += -DNRF52_PAN_55
ASMFLAGS += -DNRF_LOG_USES_RTT=1
ASMFLAGS += -DNRF52_PAN_62
ASMFLAGS += -DNRF52_PAN_63
ASMFLAGS += -DBOARD_PCA10040
ASMFLAGS += -DNRF52
ASMFLAGS += -DBSP_DEFINES_ONLY
ASMFLAGS += -D__STACK_SIZE=8192
ASMFLAGS += -D__HEAP_SIZE=0

#default target - first one defined
default: clean nrf52832_xxaa

#building all targets
all: clean
	$(NO_ECHO)$(MAKE) -f $(MAKEFILE_NAME) -C $(MAKEFILE_DIR) -e cleanobj
	$(NO_ECHO)$(MAKE) -f $(MAKEFILE_NAME) -C $(MAKEFILE_DIR) -e nrf52832_xxaa

#target for printing all targets
help:
	@echo following targets are available:
	@echo 	nrf52832_xxaa

C_SOURCE_FILE_NAMES = $(notdir $(C_SOURCE_FILES))
C_PATHS = $(call remduplicates, $(dir $(C_SOURCE_FILES) ) )
C_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILE_NAMES:.c=.o) )

ASM_SOURCE_FILE_NAMES = $(notdir $(ASM_SOURCE_FILES))
ASM_PATHS = $(call remduplicates, $(dir $(ASM_SOURCE_FILES) ))
ASM_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(ASM_SOURCE_FILE_NAMES:.s=.o) )

vpath %.c $(C_PATHS)
vpath %.s $(ASM_PATHS)

OBJECTS = $(C_OBJECTS) $(ASM_OBJECTS)

nrf52832_xxaa: OUTPUT_FILENAME := nrf52832_xxaa
nrf52832_xxaa: LINKER_SCRIPT=nello_one_gcc_nrf52.ld

nrf52832_xxaa: $(BUILD_DIRECTORIES) $(OBJECTS)
	@echo Linking target: $(OUTPUT_FILENAME).out
	$(NO_ECHO)$(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -lm -o $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out
	$(NO_ECHO)$(MAKE) -f $(MAKEFILE_NAME) -C $(MAKEFILE_DIR) -e finalize

## Create build directories
$(BUILD_DIRECTORIES):
	echo $(MAKEFILE_NAME)
	$(MK) $@

# Create objects from C SRC files
$(OBJECT_DIRECTORY)/%.o: %.c
	@echo Compiling file: $(notdir $<)
	$(NO_ECHO)$(CC) $(CFLAGS) $(INC_PATHS) -c -o $@ $<

# Assemble files
$(OBJECT_DIRECTORY)/%.o: %.s
	@echo Assembly file: $(notdir $<)
	$(NO_ECHO)$(CC) $(ASMFLAGS) $(INC_PATHS) -c -o $@ $<
# Link
$(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out: $(BUILD_DIRECTORIES) $(OBJECTS)
	@echo Linking target: $(OUTPUT_FILENAME).out
	$(NO_ECHO)$(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -lm -o $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out
## Create binary .bin file from the .out file
$(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out
	@echo Preparing: $(OUTPUT_FILENAME).bin
	$(NO_ECHO)$(OBJCOPY) -O binary $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin

## Create binary .hex file from the .out file
$(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex: $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out
	@echo Preparing: $(OUTPUT_FILENAME).hex
	$(NO_ECHO)$(OBJCOPY) -O ihex $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex

finalize: genbin genhex echosize

genbin:
	@echo Preparing: $(OUTPUT_FILENAME).bin
	$(NO_ECHO)$(OBJCOPY) -O binary $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).bin

## Create binary .hex file from the .out file
genhex: 
	@echo Preparing: $(OUTPUT_FILENAME).hex
	$(NO_ECHO)$(OBJCOPY) -O ihex $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).hex
echosize:
	-@echo ''
	$(NO_ECHO)$(SIZE) $(OUTPUT_BINARY_DIRECTORY)/$(OUTPUT_FILENAME).out
	-@echo ''

clean:
	$(RM) $(BUILD_DIRECTORIES)

cleanobj:
	$(RM) $(BUILD_DIRECTORIES)/*.o
flash: nrf52832_xxaa
	@echo Flashing: $(OUTPUT_BINARY_DIRECTORY)/$<.hex
	nrfjprog --program $(OUTPUT_BINARY_DIRECTORY)/$<.hex -f nrf52  --chiperase
	nrfjprog --reset -f nrf52

## Flash softdevice