Merge pull request 'GPS Update' (#201) from mueller/gps-update into develop
All checks were successful
EIVE/eive-obsw/pipeline/head This commit looks good
All checks were successful
EIVE/eive-obsw/pipeline/head This commit looks good
Reviewed-on: #201 Reviewed-by: Jakob.Meier <meierj@irs.uni-stuttgart.de>
This commit is contained in:
commit
68992e77dc
@ -4,18 +4,23 @@
|
|||||||
#include "fsfw/datapool/PoolReadGuard.h"
|
#include "fsfw/datapool/PoolReadGuard.h"
|
||||||
#include "fsfw/timemanager/Clock.h"
|
#include "fsfw/timemanager/Clock.h"
|
||||||
|
|
||||||
|
#include "mission/utility/compileTime.h"
|
||||||
|
|
||||||
#if FSFW_DEV_HYPERION_GPS_CREATE_NMEA_CSV == 1
|
#if FSFW_DEV_HYPERION_GPS_CREATE_NMEA_CSV == 1
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#endif
|
#endif
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
GPSHyperionLinuxController::GPSHyperionLinuxController(object_id_t objectId, object_id_t parentId,
|
GPSHyperionLinuxController::GPSHyperionLinuxController(object_id_t objectId, object_id_t parentId,
|
||||||
bool debugHyperionGps)
|
bool debugHyperionGps)
|
||||||
: ExtendedControllerBase(objectId, objects::NO_OBJECT),
|
: ExtendedControllerBase(objectId, objects::NO_OBJECT),
|
||||||
gpsSet(this),
|
gpsSet(this),
|
||||||
myGpsmm(GPSD_SHARED_MEMORY, nullptr),
|
myGpsmm(GPSD_SHARED_MEMORY, nullptr),
|
||||||
debugHyperionGps(debugHyperionGps) {}
|
debugHyperionGps(debugHyperionGps) {
|
||||||
|
timeUpdateCd.resetTimer();
|
||||||
|
}
|
||||||
|
|
||||||
GPSHyperionLinuxController::~GPSHyperionLinuxController() {}
|
GPSHyperionLinuxController::~GPSHyperionLinuxController() {}
|
||||||
|
|
||||||
@ -76,9 +81,11 @@ ReturnValue_t GPSHyperionLinuxController::initializeLocalDataPool(
|
|||||||
localDataPoolMap.emplace(GpsHyperion::SATS_IN_USE, new PoolEntry<uint8_t>());
|
localDataPoolMap.emplace(GpsHyperion::SATS_IN_USE, new PoolEntry<uint8_t>());
|
||||||
localDataPoolMap.emplace(GpsHyperion::SATS_IN_VIEW, new PoolEntry<uint8_t>());
|
localDataPoolMap.emplace(GpsHyperion::SATS_IN_VIEW, new PoolEntry<uint8_t>());
|
||||||
localDataPoolMap.emplace(GpsHyperion::FIX_MODE, new PoolEntry<uint8_t>());
|
localDataPoolMap.emplace(GpsHyperion::FIX_MODE, new PoolEntry<uint8_t>());
|
||||||
|
bool enableHk = false;
|
||||||
#if OBSW_ENABLE_PERIODIC_HK == 1
|
#if OBSW_ENABLE_PERIODIC_HK == 1
|
||||||
poolManager.subscribeForPeriodicPacket(gpsSet.getSid(), true, 2.0, false);
|
enableHk = true;
|
||||||
#endif
|
#endif
|
||||||
|
poolManager.subscribeForPeriodicPacket(gpsSet.getSid(), enableHk, 60.0, false);
|
||||||
return HasReturnvaluesIF::RETURN_OK;
|
return HasReturnvaluesIF::RETURN_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,6 +179,21 @@ void GPSHyperionLinuxController::readGpsDataFromGpsd() {
|
|||||||
timeval time = {};
|
timeval time = {};
|
||||||
time.tv_sec = gpsSet.unixSeconds.value;
|
time.tv_sec = gpsSet.unixSeconds.value;
|
||||||
time.tv_usec = gps->fix.time.tv_nsec / 1000;
|
time.tv_usec = gps->fix.time.tv_nsec / 1000;
|
||||||
|
std::time_t t = std::time(nullptr);
|
||||||
|
if (time.tv_sec == t) {
|
||||||
|
timeIsConstantCounter++;
|
||||||
|
} else {
|
||||||
|
timeIsConstantCounter = 0;
|
||||||
|
}
|
||||||
|
// If the received time does not change anymore for whatever reason, do not set it here
|
||||||
|
// to avoid stale times. Also, don't do it too often often to avoid jumping times
|
||||||
|
if (timeIsConstantCounter < 20 and timeUpdateCd.hasTimedOut()) {
|
||||||
|
// Update the system time here for now. NTP seems to be unable to do so for whatever reason.
|
||||||
|
// Further tests have shown that the time seems to be set by NTPD after sme time..
|
||||||
|
// Clock::setClock(&time);
|
||||||
|
timeUpdateCd.resetTimer();
|
||||||
|
}
|
||||||
|
|
||||||
Clock::TimeOfDay_t timeOfDay = {};
|
Clock::TimeOfDay_t timeOfDay = {};
|
||||||
Clock::convertTimevalToTimeOfDay(&time, &timeOfDay);
|
Clock::convertTimevalToTimeOfDay(&time, &timeOfDay);
|
||||||
gpsSet.year = timeOfDay.year;
|
gpsSet.year = timeOfDay.year;
|
||||||
@ -192,6 +214,9 @@ void GPSHyperionLinuxController::readGpsDataFromGpsd() {
|
|||||||
std::cout << "Longitude: " << gps->fix.longitude << std::endl;
|
std::cout << "Longitude: " << gps->fix.longitude << std::endl;
|
||||||
std::cout << "Altitude(MSL): " << gps->fix.altMSL << std::endl;
|
std::cout << "Altitude(MSL): " << gps->fix.altMSL << std::endl;
|
||||||
std::cout << "Speed(m/s): " << gps->fix.speed << std::endl;
|
std::cout << "Speed(m/s): " << gps->fix.speed << std::endl;
|
||||||
|
std::time_t t = std::time(nullptr);
|
||||||
|
std::tm tm = *std::gmtime(&t);
|
||||||
|
std::cout << "C Time: " << std::put_time(&tm, "%c") << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -51,6 +51,8 @@ class GPSHyperionLinuxController : public ExtendedControllerBase {
|
|||||||
bool modeCommanded = true;
|
bool modeCommanded = true;
|
||||||
gpsmm myGpsmm;
|
gpsmm myGpsmm;
|
||||||
bool debugHyperionGps = false;
|
bool debugHyperionGps = false;
|
||||||
|
uint32_t timeIsConstantCounter = 0;
|
||||||
|
Countdown timeUpdateCd = Countdown(60);
|
||||||
|
|
||||||
void readGpsDataFromGpsd();
|
void readGpsDataFromGpsd();
|
||||||
};
|
};
|
||||||
|
97
mission/utility/compileTime.h
Normal file
97
mission/utility/compileTime.h
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
*
|
||||||
|
* Created: 29.03.2018
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
*
|
||||||
|
* Assembled from the code released on Stackoverflow by:
|
||||||
|
* Dennis (instructable.com/member/nqtronix) | https://stackoverflow.com/questions/23032002/c-c-how-to-get-integer-unix-timestamp-of-build-time-not-string
|
||||||
|
* and
|
||||||
|
* Alexis Wilke | https://stackoverflow.com/questions/10538444/do-you-know-of-a-c-macro-to-compute-unix-time-and-date
|
||||||
|
*
|
||||||
|
* Assembled by Jean Rabault
|
||||||
|
*
|
||||||
|
* UNIX_TIMESTAMP gives the UNIX timestamp (unsigned long integer of seconds since 1st Jan 1970) of compilation from macros using the compiler defined __TIME__ macro.
|
||||||
|
* This should include Gregorian calendar leap days, in particular the 29ths of February, 100 and 400 years modulo leaps.
|
||||||
|
*
|
||||||
|
* Careful: __TIME__ is the local time of the computer, NOT the UTC time in general!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef COMPILE_TIME_H_
|
||||||
|
#define COMPILE_TIME_H_
|
||||||
|
|
||||||
|
// Some definitions for calculation
|
||||||
|
#define SEC_PER_MIN 60UL
|
||||||
|
#define SEC_PER_HOUR 3600UL
|
||||||
|
#define SEC_PER_DAY 86400UL
|
||||||
|
#define SEC_PER_YEAR (SEC_PER_DAY*365)
|
||||||
|
|
||||||
|
// extracts 1..4 characters from a string and interprets it as a decimal value
|
||||||
|
#define CONV_STR2DEC_1(str, i) (str[i]>'0'?str[i]-'0':0)
|
||||||
|
#define CONV_STR2DEC_2(str, i) (CONV_STR2DEC_1(str, i)*10 + str[i+1]-'0')
|
||||||
|
#define CONV_STR2DEC_3(str, i) (CONV_STR2DEC_2(str, i)*10 + str[i+2]-'0')
|
||||||
|
#define CONV_STR2DEC_4(str, i) (CONV_STR2DEC_3(str, i)*10 + str[i+3]-'0')
|
||||||
|
|
||||||
|
// Custom "glue logic" to convert the month name to a usable number
|
||||||
|
#define GET_MONTH(str, i) (str[i]=='J' && str[i+1]=='a' && str[i+2]=='n' ? 1 : \
|
||||||
|
str[i]=='F' && str[i+1]=='e' && str[i+2]=='b' ? 2 : \
|
||||||
|
str[i]=='M' && str[i+1]=='a' && str[i+2]=='r' ? 3 : \
|
||||||
|
str[i]=='A' && str[i+1]=='p' && str[i+2]=='r' ? 4 : \
|
||||||
|
str[i]=='M' && str[i+1]=='a' && str[i+2]=='y' ? 5 : \
|
||||||
|
str[i]=='J' && str[i+1]=='u' && str[i+2]=='n' ? 6 : \
|
||||||
|
str[i]=='J' && str[i+1]=='u' && str[i+2]=='l' ? 7 : \
|
||||||
|
str[i]=='A' && str[i+1]=='u' && str[i+2]=='g' ? 8 : \
|
||||||
|
str[i]=='S' && str[i+1]=='e' && str[i+2]=='p' ? 9 : \
|
||||||
|
str[i]=='O' && str[i+1]=='c' && str[i+2]=='t' ? 10 : \
|
||||||
|
str[i]=='N' && str[i+1]=='o' && str[i+2]=='v' ? 11 : \
|
||||||
|
str[i]=='D' && str[i+1]=='e' && str[i+2]=='c' ? 12 : 0)
|
||||||
|
|
||||||
|
// extract the information from the time string given by __TIME__ and __DATE__
|
||||||
|
#define __TIME_SECONDS__ CONV_STR2DEC_2(__TIME__, 6)
|
||||||
|
#define __TIME_MINUTES__ CONV_STR2DEC_2(__TIME__, 3)
|
||||||
|
#define __TIME_HOURS__ CONV_STR2DEC_2(__TIME__, 0)
|
||||||
|
#define __TIME_DAYS__ CONV_STR2DEC_2(__DATE__, 4)
|
||||||
|
#define __TIME_MONTH__ GET_MONTH(__DATE__, 0)
|
||||||
|
#define __TIME_YEARS__ CONV_STR2DEC_4(__DATE__, 7)
|
||||||
|
|
||||||
|
// Days in February
|
||||||
|
#define _UNIX_TIMESTAMP_FDAY(year) \
|
||||||
|
(((year) % 400) == 0UL ? 29UL : \
|
||||||
|
(((year) % 100) == 0UL ? 28UL : \
|
||||||
|
(((year) % 4) == 0UL ? 29UL : \
|
||||||
|
28UL)))
|
||||||
|
|
||||||
|
// Days in the year
|
||||||
|
#define _UNIX_TIMESTAMP_YDAY(year, month, day) \
|
||||||
|
( \
|
||||||
|
/* January */ day \
|
||||||
|
/* February */ + (month >= 2 ? 31UL : 0UL) \
|
||||||
|
/* March */ + (month >= 3 ? _UNIX_TIMESTAMP_FDAY(year) : 0UL) \
|
||||||
|
/* April */ + (month >= 4 ? 31UL : 0UL) \
|
||||||
|
/* May */ + (month >= 5 ? 30UL : 0UL) \
|
||||||
|
/* June */ + (month >= 6 ? 31UL : 0UL) \
|
||||||
|
/* July */ + (month >= 7 ? 30UL : 0UL) \
|
||||||
|
/* August */ + (month >= 8 ? 31UL : 0UL) \
|
||||||
|
/* September */+ (month >= 9 ? 31UL : 0UL) \
|
||||||
|
/* October */ + (month >= 10 ? 30UL : 0UL) \
|
||||||
|
/* November */ + (month >= 11 ? 31UL : 0UL) \
|
||||||
|
/* December */ + (month >= 12 ? 30UL : 0UL) \
|
||||||
|
)
|
||||||
|
|
||||||
|
// get the UNIX timestamp from a digits representation
|
||||||
|
#define _UNIX_TIMESTAMP(year, month, day, hour, minute, second) \
|
||||||
|
( /* time */ second \
|
||||||
|
+ minute * SEC_PER_MIN \
|
||||||
|
+ hour * SEC_PER_HOUR \
|
||||||
|
+ /* year day (month + day) */ (_UNIX_TIMESTAMP_YDAY(year, month, day) - 1) * SEC_PER_DAY \
|
||||||
|
+ /* year */ (year - 1970UL) * SEC_PER_YEAR \
|
||||||
|
+ ((year - 1969UL) / 4UL) * SEC_PER_DAY \
|
||||||
|
- ((year - 1901UL) / 100UL) * SEC_PER_DAY \
|
||||||
|
+ ((year - 1601UL) / 400UL) * SEC_PER_DAY \
|
||||||
|
)
|
||||||
|
|
||||||
|
// the UNIX timestamp
|
||||||
|
#define UNIX_TIMESTAMP (_UNIX_TIMESTAMP(__TIME_YEARS__, __TIME_MONTH__, __TIME_DAYS__, __TIME_HOURS__, __TIME_MINUTES__, __TIME_SECONDS__))
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user