# $Id: Makefile.common,v 1.3 2010/08/24 16:24:11 joxe Exp $

ARCH=spi.c ds2411.c xmem.c i2c.c node-id.c sensors.c cfs-coffee.c \
     cc2420.c cc2420-arch.c cc2420-arch-sfd.c \
     sky-sensors.c uip-ipchksum.c \
     uart1.c slip_uart1.c uart1-putchar.c

CONTIKI_TARGET_DIRS = . dev apps net
ifndef CONTIKI_TARGET_MAIN
CONTIKI_TARGET_MAIN = contiki-sky-main.c
endif

ifdef IAR
CFLAGS += -D__MSP430F1611__=1 -e --vla -Ohz --multiplier=16s --core=430 --double=32
CFLAGSNO = --dlib_config "$(IAR_PATH)/LIB/DLIB/dl430fn.h" $(CFLAGSWERROR)
endif

CONTIKI_TARGET_SOURCEFILES += $(ARCH) $(UIPDRIVERS)

MCU=msp430f1611
include $(CONTIKI)/cpu/msp430/Makefile.msp430

contiki-$(TARGET).a: ${addprefix $(OBJECTDIR)/,symbols.o}
#	$(AR) rcf $@ $^


ifdef IAR
LDFLAGSNO += -xm "$(IAR_PATH)/lib/dlib/dl430fn.r43" -f "$(IAR_PATH)/config/lnk430f1611.xcl"
LDFLAGS += $(LDFLAGSNO) -Felf -yn
endif # IAR

NUMPAR=20

# Check if we are running under Windows
ifeq ($(HOST_OS),Windows)
  USBDEVPREFIX=/dev/com
  SERIALDUMP = $(CONTIKI)/tools/sky/serialdump-windows
  MOTELIST = $(CONTIKI)/tools/sky/motelist-windows
  TMOTE_BSL_FILE = tmote-bsl
  TMOTE_BSL=$(if $(wildcard $(CONTIKI)/tools/sky/$(TMOTE_BSL_FILE).exe),1,0)
  ifeq ($(TMOTE_BSL), 1)
    NUMPAR = 1
    BSL =  $(CONTIKI)/tools/sky/$(TMOTE_BSL_FILE)
    MOTES = $(shell $(MOTELIST) | grep COM | \
       cut -f 4 -d \  )
  else
    BSL = $(CONTIKI)/tools/sky/msp430-bsl-windows --telosb
    BSL_FILETYPE = -I
    MOTES = $(shell $(MOTELIST) | grep COM | \
       cut -f 4 -d \  | \
       perl -ne 'print $$1 - 1 . " " if(/COM(\d+)/);')
  endif
  CMOTES = $(shell $(MOTELIST) | grep COM | \
     cut -f 4 -d \  | \
     perl -ne 'print $$1 . " " if(/COM(\d+)/);')
else
ifeq ($(HOST_OS),Darwin)
  ifndef MOTELIST
    USBDEVPREFIX=
    SERIALDUMP = $(CONTIKI)/tools/sky/serialdump-macos
    MOTELIST = $(CONTIKI)/tools/sky/motelist-macos
    TMOTE_BSL_FILE = tmote-bsl-linux
    TMOTE_BSL=$(if $(wildcard $(CONTIKI)/tools/sky/$(TMOTE_BSL_FILE)),1,0)
    ifeq ($(TMOTE_BSL), 1)
      PATH := $(PATH):$(CONTIKI)/tools/sky
      BSL =  $(CONTIKI)/tools/sky/$(TMOTE_BSL_FILE)
      NUMPAR = 1
    else
      BSL = $(CONTIKI)/tools/sky/msp430-bsl-linux --telosb
      BSL_FILETYPE = -I
    endif
    MOTES = $(shell $(MOTELIST) 2>&- | grep usbserial | \
       cut -f 4 -d \  | \
       perl -ne 'print $$1 . " " if(m-(/dev/[\w+\.\-]+)-);')
    CMOTES=$(MOTES)
  endif
else
  # Else we assume Linux
  ifndef MOTELIST
    USBDEVPREFIX=
    SERIALDUMP = $(CONTIKI)/tools/sky/serialdump-linux
    MOTELIST = $(CONTIKI)/tools/sky/motelist-linux
    TMOTE_BSL_FILE = tmote-bsl-linux
    TMOTE_BSL=$(if $(wildcard $(CONTIKI)/tools/sky/$(TMOTE_BSL_FILE)),1,0)
    ifeq ($(TMOTE_BSL), 1)
      PATH := $(PATH):$(CONTIKI)/tools/sky
      BSL =  $(CONTIKI)/tools/sky/$(TMOTE_BSL_FILE)
      NUMPAR = 1
    else
      BSL = $(CONTIKI)/tools/sky/msp430-bsl-linux --telosb
      BSL_FILETYPE = -I
    endif
    ifdef MOTEIDS
  	  MOTES = $(foreach MOTEID, $(MOTEIDS), $(shell $(MOTELIST)  2>&- | grep $(MOTEID) | \
          cut -f 4 -d \  | \
          perl -ne 'print $$1 . " " if(m-(/dev/[\w+\.\-]+)-);')) 
    else
      MOTES = $(shell $(MOTELIST) 2>&- | grep USB | \
         cut -f 4 -d \  | \
         perl -ne 'print $$1 . " " if(m-(/dev/[\w+\.\-]+)-);')
    endif
    CMOTES=$(MOTES)
  endif
endif
endif

motelist: sky-motelist

sky-motelist:
	$(MOTELIST)
sky-motes:
	@echo $(MOTES)

ifdef MOTE
%.upload: %.ihex
	$(MAKE) IHEXFILE=$< sky-u.$(subst /,_,$(word $(MOTE), $(MOTES)))
else # MOTE
%.upload: %.ihex
	$(MAKE) IHEXFILE=$< sky-reset sky-upload
endif # MOTE

upload-ihex:
ifdef FILE
	@echo Uploading $(FILE)
ifdef MOTE
	$(MAKE) IHEXFILE=$(FILE) sky-u.$(subst /,_,$(word $(MOTE), $(MOTES)))
else # MOTE
	$(MAKE) sky-reset sky-upload
endif # MOTE
else
	@echo Example: $(MAKE) upload-ihex FILE=myfile.ihex
endif

sky-upload: sky-reset
	$(MAKE) -j $(NUMPAR) sky-upload-sequence

sky-upload-sequence:	$(foreach PORT, $(MOTES), sky-u.$(subst /,_,$(PORT)))
	@echo Done

sky-reset:
	$(MAKE) -k -j $(NUMPAR) sky-reset-sequence

sky-reset-sequence:	$(foreach PORT, $(MOTES), sky-r.$(subst /,_,$(PORT)))
	@echo Done

sky-u.%:
	@echo +++++ Erasing $(subst _,/,$*); \
	$(BSL) -c $(subst _,/,$*) -e && sleep 2 ; \
	echo +++++ Programming $(subst _,/,$*) ; \
	$(BSL) -c $(subst _,/,$*) $(BSL_FILETYPE) -p $(IHEXFILE) && sleep 2 ; \
	echo +++++ Resetting $(subst _,/,$*) ; \
	$(BSL) -c $(subst _,/,$*) -r

sky-r.%:
	$(BSL) -c $(subst _,/,$*) -r

sizeplot:
	msp430-size $(OBJECTDIR)/*.o | $(CONTIKI)/tools/sky/check-size > size-data
	gnuplot $(CONTIKI)/tools/sky/plot-size
	gv size.pdf

winslip:
ifdef INTERFACE
	$(CONTIKI)/tools/wpcapslip/wpcapslip -s $(USBDEVPREFIX)$(firstword $(CMOTES)) $(INTERFACE) 172.16.0.0 255.255.0.0
else
	@echo "Usage: \"$(MAKE) $@ INTERFACE=<the IP address of a local network interface>\""
	@echo "Use the \"ipconfig\" command to find out the IP addresses of the local interfaces"
endif

linslip: $(CONTIKI)/tools/tunslip
	$(CONTIKI)/tools/tunslip -s $(USBDEVPREFIX)$(firstword $(CMOTES)) 172.16.0.0 255.255.0.0

$(CONTIKI)/tools/tunslip:
	(cd $(CONTIKI)/tools; $(MAKE) tunslip)

ifdef MOTE
serialdump:
	$(SERIALDUMP) -b115200 $(USBDEVPREFIX)$(word $(MOTE), $(CMOTES)) | $(CONTIKI)/tools/timestamp | tee serialdump-`date +%Y%m%d-%H%M`

serialview:
	$(SERIALDUMP) -b115200 $(USBDEVPREFIX)$(word $(MOTE), $(CMOTES)) | $(CONTIKI)/tools/timestamp

login:
	$(SERIALDUMP) -b115200 $(USBDEVPREFIX)$(word $(MOTE), $(CMOTES))
else
serialdump:
	$(SERIALDUMP) -b115200 $(USBDEVPREFIX)$(firstword $(CMOTES)) | $(CONTIKI)/tools/timestamp | tee serialdump-`date +%Y%m%d-%H%M`

serialview:
	$(SERIALDUMP) -b115200 $(USBDEVPREFIX)$(firstword $(CMOTES)) | $(CONTIKI)/tools/timestamp

login:
	$(SERIALDUMP) -b115200 $(USBDEVPREFIX)$(firstword $(CMOTES))
endif