#!/bin/bash

HOST_ttyO4=/dev/ttyO4
HOST_ttyO2=/dev/ttyO2

# Check if root
if [ "$EUID" -ne 0 ]
  then echo "Please run as root"
  exit
fi


# Functions

TEST_MEGATECH_OUTPUT_PHASE=$(cat <<END
# python code starts here
import time
import serial

ser = serial.Serial()
ser.port = "/dev/ttyO4"
ser.baudrate = 2400
ser.bytesize = serial.EIGHTBITS
ser.parity = serial.PARITY_NONE
ser.stopbits = serial.STOPBITS_ONE
ser.timeout = 2
ser.write_timeout = 2

try:
    ser.open()
except Exception as e:
    print ('KO')
    exit()

if ser.isOpen():
    try:
        #ser.flushInput()
        #ser.flushOutput()
        ser.write(str.encode('^P004QMD\r'))
        ser.flush()
        response = str(ser.readline())
        print(response[12])
        ser.close()
    except Exception as e1:
        print ('KO')
else:
    print ('KO')
# python code ends here
END
)

function isOutputPhaseMegatech {
  val=$(python3 -c "$TEST_MEGATECH_OUTPUT_PHASE")
  echo $val
}

function read_mbpoll {
  baudrate=$1
  reg=$2
  num=$3
  port=$4
  retries=0
  while [ $retries -lt 3 ]; do
    result=$(mbpoll -m rtu -o 5 -1 -q -b $baudrate -P none -r $reg -c $num $port)
    if [ $? -ne 0 ]; then
      result='error'
      retries=$[$retries+1]
    else
      break
    fi
  done
  echo $result
}

# Set output_phase if serial communication is success
systemctl stop device-modbus

case $1 in

  adapt2)
    result=$(read_mbpoll 9600 462 1 $HOST_ttyO4)
    value=$(echo $result | awk '{print $NF}')
    if [ "$value" != 'error' ]; then
      binary=$(echo "ibase=10; obase=2; $value" | bc | xargs printf "%016d\n" | rev)
      length=$(expr ${#binary} - 1)
      for n in $(seq 0 $length)
      do
        eval "bit$n=${binary:n:1}"
      done
      if [ "$bit9" == '1' ]; then
        echo 'mono' > /etc/salicru/output_phase
      else
        echo 'tri' > /etc/salicru/output_phase
      fi
    fi
    systemctl start device-mqtt device-smtp device-rccmd device-logger
    if [ -f /lib/systemd/system/device-snmp.service ]; then systemctl start device-snmp; fi
  ;;
  adaptx)
    result=$(read_mbpoll 9600 329 1 $HOST_ttyO4)
    value=$(echo $result | awk '{print $NF}')
    if [ "$value" != 'error' ]; then
      binary=$(echo "ibase=10; obase=2; $value" | bc | xargs printf "%016d\n" | rev)
      length=$(expr ${#binary} - 1)
      for n in $(seq 0 $length)
      do
        eval "bit$n=${binary:n:1}"
      done
      
      if [ "$bit1" == '1' ]; then
        echo 'mono' > /etc/salicru/output_phase
      else
        echo 'tri' > /etc/salicru/output_phase
      fi
    fi
    systemctl start device-mqtt device-smtp device-rccmd device-logger
    if [ -f /lib/systemd/system/device-snmp.service ]; then systemctl start device-snmp; fi
  ;;
  cube3)
    result=$(read_mbpoll 9600 4819 1 $HOST_ttyO2)
    if [ "$result" != 'error' ]; then
      value=$(echo $result | awk '{print $NF}')
      if [ "$value" == '1' ] || [ "$value" == '3' ] || [ "$value" == '5' ]; then
        echo 'mono' > /etc/salicru/output_phase
      else
        echo 'tri' > /etc/salicru/output_phase
      fi
    fi
    systemctl start device-mqtt device-smtp device-rccmd device-logger
    if [ -f /lib/systemd/system/device-snmp.service ]; then systemctl start device-snmp; fi
  ;;
  cube40720)
    result=$(isOutputPhaseMegatech)
    if [ "$result" == '1' ]; then
      echo 'mono' > /etc/salicru/output_phase
    else
      echo 'tri' > /etc/salicru/output_phase
    fi
    systemctl start device-mqtt device-smtp device-rccmd device-logger
    if [ -f /lib/systemd/system/device-snmp.service ]; then systemctl start device-snmp; fi
  ;;
  cube43080)
    result=$(read_mbpoll 9600 730 1 $HOST_ttyO4)
    if [ "$result" != 'error' ]; then
      value=$(echo $result | awk '{print $NF}')
      if [ "$value" == '0' ] || [ "$value" == '2' ]; then
        echo 'mono' > /etc/salicru/output_phase
      else
        echo 'tri' > /etc/salicru/output_phase
      fi
    fi
    systemctl start device-mqtt device-smtp device-rccmd device-logger
    if [ -f /lib/systemd/system/device-snmp.service ]; then systemctl start device-snmp; fi
  ;;
  *)
    systemctl start device-mqtt device-smtp device-rccmd device-logger
    if [ -f /lib/systemd/system/device-snmp.service ]; then systemctl start device-snmp; fi
    exit 0
  ;;
esac