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

📄 9311db.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 5 页
字号:
				

				start = pInfo->Start & 0xFFF;
				rp = (volatile INT8U*)GetDBAddr(tmp, SOEDATA, TRUE);
				cur = *rp;
								
				num = 0;				
				if ((DBCfgs[pInfo->SuperID].Flag & FDBLOGIC2) && (!(DBCfgs[pInfo->DevID].Flag & FDBLOGIC)))	//log2
				{
					tmp = 0;
					rc = DBCfgs[pInfo->SuperID].Info.Logic.pOld[i].SOEOld;
					for (i=0; i<SOELIMIT; i++)
					{
						if (rc == cur)
							break;
						
						rtmp = rp + rc * size + 1;
						for (j=0; j<size; j++)
							*((INT8U*)&soe + j) = *(rtmp + j);
						rc = (rc + 1) % SOELIMIT;
						
						id = soe.No;
						if (DBCfgs[pInfo->DevID].Info.Real.pBI[id].Control & FCFGBISEND)
						{
							tmp++;
							if (tmp > start)
							{
								for (j=0; j<id; j++)
									if(!(DBCfgs[pInfo->DevID].Info.Real.pBI[j].Control & FCFGBISEND))
										soe.No--;
								memcpy (&pData[size*num], (INT8U*)&soe, size);
								num++;
							}
						}
						
						if (num >= pInfo->Num)
						{
							next = TRUE;
							break;
						}
					}
				}
				else
				{
					rc = DBCfgs[pInfo->SuperID].Info.Logic.pOld[i].SOEOld;
					rc = (rc + start) % SOELIMIT;

					for (i=0; i<SOELIMIT; i++)
					{
						if (rc == cur)
							break;
						
						rtmp = rp + rc * size + 1;
						for (j=0; j<size; j++)
							*(pData + i*size + j) = *(rtmp + j);
						rc = (rc + 1) % SOELIMIT;
						
						num++;
						if (num >= pInfo->Num)
						{
							next = TRUE;
							break;
						}
					}
				}
				
				break;
			}	
				
			pInfo->Num = num;	//realnum	
			if (next)
			{
				rc = GetPortofDB(pInfo->DevID);
				if (rc != 0xFFFF)
				{
					OSFlagPost (SysPorts[rc].Event, FSOE, OS_FLAG_SET, &err);
					if (err != OS_NO_ERR)
					{
						ErrorInfo(OSPrioCur, "数据库发送失败1627");
						return (FALSE);
					}
				}
			}
			return (TRUE);
		}
		else
			return (FALSE);
	}

	rp = (volatile INT8U*)GetDBAddr(pInfo->DevID, SOEDATA, TRUE);
	*pData = *rp;
		
	tmp = pInfo->Start;
	for (i=0; i<pInfo->Num; i++)
	{
		rtmp = rp + tmp * size + 1;
		for (j=0; j<size; j++)
			*(pData + i*size + j + 1) = *(rtmp + j);
			tmp = (tmp + 1) % SOELIMIT;
	}
		
	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:DBReadLB()												*/
/*函数功能:数据库录波读操作		 								*/
/*输入说明:pData:数据指针											*/
/*			pInfo:数据信息											*/
/*------------------------------------------------------------------*/	
void DBReadLB(INT8U *pData, struct DBInfo *pInfo)
{
	volatile INT8U	*rp, *rtmp;
	INT8U	cur, size, limit, tmp;
	INT16U	i, j;
	INT32U	start, len1, len2;
	struct LBInfo_t		info;
	
	size = sizeof (struct LBInfo_t);
	if (NVRAMSIZE == 0x20000)
	{
		limit = LBLIMIT;
		if (pInfo->SuperID >= FDNum)
		{
			pInfo->Num = 0;
			return;
		}
		else
		{
			rtmp = LBMANAGADDR + pInfo->SuperID * (limit + 1);
		}
	}
	else
	{
		rp = LBMANAG2ADDR;
		tmp = *rp;
		tmp = tmp>>4;
		if (tmp != pInfo->SuperID)
		{
			pInfo->Num = 0;
			return;
		}
		
		limit = 0;
		rtmp = LBMANAGADDR;
	}

	cur = *rtmp;
	if (!((pInfo->DevID == 0) || (pInfo->DevID == 0xFFFF)))
	{
		if (pInfo->DevID >= limit)
		{
			pInfo->Num = 0;
			return;
		}
	}
	
	if (limit)
		cur = (cur + limit - pInfo->DevID) % limit;
	else
		cur = 0;
	tmp = *(rtmp + cur + 1);
	if (tmp == 0)
	{
		pInfo->Num = 0;
		return;
	}

	rp = LBINFOADDR + cur * LBINFOSIZE;
	for (i=0; i<size; i++)
	{
		*((INT8U*)&info + i) = *(rp + i);
	}

	if (info.Length*2 > LBBLOCK)
	{
		rp = LBMANAG2ADDR;
		tmp = *rp;
		i = tmp>>4;
		j = tmp & 0x0F;
		if ((i != pInfo->SuperID) || (j != cur))
		{
			info.Length = LBBLOCK/2;
			rp = LBINFOADDR + cur * LBINFOSIZE;
			for (i=0; i<size; i++)
			{
				*(rp + i) = *((INT8U*)&info + i);
			}
		}
	}

	if (pInfo->Type == LBINFO)
	{
		rp = LBINFOADDR + cur * LBINFOSIZE;
		for (i=0; i<size; i++)
		{
			*(pData + i) = *(rp + i);
		}
		*pData = *(rtmp + cur + 1);	//更改录波文件存在信息
		pInfo->Num = size;
		return;
	}
	
	start = (pInfo->Start & 0xFF) * ADBIT + (pInfo->Start >>8);
	if (start >= info.Length)
	{
		pInfo->Num = 0;
		return;
	}
	
	len2 = (pInfo->Num & 0xFF) * ADBIT + (pInfo->Num >>8);
	if ((start + len2) > info.Length)
	{
		len2 = info.Length - start;
	}
	
	len1 = 0;
	if (start*2 > LBBLOCK)
	{
		len1 = 0;
	}
	else if ((start + len2)*2 > LBBLOCK)
	{
		len1 = LBBLOCK/2 - start;
		len2 -= len1;
	}
	else
	{
		len1 = len2;
		len2 = 0;
	}

	tmp = pInfo->Type - LBDATAUA;
	
	if (len1)
	{	
		rp = LBADDR + LBFDBLOCK*((pInfo->SuperID*limit) + cur) + LBBLOCK*tmp + start*2;
		for (j=0; j<len1*2; j++)
		{
			 *(pData + j) = *(rp + j);
		}
	}

	if (len2)
	{
		rp = LBADDR2 + LB2LIMIT*tmp + (start+len1)*2 - LBBLOCK;
		for (j=0; j<len2*2; j++)
		{
			 *(pData + len1*2 + j) = *(rp + j);
		}
	}
	
	start = len1 + len2;
	len1 = start % ADBIT;
	len2 = start / ADBIT;
	
	pInfo->Num = (len1<<8) + len2;	
}

/*------------------------------------------------------------------*/
/*函数名称:DBOperate()												*/
/*函数功能:数据库执行操作											*/
/*输入说明:pData:数据指针											*/
/*			pInfo:数据信息											*/
/*------------------------------------------------------------------*/
void DBOperate(INT8U *pData, struct DBInfo *pInfo)
{
	INT16U	oldID;

	oldID = OSPrioCur;
	OSTaskChangePrio(OSPrioCur, HID);
	
	switch (pInfo->Type)
	{
		case BORESQ:
			DBOpBORESQ((struct BOCode*)pData, pInfo);
			break;
			
		case BORESP:
			DBOpBORESP((struct BOCode*)pData, pInfo);
			break;			
		
		default:
			break;
		
	}
	
	OSTaskChangePrio(OSPrioCur, oldID);
}

/*------------------------------------------------------------------*/
/*函数名称:DBOpBORESQ()											*/
/*函数功能:数据库遥控请求											*/
/*输入说明:pData:数据指针											*/
/*			pInfo:数据信息											*/
/*------------------------------------------------------------------*/
void DBOpBORESQ(struct BOCode *pCode, struct DBInfo *pInfo)
{
	BOOL	flag = FALSE, on_off;
	INT8U	control, real_control, attr, err;
	INT16U	i, j, base, id, rc;
	
	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->SuperID].Flag & FDBLOGIC)
	{
		for (i=0; i<DBCfgs[pInfo->SuperID].Info.Logic.DevNum; i++)
			if (DBCfgs[pInfo->SuperID].Info.Logic.pOld[i].DevID == pInfo->DevID)
				break;
		if (i == DBCfgs[pInfo->SuperID].Info.Logic.DevNum)
		{
			pCode->Status = BORCERROR;
			return ;
		}
	}
	else
	{
		for (i=0; i<SysCfg.DBAllNum; i++)
			if (DBCfgs[i].DevID == pInfo->DevID)
				break;
		if (i == SysCfg.DBAllNum)
		{
			pCode->Status = BORCERROR;
			return ;
		}
	}

	if (DBCfgs[pInfo->DevID].Flag & FDBLOGIC)	//第一种逻辑库
	{
		for (i=0; i<SysCfg.DBAllNum; i++)
		{
			if (DBCfgs[i].Flag & FDBLOGIC)
				continue;
			if (!(DBCfgs[i].Flag & FDBLOGUSEFALG))
				continue;
			if ((DBCfgs[i].Flag & FDBLOGUSE) && (DBCfgs[i].Info.Real.LogDevID[0] == pInfo->DevID))
			{
				for (j=0; j<DBCfgs[i].YKNum; j++)
					if (DBCfgs[i].Info.Real.pBO[j].Index[0] == pInfo->Start)
					{
						attr = DBCfgs[i].Info.Real.pBO[j].Status & 0x03;
						if (attr == real_control)
						{
							flag = TRUE;
							base = i;
							id = DBCfgs[i].Info.Real.pBO[j].ID;
							break;
						}
					}
			}
			else if ((DBCfgs[i].Flag & FDBLOG2USE) && (DBCfgs[i].Info.Real.LogDevID[1] == pInfo->DevID))
			{
				for (j=0; j<DBCfgs[i].YKNum; j++)
					if (DBCfgs[i].Info.Real.pBO[j].Index[1] == pInfo->Start)
					{
						attr = DBCfgs[i].Info.Real.pBO[j].Status & 0x03;
						if (attr == real_control)
						{
							flag = TRUE;
							base = i;
							id = DBCfgs[i].Info.Real.pBO[j].ID;
							break;
						}
					}
			}
		
			if (flag)
				break;
		}
	}
	else	//实际库
	{
		if (pInfo->Start > DBCfgs[pInfo->DevID].YKNum/2)
		{
			pCode->Status = BORCERROR;
			return ;
		}
		for (j=0; j<DBCfgs[i].YKNum; j++)
			if (DBCfgs[i].Info.Real.pBO[j].ID == pInfo->Start)
			{
				attr = DBCfgs[i].Info.Real.pBO[j].Status & 0x03;
				if (attr == real_control)
				{
					flag = TRUE;
					base = i;
					id = DBCfgs[i].Info.Real.pBO[j].ID;
					break;
				}
			}
			
	}
	
	if (!flag)
	{
		pCode->Status = BORCERROR;
		return ;
	}	
			
	//记录操作,不再判断正确性
	i = DBCommQs.Cur;
	DBCommQs.Cur = (DBCommQs.Cur + 1) % DBCommQs.Max;
	
	DBCommQs.Info[i].SuperID = pInfo->SuperID;
	DBCommQs.Info[i].SID = pInfo->Start;
	DBCommQs.Info[i].DevID = base;
	DBCommQs.Info[i].ID = id;
	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 (control & BODEL)
		DBCommQs.Info[i].Flag |= BOOPDEL;	
	
	
	//下发操作
	if (base == 0)	//本机直接返回
	{
		if (control & BODEL)
		{
			if (pInfo->Num == BOSELECT)
			{
				YKDel();
				DBCommQs.Info[i].Flag = BOOPSELECT | BOOPDEL;
			}
			else if (pInfo->Num == BOOPERATE)
			{
				YKDone();
				DBCommQs.Info[i].Flag = BOOPOPERATE | BOOPDEL;
			}
		}
		else
		{
			if (pInfo->Num == BOSELECT)
			{
				flag = YKSet(DBCommQs.Info[i].ID, on_off, 0);
				if (!flag)
				{
					pCode->Status = BORCBSPERROR;
					return ;
				}
				DBCommQs.Info[i].Flag = BOOPSELECT;
			}
			else if (pInfo->Num == BOOPERATE)
			{
				flag = YKExe(DBCommQs.Info[i].ID, on_off, 0);
				if (!flag)
				{
					pCode->Status = BORCBSPERROR;
					return ;
				}
				DBCommQs.Info[i].Flag = BOOPOPERATE;
				
			}
		}
		
		rc = GetPortofDB(pInfo->SuperID);	
	}
	else
		rc = GetPortofDB(base);
	

	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, "数据库发送消息失败1251");
		}
		OSFlagPost (SysPorts[rc].Event, FBOOP, OS_FLAG_SET, &err);
		if (err != OS_NO_ERR)
			ErrorInfo(OSPrioCur, "数据库发送失败");
	}

	pCode->Status = BORCOK;	
}

/*------------------------------------------------------------------*/
/*函数名称:DBOpBORESP()											*/
/*函数功能:数据库遥控响应											*/
/*输入说明:pData:数据指针											*/
/*			pInfo:数据信息											*/
/*------------------------------------------------------------------*/
void DBOpBORESP(struct BOCode *pCode, struct DBInfo *pInfo)
{
	BOOL	flag, on_off;
	INT8U	control, real_control, err;
//	INT8U	attr;
//	INT16U	base, id;
	INT16U	i, j, rc;

⌨️ 快捷键说明

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