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

📄 9311db.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 5 页
字号:
	
	control = pCode->Control;
	real_control = (control >> 6) & 0x03;
	if (real_control == 0x03)
	{
		pCode->Status = BORCERROR;
		return ;
	}
	else
	{
		if (pCode->Control & BOCLOSE)
			on_off = TRUE;
		else if (pCode->Control & BOOPEN)
			on_off = FALSE;
	}
		
	if (DBCfgs[pInfo->DevID].Flag & FDBLOGIC)		//不可能为逻辑库
	{
		pCode->Status = BORCERROR;
		return ;
	}
	
/*	flag = FALSE;
	for (i=0; i<DBCfgs[pInfo->DevID].YKNum; i++)
	{
		if (DBCfgs[pInfo->DevID].Info.Real.pBO[i].ID == pInfo->Start)
		{
			attr = DBCfgs[pInfo->DevID].Info.Real.pBO[i].Status & 0x03;
			if (attr == real_control)
			{
				flag = TRUE;
				base = i;
				if (DBCfgs[pInfo->DevID].Info.Real.LogDevID[0] == pInfo->SuperID)
					id = DBCfgs[pInfo->DevID].Info.Real.pBO[i].Index[0];
				else if (DBCfgs[pInfo->DevID].Info.Real.LogDevID[1] == pInfo->SuperID)
					id = DBCfgs[pInfo->DevID].Info.Real.pBO[i].Index[1];
				else
					id  = DBCfgs[pInfo->DevID].Info.Real.pBO[i].ID;
				break;
			}
		}
	}
	if (!flag)
	{
		pCode->Status = BORCERROR;
		return ;
	}
*/	
	//记录操作,不再判断正确性
	i = DBCommQs.Cur;
	DBCommQs.Cur = (DBCommQs.Cur + 1) % DBCommQs.Max;
	DBCommQs.Info[i].DevID = pInfo->DevID;
	DBCommQs.Info[i].ID = pInfo->Start;
	DBCommQs.Info[i].Status = control;
	
	
	if (pInfo->Num & BOSELECT)
		DBCommQs.Info[i].Flag = BOOPSELECT;
	else if (pInfo->Num & BOOPERATE)
		DBCommQs.Info[i].Flag = BOOPOPERATE;
	else 
	{
		pCode->Status = BORCERROR;
		return ;
	}
	if (pInfo->Num & BOOPFAIL)
		DBCommQs.Info[i].Flag |= BOOPERROR;
		
	if (control & BODEL)
		DBCommQs.Info[i].Flag |= BOOPDEL;	

	if (i == 0)
		j = DBCommQs.Max - 1;
	else
		j = i - 1;
	flag = FALSE;	
	for ( ; j!=i; j--)
	{
		if (DBCommQs.Info[j].DevID == DBCommQs.Info[i].DevID)
			if (DBCommQs.Info[j].ID == DBCommQs.Info[i].ID)
				if (DBCommQs.Info[j].Status == DBCommQs.Info[i].Status)
					if ((DBCommQs.Info[j].Flag & 0x7) == (DBCommQs.Info[i].Flag & 0x07))
					{
						flag = TRUE;
						DBCommQs.Info[i].SuperID = DBCommQs.Info[j].SuperID;
						DBCommQs.Info[i].SID = DBCommQs.Info[j].SID;
						break;
					}
	
		if (j == 0)
			j = DBCommQs.Max - 1;
	}

	if (!flag)
	{
		pCode->Status = BORCERROR;
		return ;
	}
	
	rc = GetPortofDB(DBCommQs.Info[i].SuperID);
	if (rc != 0xFFFF)
	{
		err = OSQPostFront (SysPorts[rc].CommQ, &DBCommQs.Info[i]);
		if (err != OS_NO_ERR)
		{
			if (err == OS_Q_FULL)
			{
				OSQFlush (SysPorts[rc].CommQ);
				OSQPostFront (SysPorts[rc].CommQ, &DBCommQs.Info[i]);
			}
			else
				ErrorInfo(OSPrioCur, "数据库发送消息失败1400");
		}
		OSFlagPost (SysPorts[rc].Event, FBOOP, OS_FLAG_SET, &err);
		if (err != OS_NO_ERR)
			ErrorInfo(OSPrioCur, "数据库发送失败");
	}		

	pCode->Status = BORCOK;	
}

/*------------------------------------------------------------------*/
/*函数名称:DBMsgSend()												*/
/*函数功能:向应用层发送信息										*/
/*输入说明:														*/
/*输出说明:														*/
/*------------------------------------------------------------------*/
void DBMsgSend(struct DBMSGCheck *Msg, INT16U Flag)
{
	INT8U	err;
	INT16U	i, rc;
	
	for (i=0; i<Msg->Num; i++)
	{
		rc = GetPortofDB(Msg->DevID[i]);
		
		if ((rc != 0xFFFF) && SysPorts[rc].Flag)
		{
			OSFlagPost (SysPorts[rc].Event, Flag, OS_FLAG_SET, &err);
			if (err != OS_NO_ERR)
				ErrorInfo(OSPrioCur, "数据库发送失败");
		}
	}
	
}

/*------------------------------------------------------------------*/
/*函数名称:GetPortofDB()											*/
/*函数功能:获得设备所在系统端口地址								*/
/*输入说明:设备号													*/
/*输出说明:所在端口,错误返回0xFFFF								*/
/*------------------------------------------------------------------*/
INT16U GetPortofDB(INT16U DevID)
{
	INT16U	i, j;
	
	if (DevID >= SysCfg.DBAllNum)
		return (0xFFFF);
	
	for (i=1; i<SysCfg.PortNum; i++)
		for (j=0; j<SysPorts[i].DevNum; j++)
			if (SysPorts[i].DBCfgs[j].DevID == DevID)
				return (i);
	
	return (0);			
}

/*------------------------------------------------------------------*/
/*函数名称:GetX1226Time(void)										*/
/*函数功能:读取硬时钟,直接写入软时钟								*/
/*------------------------------------------------------------------*/
void GetX1226Time(void)
{
	struct X1226Time_t XTime;
	INT8U	i;
	INT16U	mm[12] = {44640, 28, 44640, 43200, 44640, 43200, 44640, 44640, 43200, 44640, 43200, 44640};
	INT8U	rxBuffer[8];
	INT32U	t;

	//读取硬时钟
	ReadSysTime((TSysTime*)(&rxBuffer));
	
	XTime.Second	= rxBuffer[0]%16 + rxBuffer[0]/16*10;
	XTime.Minute	= rxBuffer[1]%16 + rxBuffer[1]/16*10;
	if(rxBuffer[2] & MIL)
		XTime.Hour	= rxBuffer[2]%16 + (rxBuffer[2]&0x7F)/16*10;
	else	//防止底层读取非24小时制
	{
		XTime.Hour	= rxBuffer[2]%16 + (rxBuffer[2]&0x1F)/16*10;
		if(rxBuffer[2] & H21)
			XTime.Hour += 12;	
	}	
	XTime.Day		= rxBuffer[3]%16 + rxBuffer[3]/16*10;
	XTime.Month		= rxBuffer[4]%16 + rxBuffer[4]/16*10;
	XTime.Year		= rxBuffer[5]%16 + rxBuffer[5]/16*10;
	XTime.Week		= rxBuffer[6]%16 + rxBuffer[6]/16*10;
	XTime.YearH		= rxBuffer[7]%16 + rxBuffer[7]/16*10;

	
	if ((XTime.Year & 0x03) == 0)
		mm[1] = 41760;
	else
		mm[1] = 40320;

	t = 0;
	if(XTime.YearH == 19)
	{
		for(i=70; i<XTime.Year; i++)
		{
			if((i & 0x03) == 0)
				t += 527040;		//366*24*60
			else
				t += 525600;		//365*24*60
		}
	}
	else
	{
		t += 0xF0C120;
		for(i=00; i<XTime.Year; i++)
		{
			if((i & 0x03) == 0)
				t += 527040;		//366*24*60
			else
				t += 525600;		//365*24*60
		}
	}
			
	for(i=1; i<XTime.Month; i++)
		t += mm[i-1];			//24*60;
	if(XTime.Day == 0)
		XTime.Day = 1;
	t += (XTime.Day-1) * 1440;	//24*60;
	t += XTime.Hour * 60;		//60;
	t += XTime.Minute;
	pAbsTime.Minute = t;
	
	pAbsTime.Msecond %= 1000; 
	pAbsTime.Msecond += (INT16U)XTime.Second * 1000;
}
/*------------------------------------------------------------------*/
/*函数名称:GetTime(void *Time, INT8U Format)						*/
/*函数功能:读取时钟												*/
/*------------------------------------------------------------------*/
void GetTime(void *Time, INT8U Format)
{
    struct AbsTime_t    time;

    #if OS_CRITICAL_METHOD == 3     
        OS_CPU_SR  cpu_sr = 0;
    #endif
    
    OS_ENTER_CRITICAL();
    
    memcpy ((INT8U*)&time, (INT8U*)&pAbsTime, sizeof (struct AbsTime_t));

    OS_EXIT_CRITICAL();
    

	TimeChangeAbs(Time, Format, (void*)&time);

}

/*------------------------------------------------------------------*/
/*函数名称:SetTime(void *Time, INT8U Format)						*/
/*函数功能:对时,同时对硬时钟(没有毫秒,采取在秒上加1秒的方式)	*/
/*			和软时钟对钟											*/
/*------------------------------------------------------------------*/
void SetTime(void *Time, INT8U Format)		
{
	struct SysTime_t SysTime;
	struct AbsTime_t AbsTime; 
	struct X1226Time_t XTime;

	TimeChangeToAbs((void*)&AbsTime, Time, Format);
	TimeChangeToSYS((void*)&SysTime, (void*)&AbsTime, ABSTIME);
	
	XTime.Second	= SysTime.Second%10 + SysTime.Second/10*16;
	XTime.Minute	= SysTime.Minute%10 + SysTime.Minute/10*16;
	XTime.Hour		= SysTime.Hour%10 + SysTime.Hour/10*16;
	XTime.Day		= SysTime.Day%10 + SysTime.Day/10*16;
	XTime.Month		= SysTime.Month%10 + SysTime.Month/10*16;
	XTime.Year		= SysTime.Year%100;
	XTime.YearH		= SysTime.Year/100;
	XTime.Year		= XTime.Year%10 + XTime.Year/10*16;
	XTime.YearH		= XTime.YearH%10 + XTime.YearH/10*16;
	
	//软时钟对钟
	pAbsTime.Minute = AbsTime.Minute;
	pAbsTime.Msecond = AbsTime.Msecond;
	
	//硬时钟对钟
	at91_irq_close ( WDI_ID );
	TimeCounter2 = TIMECYC_READ;	
	WriteSysTime((TSysTime*)(&XTime));
	at91_irq_open (WDI_ID, INTWATCHDOG, AIC_SRCTYPE_INT_EDGE_TRIGGERED, Tmr_TickISR);
	
}

/*------------------------------------------------------------------*/
/*函数名称:TimeChange()											*/
/*函数功能:时间格式的相互转换										*/
/*输入说明:DTime:期望时间格式的输出内容;DFormat:期望的时间格式	*/
/*			STime:输入时间格式的输入内容;SFormat:输入的时间格式	*/
/*------------------------------------------------------------------*/
void TimeChange(void* DTime, INT8U DFormat, void* STime, INT8U SFormat)
{
	struct AbsTime_t	time;
	
	switch (SFormat)
	{
		case ABSTIME:
			TimeChangeAbs(DTime, DFormat, STime);
			break;
		
		case SYSTIME:
			break;
		
		default :
			if (DFormat == ABSTIME)
				TimeChangeToAbs(DTime, STime, SFormat);
			else if (DFormat == SYSTIME)
				TimeChangeToSYS(DTime, STime, SFormat);
			else
			{
				TimeChangeToAbs((void*)&time, STime, SFormat);
				TimeChangeAbs(DTime, DFormat, (void*)&time);
			}
			break;
	}
	
}

/*------------------------------------------------------------------*/
/*函数名称:TimeChangeAbs()											*/
/*函数功能:将绝对时间转换成期望的时间格式							*/
/*输入说明:DTime:期望时间格式的输出内容;DFormat:期望的时间格式	*/
/*			STime:输入绝对时间格式的输入内容						*/
/*------------------------------------------------------------------*/
void TimeChangeAbs(void* DTime, INT8U DFormat, void* STime)
{
	struct SysTime_t SysTime;
	long long dd;
	INT16U	t; 

	switch (DFormat)
	{
		case SYSTIME:
			TimeAbsToSys(((struct AbsTime_t*)STime)->Minute, &SysTime);
		
			t = ((struct AbsTime_t*)STime)->Msecond;
			SysTime.Second = (INT8U)(t / 1000);
			SysTime.MSecond = (INT16U)(t % 1000);		
			
			((struct SysTime_t*)DTime)->Year	= SysTime.Year;
			((struct SysTime_t*)DTime)->Month	= SysTime.Month;
			((struct SysTime_t*)DTime)->Day		= SysTime.Day;
			((struct SysTime_t*)DTime)->Hour	= SysTime.Hour;
			((struct SysTime_t*)DTime)->Minute	= SysTime.Minute;
			((struct SysTime_t*)DTime)->Second	= SysTime.Second;
			((struct SysTime_t*)DTime)->MSecond	= SysTime.MSecond;
			break;
			
		case ABSTIME:
			memcpy (DTime, STime, sizeof (struct AbsTime_t));
			break;
			
		case DNPTIME:
			dd = ((struct AbsTime_t*)STime)->Minute;
			dd = dd * 60000 + ((struct AbsTime_t*)STime)->Msecond;
			
			for (t=0; t<6; t++)
			{
				((struct DnpTime_t *)DTime)->Times[t] = (INT8U)dd;
				dd = dd>>8;
			}
			break;
		
		case IEC101TIME:
			TimeAbsToSys(((struct AbsTime_t*)STime)->Minute, &SysTime);
		
			t = ((struct AbsTime_t*)STime)->Msecond;
			SysTime.Second = (INT8U)(t / 1000);
			SysTime.MSecond = (INT16U)(t % 1000);
			
			((struct IEC101Time_t*)DTime)->MSecond	= SysTime.Second*1000 + SysTime.MSecond;
			((struct IEC101Time_t*)DTime)->Minute	= SysTime.Minute;
			((struct IEC101Time_t*)DTime)->Hour		= SysTime.Hour;
			((struct IEC101Time_t*)DTime)->Day		= SysTime.Day;
			((struct IEC101Time_t*)DTime)->Month	= SysTime.Month;
			((struct IEC101Time_t*)DTime)->Year		= SysTime.Year % 100;
			break;
		
		case IEC101EXTTIME:
			TimeAbsToSys(((struct AbsTime_t*)STime)->Minute, &SysTime);
		
			t = ((struct AbsTime_t*)STime)->Msecond;
			SysTime.Second = (INT8U)(t / 1000);
			SysTime.MSecond = (INT16U)(t % 1000);
			
			((struct IEC101Time_t*)DTime)->MSecond	= SysTime.Second*1000 + SysTime.MSecond;
			((struct IEC101Time_t*)DTime)->Minute	= SysTime.Minute;
			((struct IEC101Time_t*)DTime)->Hour		= SysTime.Hour;
			((struct IEC101Time_t*)DTime)->Day		= SysTime.Day;
			((struct IEC101Time_t*)DTime)->Month	= SysTime.Month + (SysTime.Year / 0x100) * 0x10;
			((struct IEC101Time_t*)DTime)->Year		= SysTime.Year % 0x100;
			break;
		
		default:
			ErrorInfo(ROOTID, "未知的时间格式!");
			break;
	}

}

/*------------------------------------------------------------------*/
/*函数名称:TimeChangeToAbs()										*/
/*函数功能:将输入的时间格式内容转换成绝对时间格式					*/
/*输入说明:DTime:绝对时间格式的输出内容;							*/
/*			STime:输入时间格式的输入内容;SFormat:输入的时间格式	*/
/*------------------------------------------------------------------*/
void TimeChangeToAbs(void* DTime, void* STime, INT8U SFormat)
{
	long long dd;
	struct SysTime_t SysTime;

	switch (SFormat)
	{
		case SYSTIME:
			((struct AbsTime_t*)DTime)->Minute	= TimeSysToAbs((struct SysTime_t*)STime);
			((struct AbsTime_t*)DTime)->Msecond = ((struct SysTime_t*)STime)->MSecond + ((struct SysTime_t*)STime)->Second * 1000; 
			break;
			
		case ABSTIME:
			memcpy (DTime, STime, sizeof (struct AbsTime_t));
			break;
			
		case DNPTIME:
			dd = ((struct DnpTime_t*)STime)->Times[5];
			dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[4];
			dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[3];
			dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[2];
			dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[1];
			dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[0];
			
			((struct AbsTime_t*)DTime)->Minute = (INT32U)(dd / 60000);
			((struct AbsTime_t*)DTime)->Msecond = (INT16U)(dd % 60000);
			break;
		
		case IEC101TIME:
			TimeChangeToSYS((void*)&SysTime, STime, IEC101TIME);
			((struct AbsTime_t*)DTime)->Minute	= TimeSysToAbs(&SysTime);
			((struct AbsTime_t*)DTime)->Msecond = SysTime.MSecond + SysTime.Second * 1000; 
			break;
		
		case IEC101EXTTIME:
			TimeChangeToSYS((void*)&SysTime, STime, IEC101EXTTIME);
			((struct AbsTime_t*)DTime)->Minute	= TimeSysToAbs(&SysTime);
			((struct AbsTime_t*)DTime)->Msecond = SysTime.MSecond + SysTime.Second * 1000; 
			break;
		
		default:
			ErrorInfo(ROOTID, "未知的时间格式!");
			break;
	}
	
}

/*------------------------------------------------------------------*/
/*函数名称:TimeChangeToSYS()										*/
/*函数功能:将输入的时间格式内容转换成系统时间格式					*/
/*输入说明:DTime:系统时间格式的输出内容;							*/
/*			STime:输入时间格式的输入内容;SFormat:输入的时间格式	*/
/*------------------------------------------------------------------*/
void TimeChangeToSYS(void* DTime, void* STime, INT8U SFormat)
{
	long long dd;
	INT16U	tmp;

	switch (SFormat)
	{
		case SYSTIME:
			memcpy (DTime, STime, sizeof (struct SysTime_t));
			break;
			
		case ABSTIME:
			((struct SysTime_t*)DTime)->Second = (INT8U)(((struct AbsTime_t*)STime)->Msecond / 1000);
			((struct SysTime_t*)DTime)->MSecond = (INT16U)(((struct AbsTime_t*)STime)->Msecond % 1000);
			
			TimeAbsToSys(((struct AbsTime_t*)STime)->Minute, (struct SysTime_t*)DTime);
			break;
			
		case DNPTIME:
			dd = ((struct DnpTime_t*)STime)->Times[5];
			dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[4];
			dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[3];
			dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[2];
			dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[1];
			dd = dd * 0x100 + ((struct DnpTime_t*)STime)->Times[0];

			((struct SysTime_t*)DTime)->Second = (INT8U)((INT16U)(dd % 60000) / 1000);
			((struct SysTime_t*)DTime)->MSecond = (INT16U)((INT16U)(dd % 60000) % 1000);
			
			TimeAbsToSys((INT32U)(dd / 60000), (struct SysTime_t*)DTime);
			break;
	
		case IEC101TIME:
			((struct SysTime_t*)DTime)->MSecond	= ((struct IEC101Time_t*)STime)->MSecond % 1000;
			((struct SysTime_t*)DTime)->Second	= ((struct IEC101Time_t*)STime)->MSecond / 1000;
			((struct SysTime_t*)DTime)->Minute	= ((struct IEC101Time_t*)STime)->Minute & 0x3F;
			((struct SysTime_t*)DTime)->Hour	= ((struct IEC101Time_t*)STime)->Hour & 0x1F;
			((struct SysTime_t*)DTime)->Day		= ((struct IEC101Time_t*)STime)->Day & 0x1F;
			((struct SysTime_t*)DTime)->Month	= ((struct IEC101Time_t*)STime)->Month & 0x0F;
			tmp = ((struct IEC101Time_t*)STime)->Year & 0x7F;
			if (tmp < 70)
				((struct SysTime_t*)DTime)->Year 

⌨️ 快捷键说明

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