Files
ESPC3-wireless/app/drivers/data_port/sb_data_port.c

250 lines
6.7 KiB
C
Raw Normal View History

2024-03-28 12:19:52 +08:00
#include "drivers/data_port/sb_data_port.h"
#include "os/os.h"
#define CONFIG_SYS_LOG_LEVEL SYS_LOG_LEVEL_INF
#define SYS_LOG_DOMAIN "DATA"
#define CONS_ABORT()
#include "sys_log.h"
/**
* @brief
*
* @param port
* @retval 0
*/
int sb_data_port_start(sb_data_port_t *port)
{
if (sb_data_port_is_started(port))
{
SYS_LOG_WRN("Data interface repeat started");
return 0;
}
if (port == NULL || port->vtable == NULL)
{
return false;
}
if (port->vtable->start)
{
return port->vtable->start(port);
}
else
{
SYS_LOG_ERR("The data interface has not been defined");
return -1;
}
}
/**
* @brief
*
* @param port
* @retval 0
*/
int sb_data_port_stop(sb_data_port_t *port)
{
if (!sb_data_port_is_started(port))
{
SYS_LOG_WRN("The data interface has not been started yet");
return 0;
}
if (port->vtable->stop)
{
return port->vtable->stop(port);
}
else
{
SYS_LOG_ERR("The data interface has not been defined");
return -1;
}
}
/**
* @brief
* wait_ms 0
* wait_ms > 0
* wait_ms > 0 线线
*
* @param port
* @param data
* @param size
* @param wait_ms
* @retval < 0
* @retval >= 0
*/
int sb_data_port_write(sb_data_port_t *port, const void *data, uint32_t size, uint32_t wait_ms)
{
if (!sb_data_port_is_started(port))
{
SYS_LOG_WRN("The data interface has not been started yet");
return -1;
}
if (port->vtable->write)
{
int ret = 0;
int cmp_time = os_get_sys_time();
while (size)
{
int curr_time = os_get_sys_time();
int wsize = port->vtable->write(port, data, size);
if (wsize > 0)
{
cmp_time = curr_time;
data = &((uint8_t *)data)[wsize];
size -= wsize;
ret += wsize;
}
else if (wsize == 0)
{
if (wait_ms == 0)
{
break;
}
else if (curr_time - cmp_time > wait_ms)
{
return -1;
}
else
{
os_thread_sleep(1);
continue;
}
}
else
{
return -1;
}
}
return ret;
}
else
{
SYS_LOG_ERR("The data interface has not been defined");
return -1;
}
}
/**
* @brief
* wait_ms 0
* wait_ms > 0
* wait_ms > 0 线线
*
* @param port
* @param buffer[out] NULL
* @param length
* @param wait_ms
* @retval < 0
* @retval >= 0
*/
int sb_data_port_read(sb_data_port_t *port, void *buffer, uint32_t length, uint32_t wait_ms)
{
if (!sb_data_port_is_started(port))
{
SYS_LOG_WRN("The data interface has not been started yet");
return -1;
}
if (port->vtable->read)
{
int ret = 0;
int cmp_time = os_get_sys_time();
while (length)
{
int curr_time = os_get_sys_time();
int rsize = port->vtable->read(port, buffer, length);
if (rsize > 0)
{
cmp_time = curr_time;
buffer = &((uint8_t *)buffer)[rsize];
length -= rsize;
ret += rsize;
}
else if (rsize == 0)
{
if (wait_ms == 0)
{
break;
}
else if (curr_time - cmp_time > wait_ms)
{
return -1;
}
else
{
os_thread_sleep(1);
continue;
}
}
else
{
return -1;
}
}
return ret;
}
else
{
SYS_LOG_ERR("The data interface has not been defined");
return -1;
}
}
/**
* @brief
*
*
* @param port
* @retval true
* @retval false
*/
bool sb_data_port_is_started(sb_data_port_t *port)
{
SYS_ASSERT(port, "Data interface not bound");
SYS_ASSERT(port->vtable, "Data interface not bound");
if (port == NULL || port->vtable == NULL)
{
return false;
}
if (port->vtable->is_started)
{
return port->vtable->is_started(port);
}
else
{
SYS_LOG_ERR("The data interface has not been defined");
return false;
}
}
/**
* @brief
*
* @param port
* @retval uint32_t sb_data_port_read()
*/
uint32_t sb_data_port_get_rx_length(sb_data_port_t *port)
{
if (!sb_data_port_is_started(port))
{
return 0;
}
if (port->vtable->get_rx_length)
{
return port->vtable->get_rx_length(port);
}
else
{
SYS_LOG_ERR("The data interface has not been defined");
return -1;
}
}