eive-obsw/linux/devices/GPSHyperionLinuxController.h

75 lines
2.6 KiB
C
Raw Normal View History

2022-01-26 17:59:31 +01:00
#ifndef MISSION_DEVICES_GPSHYPERIONHANDLER_H_
#define MISSION_DEVICES_GPSHYPERIONHANDLER_H_
2022-04-07 17:23:50 +02:00
#include "commonSubsystemIds.h"
2022-07-27 22:02:37 +02:00
#include "devicedefinitions/GPSHyperionLinuxDefinitions.h"
#include "fsfw/FSFW.h"
2022-01-26 17:59:31 +01:00
#include "fsfw/controller/ExtendedControllerBase.h"
#include "fsfw/devicehandlers/DeviceHandlerBase.h"
2022-07-27 22:02:37 +02:00
2022-01-26 17:59:31 +01:00
#ifdef FSFW_OSAL_LINUX
#include <gps.h>
#include <libgpsmm.h>
#endif
/**
* @brief Device handler for the Hyperion HT-GPS200 device
* @details
* Flight manual:
* https://egit.irs.uni-stuttgart.de/redmine/projects/eive-flight-manual/wiki/Hyperion_HT-GPS200
* This device handler can only be used on Linux system where the gpsd daemon with shared memory
* export is running.
*/
class GPSHyperionLinuxController : public ExtendedControllerBase {
public:
static constexpr uint32_t MAX_SECONDS_TO_REACH_FIX = 60 * 60 * 5;
2022-04-07 17:23:50 +02:00
2022-05-03 00:55:01 +02:00
enum ReadModes { SHM = 0, SOCKET = 1 };
2022-01-26 17:59:31 +01:00
GPSHyperionLinuxController(object_id_t objectId, object_id_t parentId,
bool debugHyperionGps = false);
virtual ~GPSHyperionLinuxController();
2022-07-27 22:02:37 +02:00
using gpioResetFunction_t = ReturnValue_t (*)(uint8_t gpsId, void* args);
2022-01-26 17:59:31 +01:00
void setResetPinTriggerFunction(gpioResetFunction_t resetCallback, void* args);
ReturnValue_t handleCommandMessage(CommandMessage* message) override;
void performControlOperation() override;
LocalPoolDataSetBase* getDataSetHandle(sid_t sid) override;
ReturnValue_t checkModeCommand(Mode_t mode, Submode_t submode,
uint32_t* msToReachTheMode) override;
2022-07-27 22:02:37 +02:00
ReturnValue_t executeAction(Action* action) override;
ReturnValue_t handleAction(GPSHyperionLinuxAction * action);
2022-01-26 17:59:31 +01:00
ReturnValue_t initialize() override;
protected:
gpioResetFunction_t resetCallback = nullptr;
void* resetCallbackArgs = nullptr;
ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
LocalDataPoolManager& poolManager) override;
2022-05-03 11:33:07 +02:00
ReturnValue_t handleGpsRead();
2022-05-03 00:55:01 +02:00
2022-01-26 17:59:31 +01:00
private:
GpsPrimaryDataset gpsSet;
2022-05-03 11:33:07 +02:00
gps_data_t gps = {};
const char* currentClientBuf = nullptr;
ReadModes readMode = ReadModes::SOCKET;
2022-03-03 10:12:59 +01:00
Countdown maxTimeToReachFix = Countdown(MAX_SECONDS_TO_REACH_FIX * 1000);
bool modeCommanded = true;
bool timeInit = true;
2022-04-17 11:48:06 +02:00
bool gpsNotOpenSwitch = true;
bool gpsReadFailedSwitch = true;
2022-01-26 17:59:31 +01:00
bool debugHyperionGps = false;
2022-04-28 10:50:39 +02:00
int32_t noModeSetCntr = 0;
2022-04-07 10:02:56 +02:00
uint32_t timeIsConstantCounter = 0;
Countdown timeUpdateCd = Countdown(60);
2022-07-27 22:02:37 +02:00
GPSHyperionLinuxAction action = GPSHyperionLinuxAction(this);
2022-01-26 17:59:31 +01:00
void readGpsDataFromGpsd();
};
#endif /* MISSION_DEVICES_GPSHYPERIONHANDLER_H_ */