#!/usr/bin/env bash
set -euo pipefail

PORT1=${1:-/dev/ttyS2}
PORT2=${2:-/dev/ttyS3}
BAUD=${BAUD:-9600}
TIMEOUT=${TIMEOUT:-3}   # сек ожидания на чтение
TMPDIR="$(mktemp -d)"
trap 'rm -rf "$TMPDIR"' EXIT

cfg_port() {
  local p="$1"
  # 9600 8N1, сыро, без эхо/IXON/IXOFF/CRTSCTS
  stty -F "$p" "$BAUD" cs8 -cstopb -parenb -echo -icanon -ixon -ixoff -crtscts raw || {
    echo "Не удалось настроить $p" >&2; exit 1;
  }
  # попытка «прочистить» входной буфер
  timeout 0.2s cat <"$p" > /dev/null || true
}

send_and_expect() {
  local tx="$1" rx="$2" label="$3"
  local payload
  payload="$(printf 'HELLO485:%(%s)T:%06d:%s\n' -1 "$RANDOM" "$label")"
  local exp_len
  exp_len=$(printf '%s' "$payload" | wc -c)

  local outfile="$TMPDIR/rx_${label}.bin"

  # Чтение в фоне на фиксированное число байт
  ( timeout "$TIMEOUT"s dd if="$rx" of="$outfile" bs=1 count="$exp_len" status=none ) &
  local rpid=$!

  # Небольшая пауза, чтобы приёмник встал на чтение
  sleep 0.1

  # Отправка
  printf '%s' "$payload" > "$tx"

  # Ждём завершения чтения
  if ! wait "$rpid"; then
    echo "[$label] Таймаут чтения с $rx (ждали $exp_len байт за ${TIMEOUT}s)"
    return 1
  fi

  # Сравнение побайтно
  if cmp -s <(printf '%s' "$payload") "$outfile"; then
    echo "[$label] Совпадение: $tx → $rx"
    return 0
  else
    echo "[$label] Данные не совпали: $tx → $rx"
    echo "Ожидали: $(printf '%q' "$payload")"
    echo -n "Получили: "
    cat "$outfile" | xargs -0 printf '%q\n' || cat "$outfile" || true
    return 1
  fi
}

main() {
  for p in "$PORT1" "$PORT2"; do
    [[ -e "$p" ]] || { echo "❌ Порт $p не найден"; exit 1; }
  done

  echo "Настройка портов $PORT1 и $PORT2 @ ${BAUD} 8N1…"
  cfg_port "$PORT1"
  cfg_port "$PORT2"

  echo "Тест 1: $PORT1 → $PORT2"
  send_and_expect "$PORT1" "$PORT2" "S1toS2" || S12=1

  echo "Тест 2: $PORT2 → $PORT1"
  send_and_expect "$PORT2" "$PORT1" "S2toS1" || S21=1

  if [[ ${S12:-0} -eq 0 && ${S21:-0} -eq 0 ]]; then
    echo "=============================="
    echo "Итог: оба направления OK."
    exit 0
  fi

  echo "=============================="
  echo "Итог: есть проблемы."
  [[ ${S12:-0} -ne 0 ]] && echo "- Не прошло S1→S2"
  [[ ${S21:-0} -ne 0 ]] && echo "- Не прошло S2→S1"
  echo
  echo "Подсказки:"
  echo "- Убедитесь, что RS-485 линии сведены A+ к A+, B- к B-."
  exit 2
}

main "$@"
