/*
 * Copyright (c) 2022 Arm Limited. All rights reserved.
 * SPDX-License-Identifier: Apache-2.0
 *
 * 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 "data_acq.h"

#include "log_macros.h"
#include "platform_drivers.h"
#include "uart_stdout.h"

#include <assert.h>
#include <stdlib.h>
#include <string.h>

/**
 * @brief       Get the user input from USART.
 * @param[out]  user_input  String read from the UART block.
 * @param[in]   size        String read length.
 * @return      0 if successful, error code otherwise.
 **/
static int get_uart_user_input(char* user_input, int size)
{
    if (1 != GetLine(user_input, size - 1)) {
        return 1;
    }
    return 0;
}

int data_acq_channel_init(data_acq_module* module)
{
    assert(module);

    /* UART should have been initialised with low level initialisation
     * routines. */
    module->system_init = NULL;

    strncpy(module->system_name, "UART", sizeof(module->system_name));
    module->get_input = get_uart_user_input;
    module->inited = 1;

    return !(module->inited);
}

int data_acq_channel_release(data_acq_module* module)
{
    assert(module);
    module->inited = 0;
    module->get_input = NULL;
    return 0;
}
