#!/bin/ksh

version="1.0"
#
#
# Script:   showtx
# Author:   Wade Walker
# Date:     09 26 2011
#
#       This is OSW Scripts page version.
#       Refer questions to "gs-w osw scripts"
#
# Purpose:  Display DCP transmission information for the last 8 hours for a given DCP ID or USGS station ID.
#           Script uses various NOAA and USGS websites to access data. Raw Tx's are displayed to the screen
#           and the user is given the option to decode pseudo binary transmissions into human-readable format
#           ala the old pb or updated bb utilities. The decoding may still need some work as random/self-timed
#           formats differ slightly and the author could only find details for those formats for Sutron DCP's...
#
#
#    USAGE="showtx [DCP or USGS station ID] /
#
#               Argument is optional and if missing will be prompted for.
#
#**************************************************************************************************************
# Modification History:
# 2011/09/26  Initial coding - decoding portion of script based heavily on Bubba Brossett and Barry Jackson's
#             update of the pb script called bb.- WJW
#
#**************************************************************************************************************

startpath=$PWD
/usr/ucb/whoami | read userid

#print "Making temporary directory to run in..."
mkdir .showtx_tmp_$userid 2>/dev/null

print "Running in temp directory..."
cd .showtx_tmp_$userid

print
print
echo Version $version
echo "******************************************************************"
echo "*                                                                *"
echo "*                       showtx                                   *"
echo "*                                                                *"
echo "* Quickly show raw Tx data for a given DCP or station ID and     *"
echo "* convert pseudo binary Tx's into readable integers if necessary *"
echo "*                                                                *"
echo "* Please address comments, questions, bug reports, etc... to:    *"
echo "* GS_W_OSW_Scripts@usgs.gov                                      *"
echo "******************************************************************"
#delete variable - set to n for troubleshooting to stay in tmp dir and leave files to troubleshoot...
deletevar='y'
function exittx
{ 
print "Exiting showtx..."
if test $deletevar = "y"
then
cd $startpath
rm -f -r .showtx_tmp_$userid
fi
exit
}

#trap used to verify exit from script and to clean up files when interrupt key used
trap '
 exittx
  ' INT

trap '
 exittx
  ' QUIT

trap '
 exittx
  ' EXIT

trap '
  exittx
  ' HUP

trap '
 exittx
  ' TERM

# Pull USGS station ID/DCP ID HADS cross-reference - note that this may be out of date...
lwp-request -t30 "http://www.weather.gov/oh/hads/USGS/ALL_USGS-HADS_SITES.txt" > tmp.dcp_stationID_xref1
/usr/bin/sed 's/|/ /g' < tmp.dcp_stationID_xref1 >tmp.dcp_stationID_xref

id1=$1

if [[ -s tmp.dcp_stationID_xref ]]
then
until [ $dcpid ]
do
echo
echo
if [[ -z $id1 ]]
then
print "Enter DCP ID or Station ID you want to see latest raw transmissions for:"
read id1
fi
# translate lower case characters to upper case if dcp ID entered...
echo $id1 | /usr/opt/bin/tr "[:lower:]" "[:upper:]" | read id
#print $id
grep " $id " < tmp.dcp_stationID_xref  | read nwsid staid dcpid office deg mn sec ldeg lmn lsec name
echo
if [[ -z $dcpid ]] # didn't find an entry in the cross-reference - now need to figure out if station ID or dcp ID was entered...
then
echo $id >tmp.id
# if it contains any letters, we'll assume it's a DCP ID and go ahead and try to pull Tx's
grep [A-Z] tmp.id | read dcpidchk
if [[ -z $dcpidchk ]]
then
clear
echo
echo "Unable to locate DCP for $id - please enter the DCP ID or correct station ID."
print "Note: Use DCP ID if station ID was entered correctly. HADS USGS/NWS cross"
print "      reference is likely out of date for this station..."
id1=''
echo
else
dcpid=$id
print "Didn't find station ID for DCP ID $dcpid in NWS/USGS cross-reference..."
print "Assuming DCP ID was entered and cross reference is just outdated..."
print "Using DCP ID $dcpid..."
fi
else
echo
print "Using DCP ID $dcpid assigned to station $staid..."
echo
fi
done
else
echo
print "Enter DCP ID you want to see latest raw transmissions for:\c"
read dcpid
fi

# Pull 8 hours of Tx's from usgs LRGS website.
lwp-request -t30 "http://water.usgs.gov/cgi-bin/lrgs/lrgsData?DcpId=$dcpid" > tmp.dcptrans

# Check that URL returned something and that it isn't displaying a No messages message.
if [[ -s tmp.dcptrans ]]
then
/usr/bin/grep "No messages found for dcp id $dcpid." < tmp.dcptrans > tmp.dcpmsg
if [[ -s tmp.dcpmsg ]]
then
print "LRGS website did not find any messages for DCP ID $dcpid."
print "Its either not transmitting or you misentered the ID."
print "Exiting script..."
exit
fi
else
print "LRGS website appears to be down or bad DCP address was provided."
print "The following URL returned no transmissions for the script to use:"
print "http://water.usgs.gov/cgi-bin/lrgs/lrgsData?DcpId=$dcpid"
print "Exiting script."
fi

# strip out html tags and miscellaneous data from webpage.
/usr/bin/grep 'width=\"79' <tmp.dcptrans > tmp.dcptrans1

/usr/bin/sed -e 's/<[^>]*>//g' <tmp.dcptrans1 > tmp.dcptrans2

/usr/bin/grep -v ^Data < tmp.dcptrans2 > tmp.dcptrans3

echo
echo

# display raw transmission
print "Last 8 hours of raw transmissions for DCP $dcpid (if any):"
print " Most recent Tx's first."
echo
cat tmp.dcptrans3
echo 
echo

# prompt if user wants to convert pb values (may not be necessary...)
print "Convert pseudobinary values to readable integers? (CR=Y):\c"
read pb

case $pb in
  n | N | no | NO | No | nO | nope | NOPE | nosireebob )
   print "Done showing transmissions, exiting script"
   exit;;
  *)
   echo
   print "Converting pseudobinary values for self timed and random Tx's..."
   echo
   echo;;
esac

# Divide up self-timed and random Tx's for the fun of it...
#  This may not work great...
/usr/xpg4/bin/grep -e "^.B1" -e "^.BST" <tmp.dcptrans3 >tmp.dcptransST
#/usr/xpg4/bin/grep -e "^bB1" -e "^\`B1" -e "BST" <tmp.dcptrans3 >tmp.dcptransST



/usr/xpg4/bin/grep ^2 <tmp.dcptrans3 >tmp.dcptransRT

#Strip out group, time, etc... stuff from front of Tx to pare it down
# to tx'ed values/data.
/usr/bin/sed -e  "s/^.B1.//g" -e "s/^.BST//g" < tmp.dcptransST > tmp.dcptransST1

#insert a space every third value
/usr/bin/sed 's/.\{3\}/& /g' < tmp.dcptransST1 > tmp.dcptransST2

# Turn spaces into newlines (sed only takes literal newlines in 2nd
#half of substitute command - will take /n in first half...
/usr/bin/sed 's: :\
:g' < tmp.dcptransST2 > tmp.dcptransST3

# Add a space between every value - should now have 3 values per line
# with a space between each value - except for BV, etc...
/usr/bin/sed 's/./& /g' <tmp.dcptransST3 > tmp.dcptransST4

# Start the pre-math conversion of the pb - mostly stolen from bb script
/usr/bin/sed 's/@/0/g' < tmp.dcptransST4 > tmp.dt
/usr/bin/sed 's/A/1/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/B/2/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/C/3/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/D/4/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/E/5/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/F/6/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/G/7/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/H/8/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/I/9/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/J/10/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/K/11/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/L/12/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/M/13/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/N/14/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/O/15/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/P/16/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/Q/17/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/R/18/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/S/19/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/T/20/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/U/21/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/V/22/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/W/23/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/X/24/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/Y/25/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/Z/26/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/\[/27/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/\\/28/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/\]/29/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/\^/30/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/_/31/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/\`/32/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/a/33/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/b/34/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/c/35/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/d/36/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/e/37/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/f/38/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/g/39/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/h/40/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/i/41/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/j/42/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/k/43/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/l/44/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/m/45/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/n/46/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/o/47/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/p/48/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/q/49/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/r/50/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/s/51/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/t/52/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/u/53/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/v/54/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/w/55/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/x/56/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/y/57/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/z/58/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/\{/59/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/|/60/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/\}/61/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/~/62/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/?/63/g' < tmp.dt > tmp.ST.decoded
echo
#integer a
#integer b
#integer c
#integer d

# Now that intial conversion is done, do the math to finish things up and add some
# formatting stuff, null for missing values, Tx breaks, etc...
while read a b c crap
do
case $a in
 +([0-9]))
  case $b in
   +([0-9]))
     echo "( $a * 4096 ) + ( $b * 64 ) + $c" | bc | read d
     if (( $d > 131071 ))
     then
     echo "131071 - $d" | bc | read d
     fi
     echo $d >> tmp.ST.final1 ;;
   * )
   echo "$a" >> tmp.ST.final1 ;;
   esac;;
 "/" )
  echo "null" >> tmp.ST.final1 ;;
 "" )
  echo "N" >> tmp.ST.final1 ;;
 * )
  echo "??" >> tmp.ST.final1 ;;
esac
done <tmp.ST.decoded

#get rid of newlines
/usr/opt/bin/tr '\n' ' ' < tmp.ST.final1 > tmp.ST.final2
# and replace them only between different tx's
/usr/opt/bin/tr 'N' '\n' < tmp.ST.final2 > tmp.ST.final

# Now display converted values for those Tx's
print "Last 8 hours of any self timed transmitted values for dcp:"
print "  Most recent values and Tx's first..."
echo
cat tmp.ST.final
echo
print "Note that decimals are not inserted and last few values"
print "  may not be correct if appending BatV or lat long, etc..."
echo
echo
#rm -f tmp.ST.*

if [[ -s tmp.dcptransRT ]]
then

#Strip out group, time, etc... stuff from front of Tx to pare it down
# to tx'ed values/data.
/usr/bin/sed 's/^2.//g' < tmp.dcptransRT > tmp.dcptransRT1

#insert a space every third value
/usr/bin/sed 's/.\{3\}/& /g' < tmp.dcptransRT1 > tmp.dcptransRT2

# Turn spaces into newlines (sed only takes literal newlines in 2nd
#half of substitute command - will take /n in first half...
/usr/bin/sed 's: :\
:g' < tmp.dcptransRT2 > tmp.dcptransRT3

# Add a space between every value - should now have 3 values per line
# with a space between each value - except for BV, etc...
/usr/bin/sed 's/./& /g' <tmp.dcptransRT3 > tmp.dcptransRT4


# Start the pre-math conversion of the pb - mostly stolen from bb script
/usr/bin/sed 's/@/0/g' < tmp.dcptransRT4 > tmp.dt
/usr/bin/sed 's/A/1/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/B/2/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/C/3/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/D/4/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/E/5/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/F/6/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/G/7/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/H/8/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/I/9/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/J/10/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/K/11/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/L/12/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/M/13/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/N/14/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/O/15/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/P/16/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/Q/17/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/R/18/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/S/19/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/T/20/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/U/21/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/V/22/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/W/23/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/X/24/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/Y/25/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/Z/26/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/\[/27/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/\\/28/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/\]/29/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/\^/30/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/_/31/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/\`/32/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/a/33/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/b/34/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/c/35/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/d/36/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/e/37/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/f/38/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/g/39/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/h/40/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/i/41/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/j/42/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/k/43/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/l/44/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/m/45/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/n/46/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/o/47/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/p/48/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/q/49/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/r/50/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/s/51/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/t/52/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/u/53/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/v/54/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/w/55/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/x/56/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/y/57/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/z/58/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/\{/59/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/|/60/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/\}/61/g' < tmp.dt > tmp.dt1
/usr/bin/sed 's/~/62/g' < tmp.dt1 > tmp.dt
/usr/bin/sed 's/?/63/g' < tmp.dt > tmp.RT.decoded
echo
#integer a
#integer b
#integer c
#integer d

# Now that intial conversion is done, do the math to finish things up and add some
# formatting stuff, null for missing values, Tx breaks, etc...
while read a b c crap
do
case $a in
 +([0-9]))
  case $b in
   +([0-9]))
     echo "( $a * 4096 ) + ( $b * 64 ) + $c" | bc | read d
     if (( $d > 131071 ))
     then
     echo "131071 - $d" | bc | read d
     fi
     echo $d >> tmp.RT.final1 ;;
   * )
   echo "$a" >> tmp.RT.final1 ;;
   esac;;
 "/" )
  echo "null" >> tmp.RT.final1 ;;
 "" )
  echo "N" >> tmp.RT.final1 ;;
 * )
  echo "??" >> tmp.RT.final1 ;;
esac
done <tmp.RT.decoded

#get rid of newlines
/usr/opt/bin/tr '\n' ' ' < tmp.RT.final1 > tmp.RT.final2

# and replace them only between different tx's
/usr/opt/bin/tr 'N' '\n' < tmp.RT.final2 > tmp.RT.final


print "Last 8 hours of any randomly transmitted values for dcp:"
echo
cat tmp.RT.decoded
else
print "No random Tx's detected in last 8 hours."
echo
fi

print "Finished running showtx."

echo

exit
