📄 9311fop.c
字号:
/*函数功能:重新分配参数扇区 */
/*输入说明: */
/*输出说明:成功后返回新的扇区号,失败返回0xFFFF */
/*------------------------------------------------------------------*/
INT16U FAnewSector(INT16U* Flag, INT16U Cur)
{
BOOL dd;
INT16U i, rc, k, tmp;
INT16U fold[SLMANAG/2], fnew[SLMANAG/2];
INT32U offset, daddr, saddr, da, sa;
memcpy (fold, Flag, SLMANAG);
rc = 0;
for (i=0; i<SLALLNUM; i++)
{
if (fold[i] == SFINVALID)
rc++;
}
if (rc < SLBSAENUM) //小于一个扇区失败
{
rc = 0;
for (i=0; i<SLALLNUM; i++)
{
if (fold[i+SLALLNUM] == SFINVALID)
rc++;
}
if (rc < SLBSAENUM)
return (Cur);
}
if (rc >= SLBSAENUM) //参数
{
rc = 0;
saddr = GetRealSector(SACFG);
daddr = GetRealSector(SATEMP);
offset = GetRealSector(SATMP);
tmp = SLANEW/SLBSAENUM + 1;
for (i=0; i<tmp; i++)
{
dd = FSectorErase(GetFlashNumber(daddr) + i);
if (!dd)
{
return (FOPERROR);
}
}
dd = FSectorErase(GetFlashNumber(offset));
if (!dd)
{
return (FOPERROR);
}
for (i=0; i<SLALLNUM; i++)
{
if (fold[i] == SFERROR)
{
fnew[i] = SFERROR;
}
else if (fold[i] == SFINVALID)
{
}
else if (fold[i] == SFNOUSE)
{
}
else
{
while (fnew[rc] == SFERROR)
{
rc++;
if (rc >= SLMANAG/2)
{
return (FOPERROR);
}
}
da = offset + rc * SLFINFO;
sa = GetRealSector(SAFINFO) + i * SLFINFO;
dd = FFlashCpy(da, sa, SLFINFO, FALSE);
if (!dd)
{
return (FOPERROR);
}
sa = saddr + i * SABSAESIZE;
da = daddr + rc * SABSAESIZE;
dd = FFlashCpy(da, sa, SABSAESIZE, FALSE);
if(!dd)
{
return (FOPERROR);
}
fnew[rc] = fold[i];
rc++;
}
}
tmp = rc/SLBSAENUM + 1;
for (i=0; i<tmp; i++)
{
sa = daddr + i * SBIGSIZE;
da = saddr + i * SBIGSIZE;
dd = FFlashCpy(da, sa, SBIGSIZE, TRUE);
if(!dd)
{
return (FOPERROR);
}
}
for (; i<(SLCFG/SBIGSIZE); i++)
FSectorErase(GetFlashNumber(SACFG + i * SBIGSIZE));
k = rc;
for (; rc<SLALLNUM; rc++)
fnew[rc] = SFNOUSE;
}
else
{
da = GetRealSector(SATMP);
sa = GetRealSector(SAFINFO);
dd = FSectorErase(GetFlashNumber(da));
if (!dd)
return (FOPERROR);
dd = FFlashCpy(da, sa, SLFINFO * SLALLNUM, FALSE);
if (!dd)
return (FOPERROR);
for (rc=0; rc<SLALLNUM; rc++)
fnew[rc] = fold[rc];
}
//程序
for (i=SLALLNUM; i<SLMANAG/2; i++)
{
if (fold[i] == SFINVALID)
continue;
if (fold[i] != SFNOUSE)
{
daddr = GetRealSector(SATMP) + rc * SLFINFO;
saddr = GetRealSector(SAFINFO) + i * SLFINFO;
dd = FFlashCpy(daddr, saddr, SLFINFO, FALSE);
if (!dd)
return (FOPERROR);
fnew[rc] = fold[i];
rc++;
}
if (Cur >= SLALLNUM)
k = rc;
}
for (; rc<SLMANAG/2; rc++)
fnew[rc] = SFNOUSE;
saddr = GetRealSector(SATMP);
daddr = GetRealSector(SAFINFO);
dd = FFlashCpy(daddr, saddr, SLITTERSIZE, TRUE);
if (!dd)
return (FOPERROR);
dd = FSetManage(fnew, SLMANAG/2);
if (!dd)
return (FOPERROR);
memcpy (Flag, fnew, SLMANAG);
return (k);
}
/*------------------------------------------------------------------*/
/*函数名称:GetManage() */
/*函数功能:获得管理内容 */
/*输入说明: */
/*输出说明: */
/*------------------------------------------------------------------*/
BOOL FGetManage(INT16U* SFlag, INT16U Len)
{
INT16U i, rc, size;
INT32U offset;
size = SLITTERSIZE / SLMANAG;
offset = GetRealSector(SAMANAG);
rc = FlashRead(FLASH_BASE, offset, (INT8U*)SFlag, size * sizeof (INT16U));
if (rc != size * sizeof (INT16U))
return (FALSE);
for (i=0; i<size; i++)
if (SFlag[i] == SFNOUSE)
break;
size = Len * sizeof (INT16U);
offset = offset + i * SLMANAG;
rc = FlashRead(FLASH_BASE, offset, (INT8U*)SFlag, size);
if (rc != size)
return (FALSE);
return (TRUE);
}
/*------------------------------------------------------------------*/
/*函数名称:SetManage() */
/*函数功能:更新管理内容 */
/*输入说明: */
/*输出说明: */
/*------------------------------------------------------------------*/
BOOL FSetManage(INT16U* SFlag, INT16U Len)
{
BOOL dd;
INT16U i, rc, size;
INT32U offset, addr;
INT16U tmp[SLALLNUM];
addr = GetRealSector(SAMANAG);
size = SLITTERSIZE / SLMANAG;
rc = FlashRead(FLASH_BASE, addr, (INT8U*)tmp, size * sizeof (INT16U));
if (rc != size * sizeof (INT16U))
return (FALSE);
for (i=0; i<size; i++)
if (tmp[i] == SFNOUSE)
{
i++;
break;
}
if (i == size)
{
rc = GetFlashNumber(addr);
if (!FSectorErase(rc))
{
return (FALSE);
}
else
dd = FSectorErase(rc);
if (dd)
i = 1;
else
return (FALSE);
}
offset = addr + (i-1) * sizeof(INT16U);
rc = FlashWrite(FLASH_BASE, offset, (INT8U*)&i, sizeof(INT16U));
if (rc != sizeof(INT16U))
return (FALSE);
size = Len * sizeof (INT16U);
offset = addr + i * SLMANAG;
rc = FlashWrite(FLASH_BASE, offset, (INT8U*)SFlag, size);
if (rc != size)
return (FALSE);
return (TRUE);
}
/*------------------------------------------------------------------*/
/*函数名称:FFlashCpy() */
/*函数功能:执行扇区内容复制 */
/*输入说明:Flag--TRUE将清除原地址、目地址内容所在的扇区 */
/*输出说明: */
/*------------------------------------------------------------------*/
BOOL FFlashCpy(INT32U Daddr, INT32U Saddr, INT32U Count, BOOL Flag)
{
BOOL dd;
INT16U ss, ds;
INT32U len;
ss = GetFlashNumber(Saddr);
ds = GetFlashNumber(Daddr);
SysSchedul();
if (Flag)
{
dd = FSectorErase(ds);
if (!dd)
return (FALSE);
}
len = FlashCpy(Daddr, Saddr, Count);
if (len != Count)
return (FALSE);
if (Flag)
{
dd = FSectorErase(ss);
if (!dd)
return (FALSE);
}
SysSchedul();
return (TRUE);
}
/*------------------------------------------------------------------*/
/*函数名称:FSectorErase() */
/*函数功能:扇区擦除 */
/*输入说明: */
/*输出说明: */
/*------------------------------------------------------------------*/
BOOL FSectorErase(INT16U Sector)
{
BOOL dd;
SysSchedul();
dd = FlashErase(FLASH_BASE, Sector);
SysSchedul();
return (dd);
}
/*------------------------------------------------------------------*/
/*函数名称:GetFlashNumber() */
/*函数功能:根据地址获得扇区号 */
/*输入说明: */
/*输出说明: */
/*------------------------------------------------------------------*/
INT16U GetFlashNumber(INT32U Addr)
{
INT16U rc;
if (Addr < SABOOT2)
rc = Addr / 0x2000;
else
rc = Addr / 0x10000 + 7;
return (rc);
}
/*------------------------------------------------------------------*/
/*函数名称:GetFlashAddr() */
/*函数功能:根据扇区号获得地址 */
/*输入说明: */
/*输出说明: */
/*------------------------------------------------------------------*/
INT32U GetFlashAddr(INT16U Number)
{
INT32U rc;
if (Number < 8)
rc = Number * 0x2000;
else
rc = (Number - 7) * 0x10000;
return (rc);
}
/*------------------------------------------------------------------*/
/*函数名称:GetRealSector() */
/*函数功能:获得存储地址 */
/*输入说明: */
/*输出说明: */
/*------------------------------------------------------------------*/
INT32U GetRealSector(INT32U Addr)
{
return (Addr);
}
/*------------------------------------------------------------------*/
/*函数名称:FGetSamp() */
/*函数功能:获得采样文件信息 */
/*输入说明: */
/*输出说明: */
/*------------------------------------------------------------------*/
INT8U FGetSamp(void* pData, INT16U Attr[3], BOOL Flag)
{
INT8U i, j, k, rc, size;
char *name[6] = {"ua", "uc", "ia", "ib", "ic", "io"};
struct SysTime_t time;
struct FileInfo list;
struct LBInfo_t lb;
struct DBInfo info;
size = sizeof (struct FileInfo);
if (Flag)
{
memcpy ((INT8U*)&list, pData, size);
rc = FClass(list.Name);
if (rc == SFRECORD)
{
for (i=1; i<6; i++)
{
if (!strncmp(list.Name+i, "fd", 2))
{
j = i;
break;
}
}
if (6 == i)
return (0);
Attr[0] = list.Name[j+2] - 48 - 1;
Attr[1] = list.Name[j-1] - 48;
for (i=0; i<6; i++)
{
if (!strncmp(list.Name+j+3, name[i], 2))
{
Attr[2] = LBDATAUA + i;
}
}
}
else
{
return (0);
}
}
info.Type = LBINFO;
info.Num = 0;
rc = 0;
for (i=0; i<FDNum; i++)
{
info.SuperID = i;
for (j=0; j<LBLIMIT; j++)
{
info.DevID = j;
if (Flag)
{
if ((i != Attr[0]) || (j != Attr[1]))
continue;
}
DBRead((INT8U*)&lb, &info);
if (info.Num != 0)
{
TimeChange((void*)&time, SYSTIME, (void*)&lb.Time, ABSTIME);
time.Year = time.Year % 100;
for (k=0; k<ADNUM; k++)
{
if ((lb.Flag>>k) & 0x01)
{
sprintf(list.Name, "%01dfd%01d%02s_%02d-%02d-%02d_%02d-%02d-%02d-%03d.rec", j, (i+1), name[k], (INT8U)time.Year, time.Month, time.Day, time.Hour, time.Minute, time.Second, time.MSecond);
list.Length = lb.Length * 2;
list.Attr = 0x81B6;
if (Flag)
{
if ((i != Attr[0]) || (j != Attr[1]) || (k != (Attr[2]-LBDATAUA)))
continue;
}
memcpy ((INT8U*)(((struct FileInfo*)pData)+rc), (INT8U*)&list, size);
rc++;
}
}
}
info.Num = 0;
}
}
return (rc);
}
/*------------------------------------------------------------------*/
/*函数名称:FReadSamp() */
/*函数功能:读取采样文件内容 */
/*输入说明: */
/*输出说明: */
/*------------------------------------------------------------------*/
INT32U FReadSamp(INT16U Attr[3], INT32U Offset, INT8U* pData, INT32U Len)
{
INT16U tmp;
struct DBInfo info;
info.SuperID = Attr[0];
info.DevID = Attr[1];
info.Type = Attr[2];
tmp = Offset / 2;
info.Start = tmp / 32 + ((tmp % 32)<<8);
tmp = Len / 2;
info.Num = tmp / 32 + ((tmp % 32)<<8);
if (DBRead(pData, &info))
return (tmp * 2);
else
return (0);
}
/*------------------------------------------------------------------*/
/*函数名称:FDelSamp() */
/*函数功能:删除采样文件 */
/*输入说明: */
/*输出说明: */
/*------------------------------------------------------------------*/
BOOL FDelSamp(INT16U Attr[3])
{
BOOL rc = FALSE;
INT16U tmp;
struct LBInfo_t lb;
struct DBInfo info;
info.SuperID = Attr[0];
info.DevID = Attr[1];
info.Type = LBINFO;
info.Num = 0;
DBRead((INT8U*)&lb, &info);
if (info.Num != 0)
{
tmp = Attr[2] - LBDATAUA;
tmp = 0xFFFF ^ (0x01<<tmp);
lb.Flag &= tmp;
info.Start = 0xFFFF;
rc = DBWrite((INT8U*)&lb, &info);
}
return (rc);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -