|
|
|
@ -1,4 +1,4 @@
|
|
|
|
|
#include "GPSHyperionLinuxController.h"
|
|
|
|
|
#include "GpsHyperionLinuxController.h"
|
|
|
|
|
|
|
|
|
|
#include <fsfw/timemanager/Stopwatch.h>
|
|
|
|
|
|
|
|
|
@ -16,26 +16,26 @@
|
|
|
|
|
#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)
|
|
|
|
|
: ExtendedControllerBase(objectId), gpsSet(this), debugHyperionGps(debugHyperionGps) {
|
|
|
|
|
timeUpdateCd.resetTimer();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
GPSHyperionLinuxController::~GPSHyperionLinuxController() {
|
|
|
|
|
GpsHyperionLinuxController::~GpsHyperionLinuxController() {
|
|
|
|
|
gps_stream(&gps, WATCH_DISABLE, nullptr);
|
|
|
|
|
gps_close(&gps);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GPSHyperionLinuxController::performControlOperation() {
|
|
|
|
|
void GpsHyperionLinuxController::performControlOperation() {
|
|
|
|
|
#ifdef FSFW_OSAL_LINUX
|
|
|
|
|
readGpsDataFromGpsd();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LocalPoolDataSetBase *GPSHyperionLinuxController::getDataSetHandle(sid_t sid) { return &gpsSet; }
|
|
|
|
|
LocalPoolDataSetBase *GpsHyperionLinuxController::getDataSetHandle(sid_t sid) { return &gpsSet; }
|
|
|
|
|
|
|
|
|
|
ReturnValue_t GPSHyperionLinuxController::checkModeCommand(Mode_t mode, Submode_t submode,
|
|
|
|
|
ReturnValue_t GpsHyperionLinuxController::checkModeCommand(Mode_t mode, Submode_t submode,
|
|
|
|
|
uint32_t *msToReachTheMode) {
|
|
|
|
|
if (not modeCommanded) {
|
|
|
|
|
if (mode == MODE_ON or mode == MODE_OFF) {
|
|
|
|
@ -54,7 +54,7 @@ ReturnValue_t GPSHyperionLinuxController::checkModeCommand(Mode_t mode, Submode_
|
|
|
|
|
return returnvalue::OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ReturnValue_t GPSHyperionLinuxController::executeAction(ActionId_t actionId,
|
|
|
|
|
ReturnValue_t GpsHyperionLinuxController::executeAction(ActionId_t actionId,
|
|
|
|
|
MessageQueueId_t commandedBy,
|
|
|
|
|
const uint8_t *data, size_t size) {
|
|
|
|
|
switch (actionId) {
|
|
|
|
@ -72,7 +72,7 @@ ReturnValue_t GPSHyperionLinuxController::executeAction(ActionId_t actionId,
|
|
|
|
|
return returnvalue::OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ReturnValue_t GPSHyperionLinuxController::initializeLocalDataPool(
|
|
|
|
|
ReturnValue_t GpsHyperionLinuxController::initializeLocalDataPool(
|
|
|
|
|
localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) {
|
|
|
|
|
localDataPoolMap.emplace(GpsHyperion::ALTITUDE, new PoolEntry<double>({0.0}));
|
|
|
|
|
localDataPoolMap.emplace(GpsHyperion::LONGITUDE, new PoolEntry<double>({0.0}));
|
|
|
|
@ -92,13 +92,13 @@ ReturnValue_t GPSHyperionLinuxController::initializeLocalDataPool(
|
|
|
|
|
return returnvalue::OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void GPSHyperionLinuxController::setResetPinTriggerFunction(gpioResetFunction_t resetCallback,
|
|
|
|
|
void GpsHyperionLinuxController::setResetPinTriggerFunction(gpioResetFunction_t resetCallback,
|
|
|
|
|
void *args) {
|
|
|
|
|
this->resetCallback = resetCallback;
|
|
|
|
|
resetCallbackArgs = args;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ReturnValue_t GPSHyperionLinuxController::initialize() {
|
|
|
|
|
ReturnValue_t GpsHyperionLinuxController::initialize() {
|
|
|
|
|
ReturnValue_t result = ExtendedControllerBase::initialize();
|
|
|
|
|
if (result != returnvalue::OK) {
|
|
|
|
|
return result;
|
|
|
|
@ -127,13 +127,13 @@ ReturnValue_t GPSHyperionLinuxController::initialize() {
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ReturnValue_t GPSHyperionLinuxController::handleCommandMessage(CommandMessage *message) {
|
|
|
|
|
ReturnValue_t GpsHyperionLinuxController::handleCommandMessage(CommandMessage *message) {
|
|
|
|
|
return ExtendedControllerBase::handleCommandMessage(message);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef FSFW_OSAL_LINUX
|
|
|
|
|
|
|
|
|
|
void GPSHyperionLinuxController::readGpsDataFromGpsd() {
|
|
|
|
|
void GpsHyperionLinuxController::readGpsDataFromGpsd() {
|
|
|
|
|
auto readError = [&](int error) {
|
|
|
|
|
if (gpsReadFailedSwitch) {
|
|
|
|
|
gpsReadFailedSwitch = false;
|
|
|
|
@ -146,27 +146,33 @@ void GPSHyperionLinuxController::readGpsDataFromGpsd() {
|
|
|
|
|
if (readMode == ReadModes::SOCKET) {
|
|
|
|
|
gps_stream(&gps, WATCH_ENABLE | WATCH_JSON, nullptr);
|
|
|
|
|
// Exit if no data is seen in 2 seconds (should not happen)
|
|
|
|
|
if (not gps_waiting(&gps, 2000000)) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
int result = gps_read(&gps);
|
|
|
|
|
if (result == -1) {
|
|
|
|
|
readError(result);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (MODE_SET != (MODE_SET & gps.set)) {
|
|
|
|
|
if (noModeSetCntr >= 0) {
|
|
|
|
|
noModeSetCntr++;
|
|
|
|
|
if (gps_waiting(&gps, 2000000)) {
|
|
|
|
|
int result = gps_read(&gps);
|
|
|
|
|
while (result > 0) {
|
|
|
|
|
result = gps_read(&gps);
|
|
|
|
|
}
|
|
|
|
|
if (noModeSetCntr == 10) {
|
|
|
|
|
// TODO: Trigger event here
|
|
|
|
|
sif::warning << "GPSHyperionHandler::readGpsDataFromGpsd: No mode could be "
|
|
|
|
|
"read for 10 consecutive reads"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
noModeSetCntr = -1;
|
|
|
|
|
if (result == -1) {
|
|
|
|
|
readError(result);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (MODE_SET != (MODE_SET & gps.set)) {
|
|
|
|
|
if (mode == MODE_ON) {
|
|
|
|
|
if (noModeSetCntr >= 0) {
|
|
|
|
|
noModeSetCntr++;
|
|
|
|
|
}
|
|
|
|
|
if (noModeSetCntr == 10) {
|
|
|
|
|
// TODO: Trigger event here
|
|
|
|
|
sif::warning << "GPSHyperionHandler::readGpsDataFromGpsd: No mode could be "
|
|
|
|
|
"read for 10 consecutive reads"
|
|
|
|
|
<< std::endl;
|
|
|
|
|
noModeSetCntr = -1;
|
|
|
|
|
}
|
|
|
|
|
// did not event get mode, nothing to see.
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
noModeSetCntr = 0;
|
|
|
|
|
}
|
|
|
|
|
noModeSetCntr = 0;
|
|
|
|
|
} else if (readMode == ReadModes::SHM) {
|
|
|
|
|
int result = gps_read(&gps);
|
|
|
|
|
if (result == -1) {
|
|
|
|
@ -174,10 +180,10 @@ void GPSHyperionLinuxController::readGpsDataFromGpsd() {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
handleGpsRead();
|
|
|
|
|
handleGpsReadData();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ReturnValue_t GPSHyperionLinuxController::handleGpsRead() {
|
|
|
|
|
ReturnValue_t GpsHyperionLinuxController::handleGpsReadData() {
|
|
|
|
|
PoolReadGuard pg(&gpsSet);
|
|
|
|
|
if (pg.getReadResult() != returnvalue::OK) {
|
|
|
|
|
#if FSFW_VERBOSE_LEVEL >= 1
|