1# Copyright (c) 2024 NXP
2#
3# SPDX-License-Identifier: Apache-2.0
4
5'''Runner for teensy .'''
6
7import os
8import subprocess
9
10from runners.core import ZephyrBinaryRunner
11
12
13class TeensyBinaryRunner(ZephyrBinaryRunner):
14    '''Runner front-end for teensy.'''
15
16    def __init__(self, cfg, mcu, teensy_loader):
17        super().__init__(cfg)
18
19        self.mcu_args = ['--mcu', mcu]
20        self.teensy_loader = teensy_loader
21        self.hex_name = cfg.hex_file
22
23    @classmethod
24    def name(cls):
25        return 'teensy'
26
27    @classmethod
28    def do_add_parser(cls, parser):
29        parser.add_argument('--mcu', required=True,
30                            help='Teensy mcu target')
31        parser.add_argument('--teensy', default='teensy_loader_cli',
32                            help='path to teensy cli tool, default is teensy_loader_cli')
33
34    @classmethod
35    def do_create(cls, cfg, args):
36        ret = TeensyBinaryRunner(
37            cfg, args.mcu,
38            teensy_loader=args.teensy)
39        return ret
40
41    def do_run(self, command):
42        self.require(self.teensy_loader)
43        if command == 'flash':
44            self.flash()
45
46    def flash(self):
47        if self.hex_name is not None and os.path.isfile(self.hex_name):
48            fname = self.hex_name
49        else:
50            raise ValueError(
51                f'Cannot flash; no hex ({self.hex_name}) file found. ')
52
53        cmd = ([self.teensy_loader] +
54               self.mcu_args +
55               [fname])
56
57        self.logger.info(f'Flashing file: {fname}')
58
59        try:
60            self.check_output(cmd)
61            self.logger.info('Success')
62        except subprocess.CalledProcessError as grepexc:
63            self.logger.error(f"Failure {grepexc.returncode}")
64