# Project name
project(usbLedController C CXX ASM)

# CMake version
cmake_minimum_required(VERSION 3.0)

# Options
set(MCU "attiny44" CACHE STRING "Processor Type")
set(CPU_SPEED "12000000" CACHE STRING "Speed of the CPU")
set(PROGRAMMER "usbasp" CACHE STRING "Programmer Type")
set(COMPILE_FLAGS "" CACHE STRING "Additional Compiler Flags")

# Set own source files  
set(SRC_FILES  main.c writepin.c usbdrv/usbdrvasm.S usbdrv/usbdrv.c usbdrv/oddebug.c)

# Compiler suite specification
set(CMAKE_C_COMPILER /usr/bin/avr-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/avr-g++)
set(CMAKE_ASM_COMPILER /usr/bin/avr-gcc)
set(CMAKE_OBJCOPY /usr/bin/avr-objcopy)
set(CMAKE_OBJDUMP /usr/bin/avr-objdump)
set(CMAKE_RANLIB /usr/bin/avr-ranlib)
set(CMAKE_LINKER /usr/bin/avr-ld)

# Compiler flags
add_definitions(-mmcu=${MCU} -DF_CPU=${CPU_SPEED} -c -g -O2 -flto -ffunction-sections -fdata-sections  )

set(CMAKE_CXX_FLAGS "-std=c++17 -fno-exceptions -fno-rtti")

# Linker flags
set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")   # remove -rdynamic for C
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") # remove -rdynamic for CXX
set(CMAKE_SHARED_LIBRARY_LINK_ASM_FLAGS "") # remove -rdynamic for ASM
set(CMAKE_EXE_LINKER_FLAGS "-s -Os -Wl,--gc-sections -mmcu=${MCU}")

add_executable(${PROJECT_NAME} ${SRC_FILES})

find_program(AR_AVRDUDE NAMES avrdude PATHS /usr/bin NO_DEFAULT_PATH)
find_program(AR_AVRSIZE NAMES avr-size PATHS /usr/bin NO_DEFAULT_PATH)

add_custom_target(download 
	COMMAND ${CMAKE_OBJCOPY} -j .text -j .data -O ihex ${PROJECT_NAME} ${PROJECT_NAME}.hex
	COMMAND ${AR_AVRSIZE} -C ${PROJECT_NAME}
	COMMAND ${AR_AVRDUDE} -B 20 -v -p ${MCU} -c ${PROGRAMMER} -U flash:w:${PROJECT_NAME}.hex
	DEPENDS ${PROJECT_NAME}
	)
	
	message(STATUS "${CPU_SPEED}")
	
add_custom_target(export 
COMMAND ${CMAKE_OBJCOPY} -j .text -j .data -O ihex ${PROJECT_NAME} ${PROJECT_NAME}.hex
COMMAND ${AR_AVRSIZE} -C ${PROJECT_NAME}
DEPENDS ${PROJECT_NAME}
)

add_custom_target(fuses  
COMMAND ${AR_AVRDUDE} -B 100 -v -p ${MCU} -c ${PROGRAMMER} -U lfuse:w:0xEE:m 	-U hfuse:w:0xDF:m 	-U efuse:w:0xFF:m 	-U lock:w:0xFF:m
)

target_include_directories(${PROJECT_NAME} PRIVATE ./usbdrv)
