/******************************************************************************
版权所有：	
文件名称：	dido.h
文件版本：	01.01
创建作者:	   sunxi
创建日期：	2013-02-28
功能说明：	开入开出
其它说明：
修改记录：
*/
#ifndef _DIDO_H
#define _DIDO_H

/*------------------------------- 头文件 --------------------------------------
*/

/*------------------------------- 宏定义 --------------------------------------
*/
#define DIDO_MAX_DI_PER_SLOT		32

#define DIDO_TS_BITS 				4
#define DIDO_TS_NUM 				(1<<DIDO_TS_BITS) // 16

#define DIDO_TS_MODE
/*------------------------------ 类型结构 -------------------------------------
*/
// buffer 索引
struct ts_index
{
	volatile u8 n : DIDO_TS_BITS; 
};

struct di
{
	u32 value[2];	// 开入值
	u32 inv[2];		// 是否反转

	struct ts_index ts_i[DIDO_MAX_DI_PER_SLOT];				// 索引
	u32 			ts_t[DIDO_MAX_DI_PER_SLOT][DIDO_TS_NUM];// 时间戳
	u8 				ts_v[DIDO_MAX_DI_PER_SLOT][DIDO_TS_NUM];// 值

};



struct _do
{
	u16 on;	
	u16 off;	
};

struct do_time
{
	u8 slot;
	u32 diff_out_count;
	u32 diff_min;
	u32 diff_max;
};

// 定义遥信防抖处理结构
struct di_struct
{
	// 设置值
	u32 tm_filter;  // 防抖时间
	u8  owner;		//归属：开关1~开关12、公共
	u8  type;		//DI类型

	// 滤波处理
	int b_first_change;  
	u32 tm_keep;	// 保持时间
	u32 tm_back;	// 返回时间

	// 变位记录
	int	b_on;		// 滤波后的遥信状态
	u32 tm_di_time;
	u32 dt;
	struct timespec ts_di;	// 滤波前的变位时刻
#ifdef	DIDO_TS_MODE
	struct timespec ts_tmp;
	uint32 acc_nsec;
#endif
};


// 定义遥信防抖处理结构
struct do_struct
{
	u32 us_keep;
	u32	us_on;
};

/*------------------------------ 全局变量 -------------------------------------
*/
extern struct di g_di[];
extern u8 dido_buf[128];
extern struct di_struct g_di_st[EQU_SLOT_NUM_MAX][DIDO_MAX_DI_PER_SLOT];  
extern struct do_struct g_do_st[];
extern u16	g_do_status;        // 开出状态

/*------------------------------ 函数声明 -------------------------------------
*/

int dido_init(void);
int dido_exit(void);

int dido_di_is_on(u8 slot,u8 index);
int dido_di_is_on_ts(u8 slot,u8 index,u32 ts);
int dido_do_have_select(u32 slot,u32 index);
int dido_do(u32 slot,u16 v,int is_on);
int dido_do_time_recv(u8 * buf);
void dido_do_poll(void);
void dido_qd_set_keeptime(u32 us);

int dido_printf(void);
int dido_stat_reset(void);

int dido_led_test(void);
int dido_auto_test(char *buf,int num);
int dido_single_test(u8 slot, u8 point);
int dido_test(void);
int dido_do_kz(int on, unsigned int i);

#endif //_DIDO_H

/*------------------------------ 文件结束 -------------------------------------
*/



