Merge "SystemStatus - Add reported UTC timestamp in report"

This commit is contained in:
Linux Build Service Account 2017-04-13 10:55:47 -07:00 committed by Gerrit - the friendly Code Review server
commit ee94e7d555
2 changed files with 46 additions and 73 deletions

View file

@ -47,7 +47,6 @@ class SystemStatusNmeaBase
{ {
protected: protected:
std::vector<std::string> mField; std::vector<std::string> mField;
timespec setUtcTime(std::string sutctime);
SystemStatusNmeaBase(const char *str_in, uint32_t len_in) SystemStatusNmeaBase(const char *str_in, uint32_t len_in)
{ {
@ -86,31 +85,12 @@ public:
static const uint32_t NMEA_MAXSIZE = DEBUG_NMEA_MAXSIZE; static const uint32_t NMEA_MAXSIZE = DEBUG_NMEA_MAXSIZE;
}; };
timespec SystemStatusNmeaBase::setUtcTime(std::string sutctime)
{
timespec ts = { 0ULL, 0ULL };
uint64_t utctime_ns = atof(sutctime.c_str()) * 1000000000ULL;
ts.tv_nsec = utctime_ns % 1000000000ULL;
uint64_t utctime_s = utctime_ns / 1000000000ULL;
uint64_t hour = utctime_s / 10000ULL;
uint64_t min = (utctime_s / 100LL) % 100ULL;
uint64_t sec = utctime_s % 100ULL;
ts.tv_sec = hour * 3600ULL + min * 60ULL + sec;
timeval tv;
gettimeofday(&tv, NULL);
ts.tv_sec += (uint64_t(tv.tv_sec / (24ULL * 60ULL * 60ULL))) * (24ULL * 60ULL * 60ULL);
return ts;
}
/****************************************************************************** /******************************************************************************
SystemStatusPQWM1 SystemStatusPQWM1
******************************************************************************/ ******************************************************************************/
class SystemStatusPQWM1 class SystemStatusPQWM1
{ {
public: public:
timespec mUtcTime;
uint16_t mGpsWeek; // x1 uint16_t mGpsWeek; // x1
uint32_t mGpsTowMs; // x2 uint32_t mGpsTowMs; // x2
uint8_t mTimeValid; // x3 uint8_t mTimeValid; // x3
@ -199,11 +179,6 @@ public:
return; return;
} }
memset(&mM1, 0, sizeof(mM1)); memset(&mM1, 0, sizeof(mM1));
timeval tv;
gettimeofday(&tv, NULL);
mM1.mUtcTime.tv_sec = tv.tv_sec;
mM1.mUtcTime.tv_nsec = tv.tv_usec * 1000UL;
mM1.mGpsWeek = atoi(mField[eGpsWeek].c_str()); mM1.mGpsWeek = atoi(mField[eGpsWeek].c_str());
mM1.mGpsTowMs = atoi(mField[eGpsTowMs].c_str()); mM1.mGpsTowMs = atoi(mField[eGpsTowMs].c_str());
mM1.mTimeValid = atoi(mField[eTimeValid].c_str()); mM1.mTimeValid = atoi(mField[eTimeValid].c_str());
@ -237,7 +212,6 @@ public:
class SystemStatusPQWP1 class SystemStatusPQWP1
{ {
public: public:
timespec mUtcTime;
uint8_t mEpiValidity; // x4 uint8_t mEpiValidity; // x4
float mEpiLat; // x5 float mEpiLat; // x5
float mEpiLon; // x6 float mEpiLon; // x6
@ -266,7 +240,6 @@ private:
SystemStatusPQWP1 mP1; SystemStatusPQWP1 mP1;
public: public:
inline timespec getUtcTime() { return mP1.mUtcTime; }
inline uint8_t getEpiValidity() { return mP1.mEpiValidity; } inline uint8_t getEpiValidity() { return mP1.mEpiValidity; }
inline float getEpiLat() { return mP1.mEpiLat; } inline float getEpiLat() { return mP1.mEpiLat; }
inline float getEpiLon() { return mP1.mEpiLon; } inline float getEpiLon() { return mP1.mEpiLon; }
@ -282,7 +255,6 @@ public:
return; return;
} }
memset(&mP1, 0, sizeof(mP1)); memset(&mP1, 0, sizeof(mP1));
mP1.mUtcTime = setUtcTime(mField[eUtcTime]);
mP1.mEpiValidity = strtol(mField[eEpiValidity].c_str(), NULL, 16); mP1.mEpiValidity = strtol(mField[eEpiValidity].c_str(), NULL, 16);
mP1.mEpiLat = atof(mField[eEpiLat].c_str()); mP1.mEpiLat = atof(mField[eEpiLat].c_str());
mP1.mEpiLon = atof(mField[eEpiLon].c_str()); mP1.mEpiLon = atof(mField[eEpiLon].c_str());
@ -301,7 +273,6 @@ public:
class SystemStatusPQWP2 class SystemStatusPQWP2
{ {
public: public:
timespec mUtcTime;
float mBestLat; // x4 float mBestLat; // x4
float mBestLon; // x5 float mBestLon; // x5
float mBestAlt; // x6 float mBestAlt; // x6
@ -339,7 +310,6 @@ public:
return; return;
} }
memset(&mP2, 0, sizeof(mP2)); memset(&mP2, 0, sizeof(mP2));
mP2.mUtcTime = setUtcTime(mField[eUtcTime]);
mP2.mBestLat = atof(mField[eBestLat].c_str()); mP2.mBestLat = atof(mField[eBestLat].c_str());
mP2.mBestLon = atof(mField[eBestLon].c_str()); mP2.mBestLon = atof(mField[eBestLon].c_str());
mP2.mBestAlt = atof(mField[eBestAlt].c_str()); mP2.mBestAlt = atof(mField[eBestAlt].c_str());
@ -356,7 +326,6 @@ public:
class SystemStatusPQWP3 class SystemStatusPQWP3
{ {
public: public:
timespec mUtcTime;
uint8_t mXtraValidMask; uint8_t mXtraValidMask;
uint32_t mGpsXtraAge; uint32_t mGpsXtraAge;
uint32_t mGloXtraAge; uint32_t mGloXtraAge;
@ -412,7 +381,6 @@ public:
return; return;
} }
memset(&mP3, 0, sizeof(mP3)); memset(&mP3, 0, sizeof(mP3));
mP3.mUtcTime = setUtcTime(mField[eUtcTime]);
mP3.mXtraValidMask = strtol(mField[eXtraValidMask].c_str(), NULL, 16); mP3.mXtraValidMask = strtol(mField[eXtraValidMask].c_str(), NULL, 16);
mP3.mGpsXtraAge = atoi(mField[eGpsXtraAge].c_str()); mP3.mGpsXtraAge = atoi(mField[eGpsXtraAge].c_str());
mP3.mGloXtraAge = atoi(mField[eGloXtraAge].c_str()); mP3.mGloXtraAge = atoi(mField[eGloXtraAge].c_str());
@ -435,7 +403,6 @@ public:
class SystemStatusPQWP4 class SystemStatusPQWP4
{ {
public: public:
timespec mUtcTime;
uint32_t mGpsEpheValid; uint32_t mGpsEpheValid;
uint32_t mGloEpheValid; uint32_t mGloEpheValid;
uint64_t mBdsEpheValid; uint64_t mBdsEpheValid;
@ -473,7 +440,6 @@ public:
return; return;
} }
memset(&mP4, 0, sizeof(mP4)); memset(&mP4, 0, sizeof(mP4));
mP4.mUtcTime = setUtcTime(mField[eUtcTime]);
mP4.mGpsEpheValid = strtol(mField[eGpsEpheValid].c_str(), NULL, 16); mP4.mGpsEpheValid = strtol(mField[eGpsEpheValid].c_str(), NULL, 16);
mP4.mGloEpheValid = strtol(mField[eGloEpheValid].c_str(), NULL, 16); mP4.mGloEpheValid = strtol(mField[eGloEpheValid].c_str(), NULL, 16);
mP4.mBdsEpheValid = strtol(mField[eBdsEpheValid].c_str(), NULL, 16); mP4.mBdsEpheValid = strtol(mField[eBdsEpheValid].c_str(), NULL, 16);
@ -490,7 +456,6 @@ public:
class SystemStatusPQWP5 class SystemStatusPQWP5
{ {
public: public:
timespec mUtcTime;
uint32_t mGpsUnknownMask; uint32_t mGpsUnknownMask;
uint32_t mGloUnknownMask; uint32_t mGloUnknownMask;
uint64_t mBdsUnknownMask; uint64_t mBdsUnknownMask;
@ -558,7 +523,6 @@ public:
return; return;
} }
memset(&mP5, 0, sizeof(mP5)); memset(&mP5, 0, sizeof(mP5));
mP5.mUtcTime = setUtcTime(mField[eUtcTime]);
mP5.mGpsUnknownMask = strtol(mField[eGpsUnknownMask].c_str(), NULL, 16); mP5.mGpsUnknownMask = strtol(mField[eGpsUnknownMask].c_str(), NULL, 16);
mP5.mGloUnknownMask = strtol(mField[eGloUnknownMask].c_str(), NULL, 16); mP5.mGloUnknownMask = strtol(mField[eGloUnknownMask].c_str(), NULL, 16);
mP5.mBdsUnknownMask = strtol(mField[eBdsUnknownMask].c_str(), NULL, 16); mP5.mBdsUnknownMask = strtol(mField[eBdsUnknownMask].c_str(), NULL, 16);
@ -585,7 +549,6 @@ public:
class SystemStatusPQWP6 class SystemStatusPQWP6
{ {
public: public:
timespec mUtcTime;
uint32_t mFixInfoMask; uint32_t mFixInfoMask;
}; };
@ -611,7 +574,6 @@ public:
return; return;
} }
memset(&mP6, 0, sizeof(mP6)); memset(&mP6, 0, sizeof(mP6));
mP6.mUtcTime = setUtcTime(mField[eUtcTime]);
mP6.mFixInfoMask = strtol(mField[eFixInfoMask].c_str(), NULL, 16); mP6.mFixInfoMask = strtol(mField[eFixInfoMask].c_str(), NULL, 16);
} }
@ -624,7 +586,6 @@ public:
class SystemStatusPQWS1 class SystemStatusPQWS1
{ {
public: public:
timespec mUtcTime;
uint32_t mFixInfoMask; uint32_t mFixInfoMask;
uint32_t mHepeLimit; uint32_t mHepeLimit;
}; };
@ -653,7 +614,6 @@ public:
return; return;
} }
memset(&mS1, 0, sizeof(mS1)); memset(&mS1, 0, sizeof(mS1));
mS1.mUtcTime = setUtcTime(mField[eUtcTime]);
mS1.mFixInfoMask = atoi(mField[eFixInfoMask].c_str()); mS1.mFixInfoMask = atoi(mField[eFixInfoMask].c_str());
mS1.mHepeLimit = atoi(mField[eHepeLimit].c_str()); mS1.mHepeLimit = atoi(mField[eHepeLimit].c_str());
} }
@ -665,7 +625,6 @@ public:
SystemStatusTimeAndClock SystemStatusTimeAndClock
******************************************************************************/ ******************************************************************************/
SystemStatusTimeAndClock::SystemStatusTimeAndClock(const SystemStatusPQWM1& nmea) : SystemStatusTimeAndClock::SystemStatusTimeAndClock(const SystemStatusPQWM1& nmea) :
SystemStatusItemBase(nmea.mUtcTime),
mGpsWeek(nmea.mGpsWeek), mGpsWeek(nmea.mGpsWeek),
mGpsTowMs(nmea.mGpsTowMs), mGpsTowMs(nmea.mGpsTowMs),
mTimeValid(nmea.mTimeValid), mTimeValid(nmea.mTimeValid),
@ -708,7 +667,6 @@ void SystemStatusTimeAndClock::dump()
SystemStatusXoState SystemStatusXoState
******************************************************************************/ ******************************************************************************/
SystemStatusXoState::SystemStatusXoState(const SystemStatusPQWM1& nmea) : SystemStatusXoState::SystemStatusXoState(const SystemStatusPQWM1& nmea) :
SystemStatusItemBase(nmea.mUtcTime),
mXoState(nmea.mXoState) mXoState(nmea.mXoState)
{ {
} }
@ -733,7 +691,6 @@ void SystemStatusXoState::dump()
SystemStatusRfAndParams SystemStatusRfAndParams
******************************************************************************/ ******************************************************************************/
SystemStatusRfAndParams::SystemStatusRfAndParams(const SystemStatusPQWM1& nmea) : SystemStatusRfAndParams::SystemStatusRfAndParams(const SystemStatusPQWM1& nmea) :
SystemStatusItemBase(nmea.mUtcTime),
mPgaGain(nmea.mPgaGain), mPgaGain(nmea.mPgaGain),
mGpsBpAmpI(nmea.mGpsBpAmpI), mGpsBpAmpI(nmea.mGpsBpAmpI),
mGpsBpAmpQ(nmea.mGpsBpAmpQ), mGpsBpAmpQ(nmea.mGpsBpAmpQ),
@ -796,7 +753,6 @@ void SystemStatusRfAndParams::dump()
SystemStatusErrRecovery SystemStatusErrRecovery
******************************************************************************/ ******************************************************************************/
SystemStatusErrRecovery::SystemStatusErrRecovery(const SystemStatusPQWM1& nmea) : SystemStatusErrRecovery::SystemStatusErrRecovery(const SystemStatusPQWM1& nmea) :
SystemStatusItemBase(nmea.mUtcTime),
mRecErrorRecovery(nmea.mRecErrorRecovery) mRecErrorRecovery(nmea.mRecErrorRecovery)
{ {
} }
@ -821,7 +777,6 @@ void SystemStatusErrRecovery::dump()
SystemStatusInjectedPosition SystemStatusInjectedPosition
******************************************************************************/ ******************************************************************************/
SystemStatusInjectedPosition::SystemStatusInjectedPosition(const SystemStatusPQWP1& nmea) : SystemStatusInjectedPosition::SystemStatusInjectedPosition(const SystemStatusPQWP1& nmea) :
SystemStatusItemBase(nmea.mUtcTime),
mEpiValidity(nmea.mEpiValidity), mEpiValidity(nmea.mEpiValidity),
mEpiLat(nmea.mEpiLat), mEpiLat(nmea.mEpiLat),
mEpiLon(nmea.mEpiLon), mEpiLon(nmea.mEpiLon),
@ -864,7 +819,6 @@ void SystemStatusInjectedPosition::dump()
SystemStatusBestPosition SystemStatusBestPosition
******************************************************************************/ ******************************************************************************/
SystemStatusBestPosition::SystemStatusBestPosition(const SystemStatusPQWP2& nmea) : SystemStatusBestPosition::SystemStatusBestPosition(const SystemStatusPQWP2& nmea) :
SystemStatusItemBase(nmea.mUtcTime),
mBestLat(nmea.mBestLat), mBestLat(nmea.mBestLat),
mBestLon(nmea.mBestLon), mBestLon(nmea.mBestLon),
mBestAlt(nmea.mBestAlt), mBestAlt(nmea.mBestAlt),
@ -901,7 +855,6 @@ void SystemStatusBestPosition::dump()
SystemStatusXtra SystemStatusXtra
******************************************************************************/ ******************************************************************************/
SystemStatusXtra::SystemStatusXtra(const SystemStatusPQWP3& nmea) : SystemStatusXtra::SystemStatusXtra(const SystemStatusPQWP3& nmea) :
SystemStatusItemBase(nmea.mUtcTime),
mXtraValidMask(nmea.mXtraValidMask), mXtraValidMask(nmea.mXtraValidMask),
mGpsXtraAge(nmea.mGpsXtraAge), mGpsXtraAge(nmea.mGpsXtraAge),
mGloXtraAge(nmea.mGloXtraAge), mGloXtraAge(nmea.mGloXtraAge),
@ -956,7 +909,6 @@ void SystemStatusXtra::dump()
SystemStatusEphemeris SystemStatusEphemeris
******************************************************************************/ ******************************************************************************/
SystemStatusEphemeris::SystemStatusEphemeris(const SystemStatusPQWP4& nmea) : SystemStatusEphemeris::SystemStatusEphemeris(const SystemStatusPQWP4& nmea) :
SystemStatusItemBase(nmea.mUtcTime),
mGpsEpheValid(nmea.mGpsEpheValid), mGpsEpheValid(nmea.mGpsEpheValid),
mGloEpheValid(nmea.mGloEpheValid), mGloEpheValid(nmea.mGloEpheValid),
mBdsEpheValid(nmea.mBdsEpheValid), mBdsEpheValid(nmea.mBdsEpheValid),
@ -993,7 +945,6 @@ void SystemStatusEphemeris::dump()
SystemStatusSvHealth SystemStatusSvHealth
******************************************************************************/ ******************************************************************************/
SystemStatusSvHealth::SystemStatusSvHealth(const SystemStatusPQWP5& nmea) : SystemStatusSvHealth::SystemStatusSvHealth(const SystemStatusPQWP5& nmea) :
SystemStatusItemBase(nmea.mUtcTime),
mGpsUnknownMask(nmea.mGpsUnknownMask), mGpsUnknownMask(nmea.mGpsUnknownMask),
mGloUnknownMask(nmea.mGloUnknownMask), mGloUnknownMask(nmea.mGloUnknownMask),
mBdsUnknownMask(nmea.mBdsUnknownMask), mBdsUnknownMask(nmea.mBdsUnknownMask),
@ -1060,7 +1011,6 @@ void SystemStatusSvHealth::dump()
SystemStatusPdr SystemStatusPdr
******************************************************************************/ ******************************************************************************/
SystemStatusPdr::SystemStatusPdr(const SystemStatusPQWP6& nmea) : SystemStatusPdr::SystemStatusPdr(const SystemStatusPQWP6& nmea) :
SystemStatusItemBase(nmea.mUtcTime),
mFixInfoMask(nmea.mFixInfoMask) mFixInfoMask(nmea.mFixInfoMask)
{ {
} }
@ -1085,7 +1035,6 @@ void SystemStatusPdr::dump()
SystemStatusPositionFailure SystemStatusPositionFailure
******************************************************************************/ ******************************************************************************/
SystemStatusPositionFailure::SystemStatusPositionFailure(const SystemStatusPQWS1& nmea) : SystemStatusPositionFailure::SystemStatusPositionFailure(const SystemStatusPQWS1& nmea) :
SystemStatusItemBase(nmea.mUtcTime),
mFixInfoMask(nmea.mFixInfoMask), mFixInfoMask(nmea.mFixInfoMask),
mHepeLimit(nmea.mHepeLimit) mHepeLimit(nmea.mHepeLimit)
{ {
@ -1161,7 +1110,9 @@ SystemStatus::SystemStatus()
bool SystemStatus::setTimeAndCLock(const SystemStatusPQWM1& nmea) bool SystemStatus::setTimeAndCLock(const SystemStatusPQWM1& nmea)
{ {
SystemStatusTimeAndClock s(nmea); SystemStatusTimeAndClock s(nmea);
if (mCache.mTimeAndClock.empty() || !mCache.mTimeAndClock.back().equals(s)) { if (!mCache.mTimeAndClock.empty() && mCache.mTimeAndClock.back().equals(s)) {
mCache.mTimeAndClock.back().mUtcReported = s.mUtcReported;
} else {
mCache.mTimeAndClock.push_back(s); mCache.mTimeAndClock.push_back(s);
if (mCache.mTimeAndClock.size() > maxTimeAndClock) { if (mCache.mTimeAndClock.size() > maxTimeAndClock) {
mCache.mTimeAndClock.erase(mCache.mTimeAndClock.begin()); mCache.mTimeAndClock.erase(mCache.mTimeAndClock.begin());
@ -1173,7 +1124,9 @@ bool SystemStatus::setTimeAndCLock(const SystemStatusPQWM1& nmea)
bool SystemStatus::setXoState(const SystemStatusPQWM1& nmea) bool SystemStatus::setXoState(const SystemStatusPQWM1& nmea)
{ {
SystemStatusXoState s(nmea); SystemStatusXoState s(nmea);
if (mCache.mXoState.empty() || !mCache.mXoState.back().equals(s)) { if (!mCache.mXoState.empty() && mCache.mXoState.back().equals(s)) {
mCache.mXoState.back().mUtcReported = s.mUtcReported;
} else {
mCache.mXoState.push_back(s); mCache.mXoState.push_back(s);
if (mCache.mXoState.size() > maxXoState) { if (mCache.mXoState.size() > maxXoState) {
mCache.mXoState.erase(mCache.mXoState.begin()); mCache.mXoState.erase(mCache.mXoState.begin());
@ -1185,7 +1138,9 @@ bool SystemStatus::setXoState(const SystemStatusPQWM1& nmea)
bool SystemStatus::setRfAndParams(const SystemStatusPQWM1& nmea) bool SystemStatus::setRfAndParams(const SystemStatusPQWM1& nmea)
{ {
SystemStatusRfAndParams s(nmea); SystemStatusRfAndParams s(nmea);
if (mCache.mRfAndParams.empty() || !mCache.mRfAndParams.back().equals(s)) { if (!mCache.mRfAndParams.empty() && mCache.mRfAndParams.back().equals(s)) {
mCache.mRfAndParams.back().mUtcReported = s.mUtcReported;
} else {
mCache.mRfAndParams.push_back(s); mCache.mRfAndParams.push_back(s);
if (mCache.mRfAndParams.size() > maxRfAndParams) { if (mCache.mRfAndParams.size() > maxRfAndParams) {
mCache.mRfAndParams.erase(mCache.mRfAndParams.begin()); mCache.mRfAndParams.erase(mCache.mRfAndParams.begin());
@ -1197,7 +1152,9 @@ bool SystemStatus::setRfAndParams(const SystemStatusPQWM1& nmea)
bool SystemStatus::setErrRecovery(const SystemStatusPQWM1& nmea) bool SystemStatus::setErrRecovery(const SystemStatusPQWM1& nmea)
{ {
SystemStatusErrRecovery s(nmea); SystemStatusErrRecovery s(nmea);
if (mCache.mErrRecovery.empty() || !mCache.mErrRecovery.back().equals(s)) { if (!mCache.mErrRecovery.empty() && mCache.mErrRecovery.back().equals(s)) {
mCache.mErrRecovery.back().mUtcReported = s.mUtcReported;
} else {
mCache.mErrRecovery.push_back(s); mCache.mErrRecovery.push_back(s);
if (mCache.mErrRecovery.size() > maxErrRecovery) { if (mCache.mErrRecovery.size() > maxErrRecovery) {
mCache.mErrRecovery.erase(mCache.mErrRecovery.begin()); mCache.mErrRecovery.erase(mCache.mErrRecovery.begin());
@ -1212,7 +1169,9 @@ bool SystemStatus::setErrRecovery(const SystemStatusPQWM1& nmea)
bool SystemStatus::setInjectedPosition(const SystemStatusPQWP1& nmea) bool SystemStatus::setInjectedPosition(const SystemStatusPQWP1& nmea)
{ {
SystemStatusInjectedPosition s(nmea); SystemStatusInjectedPosition s(nmea);
if (mCache.mInjectedPosition.empty() || !mCache.mInjectedPosition.back().equals(s)) { if (!mCache.mInjectedPosition.empty() && mCache.mInjectedPosition.back().equals(s)) {
mCache.mInjectedPosition.back().mUtcReported = s.mUtcReported;
} else {
mCache.mInjectedPosition.push_back(s); mCache.mInjectedPosition.push_back(s);
if (mCache.mInjectedPosition.size() > maxInjectedPosition) { if (mCache.mInjectedPosition.size() > maxInjectedPosition) {
mCache.mInjectedPosition.erase(mCache.mInjectedPosition.begin()); mCache.mInjectedPosition.erase(mCache.mInjectedPosition.begin());
@ -1224,7 +1183,9 @@ bool SystemStatus::setInjectedPosition(const SystemStatusPQWP1& nmea)
bool SystemStatus::setBestPosition(const SystemStatusPQWP2& nmea) bool SystemStatus::setBestPosition(const SystemStatusPQWP2& nmea)
{ {
SystemStatusBestPosition s(nmea); SystemStatusBestPosition s(nmea);
if (mCache.mBestPosition.empty() || !mCache.mBestPosition.back().equals(s)) { if (!mCache.mBestPosition.empty() && mCache.mBestPosition.back().equals(s)) {
mCache.mBestPosition.back().mUtcReported = s.mUtcReported;
} else {
mCache.mBestPosition.push_back(s); mCache.mBestPosition.push_back(s);
if (mCache.mBestPosition.size() > maxBestPosition) { if (mCache.mBestPosition.size() > maxBestPosition) {
mCache.mBestPosition.erase(mCache.mBestPosition.begin()); mCache.mBestPosition.erase(mCache.mBestPosition.begin());
@ -1236,7 +1197,9 @@ bool SystemStatus::setBestPosition(const SystemStatusPQWP2& nmea)
bool SystemStatus::setXtra(const SystemStatusPQWP3& nmea) bool SystemStatus::setXtra(const SystemStatusPQWP3& nmea)
{ {
SystemStatusXtra s(nmea); SystemStatusXtra s(nmea);
if (mCache.mXtra.empty() || !mCache.mXtra.back().equals(s)) { if (!mCache.mXtra.empty() && mCache.mXtra.back().equals(s)) {
mCache.mXtra.back().mUtcReported = s.mUtcReported;
} else {
mCache.mXtra.push_back(s); mCache.mXtra.push_back(s);
if (mCache.mXtra.size() > maxXtra) { if (mCache.mXtra.size() > maxXtra) {
mCache.mXtra.erase(mCache.mXtra.begin()); mCache.mXtra.erase(mCache.mXtra.begin());
@ -1248,7 +1211,9 @@ bool SystemStatus::setXtra(const SystemStatusPQWP3& nmea)
bool SystemStatus::setEphemeris(const SystemStatusPQWP4& nmea) bool SystemStatus::setEphemeris(const SystemStatusPQWP4& nmea)
{ {
SystemStatusEphemeris s(nmea); SystemStatusEphemeris s(nmea);
if (mCache.mEphemeris.empty() || !mCache.mEphemeris.back().equals(s)) { if (!mCache.mEphemeris.empty() && mCache.mEphemeris.back().equals(s)) {
mCache.mEphemeris.back().mUtcReported = s.mUtcReported;
} else {
mCache.mEphemeris.push_back(s); mCache.mEphemeris.push_back(s);
if (mCache.mEphemeris.size() > maxEphemeris) { if (mCache.mEphemeris.size() > maxEphemeris) {
mCache.mEphemeris.erase(mCache.mEphemeris.begin()); mCache.mEphemeris.erase(mCache.mEphemeris.begin());
@ -1260,7 +1225,9 @@ bool SystemStatus::setEphemeris(const SystemStatusPQWP4& nmea)
bool SystemStatus::setSvHealth(const SystemStatusPQWP5& nmea) bool SystemStatus::setSvHealth(const SystemStatusPQWP5& nmea)
{ {
SystemStatusSvHealth s(nmea); SystemStatusSvHealth s(nmea);
if (mCache.mSvHealth.empty() || !mCache.mSvHealth.back().equals(s)) { if (!mCache.mSvHealth.empty() && mCache.mSvHealth.back().equals(s)) {
mCache.mSvHealth.back().mUtcReported = s.mUtcReported;
} else {
mCache.mSvHealth.push_back(s); mCache.mSvHealth.push_back(s);
if (mCache.mSvHealth.size() > maxSvHealth) { if (mCache.mSvHealth.size() > maxSvHealth) {
mCache.mSvHealth.erase(mCache.mSvHealth.begin()); mCache.mSvHealth.erase(mCache.mSvHealth.begin());
@ -1272,7 +1239,9 @@ bool SystemStatus::setSvHealth(const SystemStatusPQWP5& nmea)
bool SystemStatus::setPdr(const SystemStatusPQWP6& nmea) bool SystemStatus::setPdr(const SystemStatusPQWP6& nmea)
{ {
SystemStatusPdr s(nmea); SystemStatusPdr s(nmea);
if (mCache.mPdr.empty() || !mCache.mPdr.back().equals(s)) { if (!mCache.mPdr.empty() && mCache.mPdr.back().equals(s)) {
mCache.mPdr.back().mUtcReported = s.mUtcReported;
} else {
mCache.mPdr.push_back(s); mCache.mPdr.push_back(s);
if (mCache.mPdr.size() > maxPdr) { if (mCache.mPdr.size() > maxPdr) {
mCache.mPdr.erase(mCache.mPdr.begin()); mCache.mPdr.erase(mCache.mPdr.begin());
@ -1287,7 +1256,9 @@ bool SystemStatus::setPdr(const SystemStatusPQWP6& nmea)
bool SystemStatus::setPositionFailure(const SystemStatusPQWS1& nmea) bool SystemStatus::setPositionFailure(const SystemStatusPQWS1& nmea)
{ {
SystemStatusPositionFailure s(nmea); SystemStatusPositionFailure s(nmea);
if (mCache.mPositionFailure.empty() || !mCache.mPositionFailure.back().equals(s)) { if (!mCache.mPositionFailure.empty() && mCache.mPositionFailure.back().equals(s)) {
mCache.mPositionFailure.back().mUtcReported = s.mUtcReported;
} else {
mCache.mPositionFailure.push_back(s); mCache.mPositionFailure.push_back(s);
if (mCache.mPositionFailure.size() > maxPositionFailure) { if (mCache.mPositionFailure.size() > maxPositionFailure) {
mCache.mPositionFailure.erase(mCache.mPositionFailure.begin()); mCache.mPositionFailure.erase(mCache.mPositionFailure.begin());
@ -1322,8 +1293,7 @@ bool SystemStatus::setNmeaString(const char *data, uint32_t len)
} }
char buf[SystemStatusNmeaBase::NMEA_MAXSIZE + 1] = { 0 }; char buf[SystemStatusNmeaBase::NMEA_MAXSIZE + 1] = { 0 };
strncpy(buf, data, len); strlcpy(buf, data, sizeof(buf));
LOC_LOGI("setNmeaString-0321a: nmea=%s", buf);
pthread_mutex_lock(&mMutexSystemStatus); pthread_mutex_lock(&mMutexSystemStatus);
@ -1393,10 +1363,7 @@ bool SystemStatus::setNmeaString(const char *data, uint32_t len)
bool SystemStatus::eventPosition(const UlpLocation& location, bool SystemStatus::eventPosition(const UlpLocation& location,
const GpsLocationExtended& locationEx) const GpsLocationExtended& locationEx)
{ {
timespec ts; SystemStatusLocation s(location, locationEx);
ts.tv_sec = location.gpsLocation.timestamp / 1000ULL;
ts.tv_nsec = (location.gpsLocation.timestamp % 1000ULL) * 1000000ULL;
SystemStatusLocation s(location, locationEx, ts);
if ((mCache.mLocation.empty()) || !mCache.mLocation.back().equals(s)) { if ((mCache.mLocation.empty()) || !mCache.mLocation.back().equals(s)) {
mCache.mLocation.push_back(s); mCache.mLocation.push_back(s);
if (mCache.mLocation.size() > maxLocation) { if (mCache.mLocation.size() > maxLocation) {

View file

@ -49,8 +49,16 @@ namespace loc_core
class SystemStatusItemBase class SystemStatusItemBase
{ {
public: public:
timespec mUtcTime; timespec mUtcTime; // UTC timestamp when this info was last updated
SystemStatusItemBase(timespec utctime) : mUtcTime(utctime) { }; timespec mUtcReported; // UTC timestamp when this info was reported
SystemStatusItemBase() {
timeval tv;
gettimeofday(&tv, NULL);
mUtcTime.tv_sec = tv.tv_sec;
mUtcTime.tv_nsec = tv.tv_usec *1000ULL;
mUtcReported = mUtcTime;
};
virtual ~SystemStatusItemBase() { }; virtual ~SystemStatusItemBase() { };
virtual void dump(void) { }; virtual void dump(void) { };
}; };
@ -61,9 +69,7 @@ public:
UlpLocation mLocation; UlpLocation mLocation;
GpsLocationExtended mLocationEx; GpsLocationExtended mLocationEx;
SystemStatusLocation(const UlpLocation& location, SystemStatusLocation(const UlpLocation& location,
const GpsLocationExtended& locationEx, const GpsLocationExtended& locationEx) :
const timespec& ts) :
SystemStatusItemBase(ts),
mLocation(location), mLocation(location),
mLocationEx(locationEx){ }; mLocationEx(locationEx){ };
bool equals(SystemStatusLocation& peer); bool equals(SystemStatusLocation& peer);