/*
 *
 *    Copyright (c) 2021 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.
 */

#include <lib/core/CHIPSafeCasts.h>
#include <lib/shell/streamer.h>
#include <platform/PlatformManager.h>
#include <wiced_hal_platform.h>
#include <wiced_hal_puart.h>

namespace chip {
namespace Shell {

void ProcessInput(intptr_t args);

static int streamer_cyw30739_init(streamer_t * streamer);
static ssize_t streamer_cyw30739_read(streamer_t * streamer, char * buf, size_t len);
static ssize_t streamer_cyw30739_write(streamer_t * streamer, const char * buf, size_t len);
static void streamer_cyw30739_uart_rx_handler(void * arg);

static streamer_t streamer_stdio = {
    .init_cb  = streamer_cyw30739_init,
    .read_cb  = streamer_cyw30739_read,
    .write_cb = streamer_cyw30739_write,
};

streamer_t * streamer_get()
{
    return &streamer_stdio;
}

int streamer_cyw30739_init(streamer_t * streamer)
{
    wiced_platform_puart_init(streamer_cyw30739_uart_rx_handler);
    return 0;
}

ssize_t streamer_cyw30739_read(streamer_t * streamer, char * buf, size_t len)
{
    size_t count;
    for (count = 0; count < len; count++)
    {
        if (!wiced_hal_puart_read(Uint8::from_char(buf) + count))
            break;
    }
    wiced_hal_puart_reset_puart_interrupt();
    return count;
}

ssize_t streamer_cyw30739_write(streamer_t * streamer, const char * buf, size_t len)
{
    wiced_hal_puart_print(const_cast<char *>(buf));
    return 0;
}

void streamer_cyw30739_uart_rx_handler(void * arg)
{
    DeviceLayer::PlatformMgr().LockChipStack();
    DeviceLayer::PlatformMgr().ScheduleWork(ProcessInput, 0);
    DeviceLayer::PlatformMgr().UnlockChipStack();
}

} // namespace Shell
} // namespace chip
