# Include configuration file
include Configuration

# Project name ----------------------------------------
PROJECT  = $(PROJNAME).elf

# Automatic selection of Makerules and related parameters
ifeq ($(STACK_TYPE), ALL_DEVICES_TYPES)
ifeq ($(SECURITY_MODE), NO_SECURITY_MODE)
include $(COMPONENTS_PATH)/../lib/MakerulesBcAll
endif
ifeq ($(SECURITY_MODE), STANDARD_SECURITY_MODE)
include $(COMPONENTS_PATH)/../lib/MakerulesBcAllStdSec
endif
endif

ifeq ($(STACK_TYPE), COORDINATOR)
ifeq ($(SECURITY_MODE), NO_SECURITY_MODE)
include $(COMPONENTS_PATH)/../lib/MakerulesBcCoordinator
endif
ifeq ($(SECURITY_MODE), STANDARD_SECURITY_MODE)
include $(COMPONENTS_PATH)/../lib/MakerulesBcCoordinatorStdSec
endif
endif

ifeq ($(STACK_TYPE), ROUTER)
ifeq ($(SECURITY_MODE), NO_SECURITY_MODE)
include $(COMPONENTS_PATH)/../lib/MakerulesBcRouter
endif
ifeq ($(SECURITY_MODE), STANDARD_SECURITY_MODE)
include $(COMPONENTS_PATH)/../lib/MakerulesBcRouterStdSec
endif
endif

ifeq ($(STACK_TYPE), ENDDEVICE)
ifeq ($(SECURITY_MODE), NO_SECURITY_MODE)
include $(COMPONENTS_PATH)/../lib/MakerulesBcEndDevice
endif
ifeq ($(SECURITY_MODE), STANDARD_SECURITY_MODE)
include $(COMPONENTS_PATH)/../lib/MakerulesBcEndDeviceStdSec
endif
endif

# Application parameters ------------------------------
CFLAGS += -DTIMER_SENDING_PERIOD=$(TIMER_SENDING_PERIOD)
CFLAGS += -DTHRESHOLD_FAILED_TRANSMISSION=$(THRESHOLD_FAILED_TRANSMISSION)
CFLAGS += -DCOORDINATOR_EXT_PANID=$(COORDINATOR_EXT_PANID)

CFLAGS += -DCS_AUTONETWORK=$(CS_AUTONETWORK)
CFLAGS += -DCS_CHANNEL_MASK=$(CS_CHANNEL_MASK)
CFLAGS += -DCS_CHANNEL_PAGE=$(CS_CHANNEL_PAGE)
CFLAGS += -DCS_RF_TX_POWER=$(CS_RF_TX_POWER)
CFLAGS += -DCS_END_DEVICE_SLEEP_PERIOD=$(CS_END_DEVICE_SLEEP_PERIOD)
CFLAGS += -DCS_NEIB_TABLE_SIZE=$(CS_NEIB_TABLE_SIZE)
CFLAGS += -DCS_MAX_CHILDREN_AMOUNT=$(CS_MAX_CHILDREN_AMOUNT)
CFLAGS += -DCS_MAX_CHILDREN_ROUTER_AMOUNT=$(CS_MAX_CHILDREN_ROUTER_AMOUNT)
CFLAGS += -DCS_MAX_NETWORK_DEPTH=$(CS_MAX_NETWORK_DEPTH)
CFLAGS += -DCS_ROUTE_TABLE_SIZE=$(CS_ROUTE_TABLE_SIZE)
CFLAGS += -DCS_ADDRESS_MAP_TABLE_SIZE=$(CS_ADDRESS_MAP_TABLE_SIZE)
CFLAGS += -DCS_ROUTE_DISCOVERY_TABLE_SIZE=$(CS_ROUTE_DISCOVERY_TABLE_SIZE)
CFLAGS += -DCS_APS_DATA_REQ_BUFFER_SIZE=$(CS_APS_DATA_REQ_BUFFER_SIZE)
CFLAGS += -DCS_APS_ACK_FRAME_BUFFER_SIZE=$(CS_APS_ACK_FRAME_BUFFER_SIZE)
CFLAGS += -DCS_DUPLICATE_REJECTION_TABLE_SIZE=$(CS_DUPLICATE_REJECTION_TABLE_SIZE)

CFLAGS += -DCS_NWK_DATA_REQ_BUFFER_SIZE=$(CS_NWK_DATA_REQ_BUFFER_SIZE)
CFLAGS += -DCS_NWK_DATA_IND_BUFFER_SIZE=$(CS_NWK_DATA_IND_BUFFER_SIZE)

ifeq ($(TEST_NETWORK), 1)
  CFLAGS += -DTEST_NETWORK
endif

CFLAGS += -DAPP_DEV_TYPE_$(APP_DEVICE_TYPE)

ifeq ($(HAL), AT91SAM7X256)
  CFLAGS += -DUART_CHANNEL=UART_CHANNEL_0 
endif
ifeq ($(HAL), ATMEGA1281)
  CFLAGS += -DUART_CHANNEL=UART_CHANNEL_1
endif  
ifeq ($(HAL), ATMEGA2561)
  CFLAGS += -DUART_CHANNEL=UART_CHANNEL_1
endif  

# Output debug port for ARM platforms only ------------
ifeq ($(HAL), AT91SAM7X256)
  CFLAGS += -DCS_UID=$(CS_UID)
  CFLAGS += -DCS_EXT_PANID=$(CS_EXT_PANID)
  ifeq ($(DEBUG), ON)
    CFLAGS += -D_DBG_
  endif
endif

ifeq ($(USE_STATIC_ADDRESSING), 1)
  CFLAGS += -DCS_NWK_ADDR=$(CS_NWK_ADDR)
  CFLAGS += -DCS_NWK_UNIQUE_ADDR=true
endif

ifeq ($(USE_NETWORK_KEY), 1)
  CFLAGS += -DCS_NETWORK_KEY=$(CS_NETWORK_KEY)
endif
CFLAGS += -DCS_ZDO_SECURITY_STATUS=$(CS_ZDO_SECURITY_STATUS)

# Compiler specific flags -----------------------------
ifeq ($(DEBUG), ON)
  ifeq ($(COMPILER_TYPE), GCC)
    CFLAGS += -g -Os 
    #CFLAGS += -lm -lc
  endif
  ifeq ($(COMPILER_TYPE), IAR)
    CFLAGS += --debug
  endif
endif

# Include paths ---------------------------------
INCLUDES =                        \
	-I$(APP_PATH)/include     \
	-I$(SE_PATH)/include      \
	-I$(APS_PATH)/include     \
	-I$(NWK_PATH)/include     \
	-I$(ZDO_PATH)/include     \
	-I$(MAC_PHY_PATH)/include \
	-I$(HAL_PATH)/include     \
	-I$(HAL_HWD_PATH)/include \
	-I$(BSP_PATH)/include     \
	-I$(CS_PATH)/include      \
	-I$(PDS_PATH)/include     \
	-I$(TC_PATH)/include      \
	-I$(SSP_PATH)/include

# Libraries paths -------------------------------------
ifeq ($(COMPILER_TYPE), GCC)
  LIBDIRS =                         \
            -L$(COMPONENTS_PATH)/../lib \
            -L$(BSP_PATH)/lib       \
            -L$(CS_PATH)/lib        \
            -L$(PDS_PATH)/lib		\
			-L$C:/WinAVR-20080610/avr/lib
  LIBS = -l$(STACK_LIB) -l$(PDS_LIB) -l$(BSP_LIB) -l$(STACK_LIB)
endif
ifeq ($(COMPILER_TYPE), IAR)
  LIBS =                                        \
        $(COMPONENTS_PATH)/../lib/lib$(STACK_LIB).a \
        $(PDS_PATH)/lib/lib$(PDS_LIB).a         \
        $(BSP_PATH)/lib/lib$(BSP_LIB).a         \
        $(COMPONENTS_PATH)/../lib/lib$(STACK_LIB).a
endif


# Linking ---------------------------------------------
ifeq ($(COMPILER_TYPE), GCC)
  # It's easier to use indirect ld call via gcc instead of direct ld call.
  LD = $(CC)
  LINKER_FLAGS = -Xlinker -Map=$(PROJNAME).map -Wl,--gc-sections
  ifeq ($(HAL), ATMEGA1281)
    objects = $(COMPONENTS_PATH)/../lib/WdtInitatmega1281.o
    LINKER_FLAGS += $(filter -mmcu%,$(CFLAGS))
    PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
    MATH_LIB = -lm 
  endif
  ifeq ($(HAL), ATMEGA2561)
    objects = $(COMPONENTS_PATH)/../lib/WdtInitatmega2561.o
    LINKER_FLAGS += $(filter -mmcu%,$(CFLAGS))
  endif
  ifeq ($(HAL), AT91SAM7X256)
    LDSCRIPT = atmel-rom
    objects = $(COMPONENTS_PATH)/../lib/FirmwareBoot.o
    LINKER_FLAGS += $(filter -mthumb%,$(CFLAGS))
    LINKER_FLAGS += $(filter -mcpu%,$(CFLAGS))
    LINKER_FLAGS += -nostartfiles
    LINKER_FLAGS += -Xlinker -T$(LDSCRIPT).ld
  endif

  ifeq ($(DEBUG), ON)
    LINKER_FLAGS += -g -Wl -u vfprintf -lprintf_flt -lm -lc
 endif
endif
ifeq ($(COMPILER_TYPE), IAR)
  ifeq ($(HAL), AT91SAM7X256)
    LDSCRIPT = at91SAM7X256_FLASH
    objects = $(COMPONENTS_PATH)/../lib/FirmwareBoot.o
    LINKER_FLAGS  = --redirect _Printf=_PrintfTiny 
    LINKER_FLAGS += --redirect _Scanf=_ScanfSmall
    LINKER_FLAGS += --semihosting 
    LINKER_FLAGS += --entry __iar_program_start
    LINKER_FLAGS += --map $(PROJNAME).map
    LINKER_FLAGS += --config $(LDSCRIPT).icf
  endif
endif

# Objects ---------------------------------------------
objects +=                            \
  $(CS_PATH)/objs/configServer.o      \
  $(APP_PATH)/objs/kranhaken.o        \
  $(APP_PATH)/objs/krancoordinator.o   \
  $(APP_PATH)/objs/kranrouter.o        \
  $(APP_PATH)/objs/kranenddevice.o     \
  $(APP_PATH)/objs/readinclination.o   


# Targets ---------------------------------------------
all: pds bsp \
	obj_label $(objects) link $(PROJNAME).srec $(PROJNAME).hex $(PROJNAME).bin \
	size

pds: 
	make all -C $(PDS_PATH)

bsp:
	make all -C $(BSP_PATH)

obj_label:
	@echo 
	@echo -------Application objects creation ---------------
$(objects): 
	$(CC) $(CFLAGS) $(INCLUDES) $^ -o $@
$(CS_PATH)/objs/configServer.o:        $(CS_PATH)/src/configServer.c
$(APP_PATH)/objs/kranhaken.o:          $(APP_PATH)/kranhaken.c
$(APP_PATH)/objs/krancoordinator.o:   $(APP_PATH)/krancoordinator.c
$(APP_PATH)/objs/kranrouter.o:        $(APP_PATH)/kranrouter.c
$(APP_PATH)/objs/kranenddevice.o:     $(APP_PATH)/kranenddevice.c
$(APP_PATH)/objs/readinclination.o:    $(APP_PATH)/readinclination.c
#$(APP_PATH)/objs/WSNSensorManager.o:  $(APP_PATH)/WSNSensorManager.c

link:
	@echo 
	@echo -----------------Linking---------------------------
	$(LD) $(LIBDIRS) $(LINKER_FLAGS) $(objects) $(LIBS) -o $(PROJNAME).elf

%.srec:
	$(OBJCOPY) -O srec --srec-len 128 $(PROJECT) $(PROJNAME).srec

%.hex:
	$(OBJCOPY) -O ihex $(PROJECT) $(PROJNAME).hex

%.bin : $(PROJNAME).elf
	$(OBJCOPY) --strip-debug --strip-unneeded $(PROJNAME).elf -O binary $(PROJNAME).bin

size:
	$(SIZE) -td $(PROJECT)

# Cleaning... ------------------------------------------
clean:
	@echo 
	@echo -------Application cleaning------------------------
	-rm -rf $(TARGET) $(PROJECT) $(PROJNAME).hex $(PROJNAME).eep $(PROJNAME).srec $(PROJNAME).bin $(APP_PATH)/objs/*.o $(PROJNAME).map
	make clean -C $(PDS_PATH)
	make clean -C $(CS_PATH)
	make clean -C $(BSP_PATH)

# eof Makefile
