@@ -576,6 +576,15 @@ String Gps::getMessages() const {
576576 return theGpsMessage;
577577}
578578
579+ String Gps::popMessage () {
580+ String theGpsMessage = " " ;
581+ if (mMessages .size () > 0 ) {
582+ theGpsMessage = mMessages [0 ];
583+ mMessages .erase (mMessages .begin ());
584+ }
585+ return theGpsMessage;
586+ }
587+
579588String Gps::getMessage (uint16_t idx) const {
580589 String theGpsMessage = " " ;
581590 if (mMessages .size () > idx) {
@@ -872,7 +881,7 @@ void Gps::parseUbxMessage() {
872881 mGpsBuffer .navDop .iTow , mGpsBuffer .navDop .gDop , mGpsBuffer .navDop .pDop ,
873882 mGpsBuffer .navDop .tDop , mGpsBuffer .navDop .vDop , mGpsBuffer .navDop .hDop ,
874883 mGpsBuffer .navDop .nDop , mGpsBuffer .navDop .eDop );
875- if (prepareGpsData (mGpsBuffer .navSol .iTow )) {
884+ if (prepareGpsData (mGpsBuffer .navDop .iTow )) {
876885 mIncomingGpsRecord .setHdop (mGpsBuffer .navDop .hDop );
877886 checkGpsDataState ();
878887 }
@@ -882,6 +891,15 @@ void Gps::parseUbxMessage() {
882891 log_v (" SOL: iTOW: %u, gpsFix: %d, flags: %02x, numSV: %d, pDop: %04d." ,
883892 mGpsBuffer .navSol .iTow , mGpsBuffer .navSol .gpsFix , mGpsBuffer .navSol .flags ,
884893 mGpsBuffer .navSol .numSv , mGpsBuffer .navSol .pDop );
894+ if (mGpsBuffer .navSol .flags & 4 ) { // WKNSET
895+ if (mLastGpsWeek != mGpsBuffer .navSol .week ) {
896+ // debugging #294
897+ addStatisticsMessage (String (" NAVSOL gps week changed: " )
898+ + mLastGpsWeek + " -> " + mGpsBuffer .navSol .week
899+ + " at " + TimeUtils::dateTimeToString ());
900+ }
901+ mLastGpsWeek = mGpsBuffer .navSol .week ;
902+ }
885903 if (prepareGpsData (mGpsBuffer .navSol .iTow )) {
886904 mIncomingGpsRecord .setInfo (mGpsBuffer .navSol .numSv , mGpsBuffer .navSol .gpsFix , mGpsBuffer .navSol .flags );
887905 checkGpsDataState ();
@@ -1027,11 +1045,25 @@ void Gps::parseUbxMessage() {
10271045}
10281046
10291047void Gps::handleUbxNavTimeGps (const GpsBuffer::UbxNavTimeGps &message, const uint32_t receivedMs, const uint32_t delayMs) {
1030- log_i (" TIMEGPS: iTOW: %u, fTOW: %d, week %d, leapS: %d, valid: 0x%02x, tAcc %dns, delay %dms" ,
1031- message.iTow , message.fTow , message.week , message.leapS , message.valid , message.tAcc , delayMs);
1048+ log_i (" TIMEGPS: iTOW: %u, fTOW: %d, week %d, leapS: %d, valid: 0x%02x (%s%s%s), tAcc %uns, DATE: %s, delay %dms" ,
1049+ message.iTow , message.fTow , message.week , message.leapS , message.valid ,
1050+ message.valid & 1 ? " TOW" : " " ,
1051+ message.valid & 2 ? " WEEK" : " " ,
1052+ message.valid & 4 ? " UTC" : " " ,
1053+ message.tAcc ,
1054+ TimeUtils::dateTimeToString (TimeUtils::toTime (message.week , message.iTow / 1000 )).c_str (),
1055+ delayMs);
1056+ if (message.valid & 2 ) {
1057+ if (mLastGpsWeek != message.week ) {
1058+ // debugging #294
1059+ addStatisticsMessage (String (" TIMEGPS gps week changed: " )
1060+ + mLastGpsWeek + " -> " + message.week );
1061+ }
1062+ mLastGpsWeek = message.week ;
1063+ }
10321064 if ((message.valid & 0x03 ) == 0x03 // WEEK && TOW
1033- && delayMs < 80
1034- && message.tAcc < (80 * 1000 * 1000 /* 80ms */ )
1065+ && delayMs < 20
1066+ && message.tAcc < (20 * 1000 * 1000 /* 20ms */ )
10351067 && (mLastTimeTimeSet == 0
10361068 || (mLastTimeTimeSet + (2 * 60 * 1000 /* 2 minutes */ )) < receivedMs)) {
10371069 String oldTime = TimeUtils::dateTimeToString ();
@@ -1040,7 +1072,8 @@ void Gps::handleUbxNavTimeGps(const GpsBuffer::UbxNavTimeGps &message, const uin
10401072 if (oldTime != newTime) {
10411073 log_i (" TIMEGPS set: %s -> %s" , oldTime.c_str (), newTime.c_str ());
10421074 addStatisticsMessage (String (" TIMEGPS set: " )
1043- + oldTime + " -> " + newTime + " " + String (delayMs) + " ms." );
1075+ + oldTime + " -> " + newTime + " delay " + String (delayMs)
1076+ + " ms. tAcc:" + String (message.tAcc ) + " ns" );
10441077 }
10451078 if (mLastTimeTimeSet == 0 ) {
10461079 mLastTimeTimeSet = receivedMs;
@@ -1136,6 +1169,7 @@ bool Gps::prepareGpsData(uint32_t tow) {
11361169 // fine already prepared
11371170 } else if (mIncomingGpsRecord .mCollectTow == 0 ) {
11381171 mIncomingGpsRecord .setTow (tow);
1172+ mIncomingGpsRecord .setWeek (mLastGpsWeek );
11391173 } else if ((int32_t ) (mIncomingGpsRecord .mCollectTow - tow) > 0 ) {
11401174 log_e (" Data already published: %d" ,
11411175 mCurrentGpsRecord .mCollectTow );
0 commit comments