###############################################################################
#
# MODULE:      DimmerSwitch
#
# DESCRIPTION: Makefile
# 
###############################################################################
#
# This software is owned by NXP B.V. and/or its supplier and is protected
# under applicable copyright laws. All rights are reserved. We grant You,
# and any third parties, a license to use this software solely and
# exclusively on NXP products [NXP Microcontrollers such as  JN5168, JN5164,
# JN5161, JN5148, JN5142, JN5139]. 
# You, and any third parties must reproduce the copyright and warranty notice
# and any other legend of ownership on each copy or partial copy of the 
# software.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# Copyright NXP B.V. 2015. All rights reserved
#
###############################################################################

#Default HW is DimmerSwitch
SWITCH ?= DimmerSwitch
DR     ?= DR1199
TYPE   ?= EXP_BOARD
REV    ?= r1v2

# type of node commissionning
COMMISSION ?= NFC
ifeq ($(COMMISSION), NFC) 
CFLAGS += -DNFC_SUPPORT
endif

# Pull in the manufacturer specific configuration options
include $(abspath ../..)/$(SWITCH)/Build/manu_config.mk

# Application target name
#  Note: Target name must be the same as the subfolder name

TARGET    = $(SWITCH)

###############################################################################
#User definable make parameters that may be overwritten from the command line

# Default target device is the JN5168

JENNIC_CHIP ?= JN5168
CFLAGS += -DCHIP_$(JENNIC_CHIP)

JENNIC_CHIP_FAMILY ?= JN516x

PDM_BUILD_TYPE ?=_EEPROM

OVERLAY_BUILD = 0

###############################################################################
# Default SDK

JENNIC_SDK ?= JN-SW-4168

###############################################################################
# Default DK4 development kit target hardware
JENNIC_PCB ?= DEVKIT4


# Tell the codebase the target platform
CFLAGS += -D$(SWITCH)
CFLAGS += -D$(DR)
CFLAGS += -DBUTTON_MAP_$(DR)

KEEPALIVETIME ?= 6

ifeq ($(KEEPALIVETIME),0) 
#no need to do anything as the sleep will not be defined
else 
ifeq ($(KEEPALIVETIME),255)
CFLAGS += -DKEEP_ALIVETIME=6
CFLAGS += -DSLEEP_ENABLE
CFLAGS += -DDEEP_SLEEP_ENABLE
else
CFLAGS += -DKEEP_ALIVETIME=$(KEEPALIVETIME)
CFLAGS += -DSLEEP_ENABLE
endif
endif


# Switch is an Initiator,
CFLAGS += -DEZ_MODE_INITIATOR
CFLAGS += -DEZ_ENABLE_GROUP

###############################################################################
# Select the network stack

JENNIC_MAC ?= MiniMacShim
JENNIC_STACK ?= ZLLHA

###############################################################################
# End device or router / coord (e.g. ZCR, ZED)

ZBPRO_DEVICE_TYPE ?= ZED

###############################################################################
# Debug options define DEBUG for HW debug
#DEBUG ?=HW
#
#
# Define which UART to use for debug
DEBUG_PORT ?= UART0

###############################################################################
# Define TRACE to use with DBG module
#TRACE ?=1
ifeq ($(TRACE), 1)
CFLAGS  += -DDBG_ENABLE

# Common
# ------
#CFLAGS += -DNXP_HARDWARE
#CFLAGS += -DDEBUG_APP_BUTTON       # app_buttons.c
#CFLAGS += -DDEBUG_ZCL              # app_dbg_zcl_event.c
CFLAGS += -DDEBUG_EXCEPTION        # app_exceptions.c
CFLAGS += -DDEBUG_PDM              # app_pdm.c
CFLAGS += -DDEBUG_HEAP             # app_util.c
#CFLAGS += -DDEBUG_ZBP_UTILS        # app_zbp_utilities.c
#CFLAGS += -DDEBUG_EZMODE           # haEzFindAndBind.c && haEzJoin.c
#CFLAGS += -DDEBUG_I2C_DRIVER       # I2C_Driver.c
CFLAGS += -DDEBUG_NDEF             # ndef.c
CFLAGS += -DDEBUG_NFC              # nfc.c
CFLAGS += -DDEBUG_NTAG             # ntag.c
CFLAGS += -DDEBUG_NSC              # nsc.c
#CFLAGS += -DDEBUG_APP
#CFLAGS += -DDEBUG_JOIN
#CFLAGS += -DDEBUG_COMMISSION
#CFLAGS += -DDEBUG_CLD_ONOFF
#CFLAGS += -DDEBUG_SCAN

# Common Switch
# -------------
CFLAGS += -DDEBUG_START_UP         # app_start_switch.c
#CFLAGS += -DDEBUG_SWITCH_STATE     # app_switch_state_machine.c
#CFLAGS += -DDEBUG_CIRCULAR_ROUTE   # app_zcl_switch_task.c
#CFLAGS += -DDEBUG_SWITCH_TASK      # app_zcl_switch_task.c
CFLAGS += -DDEBUG_SWITCH_NODE      # zha_switch_node.c
endif

ifeq ($(OTA),1)
CFLAGS  += -DBUILD_OTA

OTA_ENCRYPTED ?= 0
ifeq ($(OTA_ENCRYPTED),1)
CFLAGS  += -DOTA_ENCRYPTED
endif

APP_CLUSTERS_OTA_SRC ?=1
endif

# Target
# ------

###############################################################################
# Profile domains

# HA lighting application
APP_CLUSTER_HA_LIGHTING_SRC ?=1

# ZLL lighting application
#APP_CLUSTER_ZLL_SRC ?= 1

###############################################################################
# Cluster domains

# OTA clusters
#APP_CLUSTERS_OTA_SRC ?=1

# Green Power clusters
#APP_CLUSTERS_GREENPOWER_SRC ?=1

# Lighting clusters
APP_CLUSTER_LIGHTING_SRC ?=1

# Measurement and sensing clusters
#APP_CLUSTERS_MEASUREMENT_AND_SENSING ?=1

# Energy at Home clusters
#APP_CLUSTERS_ENERGY_AT_HOME_SRC ?=1

# HVAC clusters
#APP_CLUSTERS_HVAC_SRC ?=1

# Smart Energy clusters
#APP_CLUSTERS_SMART_ENERGY_SRC ?=1

# IAS clusters
#APP_CLUSTERS_IAS_SRC ?=1

##############################################################################
# For 4x use string based PDM id's for newer families use 16 bit id numbers
ifneq ($(JENNIC_CHIP_FAMILY), JN514x)
CFLAGS   += -DPDM_USER_SUPPLIED_ID
endif

###############################################################################
# Path definitions
# Select definitions for either single or multiple targets

# Use if application directory contains multiple targets
SDK_BASE_DIR       = $(abspath ../../../../sdk/$(JENNIC_SDK))
UTIL_SRC_DIR       = $(COMPONENTS_BASE_DIR)/Utilities/Source
APP_BASE           = $(abspath ../..)
APP_BLD_DIR        = $(APP_BASE)/$(TARGET)/Build
APP_SRC_DIR        = $(APP_BASE)/$(TARGET)/Source
APP_COMMON_SRC_DIR = $(APP_BASE)/Common_Switch/Source
COMMON_SRC_DIR     = $(APP_BASE)/Common/Source

###############################################################################
# Application Source files
#  Note: Path to source file is found using vpath below, so only .c filename is required

# Generated
# ---------
APPSRC  = os_gen.c
APPSRC += os_irq.S
APPSRC += os_irq_alignment.S
APPSRC += os_irq_buserror.S
APPSRC += os_irq_illegalinstruction.S
APPSRC += os_irq_stackoverflowexception.S
APPSRC += os_irq_unimplementedmodule.S
APPSRC += pdum_gen.c
APPSRC += pdum_apdu.S
APPSRC += zps_gen.c

# Target
# ------
APPSRC += App_$(TARGET).c

# Common
# ------
APPSRC += app_buttons.c
APPSRC += app_dbg_zcl_event.c
APPSRC += app_exceptions.c
APPSRC += app_pdm.c
APPSRC += app_util.c
APPSRC += app_zbp_utilities.c
APPSRC += dump.c
APPSRC += haEzFindAndBind.c
APPSRC += haEzJoin.c
ifeq ($(OTA),1)
APPSRC += app_ota_client.c
else
APPSRC += haKeys.c
endif
APPSRC += I2C_Driver.c
APPSRC += ndef.c
APPSRC += nfc.c
APPSRC += nsc.c
APPSRC += ntag.c
APPSRC += Timer.c
APPSRC += PingParent.c

# Common_Switch
# -------------
APPSRC += app_start_switch.c
APPSRC += app_switch_state_machine.c
APPSRC += app_zcl_switch_task.c
APPSRC += Controls.c
APPSRC += zha_switch_node.c

# Utilities
# ---------
APPSRC += app_timer_driver.c
APPSRC += appZpsBeaconHandler.c
APPSRC += appZdpExtraction.c
APPSRC += NumToString.c

APP_ZPSCFG = app.zpscfg

BIN_SUFFIX=_$(DR)
BIN_SUFFIX := $(BIN_SUFFIX)_$(COMMISSION)
ifeq ($(OTA),1)
BIN_SUFFIX := $(BIN_SUFFIX)_OTA
endif
ifeq ($(GP_SUPPORT), 1)
BIN_SUFFIX := $(BIN_SUFFIX)_GP
endif

##############################################################################
# Additional Application Source directories
# Define any additional application directories outside the application directory
# e.g. for AppQueueApi

ADDITIONAL_SRC_DIR +=

##############################################################################
# Standard Application header search paths

INCFLAGS += -I$(COMMON_SRC_DIR)
INCFLAGS += -I$(APP_COMMON_SRC_DIR)
INCFLAGS += -I$(APP_SRC_DIR)

# Application specific include files
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/Random/Include
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/MAC/Include
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/NXPLogo/Include
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/Utilities/Include
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/ZCL/Include
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/Xcv/Include/
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/Recal/Include/
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/MicroSpecific/Include 
INCFLAGS += -I$(COMPONENTS_BASE_DIR)/HardwareApi/Include
LDLIBS += Recal_$(JENNIC_CHIP_FAMILY)

##############################################################################
# Application libraries
# Specify additional Component libraries

#APPLIBS +=

##############################################################################

# You should not need to edit below this line

##############################################################################
##############################################################################
# Configure for the selected chip or chip family

include $(SDK_BASE_DIR)/Chip/Common/Build/config.mk
include $(SDK_BASE_DIR)/Platform/Common/Build/Config.mk
include $(SDK_BASE_DIR)/Stack/Common/Build/config.mk

##############################################################################

TEMP = $(APPSRC:.c=.o)
APPOBJS_TMP = $(TEMP:.S=.o)
APPOBJS := $(addprefix $(APP_BLD_DIR)/,$(APPOBJS_TMP))

##############################################################################
# Application dynamic dependencies

APPDEPS_TMP = $(APPOBJS_TMP:.o=.d)
APPDEPS := $(addprefix $(APP_BLD_DIR)/,$(APPDEPS_TMP))

##############################################################################
# Linker

# Add application libraries before chip specific libraries to linker so
# symbols are resolved correctly (i.e. ordering is significant for GCC)

APPLDLIBS := $(foreach lib,$(APPLIBS),$(if $(wildcard $(addprefix $(COMPONENTS_BASE_DIR)/Library/lib,$(addsuffix _$(JENNIC_CHIP).a,$(lib)))),$(addsuffix _$(JENNIC_CHIP),$(lib)),$(addsuffix _$(JENNIC_CHIP_FAMILY),$(lib))))
LDLIBS := $(APPLDLIBS) $(LDLIBS)

##############################################################################
# Dependency rules

.PHONY: all clean
# Path to directories containing application source
vpath % $(COMMON_SRC_DIR):$(APP_COMMON_SRC_DIR):$(APP_SRC_DIR):$(HA_SRC_DIRS):$(ZCL_SRC):$(UTIL_SRC_DIR)

ifeq ($(OTA),1)
APP_SW_VERSION_UPGRADE_IMAGE ?= 2
all: Client.bin	
else
all: $(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX).bin
endif
-include $(APPDEPS)
#%.d:
#	rm -f $*.o

$(APP_SRC_DIR)/os_gen.c $(APP_SRC_DIR)/os_gen.h $(APP_SRC_DIR)/os_irq.S $(APP_SRC_DIR)/os_irq_alignment.S $(APP_SRC_DIR)/os_irq_buserror.S $(APP_SRC_DIR)/os_irq_illegalinstruction.S $(APP_SRC_DIR)/os_irq_stackoverflowexception.S $(APP_SRC_DIR)/os_irq_unimplementedmodule.S: $(APP_SRC_DIR)/App_$(TARGET)_$(JENNIC_CHIP_FAMILY).oscfgdiag $(OSCONFIG)
	$(info Configuring the OS ...)
	$(OSCONFIG) -f $< -o $(APP_SRC_DIR) -v $(JENNIC_CHIP)
	@echo

$(APP_SRC_DIR)/pdum_gen.c $(APP_SRC_DIR)/pdum_gen.h: $(COMMON_SRC_DIR)/$(APP_ZPSCFG) $(PDUMCONFIG)
	$(info Configuring the PDUM ...)
	$(PDUMCONFIG) -z $(TARGET) -f $< -o $(APP_SRC_DIR)
	@echo

$(APP_SRC_DIR)/zps_gen.c $(APP_SRC_DIR)/zps_gen.h: $(COMMON_SRC_DIR)/$(APP_ZPSCFG) $(ZPSCONFIG)
	$(info Configuring the Zigbee Protocol Stack ...)
	$(ZPSCONFIG) -n $(TARGET) -t $(JENNIC_CHIP) -l $(ZPS_NWK_LIB) -a $(ZPS_APL_LIB) -c $(TOOL_COMMON_BASE_DIR)/$(TOOLCHAIN_PATH) -f $< -o $(APP_SRC_DIR)
	@echo

$(APP_BLD_DIR)/%.o: %.S
	$(info Assembling $< ...)
	$(CC) -c -o $(subst Source,Build,$@) $(CFLAGS) $(INCFLAGS) $< -MD -MF $*.d -MP
	@echo

$(APP_BLD_DIR)/%.o: %.c
	$(info Compiling $< ...)
	$(CC) -c -o $(subst Source,Build,$@) $(CFLAGS) $(INCFLAGS) $< -MD -MF $*.d -MP
	@echo

$(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX).elf: $(APPOBJS) $(addsuffix.a,$(addprefix $(COMPONENTS_BASE_DIR)/Library/lib,$(APPLDLIBS)))
	$(info Linking $@ ...)
	$(CC) -Wl,--gc-sections -Wl,-u_AppColdStart -Wl,-u_AppWarmStart $(LDFLAGS) -TAppBuildZLLHA_$(JENNIC_CHIP).ld -o $@ -Wl,--start-group $(APPOBJS) $(addprefix -l,$(LDLIBS)) -lm -Wl,--end-group -Wl,-Map,$(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX).map 
	$(SIZE) $@ 
	
$(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX).bin: $(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX).elf 
	$(info Generating binary ...)
	$(OBJCOPY) -j .version -j .bir -j .flashheader -j .vsr_table -j .vsr_handlers  -j .rodata -j .text -j .data -j .bss -j .heap -j .stack -S -O binary $< $@
ifeq ($(OTA),1)	
Client.bin:$(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX).bin

ifeq ($(OTA_ENCRYPTED),0)
    ############################################## Create Client and OTA images - Unencrypted ##################################
	cp -f $(APP_BLD_DIR)/$(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX).bin $(APP_BLD_DIR)/OTABuild/$(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX).bin
	cd $(APP_BLD_DIR)/OTABuild;\
	$(APP_BLD_DIR)/OTABuild/SwitchCreatOtaClient.bat $(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX) $(MANUFACTURER_CODE) $(APP_SW_VERSION) $(JENNIC_CHIP)

    ##########################Create Client and OTA images with a different version to test - Unencrypted #########################	
	cp -f $(APP_BLD_DIR)/$(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX).bin $(APP_BLD_DIR)/OTABuild/$(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX).bin
	cd $(APP_BLD_DIR)/OTABuild;\
	$(APP_BLD_DIR)/OTABuild/SwitchCreatOtaClient.bat $(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX) $(MANUFACTURER_CODE) $(APP_SW_VERSION_UPGRADE_IMAGE) $(JENNIC_CHIP)
else
    ############################################## Create Client and OTA images - Enncrypted ##################################
	cp -f $(APP_BLD_DIR)/$(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX).bin $(APP_BLD_DIR)/OTABuild/$(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX).bin
	cd $(APP_BLD_DIR)/OTABuild;\
	$(APP_BLD_DIR)/OTABuild/SwitchCreatOtaEncClient.bat $(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX) $(MANUFACTURER_CODE) $(APP_SW_VERSION) $(JENNIC_CHIP)

    ##########################Create Client and OTA images with a different version to test - Enncrypted #########################	
	cp -f $(APP_BLD_DIR)/$(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX).bin $(APP_BLD_DIR)/OTABuild/$(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX).bin
	cd $(APP_BLD_DIR)/OTABuild;\
	$(APP_BLD_DIR)/OTABuild/SwitchCreatOtaEncClient.bat $(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX) $(MANUFACTURER_CODE) $(APP_SW_VERSION_UPGRADE_IMAGE) $(JENNIC_CHIP)
endif	
	
	rm -f $(APP_BLD_DIR)/$(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX).bin
endif	

###############################################################################

clean:
	rm -f $(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX).bin
	rm -f $(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX).elf
	rm -f $(TARGET)_$(JENNIC_CHIP)$(BIN_SUFFIX).map
	rm -f *.d
	rm -f *.o
	rm -f $(APP_SRC_DIR)/os_gen.*
	rm -f $(APP_SRC_DIR)/os_irq*.S
	rm -f $(APP_SRC_DIR)/pdum_apdu.S
	rm -f $(APP_SRC_DIR)/pdum_gen.*
	rm -f $(APP_SRC_DIR)/zps_gen*.*

###############################################################################
