/*
 *
 *    Copyright (c) 2022 Project CHIP Authors
 *
 *    Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
 *
 *    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.
 */

/**
 *    @file
 *      Source implementation of an input / output stream for cc13xx_26xx targets
 */

#include "streamer.h"
#include <lib/shell/Engine.h>
#include <lib/shell/streamer.h>
#include <lib/support/CHIPMem.h>
#include <platform/CHIPDeviceLayer.h>

#include "ti_drivers_config.h"

#include <ti/drivers/UART2.h>

namespace chip {
namespace Shell {

#ifndef SHELL_STREAMER_APP_SPECIFIC

UART2_Handle sStreamUartHandle = NULL;

#if !MATTER_CC13XX_26XX_PLATFORM_LOG_ENABLED
extern "C" int cc13xx_26xxLogInit(void)
{
    return 0;
}

extern "C" void cc13xx_26xxVLog(const char * msg, va_list v)
{
    if (NULL != sStreamUartHandle)
    {
        static char sDebugUartBuffer[CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE];
        size_t ret;

        ret = vsnprintf(sDebugUartBuffer, sizeof(sDebugUartBuffer), msg, v);
        if (0 < ret)
        {
            // PuTTY likes \r\n
            size_t len                = (ret + 2U) < sizeof(sDebugUartBuffer) ? (ret + 2) : sizeof(sDebugUartBuffer);
            sDebugUartBuffer[len - 2] = '\r';
            sDebugUartBuffer[len - 1] = '\n';

            UART2_write(sStreamUartHandle, sDebugUartBuffer, len, NULL);
        }
    }
}
#endif // !MATTER_CC13XX_26XX_PLATFORM_LOG_ENABLED

int streamer_cc13xx_26xx_init(streamer_t * streamer)
{
    UART2_Params uartParams;

    UART2_Params_init(&uartParams);
    // Most params can be default because we only send data, we don't receive
    uartParams.baudRate = 115200;

    sStreamUartHandle = UART2_open(CONFIG_UART_STREAMER, &uartParams);
    return 0;
}

ssize_t streamer_cc13xx_26xx_read(streamer_t * streamer, char * buf, size_t len)
{
    (void) streamer;
    size_t ret;

    UART2_read(sStreamUartHandle, buf, len, &ret);

    return ret;
}

ssize_t streamer_cc13xx_26xx_write(streamer_t * streamer, const char * buf, size_t len)
{
    (void) streamer;
    return UART2_write(sStreamUartHandle, buf, len, NULL);
}

static streamer_t streamer_cc13xx_26xx = {
    .init_cb  = streamer_cc13xx_26xx_init,
    .read_cb  = streamer_cc13xx_26xx_read,
    .write_cb = streamer_cc13xx_26xx_write,
};

streamer_t * streamer_get()
{
    return &streamer_cc13xx_26xx;
}

#endif //#ifndef SHELL_STREAMER_APP_SPECIFIC

} // namespace Shell
} // namespace chip
