/*
 *
 *    Copyright (c) 2021 Project CHIP Authors
 *    All rights reserved.
 *
 *    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.
 */
#include "AppConfig.h"
#include "USART.h"
#include "matter_shell.h"
#include "rsi_rom_egpio.h"
#include "silabs_utils.h"
#include "sl_si91x_usart.h"
#ifdef __cplusplus
extern "C" {
#endif
#include "assert.h"
#include "rsi_board.h"
#include "rsi_debug.h"
#include "uart.h"
#include <stddef.h>
#include <string.h>

#define USART_BAUDRATE 115200 // Baud rate <9600-7372800>
#define UART_CONSOLE_ERR -1   // Negative value in case of UART Console action failed. Triggers a failure for PW_RPC

sl_usart_handle_t usart_handle;

void callback_event(uint32_t event);

/*******************************************************************************
 * Callback function triggered on data Transfer and reception
 ******************************************************************************/
void callback_event(uint32_t event)
{
    switch (event)
    {
    case SL_USART_EVENT_SEND_COMPLETE:
        break;
    case SL_USART_EVENT_RECEIVE_COMPLETE:
#ifdef ENABLE_CHIP_SHELL
        chip::NotifyShellProcess();
#endif
    case SL_USART_EVENT_TRANSFER_COMPLETE:
        break;
    }
}

void uartConsoleInit(void)
{
    int32_t status = 0;

    sl_si91x_usart_control_config_t usart_config;
    usart_config.baudrate      = USART_BAUDRATE;
    usart_config.mode          = SL_USART_MODE_ASYNCHRONOUS;
    usart_config.parity        = SL_USART_NO_PARITY;
    usart_config.stopbits      = SL_USART_STOP_BITS_1;
    usart_config.hwflowcontrol = SL_USART_FLOW_CONTROL_NONE;
    usart_config.databits      = SL_USART_DATA_BITS_8;
    usart_config.misc_control  = SL_USART_MISC_CONTROL_NONE;
    usart_config.usart_module  = USART_0;
    usart_config.config_enable = ENABLE;
    usart_config.synch_mode    = DISABLE;
    sl_si91x_usart_control_config_t get_config;

    // Initialize the UART
    status = sl_si91x_usart_init((usart_peripheral_t) usart_config.usart_module, &usart_handle);
    if (status != SL_STATUS_OK)
    {
        SILABS_LOG("sl_si91x_usart_initialize: Error Code : %lu \n", status);
    }

    // Configure the USART configurations
    status = sl_si91x_usart_set_configuration(usart_handle, &usart_config);
    if (status != SL_STATUS_OK)
    {
        SILABS_LOG("sl_si91x_usart_set_configuration: Error Code : %lu \n", status);
    }

    // Register user callback function
    status = sl_si91x_usart_register_event_callback(callback_event);
    if (status != SL_STATUS_OK)
    {
        SILABS_LOG("sl_si91x_usart_register_event_callback: Error Code : %lu \n", status);
    }

    NVIC_EnableIRQ(USART0_IRQn);
    NVIC_SetPriority(USART0_IRQn, 7);
}

/*
 *   @brief Read the data available from the console Uart
 *   @param Buffer that contains the data to write, number bytes to write.
 *   @return Amount of bytes written or ERROR (-1)
 */
int16_t uartConsoleWrite(const char * Buf, uint16_t BufLength)
{
    int32_t status = 0;
    if (Buf == NULL || BufLength < 1)
    {
        return UART_CONSOLE_ERR;
    }

    status = sl_si91x_usart_send_data(usart_handle, Buf, BufLength);
    if (status != SL_STATUS_OK)
    {
        return status;
    }
    return BufLength;
}

/**
 * @brief Write Logs to the Uart. Appends a return character
 *
 * @param log pointer to the logs
 * @param length number of bytes to write
 * @return int16_t Amount of bytes written or ERROR (-1)
 */
int16_t uartLogWrite(const char * log, uint16_t length)
{
    if (log == NULL || length == 0)
    {
        return UART_CONSOLE_ERR;
    }
    for (uint16_t i = 0; i < length; i++)
    {
        Board_UARTPutChar(log[i]);
    }
    // To print next log in new line with proper formatting
    Board_UARTPutChar('\r');
    Board_UARTPutChar('\n');

    return length + 2;
}

/*
 *   @brief Read the data available from the console Uart
 *   @param Buffer for the data to be read, number bytes to read.
 *   @return Amount of bytes that was read from the rx fifo or ERROR (-1)
 */
int16_t uartConsoleRead(char * Buf, uint16_t NbBytesToRead)
{
    int32_t status = 0;
    if (Buf == NULL || NbBytesToRead < 1)
    {
        return UART_CONSOLE_ERR;
    }

    status = sl_si91x_usart_receive_data(usart_handle, Buf, NbBytesToRead);
    if (status != SL_STATUS_OK)
    {
        return status;
    }
    return NbBytesToRead;
}

#ifdef __cplusplus
}
#endif
