⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9311cfg.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 4 页
字号:
/*------------------------------------------------------------------*/
/*模块名称:9311cfg.c		                                       	*/
/*模块功能:读取参数文件并进行相关初始化			    			*/
/*编写日期:2004年12月                                         		*/
/*编写者:  dingding												*/
/*------------------------------------------------------------------*/

#include "includes.h"

//全局变量
struct SysConfig	SysCfg;
struct MyConfig		MyCfg;
struct YCPara_t		YCPara;
struct PortAppInfo	PortInfo[2];
struct SysPort		*SysPorts;
struct DBConfig		*DBCfgs;
struct DBInitInfo	*DBInfos;
void	*MsgQ[MAXCOMMMSG];

extern struct AbsTime_t	pAbsTime;
extern BOOL		TGSH;
extern INT8U	PORTCFG;
extern INT16U	FDNum, ResetDelay;

#ifndef BOOT_PROG
#define FAC_OVERD			0x01	//过流检测
#define FAC_SHORTD			0x02	//短路检测
#define FAC_OVER_TRIP		0x20	//过流(短路)跳闸
#define FAC_RECLOSE			0x80	//一次重合闸
#endif

/*------------------------------------------------------------------*/
/*函数名称:InitSys(void)											*/
/*函数功能:系统初始化,读入参数文件,初始化相关硬件				*/
/*------------------------------------------------------------------*/
void InitSys(void)
{
	BOOL	dd, boot=FALSE;
	INT16U	rc, i;
	INT8U	*pTmpBuf;
	char	err[60];
	struct SysTime_t SystemTime;

	memset (&SysCfg, 0, sizeof (struct SysConfig));
	memset (&MyCfg, 0, sizeof (struct MyConfig));	
	memset (&YCPara, 0, sizeof (struct YCPara_t));
	memset (PortInfo, 0, 2 * sizeof (struct PortAppInfo));
	memset((INT8U*)&pAbsTime, 0, (sizeof (struct AbsTime_t)));
		
	SysSchedul();
	SetCFG(FLASH_BASE);
	#ifdef BOOT_PROG
		boot = Test();
	#endif
	
	NVRAMInit();

	//时钟初始化
	GetX1226Time();
	
	GetTime((void *)&SystemTime, SYSTIME);
	sprintf(err, "%04d-%02d-%02d %02d:%02d:%02d:%03d ******系统重新启动******", SystemTime.Year, SystemTime.Month, SystemTime.Day, SystemTime.Hour,SystemTime.Minute, SystemTime.Second, SystemTime.MSecond);
	ErrorInfo(ROOTID, err);
	
	//注意添加的字符总共不要超过10个
	strcpy(err, VERSIONNO);
	
	#ifdef FUNCTION_CN
		strcat(err, " CN");
	#endif
	
	ErrorInfo(ROOTID, err);
	
	if ((pTmpBuf = (INT8U*)malloc(sizeof(INT8U)*MAXFILELEN)) == NULL)
	{
		ErrorInfo(ROOTID, "空间不够,无法读取文件");
		return;
	}
	
	//读取ycpara.sys
	SysCfg.DefPara = FALSE;		
	GetYcPara(YCPARAINIT);
	SysSchedul();
	
	if (!boot)
		rc = ReadParaFile("devices.dat", pTmpBuf, MAXFILELEN, TRUE);
	if ((rc == FOPERROR) || boot)
	{
		SetDefBase();
		SysCfg.DefPara = TRUE;
	}
	else
		GetDevice(pTmpBuf);

	if (!SysCfg.DefPara)
	{
		for (i=0; i<SysCfg.DBAllNum; i++)
		{
			dd = GetRealBase(i, pTmpBuf);
			if (!dd)
			{
				SetDefBase();
				break;
			}
		}
		for (i=0; i<SysCfg.DBAllNum; i++)
		{
			dd = GetLogicBase(i, pTmpBuf);
			if (!dd)
			{
				SetDefBase();
				break;
			}
		}
	}
	
	SysSchedul();
	if (!boot)
		rc = ReadParaFile("myconfig.dat", pTmpBuf, MAXFILELEN, TRUE);
	if ((rc == FOPERROR) || boot)
	{
		SetDefMyConfig();
		SysCfg.DefPara = TRUE;
	}
	else
		GetMyConfig(pTmpBuf);		

	#ifndef BOOT_PROG
		if (MyCfg.FDNum)
		{
			for (i=0;i<MyCfg.FDNum;i++)
				if (MyCfg.Fd[i].Control & FAULTD_ENABLE)
					GetDzfd(i, pTmpBuf);
		}
	#endif

	if (!boot)
		rc = ReadParaFile("ports.dat", pTmpBuf, MAXFILELEN, FALSE);
	if ((rc == FOPERROR) || boot)
		SetDefPort();
	else
		GetPorts(pTmpBuf);
	
	DBInit();
	SysSchedul();
		
	if (SysCfg.DefPara)
		ErrorInfo(ROOTID, "注意:系统使用默认参数!");

	ErrorInfo(ROOTID, "系统开始运行...");
	free (pTmpBuf);
}

/*------------------------------------------------------------------*/
/*函数名称:ReadParaFile()											*/
/*函数功能:读取参数文件(最大64K)									*/
/*------------------------------------------------------------------*/
INT16U ReadParaFile(char *Name, INT8U *pBuf, INT32U Len, BOOL Flag)
{
	INT16U	rc;
	char	err[60] = "";
	struct FileInfo pFile;
	
	memcpy ((INT8U*)pFile.Name, Name, MAXFILENAMELEN);
	
	rc = FRead(pBuf, 0x8000, Len, &pFile);
	
	if (!Flag)
		return (rc);
	
	if (rc == FOPERROR)
	{
		strcpy (err, Name);
		strcat (err, " 文件读取失败...");
		ErrorInfo(ROOTID, err);
	}

	return (rc);
}

/*------------------------------------------------------------------*/
/*函数名称:GetDevice()												*/
/*函数功能:读取设备文件,创建数据库索引							*/
/*输入说明:														*/
/*输出说明:														*/
/*------------------------------------------------------------------*/
void GetDevice(INT8U* pTmpBuf)
{
	INT8U	err;
	INT16U	i, j, k, size, num, dd, cur;
	struct FILEHEADER_t *filehead;
	struct PDevConf_t *pdevice;
	INT16U	ports[PORTMAXNUM];
	
	num = 0;
	filehead = (struct FILEHEADER_t*)pTmpBuf;
	pdevice = (struct PDevConf_t*)(filehead + 1);
	i = filehead->Size - filehead->Headsize;
	size = sizeof (struct PDevConf_t);
	num = (INT16U)(i / size);
	SysCfg.DBAllNum = num;
	
	ports[0] = SELFPORT;
	num = 1;
	for (i=0; i<SysCfg.DBAllNum; i++)
	{
		for (j=0; j<num; j++)
			if (pdevice[i].Port[0].PortID == ports[j])
				break;
		if (j == num)
		{
			ports[num] = pdevice[i].Port[0].PortID;
			num++;
		}
	}
	
	SysCfg.PortNum = num;
	size = sizeof (struct SysPort);
	SysPorts = (struct SysPort*)malloc(num * size);
	size = sizeof (struct DBConfig);
	DBCfgs = (struct DBConfig*)malloc(SysCfg.DBAllNum * size);
	size = sizeof (struct DBInitInfo);
	DBInfos = (struct DBInitInfo*)malloc(SysCfg.DBAllNum * size);
	if (!(SysPorts && DBCfgs && DBInfos))
	{
		ErrorInfo(ROOTID, "创建数据库失败152");
		return;		//chongqi?
	}
	else
	{
		memset (SysPorts, 0, num * sizeof (struct SysPort));
		memset (DBCfgs, 0, SysCfg.DBAllNum * sizeof (struct DBConfig));
		memset (DBInfos, 0, SysCfg.DBAllNum * sizeof (struct DBInitInfo));
	}
	
	for (i=0; i<SysCfg.DBAllNum; i++)
	{
		DBCfgs[i].Info.Real.LogDevID[0] = DEFINDEXNO;
		DBCfgs[i].Info.Real.LogDevID[1] = DEFINDEXNO;
	}

	SysPorts[0].PortID = SELFPORT;		//固定
	num = 1;
	for (i=0; i<SysCfg.DBAllNum; i++)
	{
		for (j=0; j<num; j++)
			if (pdevice[i].Port[0].PortID == SysPorts[j].PortID)
				break;
		if (j == num)
		{
			SysPorts[num].PortID = pdevice[i].Port[0].PortID;
			num++;
		}
	}
	
	dd = (MAXCOMMMSG) / SysCfg.DBAllNum;
	if (dd < 5)
	{
		ErrorInfo(ROOTID, "警告:系统所带的设备太多");
		
	}
	
	cur = 0;
	for (j=0, k=0; j<num; j++)
	{
		for (i=0; i<SysCfg.DBAllNum; i++)
			if (pdevice[i].Port[0].PortID == SysPorts[j].PortID)
			{
				SysPorts[j].DevNum++;
				DBCfgs[k].DevID = k;
				DBInfos[k].DevID = k;
				DBInfos[k].PortID = pdevice[i].Port[0].PortID;
				DBInfos[k].Name = pdevice[i].Name;
				strcpy (DBInfos[k].ParaName, pdevice[i].ParaName);
				k++;
			}

		if (j == 0)
		{
			size = 0;
			SysPorts[j].DBCfgs = &DBCfgs[0];
			SysPorts[j].DevNum = SysCfg.DBAllNum;
			SysPorts[j].Event = OSFlagCreate(0x00, &err);
			if (err != OS_NO_ERR)
				ErrorInfo(OSPrioCur, "数据库发送失败260");
				
			SysPorts[j].CommQ =	OSQCreate(&MsgQ[cur], dd);
			cur = dd;
		}
		else
		{
			if (j == 1)
				size = 1;
			else
				size += SysPorts[j-1].DevNum;
			SysPorts[j].DBCfgs = &DBCfgs[size];
			
			if (SysPorts[j].DevNum)
			{
				SysPorts[j].Event = OSFlagCreate(0x00, &err);
				if (err != OS_NO_ERR)
					ErrorInfo(OSPrioCur, "数据库发送失败260");
				SysPorts[j].CommQ =	OSQCreate(&MsgQ[cur], dd*SysPorts[j].DevNum);
				cur += dd*SysPorts[j].DevNum;
			}
		}
	}
}

/*------------------------------------------------------------------*/
/*函数名称:GetMyConfig()											*/
/*函数功能:获取参数配置文件										*/
/*输入说明:														*/
/*输出说明:														*/
/*------------------------------------------------------------------*/
void GetMyConfig(INT8U* pTmpBuf)
{
	INT16U	i;
	struct FILEHEADER_t *filehead;
	struct pconfig_t *pconfig;
	struct ppt_t *ppt;
	struct pfeeder_t *pfeeder;
	struct pai_t *pai;
	struct pbi_t *pbi;
	struct pbo_t *pbo;
	struct pyc_t *pyc;
	struct pyx_t *pyx;
	struct pdd_t *pdd;
	
	filehead = (struct FILEHEADER_t *)pTmpBuf;
	pconfig = (struct pconfig_t *)(filehead + 1);
	
	ppt = (struct ppt_t *)(pconfig + 1);
	pfeeder = (struct pfeeder_t *)(ppt + pconfig->ptnum);
	pai = (struct pai_t *)(pfeeder + pconfig->feedernum);
	pbi = (struct pbi_t *)(pai + pconfig->ainum);
	pbo = (struct pbo_t *)(pbi + pconfig->binum);
	pyc = (struct pyc_t *)(pbo + pconfig->bonum);
	pyx = (struct pyx_t *)(pyc + pconfig->ycnum);
	pdd = (struct pdd_t *)(pyx + pconfig->yxnum);
	
	if (pconfig->control & CFGTGSH)
	{
		if (!TGSH)
			SetDefMyConfig();
	}
	else
	{
		if (TGSH)
			SetDefMyConfig();
	}
	
	MyCfg.Addr = pconfig->addr;
	MyCfg.Yxcyc = pconfig->yxcyc;	
	MyCfg.AINum = pconfig->ycnum;
	MyCfg.BINum = pconfig->binum;
	MyCfg.BONum = pconfig->bonum;
	MyCfg.FDNum = pconfig->feedernum;
	
	MyCfg.lan1 = pconfig->lan1;
	MyCfg.lan1_ip = pconfig->lan1_ip;
	MyCfg.lan1_subnet_mask = pconfig->lan1_subnet_mask;
	MyCfg.lan2 = pconfig->lan2;
	MyCfg.lan2_ip = pconfig->lan2_ip;
	MyCfg.lan2_subnet_mask = pconfig->lan2_subnet_mask;
	MyCfg.def_gtwy_ip = pconfig->def_gtwy_ip;
	
	if (MyCfg.Yxcyc == 0)
		MyCfg.Yxcyc = 2;
	else if (MyCfg.Yxcyc > 10)
		MyCfg.Yxcyc = 10;
	
 
	MyCfg.Ai = malloc (MyCfg.AINum * sizeof(struct AICfg_t));
	MyCfg.Bi = malloc (MyCfg.BINum * sizeof(struct BICfg_t));
	MyCfg.Bo = malloc (MyCfg.BONum * sizeof(struct BOCfg_t));
	MyCfg.Fd = malloc (MyCfg.FDNum * sizeof(struct FDCfg_t));
	if (!(MyCfg.Ai && MyCfg.Bi && MyCfg.Bo && MyCfg.Fd))
	{
		ErrorInfo(ROOTID, "创建参数设置失败");
		return;
	}
	else
	{
		memset (MyCfg.Ai, 0, MyCfg.AINum * sizeof(struct AICfg_t));
		memset (MyCfg.Bi, 0, MyCfg.BINum * sizeof(struct BICfg_t));
		memset (MyCfg.Bo, 0, MyCfg.BONum * sizeof(struct BOCfg_t));
		memset (MyCfg.Fd, 0, MyCfg.FDNum * sizeof(struct FDCfg_t));
	}
	
	if (MyCfg.AINum)
	{
		for (i=0; i<MyCfg.AINum; i++)
		{
			MyCfg.Ai[i].Xs1 = pyc[i].xs1;
			MyCfg.Ai[i].Xs2 = pyc[i].xs2;
			MyCfg.Ai[i].ToZero = pyc[i].tozero;
			MyCfg.Ai[i].Flag = pyc[i].yxjc;
			MyCfg.Ai[i].UpperLimitYxNo = pyc[i].sxyx;
			MyCfg.Ai[i].UnderLimitYxNo = pyc[i].xxyx;
			MyCfg.Ai[i].UpperLimit = pyc[i].sx;
			MyCfg.Ai[i].UnderLimit = pyc[i].xx;
		}
	}
	else
		MyCfg.Ai = NULL;
	
	if (MyCfg.BINum)
	{
		for (i=0; i<MyCfg.BINum; i++)
		{
			MyCfg.Bi[i].Mode = pbi[i].mode;
			MyCfg.Bi[i].DTime = pbi[i].time;
		}
	}
	else
		MyCfg.Bi = NULL;
		
	if (MyCfg.BONum)
	{
		for (i=0; i<MyCfg.BONum; i++)
		{
			MyCfg.Bo[i].ArmTime = pbo[i].armtime;
			MyCfg.Bo[i].OnTime = pbo[i].ontime;
		}
	}
	else
		MyCfg.Bo = NULL;
	
	if (MyCfg.FDNum)
	{
		for (i=0; i<MyCfg.FDNum; i++)
		{
			strcpy ((char*)MyCfg.Fd[i].DZname, (char*)pfeeder[i].s_f_name);
			MyCfg.Fd[i].Control = pfeeder[i].control;
			MyCfg.Fd[i].Yxzt = pfeeder[i].kgzt1;
			MyCfg.Fd[i].Yxzt2 = pfeeder[i].kgzt2;
			MyCfg.Fd[i].Yxcn = pfeeder[i].kgcn;
			MyCfg.Fd[i].FaultBI = pfeeder[i].faultbi;
			MyCfg.Fd[i].YkH = pfeeder[i].hzjdq;
			MyCfg.Fd[i].YkF = pfeeder[i].fzjdq;
			MyCfg.Fd[i].FdrFlag = pfeeder[i].FdrFlag;
			MyCfg.Fd[i].FdrTime = pfeeder[i].FdrTime;
		}
	}
	else
		MyCfg.Fd = NULL;
}

/*------------------------------------------------------------------*/
/*函数名称:GetPorts()												*/
/*函数功能:读取端口配置文件										*/
/*输入说明:														*/
/*输出说明:														*/
/*------------------------------------------------------------------*/
void GetPorts(INT8U* pTmpBuf)
{
	INT16U	i, size, num;
	struct FILEHEADER_t *filehead;
	struct PortAttri_t *port;	

	filehead = (struct FILEHEADER_t*)pTmpBuf;
	port = (struct PortAttri_t*)(filehead + 1);
	i = filehead->Size - filehead->Headsize;
	size = sizeof (struct PortAttri_t);
	num = (INT16U)(i / size);
	
	for (i=1; i<=num; i++)
	{
		if (port[num-i].DriverID == 0)
			continue;
		InitPort(&port[num-i]);
		GetPad(&port[num-i], (pTmpBuf + 1024));
	}
		
	SetDefPort();
}

/*------------------------------------------------------------------*/
/*函数名称:GetPad()												*/
/*函数功能:读取端口相关的规约面板参数								*/
/*输入说明:														*/
/*输出说明:														*/
/*------------------------------------------------------------------*/
void GetPad(struct PortAttri_t* Port, INT8U* pTmpBuf)
{
	INT16U	i, num, rc;
	char	file[60];
	struct FILEHEADER_t *filehead;

	num = Port->PortID;
	if (num < 41)
		i = num;
	else
		i = num - 40;
		
	sprintf(file,"c%04d.dat", num);
	rc = ReadParaFile(file, pTmpBuf, MAXFILELEN, FALSE);
	if (rc == FOPERROR)
	{
		PortInfo[i-1].pPad = NULL;
		return ;
	}
	
	filehead = (struct FILEHEADER_t *)pTmpBuf;
	
	switch (PortInfo[i-1].Attr)
	{
		case DNPSEC:
			num = sizeof (struct PSecDnpPad);
			PortInfo[i-1].pPad = malloc (num);
			break;
		
		case DNPPRI:
			num = sizeof (struct PPriDnpPad);
			PortInfo[i-1].pPad = malloc (num);
			break;
			
		case IEC101_1997SEC:
			num = sizeof (struct PSec101Pad);
			PortInfo[i-1].pPad = malloc (num);
			break;
		
		case IEC101_1997PRI:
			num = sizeof (struct PPri101Pad);
			PortInfo[i-1].pPad = malloc (num);
			break;
		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -