/******************************************************************************
版权所有：	
文件名称：	equ.h
文件版本：	01.01
创建作者:	   sunxi
创建日期：	2013-03-25
功能说明：	装置信息管理维护
其它说明：
修改记录：
*/
#ifndef _EQU_H
#define _EQU_H
/*------------------------------- 头文件 --------------------------------------
*/


/*------------------------------- 宏定义 --------------------------------------
*/
// 配置资源名字长度，不要随意改动，影响文件的对齐。
#define EQU_CFG_NAME_LEN		20	

// 板卡类型用一个字节表示，分为四组，用最高2位表示
// 1、001~063: 和主板直接或通过CAN连接。
// 2、064~127: 和主板通过串口连接
// 3、128~191: 保留
// 4、192~255: 保留
#define BOARD_TYPE_GROUP_MASK		0XC0
#define BOARD_TYPE_GROUP_MAIN		0X00
#define BOARD_TYPE_GROUP_RS			0X40
#define BOARD_TYPE_GROUP_RSV1		0X80
#define BOARD_TYPE_GROUP_RSV2		0XC0

// 支持的控制板数量
#define BOARD_TYPE_KZ_NUM		26  //增加控制板的类型数量，适应分布式不同办卡类型


#define	BOARD_TYPE_NULL				0   // 备用板
#define BOARD_TYPE_POWER			1   // 电源板
#define BOARD_TYPE_MAIN				2   // 主控板 
#define BOARD_TYPE_DO				3   // 开入板
#define BOARD_TYPE_DI				4   // 开出板
#define BOARD_TYPE_AUX				5   // 
#define BOARD_TYPE_AC				6   // 采样板
#define BOARD_TYPE_ZT				7	// 状态板
#define BOARD_TYPE_ZH				8	// 综合板
#define BOARD_TYPE_KZ				9	// 控制板

#define BOARD_TYPE_FTUMAIN			11	//GH_F308 主板，DI、DO、AI
#define BOARD_TYPE_FTUKZ1			12	//GH_F308 控制板，仅占板卡位置,10DO, 3DI, 8AC
#define BOARD_TYPE_DFTU_KC00		13	//DFTU 二遥DFTU控制板，,00DO, 12DI, 16AC

#define BOARD_TYPE_DFTU_KC08		14	//DFTU 三遥DFTU控制板，,08DO, 3DI, 10AC
#define BOARD_TYPE_DFTU_KC10		15	//DFTU 三遥DFTU控制板，,10DO, 3DI, 10AC
#define BOARD_TYPE_FBDTU_KZ1		16	//一体式分布式DTU控制板
#define BOARD_TYPE_FBDTU_KZ2		17	//后拔插分布式DTU控制板
#define BOARD_TYPE_FBDTU_MAIN1		18	//分布式DTU主板
#define BOARD_TYPE_FBDTU_MAIN		19	//分布式DTU主板

#define BOARD_TYPE_DI60				10	//标准化DTU开入拓展板
#define BOARD_TYPE_DO_2				20	//标准化DTU开出拓展板

#define BOARD_TYPE_FBC_V1           25  // 国网测控控制板
#define BOARD_TYPE_FBM_V1           26	// 国网管理控制板

#define BOARD_TYPE_FUXI_DI          30   // 开入板
#define BOARD_TYPE_FUXI_DO          31   // 开出板
#define BOARD_TYPE_FUXI_AC          32   // 采样板

#define BOARD_TYPE_RS_STATUS		64	// 状态板
#define BOARD_TYPE_LCD_16LED		65	// 液晶面板
#define BOARD_TYPE_LCD				65	// 液晶面板
#define BOARD_TYPE_METERING			67	// 计量板
#define BOARD_TYPE_LCD_24LED		68	// 液晶面板 24个双色灯
#define BOARD_TYPE_LCD_26LED		70	// 液晶面板 26个双色灯

#define BOARD_TYPE_FTU				100	//FTU主板
#define BOARD_TYPE_FTU_V2		    103 //FTU_V2
#define BOARD_TYPE_FTU_END			130	

#define BOARD_TYPE_HAT_FTU_LCD		63///120	// 新罩式FTU面板

#define BOARD_STATUS_POWERUP		0X00
#define BOARD_STATUS_CONFIG_DO		0X01
#define BOARD_STATUS_CONFIG_DI		0X02
#define BOARD_STATUS_NORMAL			0X03
#define BOARD_STATUS_UPDATE			0X04
#define BOARD_STATUS_CONFIG_WAIT	0X07
#define BOARD_STATUS_CONFIG_LED		0X08
#define BOARD_STATUS_CONFIG_DO_2	0X09 //DFTU 开出拓展板状态

//CT PT标度,1V或1A对应的码值
enum
{
	EQU_SCALE_PT_264V_3V53,	
	EQU_SCALE_PT_DEFAULT,	// 默认值，不同装置默认值可能不同
	EQU_SCALE_EVT_3V25_100V,	
	EQU_SCALE_EVT_6V50_100V,
	EQU_SCALE_CT_100A_3V53,	
	EQU_SCALE_CT_DEFAULT,	// 默认值，一般额定值为100A，不同装置默认值可能不同
	EQU_SCALE_ECT_1V_1A,	
	EQU_SCALE_ECT_0V2_1A,
	EQU_SCALE_CT_10A_51,
	EQU_SCALE_PT_102K,
	EQU_SCALE_PT_120K,
	EQU_SCALE_PT_172K,
	EQU_SCALE_PT_204K,
	EQU_SCALE_CT_10A_604,
	EQU_SCALE_CT_10A_120,
	EQU_SCALE_CT_10A_249,
	EQU_SCALE_PT_120K_604,
	EQU_SCALE_PT_400V_3V53,
	EQU_SCALE_CT_20A_3V53, 
	EQU_SCALE_DC_VOLT,
	EQU_SCALE_DC_CURRENT,
	EQU_SCALE_NUM
};


#define LED_NULL		(-1)
#define LED_MAX_NUM		(16*4 + 8)


/*------------------------------ 类型结构 -------------------------------------
*/
//装置配置文件头
struct equ_config
{
	// 配置文件头
	struct cfg_file_head cfh;		

	//工程文件名
	s8	prj_name[64];

	// 装置类型
	u8 	equ_sw_num;		// 装置支持的本地开关数量
	u8 	equ_slot_num;	// 装置支持的插槽数量
	s8 	equ_name[14];

	// 板卡信息
	u8 	brd_type[16];

	// 通道配置头
	// DI
	u32	di_addr;	//地址
	u32	di_num;		//个数

	// DO
	u32	do_addr;	//地址
	u32	do_num;		//个数

	// AC
	u32	ac_addr;	//地址
	u32	ac_num;		//个数

	// 保留
	u32	re_addr;	//地址
	u32	re_num;		//个数

	//对应描述文件
	u32	rsc_version;// 版本
	u32	rsc_signature;// 签名
	u32	rsc_length;// 长度
	u16	rsc_crc;	// CRC
	u16 reserved0;
};

struct equ_config_di
{
	u8 	slot;			//板卡槽位地址
	u8 	index;			//DI硬件地址,从0开始
	u8 	type;			//DI类型
	u8 	owner;			//归属：开关1~开关12、公共
	u32 filter_time;	//DI防抖滤波时间
	u8 	is_Inverse;		//是否取反
	s8 	name[EQU_CFG_NAME_LEN];		//DI名称
	u8	reserved[3];
};

struct equ_config_do
{
	u8 	slot;		//板卡槽位地址
	u8 	index;		//DO硬件地址
	u8 	type;		//DO类型
	u8 	owner;		//归属：开关1~开关12、公共
	u16 time_pulse;	//DO脉宽时间
	s8 	name[EQU_CFG_NAME_LEN];	//DO名称
	u8	reserved[6];
};

struct equ_config_ac
{
	u8 	slot;			//板卡槽位地址
	u8 	index;			//AI硬件地址
	u8 	type;			//AI类型
	u8 	owner;			//归属：开关1~开关12、公共
	u8 	is_ct_inverse;	//CT是否反向：防止CT反接
	u8 	scale;		//采样PT变比：1A 5A 20A100A
	s8 	name[EQU_CFG_NAME_LEN];		//AI名称
	u16	reserved[6];
};

struct board_res_head
{
	// 配置文件头
	struct cfg_file_head cfh;		

	// 板卡描述
	u32	br_addr;	//地址
	u32	br_num;		//个数

	// 保留
	u32	re_addr;	//地址
	u32	re_num;		//个数
};


struct board_res
{
	u8 type;	// 类型
	u8 di_num;	// DI数量
	u8 do_num;	// DO数量
	u8 ac_num;	// AC数量
	s8 name[12];// 名字
};


struct board_info
{
	u8 	type;
	u8  di_num;	// DI数量
	u8  do_num;	// DO数量
	u8  ac_num;	// AC数量
	
	u8 	status;
	u16	errcode;
	u16 crc;
	u32 version;
	struct timespec update_time;
	u16	can_bus;

	// 子板通讯异常检查
	u8	is_check;	// 是否检查
	u8	is_ok;		// 检查结果是否ok
	u32 us0;		// 检查时间点记录
};

struct sn
{
	s8 sw;
	s8 no;
};

//LED配置结构体
struct led_config
{
	u8 	num;					// 板卡LED个数
	struct sn sn[LED_MAX_NUM];	// LED对应逻辑点
};


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

extern struct equ_config 		*g_equ_config;
extern struct equ_config_di 	*g_equ_config_di;
extern struct equ_config_do 	*g_equ_config_do;
extern struct equ_config_ac 	*g_equ_config_ac;

	extern struct board_info 		g_board_info[];

extern struct board_res			*g_board_res;

extern u8  g_equ_adc_inv[CFG_ADC_CHANNEL]; 
extern int g_equ_adc_inv_num;

// ADC通道是否配置
extern u8 g_equ_adc_config[CFG_ADC_CHANNEL];

extern u32 g_sw_num;

extern int g_slot_addr;		// 插槽地址
extern int g_hw_version;	// 硬件版本

extern u16 g_crc_brd_res;
extern u16 g_crc_equ_cfg;
extern u32 g_ac_slot_begin;  //8槽机箱为6，11槽机箱为7

extern struct file_contrast		g_equ_contrast;
extern int g_sw_ac_num[SWITCH_NUM_MAX+1];
extern int g_pub_ac_num;

#define equ_config_null()		(!g_equ_config->equ_slot_num)
#define equ_slot_can_bus(slot) (g_board_info[slot].can_bus)

int equ_init(void);
int equ_exit(void);

int equ_ac_index_to_slot(int ac_index);
int equ_get_di_num(u32 slot);
int equ_get_do_num(u32 slot);
int equ_get_ac_num(u32 slot);
int equ_get_ac_channel(u32 slot,u32 index);
int equ_get_ac_scale(u8 slot,u8 no);
u32 equ_get_slot_by_type(u8 type);
u16 equ_di_to_sw(u8 slot,u8 no);
char * equ_di_name(u8 slot,u8 no);
u8   equ_di_type(u8 slot,u8 no);  //根据板卡和序号，返回遥信类型
u8  equ_pub_di_type(u8 slot,u8 no) ;
#endif //_EQU_H

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



