Я не знаю где тут баг , но он есть . Причем иногда проявляется иногда нет
void COutlessPointer2Dlg::OnTimer( UINT_PTR nIDEvent)
{
if( nIDEvent==TMR_RUNNING)
{
SetSystemPowerState( NULL, POWER_STATE_ON, POWER_FORCE);
ZeroMemory( &gpsPos, sizeof( GPS_POSITION));
if( m_CfgData.bGpsMode == 1)
{
//Test
gps.GPSPortRead();
CManualGPS::GPSMESSAGE m;
ZeroMemory( &m, sizeof(CManualGPS::GPSMESSAGE));
if( gps.GPSGetData( &m))
{
gpsPos.dblLatitude = m.fLattitude;
gpsPos.dblLongitude = m.fLongitude;
gpsPos.flAltitudeWRTSeaLevel = (float)m.fAltitude;
gpsPos.dwSatelliteCount = m.dwSatellites;
gpsPos.flHorizontalDilutionOfPrecision = m.fHDOP;
}
#pragma region debug
//debug
/*CFile f;
if( f.Open( L"\\GPS\\tmp.txt", CFile::modeWrite|CFile::modeCreate|CFile::modeNoTruncate))
{
CStringA sGpsCut("");
sGpsCut.Format( "%d;%f;%f;%f;", m.dwSatellites, m.fLattitude, m.fLongitude, m.fAltitude);
char ch[3] = {'\r','\n',0x00};
sGpsCut += ch;
COleDateTime dt( COleDateTime::GetCurrentTime());
sGpsCut += dt.Format();
sGpsCut += ch;
f.SeekToEnd();
f.Write( sGpsCut.GetBuffer(), sGpsCut.GetLength());
f.Close();
}*/
//
#pragma endregion
}
else if( m_CfgData.bGpsMode == 0)
{
//GPS reading
gpsPos.dwVersion = GPS_VERSION_1;
gpsPos.dwSize = sizeof( GPS_POSITION);
if( GPSGetPosition( hGPS, &gpsPos, 1000, 0)!=ERROR_SUCCESS)
{
ZeroMemory( &gpsPos, sizeof( GPS_POSITION));
}
#pragma region debug
//debug
/*CFile f;
if( f.Open( L"\\GPS\\tmp.txt", CFile::modeWrite|CFile::modeCreate|CFile::modeNoTruncate))
{
CStringA sGpsCut("");
sGpsCut.Format( "%d;%f;%f;%f;", gpsPos.dwSatelliteCount, gpsPos.dblLatitude,
gpsPos.dblLongitude, gpsPos.flHorizontalDilutionOfPrecision);
char ch[3] = {'\r','\n',0x00};
sGpsCut += ch;
COleDateTime dt( COleDateTime::GetCurrentTime());
sGpsCut += dt.Format();
sGpsCut += ch;
f.SeekToEnd();
f.Write( sGpsCut.GetBuffer(), sGpsCut.GetLength());
f.Flush();
f.Close();
}*/
//
#pragma endregion
}
ZeroMemory( &gpsPosBest, sizeof( GPS_POSITION));
DWORD dwTime = GetTickCount();
m_GpsQueue[m_dwGpsQueueIndex].dwTime = dwTime;
CopyMemory( &(m_GpsQueue[m_dwGpsQueueIndex].pos), &gpsPos, sizeof(GPS_POSITION));
m_dwGpsQueueIndex++;
if( m_dwGpsQueueIndex >= GPSQUEUESIZE) m_dwGpsQueueIndex = 0;
DWORD dwMinHdopIndex = 0;
for( int i = 1;i < GPSQUEUESIZE; i++)
{
DWORD dwPosTimeDelta = ( dwTime - m_GpsQueue[i].dwTime);
if( dwPosTimeDelta <= 13000 &&
m_GpsQueue[i].pos.flHorizontalDilutionOfPrecision >= 1.0f &&
m_GpsQueue[i].pos.flHorizontalDilutionOfPrecision <= m_GpsQueue[dwMinHdopIndex].pos.flHorizontalDilutionOfPrecision &&
m_GpsQueue[i].pos.dblLatitude!=0.0 && m_GpsQueue[i].pos.dblLongitude!=0.0)
{
if(m_GpsQueue[i].pos.flHorizontalDilutionOfPrecision < m_GpsQueue[dwMinHdopIndex].pos.flHorizontalDilutionOfPrecision)
dwMinHdopIndex = i;
else if(m_GpsQueue[i].dwTime > m_GpsQueue[dwMinHdopIndex].dwTime)
dwMinHdopIndex = i;
}
}
CopyMemory( &gpsPosBest, &(m_GpsQueue[dwMinHdopIndex].pos), sizeof(GPS_POSITION));
if( gpsPosBest.flHorizontalDilutionOfPrecision >= 1.0f && gpsPosBest.flHorizontalDilutionOfPrecision < 6)
m_btnLocate.EnableWindow( TRUE);
else
m_btnLocate.EnableWindow( FALSE);
//Redraw
m_nBlinkState = (m_nBlinkState==1)?0:1;
Invalidate( FALSE);
}
}
Извиняюсь за код под венду(mobile) , но смысл именно в баге в алгоритме кэширования показаний, а не в системе
Исправлять мне уже не нужно , но хочу понять ГДЕ? 4 часа по шагам разбирал .. так и не понял
Проблема в том , что иногда алгоритм начинает выдавать 0 значения, при нормальном сигнале с gps .. т.е. не отрабатывать как должно. отключаю кэширование и все работает ...