Allman void
log_record(enum event_code event)
{
uint32_t type, uptime, utc, i;
if (cur_write.seqno == 0)
{
flash_erase((uintptr_t)SECTOR0);
if (*SECTOR1 == LOG_MAGIC)
{
flash_erase((uintptr_t)SECTOR1);
}
cur_write.sector = SECTOR0;
cur_write.i = 2;
cur_write.seqno = 1;
}
else
{
cur_write.seqno++;
cur_write.i += REC_TYPE(cur_write.sector[cur_write.i]);
if (cur_write.i > (MAX_INDEX - 3))
{
cur_write.sector = SEC_SWAP(cur_write.sector);
flash_erase((uintptr_t)cur_write.sector);
cur_write.i = 2;
}
}
uptime = systime_ms() / 1000;
utc = clock_get_utc_time();
if (cur_write.i == 2)
{
type = REC_ABS;
}
else if ((utc != 0) && (cur_write.utc == 0))
{
type = REC_ABS;
}
else if (uptime - cur_write.uptime <= 0xFFFF)
{
type = REC_REL;
if (cur_write.utc != 0)
{
int32_t diff[2];
diff[0] = (int32_t)uptime - (int32_t)cur_write.uptime;
diff[1] = (int32_t)utc - (int32_t)cur_write.utc;
if (abs(diff[0] - diff[1]) > 2)
{
type = REC_ABS;
}
}
}
else
{
type = REC_ABS;
}
if ((type == REC_ABS) && !clock_valid())
{
type = REC_NOUTC;
}
switch (type)
{
case REC_REL:
i = type << 24;
i |= event << 16;
i |= uptime - cur_write.uptime;
flash_write32((uintptr_t)&cur_write.sector[cur_write.i], i);
break;
case REC_ABS:
flash_write32((uintptr_t)&cur_write.sector[cur_write.i + 2],
utc);
case REC_NOUTC:
flash_write32((uintptr_t)&cur_write.sector[cur_write.i + 1],
uptime);
i = type << 24;
i |= event << 16;
i |= REC_PADDING;
flash_write32((uintptr_t)&cur_write.sector[cur_write.i],i);
break;
}
cur_write.uptime = uptime;
cur_write.utc = utc;
if (cur_write.i == 2)
{
flash_write32((uintptr_t)&cur_write.sector[1], cur_write.seqno);
flash_write32((uintptr_t)&cur_write.sector[0], LOG_MAGIC);
}
}
ส็็็็็็็็็็็็็็็็็็็็็็็็็༼ ຈل͜ຈ༽ส้้้้้้้้้้้้้้้้้้้้้้้
-
- +1 - ASDFS(12.09.2013 14:28)