#!/bin/bash
#/*
# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
# * contributor license agreements.  See the NOTICE file distributed with
# * this work for additional information regarding copyright ownership.
# * The OpenAirInterface Software Alliance licenses this file to You under
# * the OAI Public License, Version 1.1  (the "License"); you may not use this file
# * except in compliance with the License.
# * You may obtain a copy of the License at
# *
# *      http://www.openairinterface.org/?page_id=698
# *
# * Unless required by applicable law or agreed to in writing, software
# * distributed under the License is distributed on an "AS IS" BASIS,
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# * See the License for the specific language governing permissions and
# * limitations under the License.
# *-------------------------------------------------------------------------------
# * For more information about the OpenAirInterface (OAI) Software Alliance:
# *      contact@openairinterface.org
# */

# file run_enb_s1_exmimo
# brief run script for eNB EXMIMO.
# author  Lionel GAUTHIER
# company Eurecom
# email:  lionel.gauthier@eurecom.fr 


################################
# include helper functions
################################
THIS_SCRIPT_PATH=$(dirname $(readlink -f $0))
source $THIS_SCRIPT_PATH/build_helper


function help()
{
  echo_error " "
  echo_error "Usage: run_enb_s1_exmimo -c config_file [OPTION]..."
  echo_error "Run the eNB executable, hardware target is EXMIMO."
  echo_error " "
  echo_error "Mandatory arguments:"
  echo_error "  -c, -C, --config-file  eNB_config_file  eNB config file, (see $OPENAIR_DIR/targets/PROJECTS/GENERIC-LTE-EPC/CONF)"
  echo_error " "
  echo_error "Options:"
  echo_error "Mandatory arguments to long options are mandatory for short options too."
  echo_error "  -g, --gdb                           Run with GDB."
  echo_error "  -h, --help                          Print this help."
  echo_error "  -K, --itti-dump-file      filename  ITTI dump file containing all ITTI events occuring during EPC runtime.(can omit file name if last argument)"
  echo_error "  -M, --target-dl-mcs       mcs       Downlink target MCS."
  echo_error "  -V, --vcd                           Dump timings of processing in a GTKWave compliant file format."
  echo_error "  -S, --enable-missed-slot            Continue execution in case of missed slot."
  echo_error "  -T, --target-ul-mcs       mcs       Uplink target MCS."
  echo_error "  -W, --wireshark-l2                  Dump MAC frames for visualization with wireshark."
  echo_error "                                      You need to open Wireshark, open the preferences, and check try heuristics for the UDP protocol, MAC-LTE, RLC-LTE,"
  echo_error "                                      and PDCP-LTE. Then capture for all the interfaces with the following filters: s1ap or lte_rrc or mac-lte or rlc-lte"
  echo_error "                                      or pdcp-lte. Note the L2 pdus are transmitted to the local interface."
  echo_error "  -x, --xforms                        Run XFORMS scope windows."
}



function main()
{
  local -i run_gdb=0
  local    exe_arguments=""
  
  until [ -z "$1" ]
    do
    case "$1" in
      -c | -C | --config-file)
        CONFIG_FILE=$2
        # may be relative path 
        if [ -f $(dirname $(readlink -f $0))/$CONFIG_FILE ]; then
          CONFIG_FILE=$(dirname $(readlink -f $0))/$CONFIG_FILE
          echo "setting config file to: $CONFIG_FILE"
          CONFIG_FILE_ACCESS_OK=1
        else
          # may be absolute path 
          if [ -f $CONFIG_FILE ]; then
            echo "setting config file to: $CONFIG_FILE"
          else
            echo_fatal "config file $CONFIG_FILE not found"
          fi
        fi
        exe_arguments="$exe_arguments -O $CONFIG_FILE -F $THIS_SCRIPT_PATH/exmimo2_2arxg.lime"
        shift 2;
        ;;
      -g | --gdb)
        run_gdb=1
        echo "setting GDB flag to: $GDB"
        shift;
        ;;
      -h | --help)
        help
        shift;
        exit 0
        ;;
      -K | --itti-dump-file)
        ITTI_DUMP_FILE=$2
        # can omit file name if last arg on the line
        if [ "x$ITTI_DUMP_FILE" = "x" ]; then
          ITTI_DUMP_FILE="/tmp/enb_s1_exmimo_itti.log"
          shift 1;
        else
          shift 2;
        fi
        echo "setting ITTI dump file to: $ITTI_DUMP_FILE"
        exe_arguments="$exe_arguments -K $ITTI_DUMP_FILE"
        ;;      
      -M | --target-dl-mcs)
        echo "setting target dl MCS to $2"
        exe_arguments="$exe_arguments -m $2"
        shift 2;
        ;;
      -V | --vcd)
        "setting gtk-wave output"
        exe_arguments="$exe_arguments -V /tmp/oai_gtk_wave.vcd"
        shift ;
        ;;
      -S | --enable-missed-slot)
        echo "setting continue even if missed slot"
        exe_arguments="$exe_arguments -S"
        shift ;
        ;;
      -T | --target-ul-mcs)
        echo "setting target ul MCS to $2"
        exe_arguments="$exe_arguments -t $2"
        shift 2;
        ;;
      -W | ----wireshark-l2)
        echo "setting l2 pcap dump output"
        exe_arguments="$exe_arguments -W"
        shift ;
        ;;
      -x | --xforms)
        exe_arguments="$exe_arguments -d"
        echo "setting xforms to: $XFORMS"
        shift;
        ;;
      *)   
        echo "Unknown option $1"
        help
        exit 0
        ;;
    esac
  done


  set_openair_env 
  cecho "OPENAIR_DIR    = $OPENAIR_DIR" $green


  if [ ! -e $OPENAIR_DIR/targets/bin/lte-softmodem ]; then
    echo_fatal "Cannot find $OPENAIR_DIR/targets/bin/lte-softmodem executable"
  fi
  if [ ! -e $OPENAIR_DIR/targets/bin/updatefw ]; then
    echo_fatal "Cannot find $OPENAIR_DIR/targets/bin/updatefw executable"
  fi
  if [ ! -e $OPENAIR_DIR/targets/bin/openair_rf.ko ]; then
    echo_fatal "Cannot find $OPENAIR_DIR/targets/bin/openair_rf.ko kernel module"
  fi

  for i in `seq 0 64`; do 
    have_rtfX=`ls /dev/ |grep -c rtf$i`;
    if [ "$have_rtfX" -eq 0 ] ; then 
      $SUDO mknod -m 666 /dev/rtf$i c 150 $i; 
    fi;
  done

  $THIS_SCRIPT_PATH/init_exmimo2

  if [ $run_gdb -eq 0 ]; then 
    exec $OPENAIR_DIR/targets/bin/lte-softmodem  `echo $exe_arguments` 2>&1 > /tmp/lte_softmodem.stdout.txt
  else
    touch      ~/.gdb_lte_softmodem
    chmod 777  ~/.gdb_lte_softmodem
    echo "file $OPENAIR_DIR/targets/bin/lte-softmodem" > ~/.gdb_lte_softmodem
    echo "set args $exe_arguments" >> ~/.gdb_lte_softmodem
    echo "run"                        >> ~/.gdb_lte_softmodem
    cat ~/.gdb_lte_softmodem
    gdb -n -x ~/.gdb_lte_softmodem 2>&1 > /tmp/gdb_lte_softmodem.stdout.txt
  fi
}



main "$@"

