Codebase list hinawa-utils / HEAD hinawa-dice-common-cli
HEAD

Tree @HEAD (Download .tar.gz)

hinawa-dice-common-cli @HEADraw · history · blame

#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (C) 2018 Takashi Sakamoto

from hinawa_utils.misc.cli_kit import CliKit
from hinawa_utils.dice.dice_unit import DiceUnit


def handle_current_status(unit, args):
    print('owner address: {0:016x}'.format(unit.get_owner_addr()))
    print('global enabled: {0}'.format(unit.get_enabled()))
    print('clock status:')
    for name, value in unit.get_clock_status().items():
        print('  {0}: {1}'.format(name, value))
    print('clock source detection:')
    for name, value in unit.get_external_clock_states().items():
        print('  {0}: {1}'.format(name, ', '.join(value)))
    print('measured rate: {0}'.format(unit.get_measured_sampling_rate()))
    print('dice version: {0}'.format(unit.get_dice_version()))
    print('latest notification: 0x{0:08x}'.format(
        unit.get_latest_notification()))
    print('clock source: {0}'.format(unit.get_clock_source()))
    print('sampling rate: {0}'.format(unit.get_sampling_rate()))
    print('nickname: {0}'.format(unit.get_nickname()))
    print('Transmitted streams:')
    for i, params in enumerate(unit.get_tx_params()):
        print('  Stream {0}:'.format(i))
        print('    iso-channel: 0x{0:08x}'.format(params['iso-channel']))
        print('    speed:       {0}'.format(params['speed']))
        print('    pcm:         {0}'.format(params['pcm']))
        print('    midi:        {0}'.format(params['midi']))
        if 'iec60958' in params:
            print('    iec60958:')
            print('      caps:      {0}'.format(params['iec60958']['caps']))
            print('      enable:    {0}'.format(params['iec60958']['enable']))
        print('    formation:')
        for j, name in enumerate(params['formation']):
            print('      {0}:         {1}'.format(j, name))
    print('Received streams:')
    for i, params in enumerate(unit.get_rx_params()):
        print('  Stream {0}:'.format(i))
        print('    iso-channel: 0x{0:08x}'.format(params['iso-channel']))
        print('    start:       {0}'.format(params['start']))
        print('    pcm:         {0}'.format(params['pcm']))
        print('    midi:        {0}'.format(params['midi']))
        if 'iec60958' in params:
            print('    iec60958:')
            print('      caps:      {0}'.format(params['iec60958']['caps']))
            print('      enable:    {0}'.format(params['iec60958']['enable']))
        print('    formation:')
        for j, name in enumerate(params['formation']):
            print('      {0}:         {1}'.format(j, name))
    sync_clock_source = unit.get_external_sync_clock_source()
    if sync_clock_source != '':
        sync_locked = unit.get_external_sync_locked()
        sync_rate = unit.get_external_sync_rate()
        sync_adat_status = unit.get_external_sync_adat_status()

        print('Synchronization infomation:')
        print('  clock-source:  {0}'.format(sync_clock_source))
        print('  locked:        {0}'.format(sync_locked))
        print('  sampling-rate: {0}'.format(sync_rate))
        print('  adat-status:   {0:x}'.format(sync_adat_status))

    return True


def handle_sampling_rate(unit, args):
    ops = ('set', 'get')
    rates = unit.get_supported_sampling_rates()
    if len(args) > 0 and args[0] in ops:
        op = args[0]
        if op == ops[0] and len(args) == 2:
            rate = int(args[1])
            unit.set_sampling_rate(rate)
        else:
            print(unit.get_sampling_rate())
        return True
    print('Arguments for sampling-rate command:')
    print('  sampling-rate OPERATION [RATE]')
    print('    OP:     [{0}]'.format('|'.join(ops)))
    print('    RATE:   [{0}]'.format('|'.join(map(str, rates))))
    return False


def handle_clock_source(unit, args):
    ops = ('set', 'get')
    sources = unit.get_supported_clock_sources()
    if len(args) > 0 and args[0] in ops:
        op = args[0]
        if op == ops[0] and len(args) == 2:
            source = args[1]
            unit.set_clock_source(source)
        else:
            print(unit.get_clock_source())
        return True
    print('Arguments for clock-source command:')
    print('  clock-source OPERATION [SOURCE]')
    print('    OP:     [{0}]'.format('|'.join(ops)))
    print('    SOURCE: [{0}]'.format('|'.join(sources)))
    return False


def handle_nickname(unit, args):
    ops = ('set', 'get')
    if len(args) > 0 and args[0] in ops:
        op = args[0]
        if op == ops[0] and len(args) == 2:
            name = args[1]
            unit.set_nickname(name)
        else:
            print(unit.get_nickname())
        return True
    print('Arguments for nickname command:')
    print('  nickname OPERATION [SOURCE]')
    print('    OPERATION: {0}'.format(', '.join(ops)))
    return False


cmds = {
    'current-status':   handle_current_status,
    'sampling-rate':    handle_sampling_rate,
    'clock-source':     handle_clock_source,
    'nickname':         handle_nickname,
}

fullpath = CliKit.seek_snd_unit_path()
if fullpath:
    with DiceUnit(fullpath) as unit:
        CliKit.dispatch_command(unit, cmds)