#!/bin/sh

# Modem initialisation script for comms module
# Author: dylan@kses.net
# 2014-11-11

MODEM=/dev/ttyUSB3
MODEM_LOG=/var/log/check-simcom.log
GNXIO=/usr/bin/gnxio
GNXID=/usr/bin/gnxid
MAX_TRIES=5
MODEM_SCRIPT=/etc/init.d/modem

function error()
{
    echo "$1" >&2
}

if [[ ! -x "${GNXIO}" ]] ; then
    error "${GNXIO} is missing or not executable"
    exit 1
fi

if [[ ! -x "${GNXID}" ]] ; then
    error "${GNXID} is missing or not executable"
    exit 1
else
    ID=`${GNXID}`
    if [[ "${ID}" != 7 ]] ; then
        error "This is not a KSES comms module"
        exit 1
    fi
fi

function gnxio_toggle()
{
    PIN=$1
    STATE=$2
    echo -n "[${PIN} -> ${STATE}] ... "
    ${GNXIO} set ${PIN} ${STATE}
    RESULT=`gnxio get ${PIN}`
    if [[ "${RESULT}" == "${STATE}" ]] ; then
        echo "OK"
    else
       echo "failed"
       error "Error toggling pin ${PIN}"
       exit 1
    fi
}

function modem_tx()
{
    if [[ -c ${MODEM} ]] ; then
        echo -e "$1\r" >> "${MODEM}"
        echo "TX: $1" >> "${MODEM_LOG}"
    else
        error "${MODEM} is not a character device"
        exit 1
    fi
}

function modem_rx()
{
    IFS=$'\r\n' :; RX=($(timeout 0.75 cat ${MODEM}))
    for line in "${RX[@]}" ;
    do
        echo "RX: ${line}" >> ${MODEM_LOG}
        if [[ "${line}" == "OK" ]] ; then
            RX_RESULT="OK"
        fi
    done
}

function modem_txrx()
{
    modem_tx "$1"
    RX_RESULT="failed"
    modem_rx
}

function restart_modem()
{
        sv down openvpn
        sv down pppd
        sleep 1
        $MODEM_SCRIPT
        sleep 1
        sv up pppd
        sv up openvpn
}

echo "Begin modem check"
date "+%Y-%m-%d %T" >> "${MODEM_LOG}"

echo -n "Waiting for ${MODEM} ."
while [[ ! -c "${MODEM}" ]] ; do
    sleep 1
    echo -n "."
done
echo " OK"


MODEM_CMD="AT"
COUNTER=0

while [ $COUNTER -lt $MAX_TRIES ]; do
        echo -n "Check modem (${MODEM_CMD}) ... "
        modem_txrx "${MODEM_CMD}"
        echo "${RX_RESULT}"
        if [[ ${RX_RESULT} != "OK" ]] ; then
           error "No reply to ${MODEM_CMD} from modem"
           let COUNTER=COUNTER+1
        else
           break
        fi
done

if [ $COUNTER -ge $MAX_TRIES ];then
        error "Resetting modem..."
        restart_modem
        exit 1

fi
logger "Modem checked out fine."

exit 0

