#!/bin/bash
#
# Guralp Configuration System
#   Copyright (c) 2009 Guralp Systems Ltd. All rights reserved.
#
#   I/O line support functions
#



# Find line driver type
#  $1 is the name of the line
#  driver type (input, output, tristate) written to stdout
ioline_get_driver() {
    local line="$1"
    ioline --line "${line}" --query | grep "^Line driver:" | sed -e 's,^Line driver: ,,'
}



# List I/O lines
#  $1 may be empty to list all lines
#  $1 may be 'input' to list only input-capable lines
#  $1 may be 'output to list only output-capable lines
#  List of matching lines written to stdout
ioline_list() {
    local filter_mode="$1"
    local line desc

    while read -r line desc
    do
        case "${filter_mode}" in
        input)
            case "$(ioline_get_driver "${line}")" in
            input | tristate)
                echo "${line}"
                ;;
            esac
            ;;

        output)
            case "$(ioline_get_driver "${line}")" in
            output | tristate)
                echo "${line}"
                ;;
            esac
            ;;

        *)
            echo "${line}"
            ;;
        esac
    done < <(ioline --q-list-lines)
}



# Prepare iselect of I/O lines
#  $1 as per ioline_list
#  $2 is the iselect choice prefix (select_${2}0, select_${2}1, ...)
ioline_iselect() {
    local filter_mode="$1"
    local choice="$2"
    local line desc do_echo
    local i=1

    echo "select_${choice}0=/none None"

    while read -r line desc
    do
        do_echo=0
        case "${filter_mode}" in
        input)
            case "$(ioline_get_driver "${line}")" in
            input | tristate)
                do_echo=1
                ;;
            esac
            ;;

        output)
            case "$(ioline_get_driver "${line}")" in
            output | tristate)
                do_echo=1
                ;;
            esac
            ;;

        *)
            do_echo=1
            ;;
        esac

        if [ "${do_echo}" -ne 0 ]
        then
            echo "select_${choice}${i}=${line} ${desc}"
            ((++i))
        fi
    done < <(ioline --q-list-lines)
}



# Prepare iselect of readable I/O properties
#  $1 may be empty for any property
#  $1 may be 'float' for properties that appear to be floating point
#  $2 is the iselect choice prefix
ioline_prop_iselect() {
    local filter_mode="$1"
    local choice="$2"
    local line desc do_echo prop pdesc
    local i=1

    echo "select_${choice}0=/none None"

    while read -r line desc
    do
        while read -r prop pdesc
        do
            do_echo=0
            case "${filter_mode}" in
            float)
                ioline --line "${line}" --q-property "${prop}" | grep -q '^[-0-9][0-9]*\.[0-9][0-9]*$'
                [ $? -eq 0 ] && do_echo=1
                ;;
            *)
                do_echo=1
                ;;
            esac

            if [ "${do_echo}" -ne 0 ]
            then
                echo "select_${choice}${i}=${line}/${prop} ${desc} -- ${pdesc}"
                ((++i))
            fi
        done < <(ioline --line "${line}" --q-list-properties)
    done < <(ioline --q-list-lines)
}



# vim: ts=4:sw=4:expandtab
