import sys

import waftools.objcopy

from resources.types.resource_definition import ResourceDefinition
from resources.types.resource_object import ResourceObject

CUSTOM_CONFIG_H_PATH = 'config/custom_config_boot.h'


def build(bld):
    bld.env.append_value('DEFINES', ['BLE_BOOTLOADER=1'])

    sys.path.append(bld.path.find_node('../..').abspath())
    from dialog_waf import get_sdk_node, collect_sdk_sources, generate_mem_ld

    mem_ld_node = generate_mem_ld(bld, CUSTOM_CONFIG_H_PATH)

    # Collect source files:
    source_dirs = ['src', '../common/src']
    sources = sum([bld.path.ant_glob('%s/**/*.c' % d)
                   for d in source_dirs], [])
    sdk_sources = [
        'sdk/bsp/startup/vector_table.S',
        'sdk/bsp/startup/startup_ARMCM0.S',
        'sdk/bsp/startup/system_ARMCM0.c',
        'sdk/bsp/startup/config.c',
        'sdk/bsp/peripherals/src/hw_cpm.c',
        'sdk/bsp/peripherals/src/hw_dma.c',
        'sdk/bsp/peripherals/src/hw_gpio.c',
        'sdk/bsp/peripherals/src/hw_spi.c',
        'sdk/bsp/peripherals/src/hw_uart.c',
        'sdk/bsp/peripherals/src/hw_watchdog.c',

        # Used by system_ARMCM0.c:
        'sdk/bsp/peripherals/src/hw_otpc.c',
        'sdk/bsp/peripherals/src/sys_tcs.c',
    ]
    sources.extend(collect_sdk_sources(bld, sdk_sources))

    linkflags = ['-Wl,-Map,bt_da14681_boot.map',
                 '-Wl,--build-id=sha1']

    # Includes:
    includes = ['include', '../common/include', '../../include', 'config']
    elf_node = bld.path.get_bld().make_node('bt_da14681_boot.elf')
    bld.program(features='c asm cprogram',
                source=sources,
                includes=includes,
                target=elf_node,
                lib=['gcc'],
                linkflags=linkflags,
                ldscript=mem_ld_node,
                inject_include_files=[CUSTOM_CONFIG_H_PATH],
                use=['dialog_sdk_includes', 'dialog_board_boot',
                     'pblibc-cm0', 'libutil_includes', 'libutil-cm0'])

    bld.add_manual_dependency(elf_node, mem_ld_node)

    bin_node = elf_node.change_ext('.bin')
    bld(rule=waftools.objcopy.objcopy_bin, source=elf_node, target=bin_node)

    def create_bt_patch_resource(task):
        bin_data = task.inputs[0].read('rb')
        reso = ResourceObject(ResourceDefinition('raw', 'BT_BOOT_IMAGE', None,
                              storage=task.generator.storage), bin_data)
        reso.dump(task.outputs[0])

    reso_node = elf_node.change_ext('.bin.reso')
    bld(rule=create_bt_patch_resource, source=bin_node, target=reso_node,
        storage=bld.get_bluetooth_fw_storage())

    bld.DYNAMIC_RESOURCES.append(reso_node)

def configure(ctx):
    pass


# vim:filetype=python
