#!/bin/bash
#
# Author   : Gaston Gonzalez
# Author   : William McKeehan
# Date     : 6 October 2024
# Updated  : 5 September 2025
# Purpose  : Utility script for dumping system information

function usage() {
  echo "Usage: $(basename $0) <command>"
  echo "  active-radio  - Display model of active radio" 
  echo "  callsign      - Current callsign"
  echo "  et-audio      - Show state of audio interface"
  echo "  et-audio-card - Display audio card and device: <card>,<device>"
  echo "  et-cat        - Show state of CAT control interface"
  echo "  et-gps        - Show state of GPS interface"
  echo "  et-time       - Show if time is synched via GPS"
  echo "  et-mode       - Show current mode"
  echo "  et-sdr        - Show state of SDR interface"
  echo "  grid          - Current grid square defined by user"
  echo "  ip            - System IP address"
  echo "  release       - EmComm Tools release"
}

if [ $# -ne 1 ]; then
  usage
  exit 1
fi

[ -z "$ET_USER_CONFIG" ] && ET_USER_CONFIG="${HOME}/.config/emcomm-tools/user.json"

case $1 in
  active-radio)
    if [ -L  "${ET_HOME}/conf/radios.d/active-radio.json" ]; then
      cat "${ET_HOME}/conf/radios.d/active-radio.json" | jq -r .model
    else
      echo "No radio selected"
    fi 
    ;;
  callsign)
    cat ${ET_USER_CONFIG} | jq -r .callsign
    ;;
  grid)
    FALLBACK_GRID=$(jq -r -e '.grid' ${ET_USER_CONFIG})
    GEO_CONF=/tmp/geo.tmp

    curl -f -s "http://localhost:1981/api/geo/position" > ${GEO_CONF}
    if [[ $? -eq 0 ]]; then
      API_GRID=$(jq -r -e '.position.gridSquare' ${GEO_CONF})
      [[ -e ${GEO_CONF} ]] && rm ${GEO_CONF}
      if [[ $? -eq 0 ]]; then
        echo ${API_GRID}
        exit
      fi
    fi

    echo ${FALLBACK_GRID}

    ;;
  et-audio)

    # 1. Check if the symlink was created by the udev rules
    if [ -e /dev/et-audio ]; then 

      UDEV_OUT=$(udevadm info /dev/et-audio | grep ET_DEVICE)
      if [ $? -eq 0 ]; then

        # Display friendly audio device name
        ET_DEVICE=$(udevadm info /dev/et-audio | grep ET_DEVICE | cut -d"=" -f2)
        case $ET_DEVICE in
          "DIGIRIG_LITE")
            echo "DigiRig Lite"
          ;;
          "DIGIRIG_MOBILE")
            echo "DigiRig Mobile"
          ;;
          *)
            echo $ET_DEVICE
          ;;
        esac

      else
        echo "Connected" 
      fi

    else
      echo "Not connected" 
    fi

    ;;
  et-audio-card)

    # 1. Check if the symlink was created by the udev rules
    if [ -e /dev/et-audio ]; then 

       # 2. Check that this device was properly tagged with the ET_AUDIO env variable with a udev rule
       APLAY_OUT=$(arecord -l | grep ET_AUDIO)
       if [ $? -eq 0 ]; then
         AUDIO_CARD=$(echo $APLAY_OUT | cut -d":" -f1 | awk '{print $2}')
         AUDIO_DEVICE=$(echo $APLAY_OUT | cut -d"," -f2 | cut -d":" -f1 | awk '{print $2}')
         echo $AUDIO_CARD,$AUDIO_DEVICE
       else
         exit 1
       fi
    else
      exit 1
    fi

    ;;
  et-cat)

    if [ ! -L "${ET_HOME}/conf/radios.d/active-radio.json" ]; then
      echo "N/A"
      exit 0
    fi

    # 1. Check if the symlink was created by the udev rules
    if [ -e /dev/et-cat ]; then 

      # 2. Check if the rigctl systemd unit is running properly
      systemctl status rigctld --no-pager > /dev/null 
      if [ $? -eq 0 ]; then
    
        # Note: I am disabling the VFO read as it causes issues with serval Icom 
        # radios and results in the VFO changing momentarily during this client
        # request. It causes issues during TX and RX. If it is not bulletproof,
        # features like this will be turned off. This is a problem given that 
        # Conky calls this method every 10 seconds.
        #
        # 3. Grab and format frequency 
        #FREQ=$(timeout 1 rigctl -m 2 f)
        #if [ $? -eq 0 ]; then
        #  printf "%'d MHz\n" "$FREQ" | sed 's|,|.|g'
        #else
        #  echo "Connected. Can't access VFO"; 
        #fi
        echo "Connected"; 
      else
        echo "Connected. No rig control"
      fi
    else
      echo "Not connected"; 
    fi

    ;; 
  et-sdr)
    # 1. Check if the symlink was created by the udev rules
    if [ -e /dev/et-sdr ]; then 
        echo "Connected"; 
    else
      echo "Not connected";
    fi

    ;;
  et-gps)

    # 1. Check if the symlink was created by the udev rules
    if [ -e /dev/et-gps ]; then 

      # 2. Check if the gpsd systemd unit is running properly
      systemctl status gpsd --no-pager > /dev/null 
      if [ $? -eq 0 ]; then

        # 3. Obtain the current GPS mode
        GPS_JSON=$(gpspipe -w -n 10 | grep -m 1 TPV)
        if [ $? -eq 0 ]; then
          GPS_MODE=$(echo $GPS_JSON | jq --exit-status -r .mode)

          case $GPS_MODE in
            1)
              echo "No fix"
            ;;
            2)
              echo "2D fix"
            ;;
            3)
              LAT=$(echo $GPS_JSON | jq -r .lat)
              LON=$(echo $GPS_JSON | jq -r .lon)
              printf "%.5f,%.5f\n" $LAT $LON
            ;;
            *)
              echo "Unknown mode"
            ;;
          esac 

        else
          echo "Connected. Can't decode"
        fi

      else
        echo "Connected. gpsd not running"
      fi
    else 
      echo "Not connected" 
    fi

    ;; 
  et-mode)

    SELECTED_MODE=$(cat "${HOME}/.config/emcomm-tools/et-mode")

    MODE_ID_NONE="none"
    MODE_ID_APRS_DIGIPEATER="aprs-digipeater"
    MODE_ID_BBS_CLIENT="bbs-client"
    MODE_ID_BBS_CLIENT2="bbs-client2"
    MODE_ID_BBS_SERVER="bbs-server"
    MODE_ID_CHAT_CLIENT="chat-chattervox"
    MODE_ID_PACKET_DIGIPEATER="packet-digipeater"
    MODE_ID_APRS_CLIENT="aprs-client"
    MODE_ID_WINLINK_ARDOP="winlink-ardop"
    MODE_ID_WINLINK_PACKET="winlink-packet"
    MODE_ID_WINLINK_VARA_HF="winlink-vara-hf"
    MODE_ID_WINLINK_VARA_FM="winlink-vara-fm"

    if [ ! -e /dev/et-audio ]; then 
      echo "Run 'et-mode' to set"
      echo ${MODE_ID_NONE} > "${HOME}/.config/emcomm-tools/et-mode"
      exit 0
    fi

    case ${SELECTED_MODE} in
      ${MODE_ID_NONE})
        echo "Run 'et-mode' to set"
      ;;
      ${MODE_ID_APRS_DIGIPEATER})
        echo "APRS Digipeater"
      ;;
      ${MODE_ID_APRS_CLIENT})
        echo "APRS"
      ;;
      ${MODE_ID_BBS_CLIENT})
        echo "BBS Client"
      ;;
      ${MODE_ID_BBS_CLIENT2})
        echo "BBS Client"
      ;;
      ${MODE_ID_BBS_SERVER})
        echo "BBS Server"
      ;;
      ${MODE_ID_CHAT_CLIENT})
        echo "Chat (chattervox)"
      ;;
      ${MODE_ID_PACKET_DIGIPEATER})
        echo "Packet Digipeater"
      ;;
      ${MODE_ID_WINLINK_ARDOP})
        echo "Winlink ARDOP"
      ;;
      ${MODE_ID_WINLINK_PACKET})
        echo "Winlink Packet"
      ;;
      ${MODE_ID_WINLINK_VARA_FM})
        echo "Winlink VARA FM"
      ;;
      ${MODE_ID_WINLINK_VARA_HF})
        echo "Winlink VARA HF"
      ;;
      *)
        echo "Unknown"
      ;;
    esac

    ;;
  et-time)
    ET_OUT=$(${ET_HOME}/bin/et-time)
    if [ $? -eq 0 ]; then
      echo "Yes"
    else
      echo "No"
    fi

    ;;
  ip)
    hostname -I | awk '{print $1}'
    ;;
  release)
    grep DISTRIB_DESCRIPTION /etc/lsb-release | sed 's|"||g' | awk '{print $1}' | cut -d"=" -f2
    ;;  
  *)
    echo "Command not supported."
    usage
    exit 1
    ;;
esac
