#!/usr/bin/env python3
# Copyright 2019 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""Detects attached stm32f429i-disc1 boards connected via mini usb."""

import logging
import typing

import coloredlogs  # type: ignore
import serial.tools.list_ports  # type: ignore

# Vendor/device ID to search for in USB devices.
_ST_VENDOR_ID = 0x0483
_DISCOVERY_MODEL_ID = 0x374b

_LOG = logging.getLogger('stm32f429i_detector')


class BoardInfo(typing.NamedTuple):
    """Information about a connected dev board."""
    dev_name: str
    serial_number: str


def detect_boards() -> list:
    """Detect attached boards, returning a list of Board objects."""
    boards = []
    all_devs = serial.tools.list_ports.comports()
    for dev in all_devs:
        if dev.vid == _ST_VENDOR_ID and dev.pid == _DISCOVERY_MODEL_ID:
            boards.append(
                BoardInfo(dev_name=dev.device,
                          serial_number=dev.serial_number))
    return boards


def main():
    """This detects and then displays all attached discovery boards."""

    # Try to use pw_cli logs, else default to something reasonable.
    try:
        import pw_cli.log  # pylint: disable=import-outside-toplevel
        pw_cli.log.install()
    except ImportError:
        coloredlogs.install(level='INFO',
                            level_styles={
                                'debug': {
                                    'color': 244
                                },
                                'error': {
                                    'color': 'red'
                                }
                            },
                            fmt='%(asctime)s %(levelname)s | %(message)s')

    boards = detect_boards()
    if not boards:
        _LOG.info('No attached boards detected')
    for idx, board in enumerate(boards):
        _LOG.info('Board %d:', idx)
        _LOG.info('  - Port: %s', board.dev_name)
        _LOG.info('  - Serial #: %s', board.serial_number)


if __name__ == '__main__':
    main()
