📄 9311db.c
字号:
/*------------------------------------------------------------------*/
/*模块名称:9311db.c */
/*模块功能:9311的数据库和时间处理函数,主要是管理NVRAM */
/*编写日期:2004年8月 */
/*编写者: dingding */
/*------------------------------------------------------------------*/
#include "includes.h"
//全局变量
INT32U CurNVRAMAddr = (INT32U)OTHERADDR;
INT32U NVRAMSIZE = 0x8000;
struct DBBOOPInfos DBCommQs;
struct DBManage *DBManag;
struct AbsTime_t pAbsTime;
INT8U *pFReset;
extern INT16U TimeCounter2;
extern INT16U FDNum;
extern struct SysConfig SysCfg;
extern struct MyConfig MyCfg;
extern struct SysPort *SysPorts;
extern struct DBConfig *DBCfgs;
extern struct DBInitInfo *DBInfos;
/*------------------------------------------------------------------*/
/*函数名称:DBInit(void) */
/*函数功能:数据库初始化 */
/*------------------------------------------------------------------*/
BOOL DBInit(void)
{
BOOL dd;
INT16U i, j;
volatile INT8U *wp;
dd = DBCreate();
if (!dd)
return (FALSE);
memset (&DBCommQs, 0, sizeof (struct DBBOOPInfos));
DBCommQs.Max = DBBOOPINFOMAX;
//YX初始化为分
for (i=0; i<SysCfg.DBAllNum; i++)
{
wp = (volatile INT8U*)GetDBAddr(i, YXDATA, TRUE);
for (j=0; j<DBCfgs[i].YXNum; j++)
{
#ifdef BOOT_PROG
if (0x80 & *(wp + j))
*(wp + j) = YX_H;
else
#endif
*(wp + j) = YX_F;
}
}
return (TRUE);
}
/*------------------------------------------------------------------*/
/*函数名称:NVRAMInit(void) */
/*函数功能:NVRAM初始化,以备上层使用 */
/*------------------------------------------------------------------*/
BOOL NVRAMInit(void)
{
volatile INT8U *wp;
INT8U rc, tmp;
INT16U j, size;
INT32U i;
struct DBInfo info;
//检测大小
wp = (volatile INT8U *)(NVRAM_BASE);
rc = *(wp + 0x7FFF);
tmp = (INT8U)(rc + 0x55);
*(wp + 0x1FFFF) = tmp;
if (*(wp + 0x7FFF) == tmp)
{
CurNVRAMAddr = (INT32U)OTHERADDR2;
NVRAMSIZE = 0x8000;
// ErrorInfo(OSPrioCur, "NVRAM--32K");
}
else
{
CurNVRAMAddr = (INT32U)OTHERADDR;
NVRAMSIZE = 0x20000;
// ErrorInfo(OSPrioCur, "NVRAM--128K");
}
*(wp + 0x1FFFF) = rc;
//冷启动时清零
info.DevID = ROOTID;
info.Type = FRESET;
DBRead(pFReset, &info);
if (*pFReset != RESET_RETAIN)
{
wp = NVRAMBASEADDR;
for (i=0; i<NVRAMSIZE; i++)
{
*(wp + i) = 0x0;
if (*(wp + i) != 0x0)
return (FALSE);
}
//系统信息APPID初始化为0xFFFF
wp = SYSINFOADDR + 1;
size = sizeof(struct SysInfo_t);
for (i=0; i<SYSINFOLIMIT; i++)
for (j=0; j<2; j++)
*(wp + i*size + j) = 0xFF;
}
else //初值初始化
{
//...
}
*pFReset = RESET_RETAIN;
DBWrite(pFReset, &info);
return (TRUE);
}
/*------------------------------------------------------------------*/
/*函数名称:DBCreate(void) */
/*函数功能:创建数据库 */
/*------------------------------------------------------------------*/
BOOL DBCreate(void)
{
volatile INT8U *rp;
INT16U i, j, size;
size = sizeof (struct DBManage) * SysCfg.DBAllNum;
DBManag = malloc (size);
if (!DBManag)
{
ErrorInfo(ROOTID, "创建数据库失败125");
return (FALSE);
}
else
memset (DBManag, 0, size);
for (i=0; i<SysCfg.DBAllNum; i++)
{
DBManag[i].DevID = DBCfgs[i].DevID;
if (DBCfgs[i].YCNum)
{
DBManag[i].YCAddr = malloc (DBCfgs[i].YCNum * sizeof(INT16S));
memset (DBManag[i].YCAddr, 0, DBCfgs[i].YCNum * sizeof(INT16S));
}
if (DBCfgs[i].DDNum)
{
DBManag[i].DDAddr = SetDBAddr(DDDATA, DBCfgs[i].DDNum);
}
if (DBCfgs[i].YXNum)
{
DBManag[i].YXAddr = SetDBAddr(YXDATA, DBCfgs[i].YXNum);
DBManag[i].SOEAddr = SetDBAddr(SOEDATA, DBCfgs[i].YXNum);
DBManag[i].COSAddr = SetDBAddr(COSDATA, DBCfgs[i].YXNum);
}
}
for (i=0; i<SysCfg.DBAllNum; i++)
{
if (DBCfgs[i].Flag & FDBLOGIC)
{
DBCfgs[i].Info.Logic.pOld->SOEOld = *((volatile INT8U*)(DBManag[i].SOEAddr));
DBCfgs[i].Info.Logic.pOld->COSOld = *((volatile INT8U*)(DBManag[i].COSAddr));
}
if (DBCfgs[i].Flag & FDBLOGIC2)
{
for (j=0; j<DBCfgs[i].Info.Logic.DevNum; j++)
{
rp = (volatile INT8U*)GetDBAddr(DBCfgs[i].Info.Logic.pOld[j].DevID, SOEDATA, TRUE);
DBCfgs[i].Info.Logic.pOld[j].SOEOld = *rp;
rp = (volatile INT8U*)GetDBAddr(DBCfgs[i].Info.Logic.pOld[j].DevID, COSDATA, TRUE);
DBCfgs[i].Info.Logic.pOld[j].COSOld = *rp;
}
}
}
return (TRUE);
}
/*------------------------------------------------------------------*/
/*函数名称:DBWrite() */
/*函数功能:数据库写操作 */
/*输入说明:pData:数据指针 */
/* pInfo:数据信息 */
/*------------------------------------------------------------------*/
BOOL DBWrite(INT8U *pData, struct DBInfo *pInfo)
{
volatile INT8U *wp, *wtmp;
INT16U i, j, size, tmp, oldID;
oldID = OSPrioCur;
OSTaskChangePrio(OSPrioCur, HID);
switch (pInfo->Type)
{
case YCDOTDATA:
DBWriteYCDOT(pData, pInfo);
break;
case YCDATA:
DBWriteYC(pData, pInfo);
break;
case YXDOTDATA:
DBWriteYXDOT(pData, pInfo);
break;
case YXDATA:
DBWriteYX(pData, pInfo);
break;
case SOEDATA:
DBWriteSOE(pData, pInfo);
break;
case COSDATA:
break;
case DDDATA:
DBWriteDD(pData, pInfo);
break;
case FENTERBOOT:
wp = FENTERBOOTADDR;
*wp = *pData;
break;
case FRESET:
wp = FRESETADDR;
*wp = *pData;
break;
case ABSTIME:
wp = ABSTIMEADDR;
size = sizeof(struct AbsTime_t);
for (i=0; i<size; i++)
*(wp + i) = *(pData + i);
break;
case BIDATA:
wp = BIVALADDR;
size = (pInfo->Num - 1) / 8 + 1;
for (i=0; i<size; i++)
*(wp + i) = *(pData + i);
break;
case FDRLOC:
if (pInfo->Num >= 15)
pInfo->Num = 0;
wp = FDRLOCADDR;
*(wp + pInfo->Num) = *pData;
break;
case INFODATA:
wtmp = SYSINFOADDR;
tmp = *wtmp;
size = sizeof(struct SysInfo_t);
for (i=0; i<pInfo->Num; i++)
{
wp = wtmp + tmp * size + 1;
for (j=0; j<size; j++)
*(wp + i*size + j) = *(pData + i*size + j);
tmp = (tmp + 1) % SYSINFOLIMIT;
}
*wtmp = tmp;
break;
case LBDATAUA:
case LBDATAUC:
case LBDATAIA:
case LBDATAIB:
case LBDATAIC:
case LBDATAIO:
case LBINFO:
DBWriteLB(pData, pInfo);
break;
default:
break;
}
OSTaskChangePrio(OSPrioCur, oldID);
return (TRUE);
}
/*------------------------------------------------------------------*/
/*函数名称:DBWriteYCDOT() */
/*函数功能:数据库离散遥测写操作 */
/*输入说明:pData:数据指针 */
/* pInfo:数据信息 */
/*------------------------------------------------------------------*/
void DBWriteYCDOT(INT8U *pData, struct DBInfo *pInfo)
{
INT16U *pb, *pbb;
INT16S val;
INT16U i, j, size, tmp;
pb = (INT16U*)GetDBAddr(pInfo->DevID, YCDATA, FALSE);
size = sizeof (INT16S);
for (i=0; i<size*pInfo->Num; i+=size)
{
j = *((INT16U*)pData + i);
if (j >= DBCfgs[pInfo->DevID].YCNum)
continue;
val = *((INT16U*)pData + i + 1);
if (DBCfgs[pInfo->DevID].Flag & FDBAICALCULATE)
val = (INT16U)(((INT32U)val * DBCfgs[pInfo->DevID].Info.Real.pAI[j].a) / DBCfgs[pInfo->DevID].Info.Real.pAI[j].b);
pb[j] = val;
if (DBCfgs[pInfo->DevID].Flag & FDBLOGUSE)
{
tmp = DBCfgs[pInfo->DevID].Info.Real.pAI[j].Index[0];
if (tmp != DEFINDEXNO)
{
pbb = (INT16U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[0], YCDATA, FALSE);
pbb[tmp] = val;
}
}
if (DBCfgs[pInfo->DevID].Flag & FDBLOG2USE)
{
tmp = DBCfgs[pInfo->DevID].Info.Real.pAI[j].Index[1];
if (tmp != DEFINDEXNO)
{
pbb = (INT16U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[1], YCDATA, FALSE);
pbb[tmp] = val;
}
}
}
}
/*------------------------------------------------------------------*/
/*函数名称:DBWriteYC() */
/*函数功能:数据库遥测写操作 */
/*输入说明:pData:数据指针 */
/* pInfo:数据信息 */
/*------------------------------------------------------------------*/
void DBWriteYC(INT8U *pData, struct DBInfo *pInfo)
{
INT16U *pb, *pbb;
INT16S val;
INT16U i, num, tmp;
pb = (INT16U*)GetDBAddr(pInfo->DevID, YCDATA, FALSE);
num = pInfo->Start + pInfo->Num;
if (num > DBCfgs[pInfo->DevID].YCNum)
num = DBCfgs[pInfo->DevID].YCNum;
for (i=pInfo->Start; i<num; i++)
{
val = *((INT16U*)pData + (i-pInfo->Start));
if (DBCfgs[pInfo->DevID].Flag & FDBAICALCULATE)
val = (INT16U)(((INT32U)val * DBCfgs[pInfo->DevID].Info.Real.pAI[i].a) / DBCfgs[pInfo->DevID].Info.Real.pAI[i].b);
pb[i] = val;
if (DBCfgs[pInfo->DevID].Flag & FDBLOGUSE)
{
tmp = DBCfgs[pInfo->DevID].Info.Real.pAI[i].Index[0];
if (tmp != DEFINDEXNO)
{
pbb = (INT16U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[0], YCDATA, FALSE);
pbb[tmp] = val;
}
}
if (DBCfgs[pInfo->DevID].Flag & FDBLOG2USE)
{
tmp = DBCfgs[pInfo->DevID].Info.Real.pAI[i].Index[1];
if (tmp != DEFINDEXNO)
{
pbb = (INT16U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[1], YCDATA, FALSE);
pbb[tmp] = val;
}
}
}
}
/*------------------------------------------------------------------*/
/*函数名称:DBWriteDD() */
/*函数功能:数据库电度写操作 */
/*输入说明:pData:数据指针 */
/* pInfo:数据信息 */
/*------------------------------------------------------------------*/
void DBWriteDD(INT8U *pData, struct DBInfo *pInfo)
{
volatile INT8U *wp, *wtmp;
INT32U val;
INT16U i, j, len, num, tmp;
wp = (volatile INT8U*)GetDBAddr(pInfo->DevID, DDDATA, TRUE);
num = pInfo->Start + pInfo->Num;
len = sizeof (INT32U);
if (num > DBCfgs[pInfo->DevID].DDNum)
num = DBCfgs[pInfo->DevID].DDNum;
for (i=pInfo->Start; i<num; i++)
{
val = *((INT32U*)pData + (i-pInfo->Start));
if (DBCfgs[pInfo->DevID].Flag & FDBDDCALCULATE)
val = (INT32U)(((long long)val * DBCfgs[pInfo->DevID].Info.Real.pDD[i].a) / DBCfgs[pInfo->DevID].Info.Real.pDD[i].b);
for (j=0; j<len; j++)
*(wp + i*len + j) = (INT8U)(val>>(j*8));
if (DBCfgs[pInfo->DevID].Flag & FDBLOGUSE)
{
tmp = DBCfgs[pInfo->DevID].Info.Real.pDD[i].Index[0];
if (tmp != DEFINDEXNO)
{
wtmp = (volatile INT8U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[0], DDDATA, TRUE);
for (j=0; j<len; j++)
*(wtmp + tmp*len + j) = (INT8U)(val>>(j*8));
}
}
if (DBCfgs[pInfo->DevID].Flag & FDBLOG2USE)
{
tmp = DBCfgs[pInfo->DevID].Info.Real.pDD[i].Index[1];
if (tmp != DEFINDEXNO)
{
wtmp = (volatile INT8U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[1], DDDATA, TRUE);
for (j=0; j<len; j++)
*(wtmp + tmp*len + j) = (INT8U)(val>>(j*8));
}
}
}
}
/*------------------------------------------------------------------*/
/*函数名称:DBWriteYXDOT() */
/*函数功能:数据库离散遥信写操作 */
/*输入说明:pData:数据指针 */
/* pInfo:数据信息 */
/*------------------------------------------------------------------*/
void DBWriteYXDOT(INT8U *pData, struct DBInfo *pInfo)
{
volatile INT8U *wp, *wtmp, *wpp, *wtt;
INT8U val, value, flag;
INT16U i, j, size, tmp, rc;
struct DBMSGCheck dbmsg;
flag = 0;
memset (&dbmsg, 0, sizeof (struct DBMSGCheck));
wp = (volatile INT8U*)GetDBAddr(pInfo->DevID, YXDATA, TRUE);
size = sizeof(struct COS_t);
for (i=0; i<size*pInfo->Num; i+=size)
{
rc = pData[i] + (pData[i+1]<<8);
if (rc > DBCfgs[pInfo->DevID].YXNum - 1)
continue;
val = *(wp + rc);
value = pData[i+2];
if (DBCfgs[pInfo->DevID].Info.Real.pBI[rc].Control & FCFGBIREVERSE)
value = value ^ 0x80;
*(wp + rc) = value;
if (val != value) //同时写入COS
{
wtmp = (volatile INT8U*)GetDBAddr(pInfo->DevID, COSDATA, TRUE);
tmp = *wtmp;
*wtmp = (tmp + 1) % COSLIMIT;
wtmp += tmp * size + 1;
for (j=0; j<size-1; j++)
*(wtmp + j) = *(pData + i + j);
*(wtmp + j) = value;
}
if (!(DBCfgs[pInfo->DevID].Flag & FDBLOGUSEFALG))
continue;
//检查
if (DBCfgs[pInfo->DevID].Flag & FDBSELFUSE)
{
if (!(flag & 0x08))
{
flag |= 0x08;
dbmsg.DevID[dbmsg.Num] = DBCfgs[pInfo->DevID].Log2DevID[0];
dbmsg.Num++;
}
}
if (DBCfgs[pInfo->DevID].Flag & FDBSELF2USE)
{
if (!(flag & 0x80))
{
flag |= 0x80;
dbmsg.DevID[dbmsg.Num] = DBCfgs[pInfo->DevID].Log2DevID[1];
dbmsg.Num++;
}
}
if (DBCfgs[pInfo->DevID].Flag & FDBLOGUSE)
{
rc = DBCfgs[pInfo->DevID].Info.Real.pBI[rc].Index[0];
if (rc != DEFINDEXNO)
{
wpp = (volatile INT8U*)GetDBAddr(DBCfgs[pInfo->DevID].Info.Real.LogDevID[0], YXDATA, TRUE);
wpp[rc] = value;
if (val != value)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -