#!/bin/sh

. /etc/utils.sh

BASE_PATH="/tmp/gpio"
MONITOR_PATH="$BASE_PATH/ledcontrol"
MFG_MODE_FILE="$MONITOR_PATH/mfg_mode"
ACS_FILE="$MONITOR_PATH/acsconnected"
HALTED_FILE="$MONITOR_PATH/halted"
HARDWARE_FAILURE="$MONITOR_PATH/hardware_failure"
NETWORK_STATUS_CONNECTED="CONNECTED"
NETWORK_STATUS_DISCONNECTED="DISCONNECTED"
LED_STATE_FILE="$BASE_PATH/ledstate"
# color is used by gpio-mailbox. 1 is red LED, 2 is blue LED, 3 is both LEDs on
# at the same time (purple).
PURPLE_LED="3"
BLUE_LED="2"
RED_LED="1"
SOLID_MODE="solid"
BLINK_MODE="blink"
FAST_MODE="fast"
PON_IFACE="pon0"
MAN_IFACE="man"
LEDS_PATTERN_FILE="$BASE_PATH/leds"
LEDS_BRIGHTNESS_10P="1"
LEDS_BRIGHTNESS_100P="100"
GPON_INFO_FILE="/sys/devices/platform/gpon/info/infoGpon"
GPON_AES_FILE="/sys/devices/platform/gpon/data/showAes0xxx"

led_state=""

blink_led() {
  echo "$1" > "$LEDS_PATTERN_FILE"
}

log_state_change() {
  local state="$1"

  if [ "$state" != "$led_state" ] ; then
    echo "state changed to: $state"
    atomic $LED_STATE_FILE "$state"
    led_state="$state"
  fi
}

set_led_state() {
  local mode="$1"
  local color="$2"
  local state="$3"
  local brightness="$4"

  case "$mode" in
    "$SOLID_MODE")
      blink_led "x1 $color@$brightness"
      ;;
    "$BLINK_MODE")
      blink_led "x3 $color@${brightness}x2 0 $color@${brightness}x2 0"
      ;;
    "$FAST_MODE")
      blink_led "x1 $color@$brightness 0"
      ;;
    *)
      echo "unknown mode '$mode'"
      ;;
  esac

  log_state_change "$state"
}

is_interface_up() {
  # Read the gpon status file. 'OPERATION' means the link should be up.
  # The ONU has the following GPON states:
  # 1 INITIAL
  # 2 STANDBY
  # 3 SERIAL NUMBER
  # 4 RANGING
  # 5 OPERATION
  if [ ! -e $GPON_INFO_FILE ]; then
    return 1
  fi
  x=$(cat $GPON_INFO_FILE | grep "ONU STATE")
  contains "$x" "OPERATION"
}

is_provisioned() {
  # The output looks like:
  # [0010]
  # [0312][0313][0314][0315][0320][0321][0322][0323]
  #
  # When unprovsioned this is empty, or has 1 entry.  If there are more
  # than 7 bytes then we assume the device is provisioned.
  if [ ! -e $GPON_AES_FILE ]; then
    return 1
  fi
  aes_gems=$(cat $GPON_AES_FILE | grep '\[' | wc -c)
  [ "$aes_gems" -gt 7 ]
}

has_ip_address() {
  [ -n "$(ip -f inet6 addr show dev $1 scope global 2>/dev/null)" ] ||
    [ -n "$(ip -f inet addr show dev $1 scope global 2>/dev/null)" ]
}


watch-dir $MONITOR_PATH |
while [ -z "$led_state" ] || read event; do
  if [ -e "$MFG_MODE_FILE" ]; then
    # This is manufacture mode. We have two states: The pon interface is up, we
    # blink slow purple. Otherwise, pon interface is down we blink fast purple.
    # This should never happen for an installer, if it does they'll know
    # something is wrong.
    if ! is_interface_up "$PON_IFACE" ; then
      # Override the led to blink slow if we're in manufacture mode and the pon
      # interface is not up.
      set_led_state "$FAST_MODE" "$PURPLE_LED" "MFGMODE" "$LEDS_BRIGHTNESS_100P"
    else
      # Override the led to blink fast if we're in manufacture mode and the pon
      # interface is up.
      set_led_state "$BLINK_MODE" "$PURPLE_LED" "MFGMODE" "$LEDS_BRIGHTNESS_100P"
    fi
  elif [ -e "$HALTED_FILE" ]; then
    set_led_state "$SOLID_MODE" "$RED_LED" "HALTED" "$LEDS_BRIGHTNESS_100P"
  elif [ -e "$HARDWARE_FAILURE" ]; then
    set_led_state "$SOLID_MODE" "$RED_LED" "HWFAIL" "$LEDS_BRIGHTNESS_100P"
  elif ! is_interface_up "$PON_IFACE" ; then
    set_led_state "$BLINK_MODE" "$RED_LED" "LINKDOWN" "$LEDS_BRIGHTNESS_10P"
  elif ! is_provisioned ; then
    set_led_state "$FAST_MODE" "$RED_LED" "NETCONNECTING" "$LEDS_BRIGHTNESS_10P"
  elif ! has_ip_address "$MAN_IFACE" ; then
    set_led_state "$BLINK_MODE" "$BLUE_LED" "NETCONNECTED" "$LEDS_BRIGHTNESS_10P"
  elif [ ! -e $ACS_FILE ] ; then
    set_led_state "$FAST_MODE" "$BLUE_LED" "IPV6ACQUIRED" "$LEDS_BRIGHTNESS_10P"
  else
    set_led_state "$SOLID_MODE" "$BLUE_LED" "ACSCONTACT" "$LEDS_BRIGHTNESS_10P"
  fi
  if [ -z "$led_state" ]; then sleep .5; fi
done
