#!/bin/bash
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

#### CATEGORY=Device management
### attach to a serial console
## usage: fx serial [device-path]
##
## If no device path is given, a list of options will be presented.
##
## If the selected device is not readable by the active user account, it will
## first be chmod'd to provide access to the current user.
##
## Exit the session with CTRL+o
##
## In order to have arrow keys work, execute `export TERM=xterm; /boot/bin/sh`
## on in the console.

source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
fx-config-read

if ! which socat > /dev/null 2>&1; then
  fx-error "The command \`socat\` was not found!"
  if [[ "$(uname)" == "Linux" ]]; then
    fx-error "  maybe \`apt install socat\`"
  else
    fx-error "  maybe \`brew install socat\`"
  fi
  exit 1
fi

DEVICE="$1"
if [[ -z "$DEVICE" ]]; then
  options=($(find /dev -maxdepth 1 -name ttyUSB\* -or -name tty.SLAB_USBtoUART\* -or -name tty.usbserial\* | sort))
  if [[ "${#options}" = 0 ]]; then
    fx-error "No known serial devices found, specify one exactly."
    exit 1
  fi
  echo >&2 "Select a serial device from the following list:"
  select device in "${options[@]}"; do
    DEVICE="$device"
    break
  done
fi

if [[ ! -e "$DEVICE" ]]; then
  fx-error "$DEVICE not found"
  exit 1
fi

if [[ ! -r "$DEVICE" ]]; then
  if [[ "$(uname)" == "Linux" ]]; then
    owninggroup=$(stat "$DEVICE" --printf="%G")
    if [[ ! -r "$DEVICE" ]]; then
      fx-error "$DEVICE is not readable by $USER"
      fx-error " fix: sudo usermod -a -G "$owninggroup" $USER"
      fx-error "You need to start a new login session for a group change to take effect"
      exit 1
    fi
  else
    fx-warn "$DEVICE is not readable by $USER"
    fx-warn "Fix the permissions on $DEVICE or group membership of $USER"
  fi
fi

echo >&2 "SERIAL: Connecting to $DEVICE..."
echo >&2 "SERIAL: Use CTRL-o to exit"
echo >&2 "SERIAL: Run: \`export TERM=xterm; /boot/bin/sh\` for improved key bindings"

# This is the method recommended in the socat manual to detect the presence /
# omission of this feature.
if $(socat -hh |grep ' b[1-9]' > /dev/null); then
  speed="b115200"
else
  speed="ospeed=115200,ispeed=115200"
fi

exec socat -,sane,cfmakeraw,escape=0x0f "file:${DEVICE}",sane,cfmakeraw,"${speed}",cs8,parenb=0,cstopb=0,ixoff=0,ixon=0,crtscts=0,clocal=1,nonblock=1
