#ifndef MISSION_DEVICES_GPSHYPERIONHANDLER_H_
#define MISSION_DEVICES_GPSHYPERIONHANDLER_H_

#include "fsfw/devicehandlers/DeviceHandlerBase.h"
#include "devicedefinitions/GPSDefinitions.h"
#include "lwgps/lwgps.h"

#ifndef FSFW_HAL_DEBUG_HYPERION_GPS
#define FSFW_HAL_DEBUG_HYPERION_GPS     0
#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
 */
class GPSHyperionHandler: public DeviceHandlerBase {
public:
	GPSHyperionHandler(object_id_t objectId, object_id_t deviceCommunication,
	        CookieIF* comCookie);
	virtual ~GPSHyperionHandler();

protected:
	enum class InternalStates {
	    NONE,
	    WAIT_FIRST_MESSAGE,
	    IDLE
	};
	InternalStates internalState = InternalStates::NONE;
	bool commandExecuted = false;

	/* DeviceHandlerBase overrides */
	ReturnValue_t buildTransitionDeviceCommand(
	        DeviceCommandId_t *id) override;
	void doStartUp() override;
	void doShutDown() override;
	ReturnValue_t buildNormalDeviceCommand(
	        DeviceCommandId_t *id) override;
	ReturnValue_t buildCommandFromCommand(
	        DeviceCommandId_t deviceCommand, const uint8_t *commandData,
			size_t commandDataLen) override;
	ReturnValue_t scanForReply(const uint8_t *start, size_t len,
			DeviceCommandId_t *foundId, size_t *foundLen) override;
	ReturnValue_t interpretDeviceReply(DeviceCommandId_t id,
	        const uint8_t *packet) override;

	void fillCommandAndReplyMap() override;
	void modeChanged() override;
	uint32_t getTransitionDelayMs(Mode_t from, Mode_t to) override;
	ReturnValue_t initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
			LocalDataPoolManager &poolManager) override;

private:
	lwgps_t gpsData = {};
	GpsPrimaryDataset gpsSet;
};

#endif /* MISSION_DEVICES_GPSHYPERIONHANDLER_H_ */