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

           Copyright @2024 - 2044 Shenzhen dcenzix Technology Ltd.

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

******************************************************************************/
#ifndef __COLA_DEVICE_H__
#define __COLA_DEVICE_H__

/*----------------------------------------------*
 * 包含头文件                                   *
 *----------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>
#include "cola_init.h"

/*----------------------------------------------*
 * 宏定义                                          *
 *----------------------------------------------*/
typedef struct cola_device  cola_device_t;

/*----------------------------------------------*
 * 结构体定义                                        *
 *----------------------------------------------*/

/**\struct  cola_device_ops
 * \brief 硬件操作抽象接口
 */
struct cola_device_ops
{
    int (*init)(cola_device_t *dev);     			///<初始化接口
    int (*open)(cola_device_t *dev, int oflag);     ///<打开接口
    int (*close)(cola_device_t *dev);    			///<关闭接口
    int (*read)(cola_device_t *dev, int pos, void *buffer, int size);     		///<数据读取接口
    int (*write)(cola_device_t *dev, int pos, const void *buffer, int size);   ///<数据写入接口
    int (*control)(cola_device_t *dev, int cmd, void *args); 	///<数据控制接口
    int (*config)(cola_device_t *dev, void *args, void *var);  	///<数据配置接口
};


/**\struct  cola_device
 * \brief 设备
 */

struct cola_device
{
    const char *name;					///<设备名称
    const struct cola_device_ops *dops; ///<设备操作接口
    void   *owner;						///<设备所属任务
    void   *argv;						///<参数
    int    data;						///<数据
    struct cola_device *next;			///<设备连表的下一个
};

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

#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* __cplusplus */

extern int cola_device_cfg(cola_device_t *dev, void *args, void *var);
extern int cola_device_close(cola_device_t *dev);
extern int cola_device_ctrl(cola_device_t *dev,  int cmd, void *arg);
extern cola_device_t *cola_device_find(const char *name);
extern int cola_device_init(cola_device_t *dev);
extern bool cola_device_is_exists(cola_device_t *dev);
extern int cola_device_open(cola_device_t *dev, int oflag);
extern int cola_device_read(cola_device_t *dev,  int pos, void *buffer, int size);
extern void cola_device_register(cola_device_t *dev);
extern void cola_device_set_owner(cola_device_t *dev, const void *owner);
extern int cola_device_write(cola_device_t *dev, int pos, const void *buffer, int size);
extern void device_list_insert(cola_device_t *dev);

#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */


#endif /* __COLA_DEVICE_H__ */
