# Copyright (c) 2019, Timon Baetz
#
# SPDX-License-Identifier: Apache-2.0

'''HiFive1-specific (flash only) runner.'''

from os import path

from runners.core import ZephyrBinaryRunner, RunnerCaps


class HiFive1BinaryRunner(ZephyrBinaryRunner):
    '''Runner front-end for the HiFive1 board, using openocd.'''

    def __init__(self, cfg):
        super(HiFive1BinaryRunner, self).__init__(cfg)
        self.openocd_config = path.join(cfg.board_dir, 'support', 'openocd.cfg')

    @classmethod
    def name(cls):
        return 'hifive1'

    @classmethod
    def capabilities(cls):
        return RunnerCaps(commands={'flash'})

    @classmethod
    def do_add_parser(cls, parser):
        pass

    @classmethod
    def create(cls, cfg, args):
        if cfg.gdb is None:
            raise ValueError('--gdb not provided at command line')

        return HiFive1BinaryRunner(cfg)

    def do_run(self, command, **kwargs):
        self.require(self.cfg.openocd)
        self.require(self.cfg.gdb)
        openocd_cmd = ([self.cfg.openocd, '-f', self.openocd_config])
        gdb_cmd = ([self.cfg.gdb, self.cfg.elf_file, '--batch',
                    '-ex', 'set remotetimeout 240',
                    '-ex', 'target extended-remote localhost:3333',
                    '-ex', 'load',
                    '-ex', 'quit'])
        self.run_server_and_client(openocd_cmd, gdb_cmd)
