#!/bin/sh
# variables
PROGNAME="cmd 1w"
ARGC=$#
W1_PATH=/sys/devices/w1_bus_master1
DELIM=';'
RC=-1
RC_STR_CRCERR="CRC Err"
RC_STR_INV_ID="Inv ID"
RC_STR_NAN="NaN"

print_usage()
{
    echo "${PROGNAME} clearid"
    echo "${PROGNAME} list"
    echo "${PROGNAME} read"
}

clear_id()
{
    if [ $#1 -lt 5 ]; then
        echo "${PROGNAME} listids <id>"
        return -1
    else
        echo $1 > ${W1_PATH}/w1_master_remove 2>/dev/null
        return $?
    fi
}

get_ds18b20_temp()
{
    #declare locals separately from setting them
    local LOC_RC
    local DEV_ID
    local OUTPUT
    LOC_RC=-1
    DEV_ID=$1
    OUTPUT=$(cat ${W1_PATH}/${DEV_ID}/w1_slave 2>/dev/null)
    if [ $? -ne 0 ]; then
        VAL=${RC_STR_INV_ID}
    else
        RES=$(echo -e "${OUTPUT}" | grep "YES")
        if [ $? -ne 0 ]; then
            VAL=${RC_STR_CRCERR}
        else
            RES=$(echo -e "${OUTPUT}" | grep "t=" | awk -F= '{print $2}')
            if [ "${RES}" -eq "${RES}" ] 2>/dev/null; then
                VAL=$(awk "BEGIN {printf \"%.3f\n\", ${RES}/1000}")
                LOC_RC=0
            else
                VAL=${RC_STR_NAN}
            fi
        fi
    fi
    echo ${DEV_ID}${DELIM}TEMP${DELIM}${VAL}
    return ${LOC_RC}
}

get_dev_id()
{
    local ID_ARR
    local DEV_ID
    DEV_ID=$1
    ID_ARR=($(hexdump /sys/devices/w1_bus_master1/${DEV_ID}/id 2>/dev/null | head -n 1 | tr [a-z] [A-Z]))
    if [ ${#ID_ARR} -lt 2 ]; then
        echo ${DEV_ID}${DELIM}ID${DELIM}${RC_STR_INV_ID}
        return -1
    else
        echo ${DEV_ID}${DELIM}ID${DELIM}${ID_ARR[4]}${ID_ARR[3]}${ID_ARR[2]}${ID_ARR[1]}
        return 0
    fi
}

read_1w_dev()
{
    local LOC_RC
    local FC
    LOC_RC=-1
    FC=$(echo $1 | awk -F'-' '{print $1}' | tr [a-z] [A-Z])
    #echo Family code:${FC}
    if [ "${FC}" = "28" ]; then
        get_ds18b20_temp $1
        LOC_RC=$?
    else
        get_dev_id $1
        LOC_RC=$?
    fi
    return ${LOC_RC}
}

if [ ${ARGC} -lt 2 ]; then
    print_usage
else
    ARG1=$(echo $2 | tr [a-z] [A-Z])    # convert to uppercase
    case "${ARG1}" in
    CLEARID)
        clear_id $3
        RC=$?
        ;;
    LIST)
        DEV_IDS=$(cat ${W1_PATH}/w1_master_slaves)
        echo -e "${DEV_IDS}"
        RC=$?
        ;;
    READ)
        if [ ${ARGC} -eq 3 ]; then
            DEV_IDS=$3
            ARG2=$(echo $3 | tr [a-z] [A-Z])
            if [ "${ARG2}" = "ALL" ]; then
                DEV_IDS=$(cat ${W1_PATH}/w1_master_slaves)
            fi
            RC=0
            for DEV in ${DEV_IDS}
            do
                read_1w_dev ${DEV}
                let RC=RC+$?
            done
        else
            echo "${PROGNAME} read [ALL | <id>]"
        fi
        ;;
    *)
        print_usage
        ;;
    esac
fi

exit ${RC}