/******************************************************************************

           Copyright @2024 - 2044 Shenzhen dcenzix Technology Ltd.

 ******************************************************************************
@file cola_device.c
@brief 设备节点管理
@author xiexiongwu
@version V1.0
@date 2024年5月25日

******************************************************************************/

/*----------------------------------------------*
 * 包含头文件                                   *
 *----------------------------------------------*/
#include "cola_device.h"
#include <string.h>


/*----------------------------------------------*
 * 全局变量                                         *
 *----------------------------------------------*/
 /** 
  *  \brief 设备挂载列表 
  */
struct cola_device *device_list = NULL;

/*----------------------------------------------*
 * 函数原型说明                                     *
 *----------------------------------------------*/




/**
 *@brief 设备是否存在
 *
 *@param [in] cola_device_t *dev 设备句柄
 *@return bool true:存在;false:不存在
 *
 */

bool cola_device_is_exists(cola_device_t *dev)
{
    cola_device_t *cur = device_list;
	if(!dev || !dev->name || !strlen(dev->name))
	{
		return false;
	}
	
    while (cur != NULL)
    {
        if (strcmp(cur->name, dev->name) == 0)
        {
            return true;
        }
        cur = cur->next;
    }
    return false;
}

/**
 *@brief 入设备队列
 *
 *@param [in] cola_device_t *dev 设备句柄
 *@return void
 *
 */
void device_list_insert(cola_device_t *dev)
{
    cola_device_t *cur = device_list;
    if (NULL == device_list)
    {
        device_list = dev;
        dev->next   = NULL;
    }
    else
    {
        while (NULL != cur->next)
        {
            cur = cur->next;
        }
        cur->next = dev;
        dev->next = NULL;
    }
}

/**
 *@brief 驱动注册
 *
 *@param [in] cola_device_t *dev 设备句柄
 *@return void
 *
 */
void cola_device_register(cola_device_t *dev)
{
    if ((NULL == dev) || (cola_device_is_exists(dev)))
    {
        return;
    }

    if ((NULL == dev->name) || (NULL == dev->dops))
    {
        return;
    }
	
    device_list_insert(dev);

}
/**
 *@brief 驱动查找
 *
 *@param [in] char *name 设备名称
 *@return cola_device_t *dev 设备句柄
 *
 */

cola_device_t *cola_device_find(const char *name)
{
    cola_device_t *cur = device_list;
    while (cur != NULL)
    {
        if (strcmp(cur->name, name) == 0)
        {
            return cur;
        }
        cur = cur->next;
    }
    return NULL;
}

/**
 *@brief 硬件抽象初始化接口
 *
 *@param [in]  cola_device_t *dev 设备句柄
 *@return int open结果
 *
 */

int cola_device_init(cola_device_t *dev)
{
    if (dev)
    {
        if (dev->dops->init)
        {
            return dev->dops->init(dev);
        }
    }
    return 0;
}


/**
 *@brief 硬件抽象打开接口
 *
 *@param [in]  cola_device_t *dev 设备句柄
 *@param [in]  int oflag 打开标志
 *@return int open结果
 *
 */

int cola_device_open(cola_device_t *dev, int oflag)
{
    if (dev)
    {
        if (dev->dops->open)
        {
            return dev->dops->open(dev, oflag);
        }
    }
    return 0;
}

/**
 *@brief 硬件抽象关闭接口
 *
 *@param [in]  cola_device_t *dev 设备句柄
 *@return int close结果
 *
 */

int cola_device_close(cola_device_t *dev)
{
	if (dev)
    {
        if (dev->dops->close)
        {
            return dev->dops->close(dev);
        }
    }
    return 0;
}


/**
 *@brief 硬件抽象数据读取接口
 *
 *@param [in] cola_device_t *dev 设备句柄
 *@param [in] int pos 操作类型
 *@param [in] void *buffer 数据
 *@param [in] int size 数据长度
 *@return int 读取长度
 *
 */

int cola_device_read(cola_device_t *dev,  int pos, void *buffer, int size)
{
    if (dev)
    {
        if (dev->dops->read)
        {
            return dev->dops->read(dev, pos, buffer, size);
        }
    }
    return 0;
}

/**
  *@brief 硬件抽象数据写入接口
  *
  *@param [in] cola_device_t *dev 设备句柄
  *@param [in] int pos 操作类型
  *@param [in] void *buffer 数据
  *@param [in] int size 数据长度
  *@return int 写入长度
  *
  */	
int cola_device_write(cola_device_t *dev, int pos, const void *buffer, int size)
{
    if (dev)
    {
        if (dev->dops->write)
        {
            return dev->dops->write(dev, pos, buffer, size);
        }
    }
    return 0;
}
 /**
  *@brief 硬件抽象数据控制接口
  *
  *@param [in] cola_device_t *dev 设备句柄
  *@param [in] int cmd 命令
  *@param [in] void *arg 参数
  *@return int 处理结果
  *
  */	
int cola_device_ctrl(cola_device_t *dev,  int cmd, void *arg)
{
    if (dev)
    {
        if (dev->dops->control)
        {
            return dev->dops->control(dev, cmd, arg);
        }
    }
    return 0;
}

/**
 *@brief 硬件抽象数据配置接口
 *
 *@param [in] cola_device_t *dev 设备句柄
 *@param [in] void *args 参数
 *@param [in] void *var 变量
 *@return int 处理结果
 *
 */ 

int cola_device_cfg(cola_device_t *dev, void *args, void *var)
{
    if (dev)
    {
        if (dev->dops->config)
        {
            return dev->dops->config(dev, args, var);
        }
    }
    return 0;
}

/**
 *@brief 设置驱动属于哪个任务
 *
 *@param [in] cola_device_t *dev 设备句柄
 *@param [in] void *owner 任务
 *@return void
 *
 */ 

void cola_device_set_owner(cola_device_t *dev, const void *owner)
{
    dev->owner = (void *)owner;
}
