/**
 ****************************************************************************************
 *
 * @file main.c
 *
 * @brief Main FTDF functions
 *
 * Copyright (c) 2016, Dialog Semiconductor
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 * 1. Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 * 3. Neither the name of the copyright holder nor the names of its contributors
 *    may be used to endorse or promote products derived from this software without
 *    specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL,  SPECIAL,  EXEMPLARY,  OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 ****************************************************************************************
 */

#include <ftdf.h>
#include <string.h>

#include "internal.h"
#include "regmap.h"
#include "ftdfInfo.h"

void FTDF_getReleaseInfo(char **lmacRelName, char **lmacBuildTime, char **umacRelName, char **umacBuildTime)
{
    static char        lrelName[ 16 ];
    static char        lbldTime[ 16 ];
    static char        urelName[ 16 ];
    static char        ubldTime[ 16 ];
    uint8_t            i;

    volatile uint32_t *ptr    = FTDF_GET_REG_ADDR(ON_OFF_REGMAP_REL_NAME);
    uint32_t          *chrPtr = (uint32_t *)lrelName;

    for (i = 0; i < FTDF_ON_OFF_REGMAP_REL_NAME_NUM; i++)
    {
        *chrPtr++ = *ptr++;
    }

    ptr    = FTDF_GET_REG_ADDR(ON_OFF_REGMAP_BUILDTIME);
    chrPtr = (uint32_t *)lbldTime;

    for (i = 0; i < FTDF_ON_OFF_REGMAP_BUILDTIME_NUM; i++)
    {
        *chrPtr++ = *ptr++;
    }

    const char *umacVPtr = FTDF_getUmacRelName();

    for (i = 0; i < 16; i++)
    {
        urelName[ i ] = umacVPtr[ i ];

        if (umacVPtr[ i ] == '\0')
        {
            break;
        }
    }

    umacVPtr = FTDF_getUmacBuildTime();

    for (i = 0; i < 16; i++)
    {
        ubldTime[ i ] = umacVPtr[ i ];

        if (umacVPtr[ i ] == '\0')
        {
            break;
        }
    }

    lrelName[ 15 ] = '\0';
    lbldTime[ 15 ] = '\0';
    urelName[ 15 ] = '\0';
    ubldTime[ 15 ] = '\0';

    *lmacRelName   = lrelName;
    *lmacBuildTime = lbldTime;
    *umacRelName   = urelName;
    *umacBuildTime = ubldTime;
}

void FTDF_confirmLmacInterrupt(void)
{
    volatile uint32_t *ftdfCm = FTDF_GET_REG_ADDR(ON_OFF_REGMAP_FTDF_CM);
    *ftdfCm = 0;
}

void FTDF_eventHandler(void)
{
    volatile uint32_t ftdfCe = *FTDF_GET_REG_ADDR(ON_OFF_REGMAP_FTDF_CE);

    if (ftdfCe & FTDF_MSK_RX_CE)
    {
        FTDF_processRxEvent();
    }

    if (ftdfCe & FTDF_MSK_TX_CE)
    {
        FTDF_processTxEvent();
    }

    if (ftdfCe & FTDF_MSK_SYMBOL_TMR_CE)
    {
        FTDF_processSymbolTimerEvent();
    }

#ifndef FTDF_LITE
#ifndef FTDF_NO_CSL

    if (FTDF_pib.leEnabled)
    {
        FTDF_Time curTime = FTDF_GET_FIELD(ON_OFF_REGMAP_SYMBOLTIMESNAPSHOTVAL);
        FTDF_Time delta   = curTime - FTDF_rzTime;

        if (delta < 0x80000000)
        {
            // RZ has passed check if a send frame is pending
            if (FTDF_sendFramePending != 0xfffe)
            {
                FTDF_Time   wakeupStartTime;
                FTDF_Period wakeupPeriod;

                FTDF_criticalVar();
                FTDF_enterCritical();

                FTDF_getWakeupParams(FTDF_sendFramePending, &wakeupStartTime, &wakeupPeriod);

                FTDF_txInProgress = FTDF_TRUE;
                FTDF_SET_FIELD(ON_OFF_REGMAP_MACCSLSTARTSAMPLETIME, wakeupStartTime);
                FTDF_SET_FIELD(ON_OFF_REGMAP_MACWUPERIOD, wakeupPeriod);

                volatile uint32_t *txFlagSet = FTDF_GET_FIELD_ADDR(ON_OFF_REGMAP_TX_FLAG_SET);
                *txFlagSet           |= ((1 << FTDF_TX_DATA_BUFFER) | (1 << FTDF_TX_WAKEUP_BUFFER));

                FTDF_sendFramePending = 0xfffe;

                FTDF_exitCritical();
            }

            if (FTDF_txInProgress == FTDF_FALSE)
            {
                FTDF_setCslSampleTime();
            }
        }
    }

#endif /* FTDF_NO_CSL */
#endif /* !FTDF_LITE */
    volatile uint32_t *ftdfCm = FTDF_GET_REG_ADDR(ON_OFF_REGMAP_FTDF_CM);
    *ftdfCm = FTDF_MSK_TX_CE | FTDF_MSK_RX_CE | FTDF_MSK_SYMBOL_TMR_CE;
}

#ifndef FTDF_PHY_API
void FTDF_sndMsg(FTDF_MsgBuffer *msgBuf)
{
    switch (msgBuf->msgId)
    {
#ifndef FTDF_LITE

    case FTDF_DATA_REQUEST:
        FTDF_processDataRequest((FTDF_DataRequest *) msgBuf);
        break;

    case FTDF_PURGE_REQUEST:
        FTDF_processPurgeRequest((FTDF_PurgeRequest *) msgBuf);
        break;

    case FTDF_ASSOCIATE_REQUEST:
        FTDF_processAssociateRequest((FTDF_AssociateRequest *) msgBuf);
        break;

    case FTDF_ASSOCIATE_RESPONSE:
        FTDF_processAssociateResponse((FTDF_AssociateResponse *) msgBuf);
        break;

    case FTDF_DISASSOCIATE_REQUEST:
        FTDF_processDisassociateRequest((FTDF_DisassociateRequest *) msgBuf);
        break;
#endif /* !FTDF_LITE */

    case FTDF_GET_REQUEST:
        FTDF_processGetRequest((FTDF_GetRequest *) msgBuf);
        break;

    case FTDF_SET_REQUEST:
        FTDF_processSetRequest((FTDF_SetRequest *) msgBuf);
        break;
#ifndef FTDF_LITE

    case FTDF_ORPHAN_RESPONSE:
        FTDF_processOrphanResponse((FTDF_OrphanResponse *) msgBuf);
        break;
#endif /* !FTDF_LITE */

    case FTDF_RESET_REQUEST:
        FTDF_processResetRequest((FTDF_ResetRequest *) msgBuf);
        break;

    case FTDF_RX_ENABLE_REQUEST:
        FTDF_processRxEnableRequest((FTDF_RxEnableRequest *) msgBuf);
        break;
#ifndef FTDF_LITE

    case FTDF_SCAN_REQUEST:
        FTDF_processScanRequest((FTDF_ScanRequest *) msgBuf);
        break;

    case FTDF_START_REQUEST:
        FTDF_processStartRequest((FTDF_StartRequest *) msgBuf);
        break;

    case FTDF_POLL_REQUEST:
        FTDF_processPollRequest((FTDF_PollRequest *) msgBuf);
        break;
#ifndef FTDF_NO_TSCH

    case FTDF_SET_SLOTFRAME_REQUEST:
        FTDF_processSetSlotframeRequest((FTDF_SetSlotframeRequest *) msgBuf);
        break;

    case FTDF_SET_LINK_REQUEST:
        FTDF_processSetLinkRequest((FTDF_SetLinkRequest *) msgBuf);
        break;

    case FTDF_TSCH_MODE_REQUEST:
        FTDF_processTschModeRequest((FTDF_TschModeRequest *) msgBuf);
        break;

    case FTDF_KEEP_ALIVE_REQUEST:
        FTDF_processKeepAliveRequest((FTDF_KeepAliveRequest *) msgBuf);
        break;
#endif /* FTDF_NO_TSCH */

    case FTDF_BEACON_REQUEST:
        FTDF_processBeaconRequest((FTDF_BeaconRequest *) msgBuf);
        break;
#endif /* !FTDF_LITE */

    case FTDF_TRANSPARENT_ENABLE_REQUEST:
        FTDF_enableTransparentMode(((FTDF_TransparentEnableRequest *) msgBuf)->enable,
                                   ((FTDF_TransparentEnableRequest *) msgBuf)->options);
        FTDF_REL_MSG_BUFFER(msgBuf);
        break;

    case FTDF_TRANSPARENT_REQUEST:
        FTDF_processTransparentRequest((FTDF_TransparentRequest *) msgBuf);
        break;

    case FTDF_SLEEP_REQUEST:
        FTDF_SLEEP_CALLBACK(((FTDF_SleepRequest *)msgBuf)->sleepTime);
        FTDF_REL_MSG_BUFFER(msgBuf);
        break;
#ifndef FTDF_LITE

    case FTDF_REMOTE_REQUEST:
        FTDF_processRemoteRequest((FTDF_RemoteRequest *)msgBuf);
        break;
#endif /* !FTDF_LITE */
#if FTDF_DBG_BUS_ENABLE

    case FTDF_DBG_MODE_SET_REQUEST:
        FTDF_setDbgMode(((FTDF_DbgModeSetRequest *) msgBuf)->dbgMode);
        FTDF_REL_MSG_BUFFER(msgBuf);
        break;
#endif /* FTDF_DBG_BUS_ENABLE */
#if dg_configBLACK_ORCA_IC_REV != BLACK_ORCA_IC_REV_A

    case FTDF_FPPR_MODE_SET_REQUEST:
        FTDF_fpprSetMode(((FTDF_FpprModeSetRequest *) msgBuf)->matchFp,
                         ((FTDF_FpprModeSetRequest *) msgBuf)->fpOverride,
                         ((FTDF_FpprModeSetRequest *) msgBuf)->fpForce);
        FTDF_REL_MSG_BUFFER(msgBuf);
        break;
#endif /* dg_configBLACK_ORCA_IC_REV != BLACK_ORCA_IC_REV_A */

    default:
        // Silenty release the message buffer
        FTDF_REL_MSG_BUFFER(msgBuf);
        break;
    }
}

void FTDF_sendFrameTransparentConfirm(void         *handle,
                                      FTDF_Bitmap32 status)
{
    FTDF_TransparentConfirm *confirm =
        (FTDF_TransparentConfirm *) FTDF_GET_MSG_BUFFER(sizeof(FTDF_TransparentConfirm));

    confirm->msgId  = FTDF_TRANSPARENT_CONFIRM;
    confirm->handle = handle;
    confirm->status = status;

    FTDF_RCV_MSG((FTDF_MsgBuffer *) confirm);
}

void FTDF_rcvFrameTransparent(FTDF_DataLength frameLength,
                              FTDF_Octet     *frame,
                              FTDF_Bitmap32   status)
{
    FTDF_TransparentIndication *indication =
        (FTDF_TransparentIndication *) FTDF_GET_MSG_BUFFER(sizeof(FTDF_TransparentIndication));

    indication->msgId       = FTDF_TRANSPARENT_INDICATION;
    indication->frameLength = frameLength;
    indication->status      = status;
    indication->frame       = FTDF_GET_DATA_BUFFER(frameLength);
    memcpy(indication->frame, frame, frameLength);

    FTDF_RCV_MSG((FTDF_MsgBuffer *) indication);
}
#endif /* !FTDF_PHY_API */
