/* Copyright 2020 NXP
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <stdio.h>

/*TODO Review */
#include "smComSerial.h"
#include <stdlib.h>
#include <stdio.h>
#include "string.h"
#include <assert.h>

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <paths.h>
#include <termios.h>
#include <sysexits.h>
#include <sys/param.h>
#include <sys/select.h>
#include <sys/time.h>
#include <time.h>
#include "sm_printf.h"
#include "smComSocket.h"
#include "nxLog_smCom.h"
#include "inttypes.h"
#include "nxEnsure.h"
#include "sm_timer.h"

#define REMOTE_JC_SHELL_HEADER_LEN (4)
#define REMOTE_JC_SHELL_MSG_TYPE_APDU_DATA (0x01)
#include "sm_apdu.h"
#define MAX_BUF_SIZE (MAX_APDU_BUF_LENGTH)

static int gfileDescriptor = -1;

static int smUartSetInterfaceAttrib(int fd, int speed);


U32 smComVCom_Open(void** vcom_ctx, const char *portname)
{
    LOG_I("Opening %s", portname);

    gfileDescriptor = open(portname, O_RDWR | O_NOCTTY);
    LOG_E("gfileDescriptor = %d", gfileDescriptor);
    if (gfileDescriptor < 0)
    {
        LOG_E("error %d opening %s: %s\r\n", errno, portname, strerror (errno));
        goto error;
    }
    if (0 == smUartSetInterfaceAttrib(gfileDescriptor, B115200)) {
        smCom_Init(&smComVCom_Transceive, &smComVCom_TransceiveRaw);
    }
    else {
        LOG_W("smUartSetInterfaceAttrib Failed");
        goto error;
    }
    return 0;

error:
    if (gfileDescriptor != -1) {
        close(gfileDescriptor);
    }

    return (U32)-1;
}

U32 smComVCom_Close(void* conn_ctx)
{
    U32 status = 0;

    smComSocket_CloseFD(gfileDescriptor);

    return status;
}

U32 smComVCom_GetATR(void* conn_ctx, U8 *pAtr, U16 *atrLen)
{
    return smComSocket_GetATRFD(gfileDescriptor, pAtr, atrLen);
}

U32 smComVCom_Transceive(void* conn_ctx, apdu_t *pApdu)
{
    return smComSocket_TransceiveFD(gfileDescriptor, pApdu);
}

U32 smComVCom_TransceiveRaw(void* conn_ctx, U8 *pTx, U16 txLen, U8 *pRx, U32 *pRxLen)
{
    return smComSocket_TransceiveRawFD(gfileDescriptor, pTx, txLen, pRx, pRxLen);
}

static int smUartSetInterfaceAttrib(int fd, int speed)
{
    struct termios SerialPortSettings; /* Create the structure */

    bzero(&SerialPortSettings, sizeof(SerialPortSettings));

    SerialPortSettings.c_cflag = CRTSCTS | CS8 | CLOCAL | CREAD;
    if (cfsetspeed(&SerialPortSettings, speed)) // Set  baud
    {
        LOG_W("cfsetspeed Failed");
    }

    SerialPortSettings.c_iflag = IGNPAR;
    SerialPortSettings.c_oflag = 0;
    SerialPortSettings.c_cc[VMIN] = 10;
    SerialPortSettings.c_cc[VTIME] = 10;

    if (cfsetispeed(&SerialPortSettings, speed)) /* Set Read  Speed */
    {
        LOG_W("cfsetspeed Failed");
    }
    if (cfsetospeed(&SerialPortSettings, speed)) /* Set Write Speed */
    {
        LOG_W("cfsetspeed Failed");
    }
    //tcflush(fd, TCIFLUSH);
    if ((tcsetattr(fd, TCSANOW, &SerialPortSettings)) != 0) /* Set the attributes to the termios structure*/
    {
        LOG_W("Failed Setting attributes");
        return 1;
    }
    else {
        LOG_D("Attributes Set");
        return 0;
    }
}
