#!/bin/bash
#
# Guralp Configuration System
#   Copyright 2009,2016 Guralp Systems Limited.
#
#   GPIO lines

# Quick exit for navbar query
if [ "X$1" == "X--navbar" ]
then
	echo "misc-ioline	GPIO labels and states"
	exit 0
fi


CFGFILE="/etc/ioline/name_map.local"
INA209DIR="/etc/ioline/ina209"
TAMPER_CFG="/etc/tamperd/default.local"
ENVIRO_CFG="/etc/envirologd/default.local"

# Load support functions
script_dir=$(dirname "$0")
. "$script_dir/functions.sh"


do_read() {
    local -i name_idx=0
    local -i init_idx=0
    local -i tamper_idx=0
    local -i enviro_idx=0
    local name desc linetype prop pdesc pvalue
    local numprop

    # We only list entries ioline knows about.
    # The config file may hold entrys for lines not present on this
    # hardware set.
    while read name desc
    do
        gcs_var o_sysname$name_idx "$name"
        gcs_var o_usrname$name_idx "$(gcs_get_varcf "$name" $CFGFILE)"
        ((name_idx++))

	if [ "$(ioline --line ${name} --q-property system)" != "true" ]
	then
	    linetype="$(ioline --line ${name} --query | grep '^Line driver:' | cut -d ' ' -f 3)"
	    numprop="$(ioline --line ${name} --query | grep -c '^Property name:')"
	    if [ "${linetype}" == "tristate" -o \( "${linetype}" == "input" -a "${numprop}" == "0" \) ]
	    then
		gcs_var "o_tamperid${tamper_idx}" "${name}"
		linetype="$(gcs_get_varcf2 "${name}" "${TAMPER_CFG}" "lines")"
		gcs_var "o_tampertype${tamper_idx}" "${linetype:-off}"
		((tamper_idx++))
	    fi
	fi

        while read -r prop pdesc
        do
            ioline --line "${name}" --q-property "${prop}" | grep -q '^[-0-9][0-9\.]*$'
            if [ $? -eq 0 ]
            then
                gcs_var "o_envirologid${enviro_idx}" "${name}/${prop}"
                gcs_var "d_envirologenable${enviro_idx}" "False"
                pvalue="$(gcs_get_varcf2 "${name}/${prop}" "${ENVIRO_CFG}" "values")"
                [ -n "${pvalue}" ] && gcs_var "o_envirologenable${enviro_idx}" "${pvalue}"
                ((enviro_idx++))
            fi
        done < <(ioline --line "${name}" --q-list-properties)

        if [ -r "$INA209DIR/${name}.local" ]
        then
            gcs_var o_initname$init_idx "$name"
            gcs_var o_initlevel$init_idx \
                "$(gcs_get_varcf initially_on "$INA209DIR/${name}.local")"
            [ $init_idx = 0 ] && gcs_var o_has_levels true
            ((init_idx++))
        fi
    done < <(ioline --q-list-lines)
}

do_check() {
    gcs_read_vars

    # Basic checks are performed by the configuration engine
}

do_write() {
    local -i idx
    local usrname
    local level
    local oldlevel
    local name

    do_check
    if (( gcs_errors > 0 ))
    then
        return
    fi

    TMPFILE="$(mktemp /tmp/ioline.conf.XXXXXX)"
    cp $CFGFILE $TMPFILE

    # Process the labels first.
    for (( idx = 0 ; idx < $new_names_rows ; idx++ ))
    do
        eval name="\${new_sysname${idx}}"
        [ -z "$name" ] && continue
        eval usrname="\${new_usrname${idx}}"
        gcs_set_varcf $name $TMPFILE "$usrname"
    done
    
    if diff $TMPFILE $CFGFILE > /dev/null 2>&1
    then
        # New file is the same as the original so just delete the temp
        rm -f $TMPFILE
    else
        group_move_file $TMPFILE $CFGFILE

        # Tell ioline to reload config here ?
    fi

    # Tamper monitors
    gcs_clear_varcf2_section "${TAMPER_CFG}" "lines"
    for (( idx = 0 ; idx < $new_tampers_rows ; idx++ ))
    do
        eval name="\${new_tamperid${idx}}"
        [ -z "${name}" ] && continue

        eval level="\${new_tampertype${idx}}"
        [ "${level}" == "off" ] && continue

        gcs_set_varcf2 "${name}" "${TAMPER_CFG}" "${level}" "lines"
    done
    /sbin/svc tamperd restart > /dev/null 2>&1

    # Environment logging
    for (( idx = 0 ; idx < $new_envirologs_rows ; idx++ ))
    do
        eval name="\${new_envirologid${idx}}"
        [ -z "${name}" ] && continue
        eval level="\${new_envirologenable${idx}}"
        gcs_set_varcf2 "${name}" "${ENVIRO_CFG}" "${level}" "values"
    done
    /sbin/svc envirologd restart > /dev/null 2>&1

    # Now the startup levels
    for (( idx = 0 ; idx < $new_levels_rows ; idx++ ))
    do
        eval name="\${new_initname${idx}}"
        [ -z "$name" ] && continue

        eval level="\${new_initlevel${idx}}"

        if [ -r "$INA209DIR/${name}.local" ]
        then
            oldlevel="$(gcs_get_varcf initially_on "$INA209DIR/${name}.local")"
            [ "$level" != "$oldlevel" ] \
                && gcs_set_varcf initially_on "$INA209DIR/${name}.local" "$level"
        fi
    done
}


case "X$1" in
X--check)       do_check        ;;
X--write)       do_write        ;;
X--read)        do_read         ;;
*)              exit 1          ;;
esac

gcs_cleanup
exit 0

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