#!/bin/bash

PROGRAM_PATH="/usr/bin/"
PROGRAM_NAME="btgatt-server"
PROGRAM_ARGS="-i hci0"
PROGRAM_STARTED=0
PROGRAM_QUIT=0
PROGRAM_CHECK_PERIOD=10
RSYSLOG_ID="bluetooth"
RSYSLOG_FACILITY="local0"
BLE_ADVERTISEMENT_CMD="/usr/bin/hciconfig hci0 leadv"
BLE_ADVERTISEMENT_CMD2="/usr/bin/btmgmt advertising on"
DISABLE_EXT_LE_ADVERTISEMENT_CMD="/usr/bin/hcitool cmd 0x08 0x0039 0x00 0x00"
CONFIGURE_EXT_LE_ADVERTISEMENT_CMD="/usr/bin/hcitool cmd 0x08 0x0036 0x00 0x13 0x00 0x00 0x08 0x00 0x00 0x08 0x00 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x7f 0x01 0x00 0x01 0x00 0x00"
ENABLE_EXT_LE_ADVERTISEMENT_CMD="/usr/bin/hcitool cmd 0x08 0x0039 0x01 0x01 0x00 0x00 0x00 0x00"
BOARD_NAME_PATH="/proc/device-tree/model"
SCRIPT_NAME=$(basename $BASH_SOURCE)
CYPRESS_GATT_FILE="cypress_gatt.txt"
CYPRESS_DEFAULT_GATT_PATH="/etc/gatt/${CYPRESS_GATT_FILE}"
CYPRESS_NV_GATT_PATH="/data/ctm/${CYPRESS_GATT_FILE}"

dbg_logger()
{
    logger -p ${RSYSLOG_FACILITY}.$1 -t ${RSYSLOG_ID} ${SCRIPT_NAME}: $2
}

check_local_gatt_file()
{
    dbg_logger "info" "Checking if GATT file already exists"
    if [ ! -f "${CYPRESS_NV_GATT_PATH}" ]; then
        dbg_logger "debug" "${CYPRESS_NV_GATT_PATH} does not exist, using default"
        cp ${CYPRESS_DEFAULT_GATT_PATH} ${CYPRESS_NV_GATT_PATH}
    fi
}

enable_extended_le_advertisement()
{
    dbg_logger "debug" "Enabling extended LE advertisement"
    ${DISABLE_EXT_LE_ADVERTISEMENT_CMD}
    dbg_logger "debug" "disable extended le:$?"
    ${CONFIGURE_EXT_LE_ADVERTISEMENT_CMD}
    dbg_logger "debug" "configure extended le:$?"
    ${ENABLE_EXT_LE_ADVERTISEMENT_CMD}
    dbg_logger "debug" "enable extended le:$?"
}

enable_le_advertisement()
{
    cat ${BOARD_NAME_PATH} | grep "CTM-ONE" &>/dev/null
    if [ $? -ne 0 ]; then
        enable_extended_le_advertisement
    else
        dbg_logger "debug" "Enabling LE advertisement"
        ${BLE_ADVERTISEMENT_CMD}
        sleep 1
        ${BLE_ADVERTISEMENT_CMD2}
    fi
}

reenable_ble_scanning_if_active()
{
    systemctl is-active cyp-bluetooth@ble
    if [ $? -eq 0 ]; then
        /usr/bin/hcitool cmd 0x08 0x000c 0x01 0x00
    fi
}

_term() {
    dbg_logger "info" "Stopping ${PROGRAM_NAME}"
    kill "$child" 2>/dev/null
    wait "$child"
    PROGRAM_QUIT=1
}

trap _term SIGTERM
trap _term SIGINT

while :
do
    sleep ${PROGRAM_CHECK_PERIOD}

    # check if script needs to exit
    if [ ${PROGRAM_QUIT} -eq 1 ]; then
        dbg_logger "info" "Exiting ${PROGRAM_NAME}"
        break
    fi

    if [ ${PROGRAM_STARTED} -eq 0 ]; then
        check_local_gatt_file
        dbg_logger "info" "Starting ${PROGRAM_NAME}"
        ${PROGRAM_PATH}${PROGRAM_NAME} ${PROGRAM_ARGS} &
        child=$!
        PROGRAM_STARTED=1
        dbg_logger "info" "Starting BLE advertisement"
        enable_le_advertisement
        reenable_ble_scanning_if_active
    fi

    # test to see if program is still running
    kill -0 ${child}
    if [ $? -ne 0 ]; then
        # program is no longer running, start it again
        dbg_logger "info" "${PROGRAM_NAME} is no longer running, restarting it"
        PROGRAM_STARTED=0
    else
        dbg_logger "debug" "${PROGRAM_NAME} running normally"
    fi
done
dbg_logger "info" "${PROGRAM_NAME} exited"
