/*
 *
 *    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 cc13x2_26x2 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/UART.h>

namespace chip {
namespace Shell {

#ifndef SHELL_STREAMER_APP_SPECIFIC

UART_Handle sStreamUartHandle = NULL;

#if !MATTER_CC13X2_26X2_PLATFORM_LOG_ENABLED
extern "C" int cc13x2_26x2LogInit(void)
{
    return 0;
}

extern "C" void cc13x2_26x2VLog(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';

            UART_write(sStreamUartHandle, sDebugUartBuffer, len);
        }
    }
}
#endif // !MATTER_CC13X2_26X2_PLATFORM_LOG_ENABLED

int streamer_cc13x2_26x2_init(streamer_t * streamer)
{
    UART_Params uartParams;

    UART_init();

    UART_Params_init(&uartParams);
    // Most params can be default because we only send data, we don't receive
    uartParams.baudRate = 115200;
    // unclear why the UART driver sticks in writing sometimes
    uartParams.writeTimeout = 10000; // ticks
    // Immediate return from the read function
    // uartParams.readTimeout = 0; // ticks

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

ssize_t streamer_cc13x2_26x2_read(streamer_t * streamer, char * buf, size_t len)
{
    (void) streamer;
    return UART_read(sStreamUartHandle, buf, len);
}

ssize_t streamer_cc13x2_26x2_write(streamer_t * streamer, const char * buf, size_t len)
{
    (void) streamer;
    return UART_write(sStreamUartHandle, buf, len);
}

static streamer_t streamer_cc13x2_26x2 = {
    .init_cb  = streamer_cc13x2_26x2_init,
    .read_cb  = streamer_cc13x2_26x2_read,
    .write_cb = streamer_cc13x2_26x2_write,
};

streamer_t * streamer_get()
{
    return &streamer_cc13x2_26x2;
}

#endif //#ifndef SHELL_STREAMER_APP_SPECIFIC

} // namespace Shell
} // namespace chip
