/**
 * @file smComSCI2c.c
 * @author NXP Semiconductors
 * @version 1.0
 * @par License
 *
 * Copyright 2016,2020 NXP
 * SPDX-License-Identifier: Apache-2.0
 *
 * @par Description
 * This file implements the SmCom SCI2C communication layer.
 *
 *****************************************************************************/

#include <assert.h>

#include "smComSCI2C.h"
#include "sci2c.h"
#include "i2c_a7.h"
#include "sm_printf.h"

// #define NX_LOG_ENABLE_SMCOM_DEBUG 1

#include "nxLog_smCom.h"
#include "nxEnsure.h"

static void* gpHandle = NULL;

static U32 smComSCI2C_Transceive(void* conn_ctx, apdu_t *pApdu);
static U32 smComSCI2C_TransceiveRaw(void* conn_ctx, U8 *pTx, U16 txLen, U8 *pRx, U32 *pRxLen);

U16 smComSCI2C_Close(U8 mode)
{
    sci2c_TerminateI2C(mode);
    return SW_OK;
}

U16 smComSCI2C_Init(void **conn_ctx, const char *pConnString)
{
    i2c_error_t i2c_status;
    void* ctx = NULL;

    i2c_status = axI2CInit(&ctx, pConnString);
    if (i2c_status != I2C_OK) {
        return SMCOM_COM_FAILED;
    }

    (conn_ctx == NULL)? (gpHandle = ctx):(*conn_ctx = ctx);
    return SMCOM_OK;
}

U16 smComSCI2C_Open(void *conn_ctx, U8 mode, U8 seqCnt, U8 *SCI2Catr, U16 *SCI2CatrLen)
{
    eSci2c_Error_t st = eSci2c_Error;
    U16 rv = SMCOM_PROTOCOL_FAILED;
    void* ctx = NULL;

    if (conn_ctx == NULL) {
        smComSCI2C_Init(NULL, NULL);
    }

    ctx = (conn_ctx == NULL) ? gpHandle : conn_ctx;

    if (mode == ESTABLISH_SCI2C) {
        st = sci2c_Init(ctx, SCI2Catr, SCI2CatrLen);
        if (st != eSci2c_No_Error) {
            LOG_E("sci2c_Init failed %x", st);
            *SCI2CatrLen = 0;
            return SMCOM_PROTOCOL_FAILED;
        }
    }
    else if (mode == RESUME_SCI2C) {
        LOG_I("Initializing SCI2C stack with Sequence Counter value: 0x%02X", seqCnt);
        sci2c_SetSequenceCounter(seqCnt);
        SCI2CatrLen = 0;
    }
    else {
        ENSURE_OR_GO_EXIT(0);
    }

    rv = smCom_Init(&smComSCI2C_Transceive, &smComSCI2C_TransceiveRaw);
exit:
    return rv;
}

static U32 smComSCI2C_Transceive(void* conn_ctx, apdu_t *pApdu)
{
    U32 status;
    void* ctx = (conn_ctx == NULL) ? gpHandle : conn_ctx;
    LOG_MAU8_D("Tx>", pApdu->pBuf, pApdu->buflen);
    status = sci2c_Transceive(ctx, pApdu);
    if ((status == SMCOM_OK) && (pApdu->rxlen > 0))
        LOG_MAU8_D("<Rx", pApdu->pBuf, pApdu->rxlen);
    return status;
}

static U32 smComSCI2C_TransceiveRaw(void* conn_ctx, U8 *pTx, U16 txLen, U8 *pRx, U32 *pRxLen)
{
    U32 status;
    void* ctx = (conn_ctx == NULL) ? gpHandle : conn_ctx;
    LOG_MAU8_D("Tx>", pTx, txLen);
    status = sci2c_TransceiveRaw(ctx, pTx, txLen, pRx, pRxLen);
    LOG_MAU8_D("<Rx", pRx, *pRxLen);
    return status;
}
