/*******************************************************************************
版权所有：	
版本号：    1.00 
文件名：    modify.c 
生成日期：  2019.6.24    
作者： 	  邓良基     
功能说明：定值参数修改定制    
修改日志：  
日志1：           
修改者：    
修改日期：
修改内容：
修改原因：
****************************************************************************/
#include "head.h"
#define MODIFY_DIR "/tmp/"


extern void get_set_value(char *str,const TSETTABLE *pTable,float value);

#if 0
void updateModifyFile(void)
{

}
void creatModifyFile(void)
{
	struct file * pfile;
	loff_t pos;
	char tmpstr[256];
	char valstr[24];
	char *p=tmpstr;
	int i;
	u8 setgroup[GROUP_NUM];

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

	if(!ReadEppData(EEP_SETGROUP_ADDR,setgroup,GROUP_NUM))
	{
		GetDefSetGroup(setgroup);
	}
	
#ifdef PUB_SET_SECTION
	if(!ReadPara((void*)&m_SetBuf,EEP_PUB_ADDR+(PUB_SETSIZE*m_runsection),PUB_SET_NUMBER,&tPubSetTable[0]))	
	{
		GetDefPara((void*)&m_SetBuf,PUB_SET_NUMBER,&tPubSetTable[0]);
	}
#else
	 /*读取压板定值*/
	if(!ReadPara((void*)m_SetBuf,EEP_PUB_ADDR,PUB_SET_NUMBER,&tPubSetTable[0]))
	{
		GetDefPara((void*)m_SetBuf,PUB_SET_NUMBER,&tPubSetTable[0]);
	}

#endif

	
	sprintf(p,"TYPE,ID,   定值名称       ,UI显示,当前值,单位,最大值,最小值,转发点表\r\n",tPubSetTable[i].szName);
	rt_file_write(pfile,p,strlen(p),&pos);
	for(i=0;i<PUB_SET_NUMBER;i++)
	{
		//if((tPubSetTable[i].group==0||setgroup[tPubSetTable[i].group-1]))  // 定值分类组为0 或显示定制为1
		{
			if(tPubSetTable[i].wType==SETTYPE_LABEL)
			{
				sprintf(p,"%d,%d,%s,\r\n",tPubSetTable[i].wType,i+1,tPubSetTable[i].szName);
			}
			else
			{
				get_set_value(valstr,&tPubSetTable[i],m_SetBuf[i].ff);
				sprintf(p,"%d,%d,%s,1,%s,%s,%f,%f,0x%04X\r\n",tPubSetTable[i].wType,i+1,tPubSetTable[i].szName,valstr,
					SetUints[tPubSetTable[i].wUnit],
					tPubSetTable[i].fMax,
					tPubSetTable[i].fMin,
					tPubSetTable[i].ParId 
				);
			}
			rt_file_write(pfile,p,strlen(p),&pos);
		}
	}	
	if(!ReadPara((void*)m_SetBuf,EEP_SET_ADDR+SETSIZE*(m_runsection),SW_SET_NUMBER,&tSwSetTable[0]))
	{
		GetDefPara((void*)m_SetBuf,SW_SET_NUMBER,&tSwSetTable[0]);
	}
	for(i=0;i<SW_SET_NUMBER;i++)
	{
		//if((tSwSetTable[i].group==0||setgroup[tSwSetTable[i].group-1]))  // 定值分类组为0 或显示定制为1
		{
			if(tSwSetTable[i].wType==SETTYPE_LABEL)
			{
				sprintf(p,"%d,%d,%s,\r\n",tSwSetTable[i].wType,i+PUB_SET_NUMBER+1,tSwSetTable[i].szName);
			}
			else
			{
				get_set_value(valstr,&tSwSetTable[i],m_SetBuf[i].ff);			
				sprintf(p,"%d,%d,%s,1,%s,%s,%f,%f,0x%04X\r\n",tSwSetTable[i].wType,i+PUB_SET_NUMBER+1,tSwSetTable[i].szName,valstr,
					SetUints[tSwSetTable[i].wUnit],
					tSwSetTable[i].fMax,
					tSwSetTable[i].fMin,
					tSwSetTable[i].ParId
					);
			}
			rt_file_write(pfile,p,strlen(p),&pos);
		}
	}
	
	rt_file_close(pfile,0);

}

void initModify(void)
{
	
}
#endif

/************************************************************************
函数名称：getCstValRangeString
函数版本：V0.01
作   者：
创建日期：2021.08.05
形参说明：group_type：定值组类别
		 index：定值的索引号
		 *p_str：缓存生成的字符串首地址
		 str_bytes_max：缓存buff最大长度
函数说明：获取定值范围字符串文本
返 回 值：生成的字符串文本长度
************************************************************************/
static int getCstValRangeString(int group_type,int index,char *p_str,const int str_bytes_max)
{
	int i;
	int tmp_len,str_len;
	char str[256]={0}; 
	u32 val_min,val_max;
	const TSETTABLE *p_tmp_val=NULL;

	if(p_str == NULL){
		rt_printf("getSetValueScope函数形参p_str地址为空\r\n");
		return 0;
	}

	switch(group_type){
		case SETGROUP_TYPE_BH:
			p_tmp_val = &tSwSetTable[index];
			break;
		case SETGROUP_TYPE_PUB:
			p_tmp_val = &tPubSetTable[index];
			break;
		case SETGROUP_TYPE_PARA:
			p_tmp_val = &tEquipParaTable[index];
			break;
		case SETGROUP_TYPE_CSTSET:
			p_tmp_val = &tCstSetTable[index];
			break;
		default:
			rt_printf("定值组类型错误!\r\n");
			break;
	}

	if(p_tmp_val == NULL)
		return 0;

	str_len = 0;
	switch(p_tmp_val->wType){
		case SETTYPE_LIST:
			for(i=0; i<p_tmp_val->listnum; i++){
				tmp_len = strlen(p_tmp_val->list[i].str);
				memcpy(&str[str_len],p_tmp_val->list[i].str,tmp_len);
				str_len += tmp_len;
			
				if(i==(p_tmp_val->listnum-1))
					break;
				sprintf(&str[str_len],"、");
				str_len += 2;
			}
			break;
		case SETTYPE_F:
			sprintf(str,"%.3f~%0.3f",p_tmp_val->fMin,p_tmp_val->fMax);
			str_len = strlen(str);
			break;
		case SETTYPE_IP:
			val_min = (u32)p_tmp_val->fMin;
			val_max = 0xffffffff;
			sprintf(str,"%d.%d.%d.%d~%d.%d.%d.%d",(u8)(val_min>>24),(u8)(val_min>>16),(u8)(val_min>>8),(u8)(val_min>>0),(u8)(val_max>>24),(u8)(val_max>>16),(u8)(val_max>>8),(u8)(val_max>>0));
			str_len = strlen(str);
			break;
		case SETTYPE_YMD:
			val_min = (u32)p_tmp_val->fMin;
			val_max = (u32)p_tmp_val->fMax;
			sprintf(str,"%d年%d月%d日~%d年%d月%d日",2000+(u8)(val_min>>16),(u8)(val_min>>8),(u8)(val_min>>0),2000+(u8)(val_max>>16),(u8)(val_max>>8),(u8)(val_max>>0));
			str_len = strlen(str);
			break;
		case SETTYPE_HMS:
			val_min = (u32)p_tmp_val->fMin;
			val_max = (u32)p_tmp_val->fMax;
			sprintf(str,"%d:%d:%d秒~%d:%d:%d秒",(u8)(val_min>>16),(u8)(val_min>>8),(u8)(val_min>>0),(u8)(val_max>>16),(u8)(val_max>>8),(u8)(val_max>>0));
			str_len = strlen(str);
			break;
		case SETTYPE_UINT:
		case SETTYPE_5INT:
		case SETTYPE_LINT:
		case SETTYPE_4INT:
			val_min = (u32)p_tmp_val->fMin;
			val_max = (u32)p_tmp_val->fMax;
			sprintf(str,"%d~%d",val_min,val_max);
			str_len = strlen(str);
			break;
		default:
			rt_printf("非法值数据类型!\r\n");
			return 0;
	}

	if(str_len > str_bytes_max){
		rt_printf("getCstValRangeString_生成的字符串长度超出了缓存buff长度 str_len=%d str_bytes_max=%d\r\n",str_len,str_bytes_max);
		return 0;
	} 

	memcpy(p_str,str,str_len);

	return str_len;
}

/************************************************************************
函数名称：getCstValTypeString
函数版本：V0.01
作   者：
创建日期：2021.08.05
形参说明：val_type：定值类型
		 *p_str：缓存生成的字符串首地址
		 str_bytes_max：缓存buff最大长度
函数说明：获取定值类型字符串文本
返 回 值：生成的字符串文本长度
************************************************************************/
static int getCstValTypeString(int val_type,char *p_str,const int str_bytes_max)
{
	int str_len;
	char str[24]={0}; 

	if(p_str == NULL){
		rt_printf("getCstValTypeString函数形参p_str地址为空\r\n");
		return 0;
	}
	
	switch(val_type){
		case SETTYPE_KG:
			sprintf(str,"控制字");
			break;
		case SETTYPE_LIST:
			sprintf(str,"选择列表");
			break;
		case SETTYPE_F:
			sprintf(str,"浮点型");
			break;
		case SETTYPE_UINT:
		case SETTYPE_4INT:
		case SETTYPE_5INT:
		case SETTYPE_LINT:
			sprintf(str,"整型");
			break;
		case SETTYPE_IP:
			sprintf(str,"IP地址");
			break;
		case SETTYPE_YMD:
			sprintf(str,"年月日");
			break;
		case SETTYPE_HMS:
			sprintf(str,"时分秒");
			break;
		default:
			rt_printf("非法值类型!\r\n");
			return 0;
	}

	str_len = strlen(str);

	if(str_len > str_bytes_max){
		rt_printf("getCstValTypeString_生成的字符串长度超出了缓存buff长度! str_len=%d str_bytes_max=%d\r\n",str_len,str_bytes_max);
		return 0;
	}

	memcpy(p_str,str,str_len);

	return str_len;
}

static void makeCstValueTableFile(struct file *p_file,loff_t *p_pos,const TSETTABLE *p_val_table,const int val_total,const int group_type)
{
	int i;
	char val_default[24];
	char val_type[24];
	char val_range[256];
	char tmpstr[300]={0};	
	char *p=tmpstr;	
	u32 group_last=0;
	u8 *p_menu_show = NULL;

	switch(group_type){
		case SETGROUP_TYPE_BH:
			p_menu_show = bSwSetMenuShow;
			break;
		case SETGROUP_TYPE_PUB:
			p_menu_show = bPubSetMenuShow;
			break;
		case SETGROUP_TYPE_PARA:
			p_menu_show = bParaSetMenuShow;
			break;
		case SETGROUP_TYPE_CSTSET:
			p_menu_show = bCstSetMenuShow;
			break;
		default:
			rt_printf("定值组类型错误!\r\n");
			return;
	}
	
	sprintf(p,"类别,定值名称,整定范围,单位,初始值,说明\r\n");
	rt_file_write(p_file,p,strlen(p),p_pos);
	for(i=0;i<val_total;i++)
	{
		memset(p, 0, sizeof(p));
		if(p_val_table[i].wType==SETTYPE_LABEL || !p_menu_show[i])
			continue;

		memset(val_type, 0, sizeof(val_type));
		memset(val_range, 0, sizeof(val_range));
		memset(val_default, 0, sizeof(val_default));	
		get_set_value(val_default,&p_val_table[i],p_val_table[i].fDef);
		getCstValRangeString(group_type,i,val_range,sizeof(val_range));
		getCstValTypeString(p_val_table[i].wType,val_type,sizeof(val_type));
		if(group_last != p_val_table[i].group)
		{
			int len=0;
			group_last = p_val_table[i].group;
			len = strlen(SetGroups[p_val_table[i].group].item_name)+strlen(p_val_table[i].szName)+strlen(val_range)+strlen(SetUints[p_val_table[i].wUnit])+strlen(val_default)+strlen(val_type);
			if(len > (sizeof(tmpstr)-7))	//7:5个逗号+一个回车符+一个换行符
			{
				sprintf(p,"字符串长度越限，定值生成失败！\r\n");
				rt_printf("字符串长度%d>%d越限,定值生成失败!\r\n",len,(sizeof(tmpstr)-7));
			}
			else
				sprintf(p,"%s,%s,%s,%s,%s,%s\r\n",SetGroups[p_val_table[i].group].item_name,p_val_table[i].szName,val_range,SetUints[p_val_table[i].wUnit],val_default,val_type);
		}
		else
		{
			int len=0;
			len = strlen(p_val_table[i].szName)+strlen(val_range)+strlen(SetUints[p_val_table[i].wUnit])+strlen(val_default)+strlen(val_type);
			if(len > (sizeof(tmpstr)-7))	//7:5个逗号+一个回车符+一个换行符
			{
				sprintf(p,"字符串长度越限，定值生成失败！\r\n");
				rt_printf("字符串长度%d>%d越限,定值生成失败!\r\n",len,(sizeof(tmpstr)-7));
			}
			else
				sprintf(p," ,%s,%s,%s,%s,%s\r\n",p_val_table[i].szName,val_range,SetUints[p_val_table[i].wUnit],val_default,val_type);
		}
		rt_file_write(p_file,p,strlen(p),p_pos);
	}	
}

void updateModifyFile(void)
{

}
void creatModifyFile(void)
{
	loff_t pos=0;
	struct file *p_file;
	char str[512];

	// 创建描述文件
	p_file = rt_file_open("/tmp/setdata_file.csv",O_CREAT|O_RDWR|O_TRUNC,0);
	if(IS_ERR(p_file))
		return;
	sprintf(str,"附录 定值表\r\n  注：1、装置出厂默认设置为保护功能全部退出。请根据实际项目需求及工程配置进行相关更改。\r\n \
	     2、由于技术资料更新问题，装置定值与定值列表不一致，请以装置定值为准。\r\n");
	rt_file_write(p_file,str,strlen(str),&pos);
	memset(str, 0, sizeof(str));
	sprintf(str,"附录1 装置参数定值表\r\n");
	rt_file_write(p_file,str,strlen(str),&pos);
	makeCstValueTableFile(p_file,&pos,tEquipParaTable,EQUIP_PARA_NUMBER,SETGROUP_TYPE_PARA);
	memset(str, 0, sizeof(str));
	sprintf(str,"备注：\r\n  (a) 凡是标明是选择列表类的参数，都可以通过界面列表来选择合适的选项。\r\n  \
	(b) 遥测自动上送参数平衡101规约、104规约有效,如果退出，遥测数据只有总召时才会上送。\r\n  \
	(c) 遥测发送间隔参数平衡101规约及104规约有效,如果遥测自动上送投入,遥测值、遥测发送间隔、遥测死区相 \
	互配合可有效控制通信数据流量。\r\n  (d) 不同以太网卡的IP地址必须设置为不同的网段。\r\n  (e) 网关地址 \
	整定为0.0.0.0代表使用系统默认网关。\r\n");
	rt_file_write(p_file,str,strlen(str),&pos);

	memset(str, 0, sizeof(str));
	sprintf(str,"附录2 公共定值表\r\n");
	rt_file_write(p_file,str,strlen(str),&pos);	
	makeCstValueTableFile(p_file,&pos,tPubSetTable,PUB_SET_NUMBER,SETGROUP_TYPE_PUB);

	memset(str, 0, sizeof(str));
	sprintf(str,"附录3 线路定值表\r\n");
	rt_file_write(p_file,str,strlen(str),&pos);	
	makeCstValueTableFile(p_file,&pos,tSwSetTable,SW_SET_NUMBER,SETGROUP_TYPE_BH);
	memset(str, 0, sizeof(str));
	sprintf(str,"备注：\r\n  (a) 过流加速段电流定值：按躲过本线路最大负荷整定。\r\n  (b) 零序加速段定值：\
	按最小运行方式下本线路末端接地故障最小零序电流,并考虑一定裕量整定。\r\n  (c) 零序加速段时间：按躲过断  \
	路器最大不同时合闸时间整定，避免断路器不同时合闸产生的零序电流使加速元件误动作。\r\n"); 
	rt_file_write(p_file,str,strlen(str),&pos);	

	memset(str, 0, sizeof(str));
	sprintf(str,"附录4 内部定值表\r\n");
	rt_file_write(p_file,str,strlen(str),&pos);	
	makeCstValueTableFile(p_file,&pos,tCstSetTable,CSTSET_NUMBER,SETGROUP_TYPE_CSTSET);
	
	rt_file_close(p_file,0);
}



//========================== 本文件结束 =============================
