Use SGP4 Propagator for GPS #770
@ -24,12 +24,15 @@ will consitute of a breaking change warranting a new major release:
|
|||||||
a TLE has been uploaded with the newly added action command for the ACS Controller. In
|
a TLE has been uploaded with the newly added action command for the ACS Controller. In
|
||||||
return the actual GPS data will be ignored once SPG4 is running. However, by setting the
|
return the actual GPS data will be ignored once SPG4 is running. However, by setting the
|
||||||
according parameter, the ACS Controller can be directed to ignore the SGP4 solution.
|
according parameter, the ACS Controller can be directed to ignore the SGP4 solution.
|
||||||
|
- Skyview dataset for more GPS TM has been added
|
||||||
|
|
||||||
## Fixed
|
## Fixed
|
||||||
|
|
||||||
- The handling function of the GPS data is only called once per GPS read. This should remove
|
- The handling function of the GPS data is only called once per GPS read. This should remove
|
||||||
the fake fix-has-changed events.
|
the fake fix-has-changed events.
|
||||||
|
|
||||||
## Changed
|
## Changed
|
||||||
|
|
||||||
- GPS Fix has changed event is no longer triggered for the EM
|
- GPS Fix has changed event is no longer triggered for the EM
|
||||||
|
|
||||||
# [v6.3.0] 2023-08-03
|
# [v6.3.0] 2023-08-03
|
||||||
|
@ -21,6 +21,7 @@ GpsHyperionLinuxController::GpsHyperionLinuxController(object_id_t objectId, obj
|
|||||||
bool enableHkSets, bool debugHyperionGps)
|
bool enableHkSets, bool debugHyperionGps)
|
||||||
: ExtendedControllerBase(objectId),
|
: ExtendedControllerBase(objectId),
|
||||||
gpsSet(this),
|
gpsSet(this),
|
||||||
|
skyviewSet(this),
|
||||||
enableHkSets(enableHkSets),
|
enableHkSets(enableHkSets),
|
||||||
debugHyperionGps(debugHyperionGps) {}
|
debugHyperionGps(debugHyperionGps) {}
|
||||||
|
|
||||||
@ -29,7 +30,17 @@ GpsHyperionLinuxController::~GpsHyperionLinuxController() {
|
|||||||
gps_close(&gps);
|
gps_close(&gps);
|
||||||
}
|
}
|
||||||
|
|
||||||
LocalPoolDataSetBase *GpsHyperionLinuxController::getDataSetHandle(sid_t sid) { return &gpsSet; }
|
LocalPoolDataSetBase *GpsHyperionLinuxController::getDataSetHandle(sid_t sid) {
|
||||||
|
switch (sid.ownerSetId) {
|
||||||
|
case GpsHyperion::CORE_DATASET:
|
||||||
|
return &gpsSet;
|
||||||
|
case GpsHyperion::SKYVIEW_DATASET:
|
||||||
|
return &skyviewSet;
|
||||||
|
default:
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
ReturnValue_t GpsHyperionLinuxController::checkModeCommand(Mode_t mode, Submode_t submode,
|
ReturnValue_t GpsHyperionLinuxController::checkModeCommand(Mode_t mode, Submode_t submode,
|
||||||
uint32_t *msToReachTheMode) {
|
uint32_t *msToReachTheMode) {
|
||||||
@ -90,6 +101,13 @@ ReturnValue_t GpsHyperionLinuxController::initializeLocalDataPool(
|
|||||||
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>());
|
||||||
poolManager.subscribeForRegularPeriodicPacket({gpsSet.getSid(), enableHkSets, 30.0});
|
poolManager.subscribeForRegularPeriodicPacket({gpsSet.getSid(), enableHkSets, 30.0});
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::SKYVIEW_UNIX_SECONDS, new PoolEntry<double>());
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::PRN_ID, new PoolEntry<int16_t>());
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::AZIMUTH, new PoolEntry<int16_t>());
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::ELEVATION, new PoolEntry<int16_t>());
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::SIGNAL2NOISE, new PoolEntry<double>());
|
||||||
|
localDataPoolMap.emplace(GpsHyperion::USED, new PoolEntry<uint8_t>());
|
||||||
|
poolManager.subscribeForRegularPeriodicPacket({skyviewSet.getSid(), false, 120.0});
|
||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -210,7 +228,15 @@ ReturnValue_t GpsHyperionLinuxController::handleGpsReadData() {
|
|||||||
return returnvalue::FAILED;
|
return returnvalue::FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ReturnValue_t result = handleCoreTelemetry(modeIsSet);
|
||||||
|
if (result != returnvalue::OK) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
result = handleSkyviewTelemetry();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnValue_t GpsHyperionLinuxController::handleCoreTelemetry(bool modeIsSet) {
|
||||||
PoolReadGuard pg(&gpsSet);
|
PoolReadGuard pg(&gpsSet);
|
||||||
if (pg.getReadResult() != returnvalue::OK) {
|
if (pg.getReadResult() != returnvalue::OK) {
|
||||||
#if FSFW_VERBOSE_LEVEL >= 1
|
#if FSFW_VERBOSE_LEVEL >= 1
|
||||||
@ -373,6 +399,22 @@ ReturnValue_t GpsHyperionLinuxController::handleGpsReadData() {
|
|||||||
return returnvalue::OK;
|
return returnvalue::OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReturnValue_t GpsHyperionLinuxController::handleSkyviewTelemetry() {
|
||||||
|
PoolReadGuard pg(&skyviewSet);
|
||||||
|
if (pg.getReadResult() != returnvalue::OK) {
|
||||||
|
return returnvalue::FAILED;
|
||||||
|
}
|
||||||
|
skyviewSet.unixSeconds.value = gps.skyview_time;
|
||||||
|
for (int sat = 0; sat < GpsHyperion::MAX_SATELLITES; sat++) {
|
||||||
|
skyviewSet.prn_id.value[sat] = gps.skyview[sat].PRN;
|
||||||
|
skyviewSet.azimuth.value[sat] = gps.skyview[sat].azimuth;
|
||||||
|
skyviewSet.elevation.value[sat] = gps.skyview[sat].elevation;
|
||||||
|
skyviewSet.signal2noise.value[sat] = gps.skyview[sat].ss;
|
||||||
|
skyviewSet.used.value[sat] = gps.skyview[sat].used;
|
||||||
|
}
|
||||||
|
return returnvalue::OK;
|
||||||
|
}
|
||||||
|
|
||||||
void GpsHyperionLinuxController::overwriteTimeIfNotSane(timeval time, bool validFix) {
|
void GpsHyperionLinuxController::overwriteTimeIfNotSane(timeval time, bool validFix) {
|
||||||
if (not timeInit and validFix) {
|
if (not timeInit and validFix) {
|
||||||
if (not utility::timeSanityCheck()) {
|
if (not utility::timeSanityCheck()) {
|
||||||
|
@ -54,9 +54,12 @@ class GpsHyperionLinuxController : public ExtendedControllerBase {
|
|||||||
LocalDataPoolManager& poolManager) override;
|
LocalDataPoolManager& poolManager) override;
|
||||||
|
|
||||||
ReturnValue_t handleGpsReadData();
|
ReturnValue_t handleGpsReadData();
|
||||||
|
ReturnValue_t handleCoreTelemetry(bool modeIsSet);
|
||||||
|
ReturnValue_t handleSkyviewTelemetry();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GpsPrimaryDataset gpsSet;
|
GpsPrimaryDataset gpsSet;
|
||||||
|
SkyviewDataset skyviewSet;
|
||||||
gps_data_t gps = {};
|
gps_data_t gps = {};
|
||||||
bool enableHkSets = false;
|
bool enableHkSets = false;
|
||||||
const char* currentClientBuf = nullptr;
|
const char* currentClientBuf = nullptr;
|
||||||
|
@ -20,32 +20,47 @@ static constexpr Event CANT_GET_FIX = event::makeEvent(SUBSYSTEM_ID, 1, severity
|
|||||||
static constexpr DeviceCommandId_t GPS_REPLY = 0;
|
static constexpr DeviceCommandId_t GPS_REPLY = 0;
|
||||||
static constexpr DeviceCommandId_t TRIGGER_RESET_PIN_GNSS = 5;
|
static constexpr DeviceCommandId_t TRIGGER_RESET_PIN_GNSS = 5;
|
||||||
|
|
||||||
static constexpr uint32_t DATASET_ID = 0;
|
enum SetIds : uint32_t {
|
||||||
|
CORE_DATASET,
|
||||||
|
SKYVIEW_DATASET,
|
||||||
|
};
|
||||||
|
|
||||||
enum GpsPoolIds : lp_id_t {
|
enum GpsPoolIds : lp_id_t {
|
||||||
LATITUDE = 0,
|
LATITUDE,
|
||||||
LONGITUDE = 1,
|
LONGITUDE,
|
||||||
ALTITUDE = 2,
|
ALTITUDE,
|
||||||
SPEED = 3,
|
SPEED,
|
||||||
FIX_MODE = 4,
|
FIX_MODE,
|
||||||
SATS_IN_USE = 5,
|
SATS_IN_USE,
|
||||||
SATS_IN_VIEW = 6,
|
SATS_IN_VIEW,
|
||||||
UNIX_SECONDS = 7,
|
UNIX_SECONDS,
|
||||||
YEAR = 8,
|
YEAR,
|
||||||
MONTH = 9,
|
MONTH,
|
||||||
DAY = 10,
|
DAY,
|
||||||
HOURS = 11,
|
HOURS,
|
||||||
MINUTES = 12,
|
MINUTES,
|
||||||
SECONDS = 13
|
SECONDS,
|
||||||
|
SKYVIEW_UNIX_SECONDS,
|
||||||
|
PRN_ID,
|
||||||
|
AZIMUTH,
|
||||||
|
ELEVATION,
|
||||||
|
SIGNAL2NOISE,
|
||||||
|
USED,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static constexpr uint8_t CORE_DATASET_ENTRIES = 14;
|
||||||
|
static constexpr uint8_t SKYVIEW_ENTRIES = 6;
|
||||||
|
|
||||||
|
static constexpr uint8_t MAX_SATELLITES = 30;
|
||||||
|
|
||||||
enum GpsFixModes : uint8_t { INVALID = 0, NO_FIX = 1, FIX_2D = 2, FIX_3D = 3 };
|
enum GpsFixModes : uint8_t { INVALID = 0, NO_FIX = 1, FIX_2D = 2, FIX_3D = 3 };
|
||||||
|
|
||||||
} // namespace GpsHyperion
|
} // namespace GpsHyperion
|
||||||
|
|
||||||
class GpsPrimaryDataset : public StaticLocalDataSet<18> {
|
class GpsPrimaryDataset : public StaticLocalDataSet<GpsHyperion::CORE_DATASET_ENTRIES> {
|
||||||
public:
|
public:
|
||||||
GpsPrimaryDataset(object_id_t gpsId) : StaticLocalDataSet(sid_t(gpsId, GpsHyperion::DATASET_ID)) {
|
GpsPrimaryDataset(object_id_t gpsId)
|
||||||
|
: StaticLocalDataSet(sid_t(gpsId, GpsHyperion::CORE_DATASET)) {
|
||||||
setAllVariablesReadOnly();
|
setAllVariablesReadOnly();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,7 +84,34 @@ class GpsPrimaryDataset : public StaticLocalDataSet<18> {
|
|||||||
friend class GpsHyperionLinuxController;
|
friend class GpsHyperionLinuxController;
|
||||||
friend class GpsCtrlDummy;
|
friend class GpsCtrlDummy;
|
||||||
GpsPrimaryDataset(HasLocalDataPoolIF* hkOwner)
|
GpsPrimaryDataset(HasLocalDataPoolIF* hkOwner)
|
||||||
: StaticLocalDataSet(hkOwner, GpsHyperion::DATASET_ID) {}
|
: StaticLocalDataSet(hkOwner, GpsHyperion::CORE_DATASET) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class SkyviewDataset : public StaticLocalDataSet<GpsHyperion::SKYVIEW_ENTRIES> {
|
||||||
|
public:
|
||||||
|
SkyviewDataset(object_id_t gpsId)
|
||||||
|
: StaticLocalDataSet(sid_t(gpsId, GpsHyperion::SKYVIEW_DATASET)) {
|
||||||
|
setAllVariablesReadOnly();
|
||||||
|
}
|
||||||
|
|
||||||
|
lp_var_t<double> unixSeconds =
|
||||||
|
lp_var_t<double>(sid.objectId, GpsHyperion::SKYVIEW_UNIX_SECONDS, this);
|
||||||
|
lp_vec_t<int16_t, GpsHyperion::MAX_SATELLITES> prn_id =
|
||||||
|
lp_vec_t<int16_t, GpsHyperion::MAX_SATELLITES>(sid.objectId, GpsHyperion::PRN_ID, this);
|
||||||
|
lp_vec_t<int16_t, GpsHyperion::MAX_SATELLITES> azimuth =
|
||||||
|
lp_vec_t<int16_t, GpsHyperion::MAX_SATELLITES>(sid.objectId, GpsHyperion::AZIMUTH, this);
|
||||||
|
lp_vec_t<int16_t, GpsHyperion::MAX_SATELLITES> elevation =
|
||||||
|
lp_vec_t<int16_t, GpsHyperion::MAX_SATELLITES>(sid.objectId, GpsHyperion::ELEVATION, this);
|
||||||
|
lp_vec_t<double, GpsHyperion::MAX_SATELLITES> signal2noise =
|
||||||
|
lp_vec_t<double, GpsHyperion::MAX_SATELLITES>(sid.objectId, GpsHyperion::SIGNAL2NOISE, this);
|
||||||
|
lp_vec_t<uint8_t, GpsHyperion::MAX_SATELLITES> used =
|
||||||
|
lp_vec_t<uint8_t, GpsHyperion::MAX_SATELLITES>(sid.objectId, GpsHyperion::USED, this);
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend class GpsHyperionLinuxController;
|
||||||
|
friend class GpsCtrlDummy;
|
||||||
|
SkyviewDataset(HasLocalDataPoolIF* hkOwner)
|
||||||
|
: StaticLocalDataSet(hkOwner, GpsHyperion::SKYVIEW_DATASET) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* MISSION_ACS_ARCHIVE_GPSDEFINITIONS_H_ */
|
#endif /* MISSION_ACS_ARCHIVE_GPSDEFINITIONS_H_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user