eive-obsw/mission/devices/GPSHyperionHandler.cpp

119 lines
4.0 KiB
C++
Raw Normal View History

2021-06-24 11:42:40 +02:00
#include "GPSHyperionHandler.h"
2021-06-15 17:07:47 +02:00
#include "devicedefinitions/GPSDefinitions.h"
2020-12-22 00:32:11 +01:00
2021-06-24 11:42:40 +02:00
#include "fsfw/datapool/PoolReadGuard.h"
2021-06-16 17:19:14 +02:00
#include "lwgps/lwgps.h"
2021-06-24 11:42:40 +02:00
GPSHyperionHandler::GPSHyperionHandler(object_id_t objectId, object_id_t deviceCommunication,
2020-12-22 00:32:11 +01:00
CookieIF *comCookie):
2021-06-24 11:42:40 +02:00
DeviceHandlerBase(objectId, deviceCommunication, comCookie), gpsSet(this) {
2021-06-16 17:19:14 +02:00
lwgps_init(&gpsData);
2020-12-22 00:32:11 +01:00
}
2021-06-24 11:42:40 +02:00
GPSHyperionHandler::~GPSHyperionHandler() {}
2020-12-22 00:32:11 +01:00
2021-06-24 11:42:40 +02:00
void GPSHyperionHandler::doStartUp() {
2021-06-15 16:44:31 +02:00
if(internalState == InternalStates::NONE) {
commandExecuted = false;
internalState = InternalStates::WAIT_FIRST_MESSAGE;
}
2020-12-22 00:32:11 +01:00
2021-06-15 16:44:31 +02:00
if(internalState == InternalStates::WAIT_FIRST_MESSAGE) {
if(commandExecuted) {
internalState = InternalStates::IDLE;
setMode(MODE_ON);
commandExecuted = false;
}
}
2020-12-22 00:32:11 +01:00
}
2021-06-24 11:42:40 +02:00
void GPSHyperionHandler::doShutDown() {
2021-06-15 16:44:31 +02:00
internalState = InternalStates::NONE;
commandExecuted = false;
setMode(MODE_OFF);
2020-12-22 00:32:11 +01:00
}
2021-06-24 11:42:40 +02:00
ReturnValue_t GPSHyperionHandler::buildTransitionDeviceCommand(DeviceCommandId_t *id) {
2020-12-22 00:32:11 +01:00
return HasReturnvaluesIF::RETURN_OK;
}
2021-06-24 11:42:40 +02:00
ReturnValue_t GPSHyperionHandler::buildNormalDeviceCommand(DeviceCommandId_t *id) {
2020-12-22 00:32:11 +01:00
return HasReturnvaluesIF::RETURN_OK;
}
2021-06-24 11:42:40 +02:00
ReturnValue_t GPSHyperionHandler::buildCommandFromCommand(
2020-12-22 00:32:11 +01:00
DeviceCommandId_t deviceCommand, const uint8_t *commandData,
size_t commandDataLen) {
return HasReturnvaluesIF::RETURN_OK;
}
2021-06-24 11:42:40 +02:00
ReturnValue_t GPSHyperionHandler::scanForReply(const uint8_t *start, size_t len,
2020-12-22 00:32:11 +01:00
DeviceCommandId_t *foundId, size_t *foundLen) {
2021-06-16 17:19:14 +02:00
// Pass data to GPS library
2021-06-23 15:18:31 +02:00
if(len > 0) {
sif::info << "GPSHandler::scanForReply: Received " << len << " bytes" << std::endl;
if (internalState == InternalStates::WAIT_FIRST_MESSAGE) {
// TODO: Check whether data is valid by chcking whether NMEA start string is valid
commandExecuted = true;
}
2021-06-23 15:18:31 +02:00
int result = lwgps_process(&gpsData, start, len);
if(result != 1) {
2021-06-23 15:18:31 +02:00
sif::warning << "GPSHandler::scanForReply: Issue processing GPS data with lwgps"
<< std::endl;
}
else {
2021-06-24 11:42:40 +02:00
// The data from the device will generally be read all at once. Therefore, we
// can set all field here
PoolReadGuard pg(&gpsSet);
if(pg.getReadResult() != HasReturnvaluesIF::RETURN_OK) {
#if FSFW_VERBOSE_LEVEL >= 1
sif::warning << "GPSHyperionHandler::scanForReply: Reading dataset failed"
<< std::endl;
#endif
}
// Print messages
2021-06-24 11:42:40 +02:00
if(gpsData.is_valid) {
// Set all entries valid now, set invalid on case basis if values are sanitized
gpsSet.setValidity(true, true);
}
gpsSet.latitude.value = gpsData.latitude;
gpsSet.longitude.value = gpsData.latitude;
gpsSet.fixMode.value = gpsData.fix_mode;
#if FSFW_HAL_DEBUG_HYPERION_GPS == 1
sif::info << "GPS Data" << std::endl;
printf("Valid status: %d\n", gpsData.is_valid);
printf("Latitude: %f degrees\n", gpsData.latitude);
printf("Longitude: %f degrees\n", gpsData.longitude);
printf("Altitude: %f meters\n", gpsData.altitude);
2021-06-24 11:42:40 +02:00
#endif
}
*foundLen = len;
2021-06-16 17:19:14 +02:00
}
2020-12-22 00:32:11 +01:00
return HasReturnvaluesIF::RETURN_OK;
2021-06-16 17:19:14 +02:00
2020-12-22 00:32:11 +01:00
}
2021-06-24 11:42:40 +02:00
ReturnValue_t GPSHyperionHandler::interpretDeviceReply(DeviceCommandId_t id,
2020-12-22 00:32:11 +01:00
const uint8_t *packet) {
return HasReturnvaluesIF::RETURN_OK;
}
2021-06-24 11:42:40 +02:00
uint32_t GPSHyperionHandler::getTransitionDelayMs(Mode_t from, Mode_t to) {
2020-12-22 00:32:11 +01:00
return 5000;
}
2021-06-24 11:42:40 +02:00
ReturnValue_t GPSHyperionHandler::initializeLocalDataPool(
2021-01-14 11:37:32 +01:00
localpool::DataPool &localDataPoolMap, LocalDataPoolManager &poolManager) {
2020-12-22 00:32:11 +01:00
return HasReturnvaluesIF::RETURN_OK;
}
2021-06-24 11:42:40 +02:00
void GPSHyperionHandler::fillCommandAndReplyMap() {
2021-06-15 17:07:47 +02:00
// Reply length does not matter, packets should always arrive periodically
insertInReplyMap(GpsHyperion::GPS_REPLY, 4, nullptr, 0, true);
2020-12-22 00:32:11 +01:00
}
2021-06-24 11:42:40 +02:00
void GPSHyperionHandler::modeChanged() {
2021-06-15 17:07:47 +02:00
internalState = InternalStates::NONE;
2020-12-22 00:32:11 +01:00
}