示例#1
0
文件: ublox.c 项目: ctraabe/NaviCtrl
// -----------------------------------------------------------------------------
static void ProcessIncomingUBloxByte(uint8_t byte)
{
  static size_t bytes_processed = 0, payload_length = 0;
  static uint8_t id, checksum_a, checksum_b;
  static uint8_t * data_buffer_ptr = NULL;

  switch (bytes_processed)
  {
    case 0:  // Sync char 1
      if (byte != UBX_SYNC_CHAR_1) goto RESET;
      break;
    case 1:  // Sync char 2
      if (byte != UBX_SYNC_CHAR_2) goto RESET;
      break;
    case 2:  // Class (NAV)
      if (byte != UBX_CLASS_NAV) goto RESET;
      checksum_a = byte;
      checksum_b = byte;
      break;
    case 3:  // ID
      id = byte;
      UpdateChecksum(byte, &checksum_a, &checksum_b);
      break;
    case 4:  // Payload length (lower byte)
      if (byte > UBLOX_DATA_BUFFER_LENGTH) goto RESET;
      payload_length = byte;
      data_buffer_ptr = &data_buffer_[0];
    case 5:  // Payload length (upper byte should always be zero)
      UpdateChecksum(byte, &checksum_a, &checksum_b);
      break;
    default:  // Payload or checksum
      if (bytes_processed < (6 + payload_length))  // Payload
      {
        *data_buffer_ptr++ = byte;
        UpdateChecksum(byte, &checksum_a, &checksum_b);
      }
      else if (bytes_processed == (6 + payload_length))  // Checksum A
      {
        if (byte != checksum_a) goto RESET;
      }
      else  // Checksum B
      {
        if (byte == checksum_b) CopyUBloxMessage(id);
        goto RESET;
      }
      break;
  }
  bytes_processed++;
  return;

  RESET:
  bytes_processed = 0;
}
示例#2
0
void MMatchChannel::Tick(u64 nClock)
{
	if (IsChecksumUpdateTime(nClock))
		UpdateChecksum(nClock);

	m_SmartRefresh.UpdateCategory(nClock);

	if (GetObjCount() <= 0) m_nEmptyPeriod += MTICK_CHANNEL_RUN; else m_nEmptyPeriod = 0;
	m_nLastTick = nClock;
}
示例#3
0
//// MDataCheckNode ////
MDataCheckNode::MDataCheckNode(BYTE* pData, unsigned int nLen)
{
	static unsigned int s_nID = 0;

	m_nID = s_nID++;

	m_pData = pData;
	m_nLen = nLen;

	UpdateChecksum();
	
	m_nLastChecksum = m_nChecksum;
}
BOOL CDataIndex::Open(LPCTSTR DataFileName, BOOL UseStarts)
{
	// construct index filename from data filename and read header, then verify checksum
	if (m_Valid)
		Close();

	// create index for the given data file
	m_DataFileName = _T(DataFileName);

	// build index filename
	CFileSpec fs(DataFileName);
	fs.SetExt(".ldx");

	// build cell starts filename
	CFileSpec ifs(DataFileName);
	ifs.SetExt(".ldi");

	// open index file and read header
	m_FileHandle = fopen(fs.GetFullSpec(), "rb");
	if (m_FileHandle) {
		if (ReadHeader()) {
			if (VerifyChecksum(DataFileName)) {
				m_Valid = TRUE;
			}
			else {
				fclose(m_FileHandle);
				m_Valid = FALSE;

				// check for old header checksum
				if (VerifyChecksum(DataFileName, TRUE)) {
					// update index and starts file headers
					UpdateChecksum(DataFileName);

					// this has to work since we have already opened the file
					m_FileHandle = fopen(fs.GetFullSpec(), "rb");
					if (m_FileHandle) {
						ReadHeader();
						m_Valid = TRUE;
					}
				}
			}
		}
	}

	// see if there is a starts file
	if (m_Valid && UseStarts) {
		FILE* f = fopen(ifs.GetFullSpec(), "rb");
		if (f) {
			if (ReadHeader(f)) {
				if (VerifyChecksum(DataFileName)) {
					m_CellStarts = new long[m_Header.GridCellsAcross * m_Header.GridCellsUp];
					if (m_CellStarts) {
						if (fread(m_CellStarts, sizeof(long), m_Header.GridCellsAcross * m_Header.GridCellsUp, f) == (unsigned int) (m_Header.GridCellsAcross * m_Header.GridCellsUp))
							m_HaveStarts = TRUE;
						else
							delete [] m_CellStarts;
					}
				}
			}
			fclose(f);

			// re-read index file header...starts file header was read into m_Header
			ReadHeader();
		}
		else {
			// could not read starts file...this is an error since UseStarts was TRUE
			if (m_FileHandle)
				fclose(m_FileHandle);

			m_Valid = FALSE;
			m_FileHandle = NULL;
		}
	}

	return(m_Valid);
}
示例#5
0
bool SdOsImageWriter::WriteData(DWORD dwOffset, const ByteVector& buffer)
{
    UpdateChecksum(m_checksum, buffer);

    return m_sd->WriteData(dwOffset-0x80040000 + 2*m_sd->GetBlockSize(), buffer);
}