#include "head.h"

NAME_COMPARE str_di_name[STR_MAX_NUM];		//存储屏蔽相关关键字后字符的数组

/**************************************************************************
函数名称：three_remote_run
创建日期：2021.11
函数功能说明：根据三遥通道配置中的关键字配置完成对应功能的处理
输入参数：无
输出参数：无
返回值：无
***************************************************************************/
void three_remote_run(void)
{
	int i,j,k;
	struct equ_config_di *ecd_di;
	struct equ_config_do *ecd_do;
	struct equ_config_ac *ecd_ac;
	int s_ac_num=0, s_di_num=0, s_do_num=0;
	bool sb_wrong=true;

	rt_printf("关键字数:%d.\r\n",REMOTE_NUM);
	for(i=0;i<REMOTE_NUM;i++)
	{
		switch (g_three_remote_func[i].type)
		{
			case KEYWORD_YC:
				ecd_ac = &g_equ_config_ac[0];
				
				for(j=0; j<g_equ_config->equ_slot_num; j++)
				{
					if(0 != j)
					{
						s_ac_num += g_board_info[j-1].ac_num;
						ecd_ac = &g_equ_config_ac[s_ac_num];
					}
					
					for(k=0;k<g_board_info[j].ac_num;k++)
					{
						if(0 == strncmp(ecd_ac[k].name,g_three_remote_func[i].name,strlen(g_three_remote_func[i].name)))
						{
							rt_printf("板卡%02d AI[%d/总%d]:%s\r\n",j,(ecd_ac[k].index+1),g_board_info[j].ac_num,ecd_ac[k].name);
							g_three_remote_func[i].function(ecd_ac[k].index, j);	//传递带关键字遥测点的硬件地址和板卡槽位
							sb_wrong = false;
						}
					}
				}

				if(sb_wrong)
				{
					rt_printf("AC关键字未输入/输入有误，无法识别\r\n");
				}

				break;
			case KEYWORD_YX:
				ecd_di = &g_equ_config_di[0];
				
				for(j=0; j<g_equ_config->equ_slot_num; j++)
				{
					if(0 != j)
					{
						s_di_num += g_board_info[j-1].di_num;
						ecd_di = &g_equ_config_di[s_di_num];
					}
					
					for(k=0;k<g_board_info[j].di_num;k++)
					{
						if(0 == strncmp(ecd_di[k].name,g_three_remote_func[i].name,strlen(g_three_remote_func[i].name)))
						{
							rt_printf("板卡%02d DI[%d/总%d]:%s\r\n",j,(ecd_di[k].index+1),g_board_info[j].di_num,ecd_di[k].name);
							g_three_remote_func[i].function(ecd_di[k].index, j);	//传递带关键字遥信点的硬件地址和板卡槽位
							sb_wrong = false;
						}
					}
				}

				if(sb_wrong)
				{
					rt_printf("DI关键字未输入/输入有误，无法识别\r\n");
				}
				
				break;
			case KEYWORD_YK:
				/*for(k=0;k<g_equ_config->do_num;k++)
				{
					ecd_do = &g_equ_config_do[k];
					
					if(0 == strncmp(ecd_do->name,g_three_remote_func[i].name,strlen(g_three_remote_func[i].name)))
					{
						rt_printf("遥控:%s,硬件地址:%d,do_num=%d\r\n",ecd_do->name,(ecd_do->index+1),g_equ_config->do_num);
						g_three_remote_func[i].function(ecd_do->index);
					}
				}*/

				ecd_do = &g_equ_config_do[0];
				
				for(j=0; j<g_equ_config->equ_slot_num; j++)
				{
					if(0 != j)
					{
						s_do_num += g_board_info[j-1].do_num;
						ecd_do = &g_equ_config_do[s_do_num];
					}
					
					for(k=0;k<g_board_info[j].do_num;k++)
					{
						if(0 == strncmp(ecd_do[k].name,g_three_remote_func[i].name,strlen(g_three_remote_func[i].name)))
						{
							rt_printf("板卡%02d DO[%d/总%d]:%s\r\n",j,(ecd_do[k].index+1),g_board_info[j].do_num,ecd_do[k].name);
							g_three_remote_func[i].function(ecd_do[k].index, j);	//传递带关键字遥控点的硬件地址和板卡槽位
							sb_wrong = false;
						}
					}
				}

				if(sb_wrong)
				{
					rt_printf("DO关键字未输入/输入有误，无法识别\r\n");
				}
				
				break;
			default:
				break;
		}
	}

	create_keyword_statement();
}

/**************************************************************************
函数名称：create_keyword_statement
创建日期：2021.11
函数功能说明：创建关键字声明
输入参数：无
输出参数：无
返回值：无
***************************************************************************/
void create_keyword_statement(void)
{
	struct file *pfile;
	loff_t pos=0;
	char tmp_keyword[256];
	int i;

	// 创建描述文件
	pfile = rt_file_open("/tmp/keyword.csv",O_CREAT|O_RDWR|O_TRUNC,0);
	if(IS_ERR(pfile))
		return;

	sprintf(tmp_keyword,"关键字属性,关键字名称,配置说明\r\n");
	rt_file_write(pfile,tmp_keyword,strlen(tmp_keyword),&pos);
	memset(tmp_keyword, 0, sizeof(tmp_keyword));
		
	for(i=0;i<REMOTE_NUM;i++)
	{
		sprintf(tmp_keyword,"%s,%s,%s\r\n",g_three_remote_func[i].name_type,g_three_remote_func[i].name,g_three_remote_func[i].name_explain);
		rt_file_write(pfile,tmp_keyword,strlen(tmp_keyword),&pos);
	}
	memset(tmp_keyword, 0, sizeof(tmp_keyword));

	sprintf(tmp_keyword,"\r\n使用说明:,维护工具的通道配置里将关键字输入于对应名称前面即可实现特定功能，如:\r\n");
	rt_file_write(pfile,tmp_keyword,strlen(tmp_keyword),&pos);
	memset(tmp_keyword, 0, sizeof(tmp_keyword));

	sprintf(tmp_keyword,",[DI通道配置]:\r\n,板卡槽位,硬件地址,归属,类型,名称,防抖时间(ms),取反\r\n,1,1,开关1,合位开入,<交流>开关1 合位开入,20,否\r\n\
ATTENTION,!!请务必不能忽略关键字的尖括号“<>”!!\r\n");
	rt_file_write(pfile,tmp_keyword,strlen(tmp_keyword),&pos);
	memset(tmp_keyword, 0, sizeof(tmp_keyword));
	
	rt_file_close(pfile,0);
}

/**************************************************************************
函数名称：shield_str
创建日期：2021.11
函数功能说明：屏蔽"<交流>"等关键字的显示（面板和SOE）
输入参数：ecd，str_type
输出参数：str_name
返回值：无
***************************************************************************/
char* shield_str(struct equ_config_di *ecd)
{
	int i,len;
	
	for(i=0; i<REMOTE_NUM; i++)
	{
		if(0 == strncmp(ecd->name,g_three_remote_func[i].name,strlen(g_three_remote_func[i].name)))
		{
			len = strlen(g_three_remote_func[i].name);
			strcpy(str_di_name[i].namestr,&ecd->name[len]);
			return str_di_name[i].namestr;
		}
	}
	return ecd->name;
}

/**************************************************************************
函数名称：print_di
创建日期：2022.12
函数功能说明：将开入配置打印成文件，放到tmp文件夹中
输入参数：无
输出参数：无
返回值：无
***************************************************************************/
static void print_di(void)
{
	struct file *pfile;
	loff_t pos=0;
	char str_config[64];
	int i;

	// 创建描述文件
	pfile = rt_file_open("/tmp/equ_di.csv",O_CREAT|O_RDWR|O_TRUNC,0);
	if(IS_ERR(pfile))
		return;

	for(i=0;i<PUB_DI_NUM;i++)
	{
		if(0 == i)
			sprintf(str_config,"公共,%s\r\n",g_pub_di_name[i]);
		else
			sprintf(str_config,",%s\r\n",g_pub_di_name[i]);
		rt_file_write(pfile,str_config,strlen(str_config),&pos);
		memset(str_config, 0, sizeof(str_config));
	}

	for(i=0;i<SW_DI_NUM;i++)
	{
		if(0 == i)
			sprintf(str_config,"开关,%s\r\n",g_sw_di_name[i]);
		else
			sprintf(str_config,",%s\r\n",g_sw_di_name[i]);
		rt_file_write(pfile,str_config,strlen(str_config),&pos);
		memset(str_config, 0, sizeof(str_config));
	}

	rt_file_close(pfile,0);
}

/**************************************************************************
函数名称：print_do
创建日期：2022.12
函数功能说明：将开出配置打印成文件，放到tmp文件夹中
输入参数：无
输出参数：无
返回值：无
***************************************************************************/
static void print_do(void)
{
	struct file *pfile;
	loff_t pos=0;
	char str_config[64];
	int i;

	// 创建描述文件
	pfile = rt_file_open("/tmp/equ_do.csv",O_CREAT|O_RDWR|O_TRUNC,0);
	if(IS_ERR(pfile))
		return;

	for(i=0;i<PUB_DO_NUM;i++)
	{
		if(0 == i)
			sprintf(str_config,"公共,%s\r\n",g_pub_do_name[i]);
		else
			sprintf(str_config,",%s\r\n",g_pub_do_name[i]);
		rt_file_write(pfile,str_config,strlen(str_config),&pos);
		memset(str_config, 0, sizeof(str_config));
	}

	for(i=0;i<SW_DO_NUM;i++)
	{
		if(0 == i)
			sprintf(str_config,"开关,%s\r\n",g_sw_do_name[i]);
		else
			sprintf(str_config,",%s\r\n",g_sw_do_name[i]);
		rt_file_write(pfile,str_config,strlen(str_config),&pos);
		memset(str_config, 0, sizeof(str_config));
	}

	rt_file_close(pfile,0);
}

/**************************************************************************
函数名称：print_led
创建日期：2022.12
函数功能说明：将灯配置打印成文件，放到tmp文件夹中
输入参数：无
输出参数：无
返回值：无
***************************************************************************/
static void print_led(void)
{
	struct file *pfile;
	loff_t pos=0;
	char str_config[64];
	int i;

	// 创建描述文件
	pfile = rt_file_open("/tmp/equ_led.csv",O_CREAT|O_RDWR|O_TRUNC,0);
	if(IS_ERR(pfile))
		return;

	for(i=0;i<PUB_LED_NUM;i++)
	{
		if(0 == i)
			sprintf(str_config,"公共,%s\r\n",g_pub_led_name[i]);
		else
			sprintf(str_config,",%s\r\n",g_pub_led_name[i]);
		rt_file_write(pfile,str_config,strlen(str_config),&pos);
		memset(str_config, 0, sizeof(str_config));
	}

	for(i=0;i<SW_LED_NUM;i++)
	{
		if(0 == i)
			sprintf(str_config,"开关,%s\r\n",g_sw_led_name[i]);
		else
			sprintf(str_config,",%s\r\n",g_sw_led_name[i]);
		rt_file_write(pfile,str_config,strlen(str_config),&pos);
		memset(str_config, 0, sizeof(str_config));
	}

	rt_file_close(pfile,0);
}

/**************************************************************************
函数名称：print_soe
创建日期：2022.12
函数功能说明：将事件记录打印成文件，放到tmp文件夹中
输入参数：无
输出参数：无
返回值：无
***************************************************************************/
static void print_soe(void)
{
	struct file *pfile;
	loff_t pos=0;
	char str_config[64];
	int i;

	// 创建描述文件
	pfile = rt_file_open("/tmp/equ_soe.csv",O_CREAT|O_RDWR|O_TRUNC,0);
	if(IS_ERR(pfile))
		return;

	for(i=0;i<(EV_NUMBER - EV_PUB_START);i++)
	{
		if(0 == i)
			sprintf(str_config,"公共,%s\r\n",tAllSOE[i+EV_PUB_START].strName);
		else
			sprintf(str_config,",%s\r\n",tAllSOE[i+EV_PUB_START].strName);
		rt_file_write(pfile,str_config,strlen(str_config),&pos);
		memset(str_config, 0, sizeof(str_config));
	}

	for(i=0;i<EV_SW_NUM;i++)
	{
		if(0 == i)
			sprintf(str_config,"开关,%s\r\n",tAllSOE[i].strName);
		else
			sprintf(str_config,",%s\r\n",tAllSOE[i].strName);
		rt_file_write(pfile,str_config,strlen(str_config),&pos);
		memset(str_config, 0, sizeof(str_config));
	}

	rt_file_close(pfile,0);
}

/**************************************************************************
函数名称：print_forward_tab
创建日期：2022.12
函数功能说明：将转发点表打印成文件，放到tmp文件夹中
输入参数：无
输出参数：无
返回值：无
***************************************************************************/
static void print_forward_tab(void)
{
	struct file *pfile;
	loff_t pos=0;
	char str_config[64];
	int i;
	char name[64];

	// 创建描述文件
	pfile = rt_file_open("/tmp/equ_table.csv",O_CREAT|O_RDWR|O_TRUNC,0);
	if(IS_ERR(pfile))
		return;

	if(0 == g_table_head->di_num)
	{
		sprintf(str_config, "遥信\r\n");
		rt_file_write(pfile,str_config,strlen(str_config),&pos);
		memset(str_config, 0, sizeof(str_config));
	}
	else
	{
		for(i=0;i<g_table_head->di_num;i++)
		{
			tbl_getname(RES_TYPE_YX,i,name);
			if(0 == i)
				sprintf(str_config, "遥信,%s\r\n", name);
			else
				sprintf(str_config, ",%s\r\n", name);
			rt_file_write(pfile,str_config,strlen(str_config),&pos);
			memset(str_config, 0, sizeof(str_config));
		}
	}

	if(0 == g_table_head->ac_num)
	{
		sprintf(str_config, "遥测\r\n");
		rt_file_write(pfile,str_config,strlen(str_config),&pos);
		memset(str_config, 0, sizeof(str_config));
	}
	else
	{
		for(i=0;i<g_table_head->ac_num;i++)
		{
			tbl_getname(RES_TYPE_YC,i,name);
			if(0 == i)
				sprintf(str_config, "遥测,%s\r\n", name);
			else
				sprintf(str_config, ",%s\r\n", name);
			rt_file_write(pfile,str_config,strlen(str_config),&pos);
			memset(str_config, 0, sizeof(str_config));
		}
	}

	if(0 == g_table_head->do_num)
	{
		sprintf(str_config, "遥控\r\n");
		rt_file_write(pfile,str_config,strlen(str_config),&pos);
		memset(str_config, 0, sizeof(str_config));
	}
	else
	{
		for(i=0;i<g_table_head->do_num;i++)
		{
			tbl_getname(RES_TYPE_YK,i,name);
			if(0 == i)
				sprintf(str_config, "遥控,%s\r\n", name);
			else
				sprintf(str_config, ",%s\r\n", name);
			rt_file_write(pfile,str_config,strlen(str_config),&pos);
			memset(str_config, 0, sizeof(str_config));
		}
	}

	if(0 == g_table_head->dd_num)
	{
		sprintf(str_config, "电度\r\n");
		rt_file_write(pfile,str_config,strlen(str_config),&pos);
		memset(str_config, 0, sizeof(str_config));
	}
	else
	{
		for(i=0;i<g_table_head->dd_num;i++)
		{
			tbl_getname(RES_TYPE_DD,i,name);
			if(0 == i)
				sprintf(str_config, "电度,%s\r\n", name);
			else
				sprintf(str_config, ",%s\r\n", name);
			rt_file_write(pfile,str_config,strlen(str_config),&pos);
			memset(str_config, 0, sizeof(str_config));
		}
	}
	
	rt_file_close(pfile,0);
}

/**************************************************************************
函数名称：get_config
创建日期：2022.12
函数功能说明：将开入、开出、灯、事件记录、转发点表打印成文件
输入参数：无
输出参数：无
返回值：无
***************************************************************************/
void get_config(void)
{
	print_di();
	print_do();
	print_led();
	print_soe();
	print_forward_tab();
}


