📄 9311db.c
字号:
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 + -