#
# 'make report' funktioniert nur, wenn man vorher auch make clean
# gemacht hat, weil ansonsten noch die alten make-rules 
# gelten.
#


# avrdebug
AVRDEBUG_OPTS := -a ser2 -d /dev/ttyUSB1 -c 19200 -i SPI -C 100

# Projektverzeichnis
PROJDIR := /home/jens/projekte

# Verzeichnis DIESES Projekts
CURPROJDIR := $(shell pwd)

# Devicecode fr avrdude
#DUDEDEVICE := 8535
DUDEDEVICE := m16

# Spannungsbereich
VOLTAGE    := 4.5-5.5

# Quelldateien
SRCFILES_ASM = $(wildcard $(CURPROJDIR)/src/asm/*.avr)
SRCFILES_ASM += $(wildcard $(CURPROJDIR)/src/asm/*.tab)

JAVAROOT := /usr/lib/java/

# Welches sind die Eingabedateien fr den Konstantengenerator?
JCOCOINFILES := src/autoconst/common.xml src/autoconst/hw.xml 

# Welche Dateien werden durch den Konstantengenerator erzeugt, mssen aber
# noch durch den Prprozessor?
JCOCOOUTFILES := 

# In dieser Datei steht die OS-Konfiguration
OS_CONFFILE := src/autoconst/avrdev.xml
# An dieser Stelle steht die OS-Konfiguration
OS_CONFPATH := avrdev.OS

# Betriebssystem
OS_DIR := avros/avros002/current

# Hauptprogramm im Ausgabeverzeichnis, ohne Endung
MAINOUT := $(CURPROJDIR)/out/asm-after-pp/main

# Assembler
AVRASM := tavrasm

#
AVRASMEXTR := $(PROJDIR)/tavrasmParse/tavrasmParse

# Scriptdateien fr avrdebug
AVRDEBUGSCRIPTS_IN := $(wildcard $(CURPROJDIR)/avrdebug/*)

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

#
AVRDEBUGSCRIPTS_OUT := $(foreach base,$(basename $(notdir $(AVRDEBUGSCRIPTS_IN))),$(CURPROJDIR)/out/$(base).pdebug)

# 
PREPROFILES := $(foreach base,$(JCOCOOUTFILES),$(CURPROJDIR)/$(base))

# Quelldateien mssen erst durch den Prprozessor
SRCFILES_PP   := $(subst $(CURPROJDIR)/src/asm/, $(CURPROJDIR)/out/asm-after-pp/, $(SRCFILES_ASM))
SRCFILES_DEPS := $(foreach base,$(SRCFILES_PP),$(base).deps)

# Das ext-Verzeichnis des JSDK; hier sollte jCoCoBase.jar liegen
#JSDK_EXT_DIR := $(JAVAROOT)/jre/lib/ext
JSDK_EXT_DIR := /usr/lib/kaffe/lib
# javac
JSDK_C   := javac
# java VM
JSDK_VM  := java
# jar
JSDK_JAR := jar

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

.PHONY: report clean reportNuMachSchon flash fuses showfuse debug debugreset


all:       pp $(MAINOUT).hex $(AVRDEBUGSCRIPTS_OUT)
                
pp:        autoconst $(SRCFILES_DEPS) $(SRCFILES_PP)

autoconst: out/autoconst/T_CoCoUser.class out/autoconst/conf.done
	
avros:     out/os/osconf.done out/os/os.avr

report: clean pp reportNuMachSchon

reportNuMachSchon:
	@echo --- Report ber Programm erstellen
	@$(JSDK_VM) -cp $(PROJDIR)/avrasmpp/current/out/ T_ReportParser $(CURPROJDIR)/out/report.xml

        
clean:
	#-@rm ./out/*
	-@rm -f ./out/asm-after-pp/*
	-@rm -f ./out/autoconst/*
	-@rm -f ./out/os/*
	-@rm -f ./out/tmp/*
	-@rm -f ./out/report.xml
	-@rm -f ./out/*.pdebug
	-@rm -f ./out/*.txt
	-@rm -f ./out/*.xml

flash:
	@echo --- AVR flashen
	@/usr/local/bin/scripte/avrprog_setvoltage.sh $(VOLTAGE)
	@/usr/local/bin/scripte/avrprog_02.sh ./out/asm-after-pp/main.hex nofile $(DUDEDEVICE)


showfuse:
	@echo --- Fuses
	@/usr/local/bin/scripte/avrprog_showfuses.sh $(DUDEDEVICE)
        
fuses:
ifeq ($(DUDEDEVICE), m16)
# Die Fuses entsprechend der Hardware programmieren, soweit sie
# von den defaults abweichen. Was gendert werden muss:
# -OCDEN         1 (unprogrammed, disabled)
# -JTAG          1 (unprogrammed, disabled)
# -SPIEN         0 (programmed, enabled)
# -CKOPT         1 (unprogrammed)
# -EESAVE        0 (programmed, content preserved)
# -BOOTSZ1       0 (programmed)
# -BOOTSZ0       0 (programmed)
# -BOOTRST       1 (unprogrammed)
#   high fuse ist also 11010001b=0xD1=209
# -BODLEVEL      0 (programmed, 4V)
# -BODEN         0 (programmed, enabled)
# -SUT 1..0 auf 01
# -CKSEL 3..1    1 (unprogrammed)
# -CKSEL 0       1 (unprogrammed)
#   low fuse ist also 00011111b=0x1F=31
	@echo --- Fuses programmieren: mega16
	@echo sowas wie avrdude -C /etc/avrdude.conf -v -v -p m16 -P /dev/ttyUSB1 -b 19200 -c avr910 -U lfuse:w:0x1F:m
	@echo sowas wie avrdude -C /etc/avrdude.conf -v -v -p m16 -P /dev/ttyUSB1 -b 19200 -c avr910 -U hfuse:w:0xD1:m
endif
ifeq ($(DUDEDEVICE), 8535)
	@echo --- Fuses programmieren: 8535
endif

debug:
	@echo --- AVRDebug ausfhren
	@/usr/local/bin/scripte/avrprog_setvoltage.sh $(VOLTAGE)
	@/home/jens/elektronik/avrdebug/avrdebug $(AVRDEBUG_OPTS)

debugreset:
	@echo --- AVRDebug ausfhren
	@/usr/local/bin/scripte/avrprog_setvoltage.sh $(VOLTAGE)
	@/home/jens/elektronik/avrdebug/avrdebug reset


# Scripte fr avrdebug
$(CURPROJDIR)/out/%.pdebug : $(CURPROJDIR)/avrdebug/%.debug $(CURPROJDIR)/out/asm-after-pp/SRAM.txt
	@echo --- Script fr avrdebug
	@cpp -P -include ./out/asm-after-pp/SRAM.txt $< $@

### Regeln fr das OS ###############################################

out/os/osconf.done: $(OS_CONFFILE) $(PROJDIR)/$(OS_DIR)/config/out/T_CoCoUser.class
	@echo --- Betriebssystem configurieren
	@cd $(PROJDIR)/$(OS_DIR)/config/out/ ; \
           $(JSDK_VM) T_CoCoUser file://$(CURPROJDIR)/$(OS_CONFFILE) $(OS_CONFPATH) $(CURPROJDIR)/out/os/
	@touch out/os/osconf.done

out/os/os.avr: $(PROJDIR)/$(OS_DIR)/src/os.avr $(CURPROJDIR)/$(OS_CONFFILE)
	@echo --- Betriebssystemkern kopieren
	@$(JSDK_VM) -cp $(PROJDIR)/avrasmpp/current/out/ T_AvrAsmPP      \
                $(PROJDIR)/$(OS_DIR)/src/os.avr                          \
                $(CURPROJDIR)/out/os/os.avr                              \
                -Dfile://$(CURPROJDIR)/$(OS_CONFFILE):$(OS_CONFPATH)     \
                -Dfile://$(CURPROJDIR)/out/os/os_autoconst.xml


## Regeln fr autoconst #############################################

out/autoconst/conf.done: $(JCOCOINFILES)
	@echo --- Konstantengenerator ausfhren
	@cd out/autoconst ; $(JSDK_VM) T_CoCoUser
	@touch out/autoconst/conf.done

out/autoconst/T_CoCoUser.class: src/autoconst/CoCoUser.java
	@echo --- Compiling $<
	-@rm out/autoconst/conf.done
	@$(JSDK_C) -classpath $(JSDK_EXT_DIR)/jCoCoBase.jar:$(JSDK_EXT_DIR)/jAVR.jar:. $<
	@mv ./src/autoconst/T_CoCoUser.class ./out/autoconst/

## Erzeugung des Bin-Files ##########################################

$(MAINOUT).hex: $(SRCFILES_PP) out/autoconst/conf.done pp
	@echo --- Assembler
	@cd ./out/asm-after-pp/ ;  ${AVRASM} -c main.avr -r main.avr.ee -e main.avr.list
	@echo --- Variablenadressen extrahieren
	@cd ./out/asm-after-pp/ ;  ${AVRASMEXTR} main.avr.list > SRAM.txt

## Regeln fr Prprozessor ##########################################

# Diese Regel erzeugt die Regeln und auch die avr-asm-Dateien im ersten
# Schritt, wenn die Regeln (s.u.) noch nicht existieren.
$(CURPROJDIR)/out/asm-after-pp/% : $(CURPROJDIR)/src/asm/%
	@echo --- Prprozessor-Erstlauf: $<
	@$(JSDK_VM) -cp $(PROJDIR)/avrasmpp/current/out/ T_AvrAsmPP $< $(CURPROJDIR)/out/asm-after-pp/ -R$(CURPROJDIR)/out/report.xml

# Diese Regel erzeugt die Regeln und auch die avr-asm-Dateien im ersten
# Schritt, wenn die Regeln (s.u.) noch nicht existieren.
$(CURPROJDIR)/out/tmp-after-pp/% : $(CURPROJDIR)/out/tmp/%
	@echo --- Prprozessor-Erstlauf: $<
	@$(JSDK_VM) -cp $(PROJDIR)/avrasmpp/current/out/ T_AvrAsmPP $< $(CURPROJDIR)/out/tmp-after-pp/ -R$(CURPROJDIR)/out/report.xml

# folgende Makefiles berschreiben die obige Regel
-include $(SRCFILES_DEPS)
