cmake_minimum_required(VERSION 3.10)

set(CMAKE_C_COMPILER avr-gcc)
set(CMAKE_CXX_COMPILER avr-g++)

project(ATtiny45NeoPixel C CXX)

set(MCU "attiny45")
set(F_CPU 8000000)
set(AVRDUDE_PROGRAMMER "arduino")
set(AVRDUDE_PORT "/dev/ttyACM1")
set(AVRDUDE_BAUDRATE 115200)

set(CMAKE_C_FLAGS "-Wall -Os -mmcu=${MCU} -DF_CPU=${F_CPU}UL")
set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS} -std=c++11 -fno-exceptions -fno-rtti")
set(CMAKE_EXE_LINKER_FLAGS "-Wl,-gc-sections -mmcu=${MCU}")

set(SOURCES main.c)

add_executable(${PROJECT_NAME}.elf ${SOURCES})
set_target_properties(${PROJECT_NAME}.elf PROPERTIES
    OUTPUT_NAME "${PROJECT_NAME}.elf"
)

add_custom_command(
    TARGET ${PROJECT_NAME}.elf POST_BUILD
    COMMAND avr-objcopy -O ihex -R .eeprom ${PROJECT_NAME}.elf ${PROJECT_NAME}.hex
    COMMENT "Converting ELF to Intel HEX"
)

add_custom_target(
    flash ALL
    COMMAND avrdude -c ${AVRDUDE_PROGRAMMER} -p ${MCU} -P ${AVRDUDE_PORT} -b ${AVRDUDE_BAUDRATE} -U flash:w:${PROJECT_NAME}.hex:i
    DEPENDS ${PROJECT_NAME}.elf
    COMMENT "Flashing ${PROJECT_NAME}.hex to ${MCU}"
)

# --- Fuse Setting Target (make fuses) ---
# NOTE: Set fuses to use the 8MHz internal oscillator.
# ATtiny45 default is 8MHz, but divided by 8 (1MHz). This sets the CKDIV8 fuse to be UNPROGRAMMED.
# Low Fuse (L): 0xE2 (Internal 8MHz Oscillator, Start-up time 6 CK + 65ms, **CKDIV8 disabled**)
# High Fuse (H): 0xDF (Default, Brown-out detection enabled)
# Extended Fuse (E): 0xFF (Default, Self-programming disabled)
add_custom_target(
    fuses
    COMMAND avrdude -c ${AVRDUDE_PROGRAMMER} -p ${MCU} -P ${AVRDUDE_PORT} -b ${AVRDUDE_BAUDRATE} -U lfuse:w:0xE2:m -U hfuse:w:0xDF:m -U efuse:w:0xFF:m
    COMMENT "Setting fuses for 8MHz internal clock (L: 0xE2, H: 0xDF, E: 0xFF)"
)
