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

📄 9311yx.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
字号:
/*------------------------------------------------------------------*/
/*模块名称:9311yx.c                                            	*/
/*模块功能:创建YX任务,主要完成维护底层硬件和数据库				*/
/*			完成9311的YX处理;完成9311的YK处理						*/
/*编写日期:2004年8月                                         		*/
/*编写者:  dingding												*/
/*------------------------------------------------------------------*/

#include "includes.h"


//全局变量
extern struct SysConfig		SysCfg;
extern struct MyConfig		MyCfg;
extern struct SysPort		*SysPorts;
extern struct DBConfig		*DBCfgs;
extern struct DBInitInfo	*DBInfos;
extern INT8U				TGSH;
extern INT16U				Frequency;
extern struct AbsTime_t		pAbsTime;
extern OS_EVENT				*SemTimerTenMS;
extern OS_EVENT				*SemTimerOneS;
//OS_STK  YXTaskStack[OS_TASK_DEF_STK_SIZE*8];
extern void Time0_Test(void);

//变量定义
BOOL	ACTING = FALSE;
INT8U	YXCYC;
INT16U	CellYX, CellYXPre;		//按位的实遥信
INT16U	YKArmCounter, YKOnCounter;	//遥控计数器
INT16U	TimeCounter1, TimeCounter2;	//时间计数器
INT16U	TmpCounter;					//温度计数器

SOEtmp_t	*SOEtmp;
BItmp_t		*BItmp;


/*------------------------------------------------------------------*/
/*函数名称:void YXTask(void *pdata)								*/
/*函数功能:遥信任务												*/
/*------------------------------------------------------------------*/
void YXTask(void *pdata)
{
	BOOL	dd = FALSE;
	INT8U	err;
	INT16U	tmp;
	struct DBInfo	    info;
	struct AbsTime_t	time;
	
	YKArmCounter = 0;
	YKOnCounter = 1;
	TimeCounter1 = TIMECYC_STORAGE/2;
	TimeCounter2 = TIMECYC_READ/2;
	TmpCounter = TMPCYC_READ/2;

	//遥信初始化	
	dd = YXInit();
	if (!dd)
		ErrorInfo(YXID, "遥信任务初始化失败");
		
	OSTimeDlyHMSM(0, 0, 0, 10);
	
	while (1)
	{
		OSTimeDlyHMSM(0, 0, 0, 10);
        
	    Time0_Test();
		
		YXMean();
		
		if (YKOnCounter)
		{
			ACTING = TRUE;
			YKOnCounter--;
			if (YKOnCounter == 0)
			{
				YKDone();
				ACTING = FALSE;
			}
		}
		else
			ACTING = FALSE;
			
		if (YKArmCounter)
		{
			YKArmCounter--;
			if (YKArmCounter == 0)
				YKDel();
		}
	
		err = OSSemAccept(SemTimerOneS);
		if (err != OS_NO_ERR)
		{
			
			Frequency_Treatment();
			info.DevID = ROOTID;
			info.Type = YCDATA;
			info.Num = 1;
			if (TGSH)
			info.Start = 27;
			else
				info.Start = 14;
			
			DBWrite((INT8U*)&Frequency, &info);			

			//存储时间
			if (TimeCounter1)
			{
				TimeCounter1--;
				if (TimeCounter1 == 0)
				{
					TimeCounter1 = TIMECYC_STORAGE;
					
					info.DevID = ROOTID;
					info.Type = ABSTIME;
					info.Start = 0;
					info.Num = 1;
					GetTime((void*)&time, ABSTIME);
			        DBWrite((INT8U*)&time, &info);
				}
			}
			
			//对软时钟对钟
			if (TimeCounter2)
			{
				TimeCounter2--;
				if (TimeCounter2 == 0)
				{
					TimeCounter2 = TIMECYC_READ;
					GetX1226Time();
				}
			}
			
			//读取温度
			if (TmpCounter)
			{
				TmpCounter--;
				if (TmpCounter == 0)
				{
					TmpCounter = TMPCYC_READ;
					tmp = ReadTemperature();
					info.DevID = ROOTID;
					info.Type = YCDATA;
					info.Num = 1;
					if (TGSH)
						info.Start = 26;
					else
						info.Start = 13;

					DBWrite((INT8U*)&tmp, &info);
				}
			}
		}
	
	}//while

}

/*------------------------------------------------------------------*/
/*函数名称:YxInit(void)											*/
/*函数功能:初始化遥信任务,将参数付值								*/
/*输出说明:成功返回TRUE											*/
/*------------------------------------------------------------------*/
BOOL YXInit(void)
{
	INT8U	i, dd[16];
	struct DBInfo	info;

	//初始化遥信参数--由数据库完成
	
	//创建临时数据的存储结构
	BItmp = malloc (sizeof(BItmp_t) * MyCfg.BINum);
	SOEtmp = malloc (sizeof(SOEtmp_t));
	if (!(BItmp && SOEtmp))
		return (FALSE);
	else
	{
		memset ((INT8U *)BItmp, 0, MyCfg.BINum * sizeof (BItmp_t));		
		memset ((INT8U *)SOEtmp, 0, sizeof (SOEtmp_t));	

/*		//从库里读取作为初始化
		info.DevID = ROOTID;
		info.Type = BIDATA;
		info.Num = MyCfg.BINum;
		rc = DBRead((INT8U*)&CellYX, &info);
		CellYXPre = CellYX;*/
	}
	
	//初始化
	YXCYC = MyCfg.Yxcyc;
	YXRead();
	for (i=0; i<MyCfg.BINum; i++)
	{
		if ((CellYXPre>>i) & 0x01)
		{
			if (MyCfg.Bi[i].Mode & BI_REVERSE)
				dd[i] = YX_F;
			else
				dd[i] = YX_H;
		}
		else
		{
			if (MyCfg.Bi[i].Mode & BI_REVERSE)
				dd[i] = YX_H;
			else
				dd[i] = YX_F;
		}
	}
	CellYX = CellYXPre;
	info.DevID = ROOTID;
	info.Type = YXDATA;
	info.Start = 0;
	info.Num = MyCfg.BINum;
	DBWrite(dd, &info);	
	
	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:YxRead(void)											*/
/*函数功能:实遥信的采集,1MS中断进入								*/
/*------------------------------------------------------------------*/
void YXRead(void)
{
	INT8U	i;	
	INT16U	yx_tmp = 0, yx_cur = 0, xxor;
	
	//判断遥信扫描周期
	YXCYC++;
	if (YXCYC < MyCfg.Yxcyc)
		return;
	YXCYC = 0;		
	
	yx_tmp = (*ZK1_YX) & 0xFF;
	yx_tmp = yx_tmp ^ 0xFF;
	yx_cur = yx_tmp;
	if (TGSH)
	{
		yx_tmp = 0;
		yx_tmp = (*ZK2_YX) & 0xFF;
		yx_tmp = yx_tmp ^ 0xFF;
		yx_cur |= (yx_tmp << 8);
	}
		
	if (yx_cur != CellYXPre)
	{
		for (i=0; i<MyCfg.BINum; i++)
		{
			xxor = yx_cur ^ CellYXPre;
			if ((xxor & (0x01<<i)) != 0)	//记录变化遥信
			{
				BItmp[i].DTime = MyCfg.Bi[i].DTime;
				GetTime((void*)(&BItmp[i].Time), ABSTIME);	
				BItmp[i].Status = yx_cur & (0x0001<<i);
			}
		}
		CellYXPre = yx_cur;
	}

}

/*------------------------------------------------------------------*/
/*函数名称:YxMean(void)											*/
/*函数功能:防抖,确认遥信											*/
/*------------------------------------------------------------------*/
void YXMean(void)
{
	register INT8U	i;
	register BOOL	rc = FALSE;
	struct DBInfo	info;
	
	for (i=0; i<MyCfg.BINum; i++)
	{
		if (BItmp[i].DTime > 0)
		{
			BItmp[i].DTime--;
			if (BItmp[i].DTime == 0)
			{
				if (BItmp[i].Status != (CellYX & (0x0001<<i)))	//遥信变化有效
				{
					CellYX = (CellYX & (~(0x0001<<i))) | BItmp[i].Status;
				
					SOE[HEAD].No = i;
					if (BItmp[i].Status)
						SOE[HEAD].Status =  YX_H;
					else
						SOE[HEAD].Status =  YX_F;
											
					SOE[HEAD].Time = BItmp[i].Time;
				
					HEAD++;
					if (HEAD >= SOE_NUM_TMP)
						HEAD = 0;
				
					rc = TRUE;
				}
			}
		}
	}
	
	if (rc)
	{
		info.DevID = ROOTID;
		info.Type = BIDATA;
		info.Num = MyCfg.BINum;
		DBWrite((INT8U*)&CellYX, &info);
	
		SOETask(ROOTID, FALSE);
	}
}
/*------------------------------------------------------------------*/
/*函数名称:SOETask()												*/
/*函数功能:遥信判断,将需要的遥信、SOE、COS写入数据库中			*/
/*------------------------------------------------------------------*/	
void SOETask(INT16U	DevID, BOOL SOEYES)
{
	INT8U	i, j, num, rc, k;
	INT16U	ID;
	struct	COS_t	cos[10];
	struct DBInfo	info;
	
	num = 0;
	rc = 0;
	while (HEAD != FAIL)
	{
		num = (HEAD >= FAIL) ? (HEAD - FAIL) : (SOE_NUM_TMP + HEAD - FAIL);
		
		for (i=0; i<num; i++)
		{	
			k = (FAIL + i) % SOE_NUM_TMP;
			ID = SOE[k].No;
			if (ID < MyCfg.BINum)
			{
				if (MyCfg.Bi[ID].Mode & BI_REVERSE)
				{
					if (SOE[k].Status == YX_H)
						SOE[k].Status =  YX_F;
					else
						SOE[k].Status =  YX_H;
				}
				
				//DoneYK
				if (YKOnCounter)
				{
					for (j=0; j<MyCfg.FDNum; j++)
						if (MyCfg.Fd[j].Yxzt == ID)
							YKOKDone(ID);
				}
				
				if ((MyCfg.Bi[ID].Mode & BI_ENABLE) == BI_ENABLE)
				{
					//写YX
					cos[rc].No = ID;
					cos[rc].Status = SOE[k].Status;
					rc++;
					if (rc == 10)
					{
						info.DevID = DevID;
						info.Type = YXDOTDATA;
						info.Num = rc;
						DBWrite((INT8U*)cos, &info);
						rc = 0;
					}
				
					//写SOE
					if ((MyCfg.Bi[ID].Mode & BI_SOEYES) == BI_SOEYES)
					{
						info.DevID = DevID;
						info.Type = SOEDATA;
						info.Num = 1;
						DBWrite((INT8U*)&(SOE[k].No), &info);
					}
				}				
			}
			else	//虚拟遥信
			{
				cos[rc].No = ID;
				cos[rc].Status = SOE[k].Status;
				rc++;
				if (rc == 10)
				{
					info.DevID = DevID;
					info.Type = YXDOTDATA;
					info.Num = rc;
					DBWrite((INT8U*)cos, &info);
					rc = 0;
				}
				
				if (SOEYES)
				{
					info.DevID = DevID;
					info.Type = SOEDATA;
					info.Num = 1;
					DBWrite((INT8U*)&(SOE[k].No), &info);
				}				
				
			}			
		}	
		if (rc)
		{
			info.DevID = DevID;
			info.Type = YXDOTDATA;
			info.Num = rc;
			DBWrite((INT8U*)cos, &info);
			rc = 0;
		}
	
		FAIL = (FAIL + num) % SOE_NUM_TMP;
	}
	
}

/*------------------------------------------------------------------*/
/*函数名称:YKSet(INT8U No, BOOL ON_OFF, INT16U Time)				*/
/*函数功能:遥控预置(不支持同时多路遥控)							*/
/*输入说明:No-遥控号;ON_OFF-合/分;Time-预置时间(10MS),为0时取默认*/
/*输出说明:成功返回TRUE											*/
/*------------------------------------------------------------------*/
BOOL YKSet(INT8U No, BOOL ON_OFF, INT16U Time)
{
	INT16U tmp, number, rc;
	
	if ((No>3) && (!TGSH))
		return (FALSE);
		
	//正在执行时无法预置		
	rc = ((*ZK1_YKFX) & FYKFE);
	if (TGSH)
		rc |= ((*ZK2_YKFX) & FYKFE);
	if (rc != 0)
		return (FALSE);
	
	number = (No - 1) * 2;
	if (!ON_OFF)
		number += 1;
	
	if (No > 3)
	{
		number -= 6;
		tmp = (0x0001 << number);
		*ZK2_YKHF = tmp;
		
		OSTimeDly(1); 
		rc = ((*ZK2_YKFX) & FYKFS);	
		if (rc != tmp)
			return (FALSE);
	}
	else
	{	
		tmp = (0x0001 << number);
		*ZK1_YKHF = tmp;
	
		OSTimeDly(1); 
		rc = ((*ZK1_YKFX) & FYKFS);	
		if (rc != tmp)
			return (FALSE);
	}
	
	if (Time == 0)
		YKArmCounter = MyCfg.Bo[No-1].ArmTime;
	else
		YKArmCounter = Time;
	
	return (TRUE);
}


/*------------------------------------------------------------------*/
/*函数名称:YKDel(void)												*/
/*函数功能:遥控预置撤销,失败时再执行一边							*/
/*------------------------------------------------------------------*/
void YKDel(void)
{
	INT16U	rc, tmp;
	
	tmp = 0x0000;	
	rc = ((*ZK1_YKFX) & FYKFE);
	if (TGSH)
		rc |= ((*ZK2_YKFX) & FYKFE);
	if (rc != tmp)
	{
		YKArmCounter = YKOnCounter + 1;	//dingding??
		return;
	}
	
	*ZK1_YKHF = tmp;
	if (TGSH)
		*ZK2_YKHF = tmp;
	
	OSTimeDly(1); 
	
	rc = ((*ZK1_YKFX) & FYKFS);	
	if (rc != tmp)
		*ZK1_YKHF = tmp;
	if (TGSH)
	{
		rc = ((*ZK2_YKFX) & FYKFS);	
		if (rc != tmp)
			*ZK2_YKHF = tmp;
	}

	OSTimeDly(2);
}


/*------------------------------------------------------------------*/
/*函数名称:YKExe(INT8U No, BOOL ON_OFF, INT16U Time)				*/
/*函数功能:遥控执行												*/
/*输入说明:No-遥控号;ON_OFF-合/分;Time-执行时间(10MS),为0时取默认*/
/*输出说明:成功返回TRUE											*/
/*------------------------------------------------------------------*/
BOOL YKExe(INT8U No, BOOL ON_OFF, INT16U Time)
{
	INT16U tmp, number, rc;
	
	number = (No - 1) * 2;
	if (!ON_OFF)
		number += 1;
	
	if (No > 3)
	{
		number -= 6;
		tmp = (0x0001 << number);		
		rc = ((*ZK2_YKFX) & FYKF);
		if (rc != tmp)
			return (FALSE);
		
		*ZK2_YKS = FYKS;
		*ZK2_YKHF = FYKE | tmp;
		
		OSTimeDly(1); 
		rc = ((*ZK2_YKFX) & FYKFE);	
		if (rc != FYKSE)
			return (FALSE);	
		
	}
	else
	{	
		tmp = (0x0001 << number);		
		rc = ((*ZK1_YKFX) & FYKF);
		if (rc != tmp)
			return (FALSE);
	
		*ZK1_YKS = FYKS;
		*ZK1_YKHF = FYKE | tmp;
		
		OSTimeDly(1); 
		rc = ((*ZK1_YKFX) & FYKFE);	
		if (rc != FYKSE)
			return (FALSE);	
	}

	if (Time == 0)
		YKOnCounter = MyCfg.Bo[No-1].OnTime;
	else
		YKOnCounter = Time;
	
	return (TRUE);
}


/*------------------------------------------------------------------*/
/*函数名称:YKDone(void)											*/
/*函数功能:遥控执行完成											*/
/*------------------------------------------------------------------*/
void YKDone(void)
{
	INT16U rc, tmp;
	
	tmp = 0x0000;
	
	if (TGSH)
	{
		*ZK2_YKS = tmp;
		*ZK2_YKHF = tmp;
	}
	*ZK1_YKS = tmp;
	*ZK1_YKHF = tmp;
		
	OSTimeDly(1); 
	
	if (TGSH)
	{
		rc = ((*ZK2_YKFX) & FYKF);	
		if (rc != tmp)
		{
			*ZK2_YKS = tmp;
			*ZK2_YKHF = tmp;
		}
		
	}
	rc = ((*ZK1_YKFX) & FYKF);	
	if (rc != tmp)
	{
		*ZK1_YKS = tmp;
		*ZK1_YKHF = tmp;
	}
	
	OSTimeDly(2); 
}

/*------------------------------------------------------------------*/
/*函数名称:YKOKDone()												*/
/*函数功能:遥控提前完成											*/
/*------------------------------------------------------------------*/
void YKOKDone(INT16U No)
{
	//MyCfg.Fd[i].Control & DOUBLEBI))
	//if (MyCfg.Fd[j].Yxzt2 == cos[dd].No)


	if (YKOnCounter)
	{
		YKDone();
		YKOnCounter = 0;
	}

}


⌨️ 快捷键说明

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