2021-07-07 12:12:01 +02:00
|
|
|
#ifndef MISSION_DEVICES_STARTRACKERHANDLER_H_
|
|
|
|
#define MISSION_DEVICES_STARTRACKERHANDLER_H_
|
|
|
|
|
2021-12-07 16:30:17 +01:00
|
|
|
#include "fsfw/devicehandlers/DeviceHandlerBase.h"
|
|
|
|
#include "fsfw/src/fsfw/serialize/SerializeAdapter.h"
|
2021-12-14 19:24:31 +01:00
|
|
|
#include "fsfw/timemanager/Countdown.h"
|
2021-12-07 16:30:17 +01:00
|
|
|
#include "thirdparty/arcsec_star_tracker/common/SLIP.h"
|
2021-11-27 19:40:52 +01:00
|
|
|
#include <fsfw/datapool/PoolReadGuard.h>
|
2021-12-07 16:30:17 +01:00
|
|
|
#include "StrImageLoader.h"
|
|
|
|
#include "ArcsecDataLinkLayer.h"
|
|
|
|
#include "StarTrackerDefinitions.h"
|
|
|
|
#include "ArcsecJsonParamBase.h"
|
2021-07-07 12:12:01 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief This is the device handler for the star tracker from arcsec.
|
|
|
|
*
|
|
|
|
* @details Datasheet: https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files/?dir=/EIVE_IRS/
|
|
|
|
* Arbeitsdaten/08_Used%20Components/ArcSec_KULeuven_Startracker/
|
|
|
|
* Sagitta%201.0%20Datapack&fileid=659181
|
|
|
|
* @author J. Meier
|
|
|
|
*/
|
|
|
|
class StarTrackerHandler: public DeviceHandlerBase {
|
|
|
|
public:
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Constructor
|
|
|
|
*
|
|
|
|
* @param objectId
|
|
|
|
* @param comIF
|
|
|
|
* @param comCookie
|
|
|
|
* @param gpioComIF Pointer to gpio communication interface
|
|
|
|
* @param enablePin GPIO connected to the enable pin of the reaction wheels. Must be pulled
|
|
|
|
* to high to enable the device.
|
|
|
|
*/
|
2021-11-30 16:01:02 +01:00
|
|
|
StarTrackerHandler(object_id_t objectId, object_id_t comIF, CookieIF * comCookie,
|
|
|
|
StrImageLoader* strImageLoader);
|
2021-07-07 12:12:01 +02:00
|
|
|
virtual ~StarTrackerHandler();
|
|
|
|
|
2021-11-30 16:01:02 +01:00
|
|
|
ReturnValue_t initialize() override;
|
|
|
|
|
2021-12-02 08:05:33 +01:00
|
|
|
/**
|
|
|
|
* @brief Overwrite this function from DHB to handle commands executed by the str image
|
|
|
|
* loader task.
|
|
|
|
*/
|
|
|
|
ReturnValue_t executeAction(ActionId_t actionId, MessageQueueId_t commandedBy,
|
|
|
|
const uint8_t* data, size_t size) override;
|
|
|
|
|
|
|
|
void performOperationHook() override;
|
|
|
|
|
2021-07-07 12:12:01 +02:00
|
|
|
protected:
|
|
|
|
void doStartUp() override;
|
|
|
|
void doShutDown() override;
|
2021-12-14 19:24:31 +01:00
|
|
|
void doOffActivity() override;
|
2021-07-07 12:12:01 +02:00
|
|
|
ReturnValue_t buildNormalDeviceCommand(DeviceCommandId_t * id) override;
|
|
|
|
ReturnValue_t buildTransitionDeviceCommand(DeviceCommandId_t * id) override;
|
|
|
|
void fillCommandAndReplyMap() override;
|
|
|
|
ReturnValue_t buildCommandFromCommand(DeviceCommandId_t deviceCommand,
|
|
|
|
const uint8_t * commandData,size_t commandDataLen) override;
|
|
|
|
ReturnValue_t scanForReply(const uint8_t *start, size_t remainingSize,
|
|
|
|
DeviceCommandId_t *foundId, size_t *foundLen) override;
|
|
|
|
ReturnValue_t interpretDeviceReply(DeviceCommandId_t id,
|
|
|
|
const uint8_t *packet) override;
|
|
|
|
void setNormalDatapoolEntriesInvalid() override;
|
|
|
|
uint32_t getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) override;
|
|
|
|
ReturnValue_t initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
|
|
|
LocalDataPoolManager& poolManager) override;
|
|
|
|
/**
|
|
|
|
* @brief Overwritten here to always read all available data from the UartComIF.
|
|
|
|
*/
|
|
|
|
virtual size_t getNextReplyLength(DeviceCommandId_t deviceCommand) override;
|
2021-12-06 19:36:21 +01:00
|
|
|
virtual ReturnValue_t doSendReadHook() override;
|
|
|
|
|
2021-07-07 12:12:01 +02:00
|
|
|
private:
|
|
|
|
|
|
|
|
static const uint8_t INTERFACE_ID = CLASS_ID::STR_HANDLER;
|
|
|
|
|
|
|
|
//! [EXPORT] : [COMMENT] Received reply is too short
|
|
|
|
static const ReturnValue_t REPLY_TOO_SHORT = MAKE_RETURN_CODE(0xB0);
|
|
|
|
//! [EXPORT] : [COMMENT] Received reply with invalid CRC
|
2021-12-02 08:05:33 +01:00
|
|
|
static const ReturnValue_t CRC_FAILURE = MAKE_RETURN_CODE(0xB1);
|
|
|
|
//! [EXPORT] : [COMMENT] Image loader executing
|
|
|
|
static const ReturnValue_t IMAGE_LOADER_EXECUTING = MAKE_RETURN_CODE(0xB2);
|
2021-07-07 12:12:01 +02:00
|
|
|
|
|
|
|
static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::STR_HANDLER;
|
|
|
|
|
2021-11-27 19:40:52 +01:00
|
|
|
//! [EXPORT] : [COMMENT] Status in temperature reply signals error
|
|
|
|
static const ReturnValue_t TEMPERATURE_REQ_FAILED = MAKE_RETURN_CODE(0xA0);
|
2021-11-26 13:16:05 +01:00
|
|
|
//! [EXPORT] : [COMMENT] Ping command failed
|
|
|
|
static const ReturnValue_t PING_FAILED = MAKE_RETURN_CODE(0xA1);
|
2021-11-27 19:40:52 +01:00
|
|
|
//! [EXPORT] : [COMMENT] Status in version reply signals error
|
|
|
|
static const ReturnValue_t VERSION_REQ_FAILED = MAKE_RETURN_CODE(0xA3);
|
|
|
|
//! [EXPORT] : [COMMENT] Status in interface reply signals error
|
|
|
|
static const ReturnValue_t INTERFACE_REQ_FAILED = MAKE_RETURN_CODE(0xA4);
|
|
|
|
//! [EXPORT] : [COMMENT] Status in power reply signals error
|
|
|
|
static const ReturnValue_t POWER_REQ_FAILED = MAKE_RETURN_CODE(0xA5);
|
|
|
|
//! [EXPORT] : [COMMENT] Status of reply to parameter set command signals error
|
|
|
|
static const ReturnValue_t SET_PARAM_FAILED = MAKE_RETURN_CODE(0xA6);
|
|
|
|
//! [EXPORT] : [COMMENT] Status of reply to action command signals error
|
|
|
|
static const ReturnValue_t ACTION_FAILED = MAKE_RETURN_CODE(0xA7);
|
2021-11-29 11:04:56 +01:00
|
|
|
//! [EXPORT] : [COMMENT] Received upload image command with invalid length
|
|
|
|
static const ReturnValue_t UPLOAD_TOO_SHORT = MAKE_RETURN_CODE(0xA8);
|
|
|
|
//! [EXPORT] : [COMMENT] Received upload image command with invalid position field
|
|
|
|
static const ReturnValue_t UPLOAD_INVALID_POSITION = MAKE_RETURN_CODE(0xA8);
|
|
|
|
//! [EXPORT] : [COMMENT] Position value in upload image reply not matching sent position
|
|
|
|
static const ReturnValue_t UPLOAD_IMAGE_FAILED = MAKE_RETURN_CODE(0xA9);
|
|
|
|
//! [EXPORT] : [COMMENT] Received upload image command with invalid length
|
2021-12-06 19:36:21 +01:00
|
|
|
static const ReturnValue_t INVALID_UPLOAD_COMMAND = MAKE_RETURN_CODE(0xAA);
|
|
|
|
//! [EXPORT] : [COMMENT] Received invalid path string. Exceeds allowed length
|
|
|
|
static const ReturnValue_t FILE_PATH_TOO_LONG = MAKE_RETURN_CODE(0xAB);
|
2021-12-11 11:56:47 +01:00
|
|
|
//! [EXPORT] : [COMMENT] Name of file received with command is too long
|
|
|
|
static const ReturnValue_t FILENAME_TOO_LONG = MAKE_RETURN_CODE(0xAC);
|
2021-12-14 19:24:31 +01:00
|
|
|
//! [EXPORT] : [COMMENT] Received version reply with invalid program ID
|
|
|
|
static const ReturnValue_t INVALID_PROGRAM = MAKE_RETURN_CODE(0xAD);
|
2021-12-06 19:36:21 +01:00
|
|
|
|
|
|
|
static const size_t MAX_PATH_SIZE = 50;
|
2021-12-11 11:56:47 +01:00
|
|
|
static const size_t MAX_FILE_NAME = 30;
|
2021-11-29 11:04:56 +01:00
|
|
|
|
|
|
|
// position (uint32) + 1024 image data
|
|
|
|
static const size_t UPLOAD_COMMAND_LEN = 1028;
|
|
|
|
// Max valid position value in upload image command
|
2021-11-29 15:02:14 +01:00
|
|
|
static const uint16_t MAX_POSITION= 4095;
|
2021-12-02 08:05:33 +01:00
|
|
|
static const uint8_t STATUS_OFFSET = 1;
|
|
|
|
static const uint8_t TICKS_OFFSET = 2;
|
|
|
|
static const uint8_t TIME_OFFSET = 6;
|
|
|
|
static const uint8_t TM_DATA_FIELD_OFFSET = 14;
|
|
|
|
static const uint8_t PARAMETER_ID_OFFSET = 0;
|
|
|
|
static const uint8_t ACTION_ID_OFFSET = 0;
|
|
|
|
static const uint8_t ACTION_DATA_OFFSET = 2;
|
2021-11-26 09:14:41 +01:00
|
|
|
// Ping request will reply ping with this ID (data field)
|
|
|
|
static const uint32_t PING_ID = 0x55;
|
2021-11-27 19:40:52 +01:00
|
|
|
static const uint32_t BOOT_REGION_ID = 1;
|
2021-12-14 19:24:31 +01:00
|
|
|
static const MutexIF::TimeoutType TIMEOUT_TYPE = MutexIF::TimeoutType::WAITING;
|
2021-11-28 09:57:14 +01:00
|
|
|
static const uint32_t MUTEX_TIMEOUT = 20;
|
2021-12-14 19:24:31 +01:00
|
|
|
static const uint32_t BOOT_TIMEOUT = 1000;
|
2021-11-28 09:57:14 +01:00
|
|
|
|
2021-12-02 08:05:33 +01:00
|
|
|
MessageQueueIF* eventQueue = nullptr;
|
|
|
|
|
|
|
|
ArcsecDatalinkLayer dataLinkLayer;
|
|
|
|
|
2021-07-07 12:12:01 +02:00
|
|
|
StarTracker::TemperatureSet temperatureSet;
|
2021-11-26 15:24:52 +01:00
|
|
|
StarTracker::VersionSet versionSet;
|
2021-11-27 19:40:52 +01:00
|
|
|
StarTracker::PowerSet powerSet;
|
|
|
|
StarTracker::InterfaceSet interfaceSet;
|
|
|
|
StarTracker::TimeSet timeSet;
|
|
|
|
StarTracker::SolutionSet solutionSet;
|
2021-07-07 12:12:01 +02:00
|
|
|
|
2021-12-06 19:36:21 +01:00
|
|
|
// Pointer to object responsible for uploading and downloading images to/from the star tracker
|
|
|
|
StrImageLoader* strImageLoader = nullptr;
|
|
|
|
|
2021-07-08 11:20:19 +02:00
|
|
|
uint8_t commandBuffer[StarTracker::MAX_FRAME_SIZE];
|
2021-07-07 12:12:01 +02:00
|
|
|
|
2021-12-14 19:24:31 +01:00
|
|
|
// Countdown to insert delay for star tracker to switch from bootloader to firmware program
|
|
|
|
Countdown bootCountdown;
|
|
|
|
|
|
|
|
std::string paramJsonFile = "/mnt/sd0/startracker/full.json";
|
|
|
|
|
2021-07-07 12:12:01 +02:00
|
|
|
enum class InternalState {
|
|
|
|
TEMPERATURE_REQUEST
|
|
|
|
};
|
|
|
|
|
|
|
|
InternalState internalState = InternalState::TEMPERATURE_REQUEST;
|
|
|
|
|
2021-12-14 19:24:31 +01:00
|
|
|
enum class StartupState {
|
|
|
|
IDLE,
|
|
|
|
CHECK_BOOT_STATE,
|
|
|
|
BOOT,
|
|
|
|
BOOT_DELAY,
|
|
|
|
LIMITS,
|
|
|
|
TRACKING,
|
|
|
|
MOUNTING,
|
|
|
|
CAMERA,
|
|
|
|
BLOB,
|
|
|
|
CENTROIDING,
|
|
|
|
LISA,
|
|
|
|
MATCHING,
|
|
|
|
VALIDATION,
|
|
|
|
ALGO,
|
|
|
|
WAIT_FOR_EXECUTION,
|
|
|
|
DONE
|
|
|
|
};
|
|
|
|
|
|
|
|
StartupState startupState = StartupState::IDLE;
|
|
|
|
|
2021-12-02 08:05:33 +01:00
|
|
|
bool imageLoaderExecuting = false;
|
2021-11-29 11:04:56 +01:00
|
|
|
|
2021-12-14 19:24:31 +01:00
|
|
|
/**
|
|
|
|
* @brief Handles internal state
|
|
|
|
*/
|
|
|
|
void handleInternalState();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Checks mode for commands requiring MODE_ON of MODE_NORMAL for execution.
|
|
|
|
*
|
|
|
|
* @param actionId Action id of command to execute
|
|
|
|
*/
|
|
|
|
ReturnValue_t checkMode(ActionId_t actionId);
|
|
|
|
|
2021-07-07 12:12:01 +02:00
|
|
|
/**
|
|
|
|
* @brief This function initializes the serial link ip protocol struct slipInfo.
|
|
|
|
*/
|
|
|
|
void slipInit();
|
|
|
|
|
2021-11-27 19:40:52 +01:00
|
|
|
ReturnValue_t scanForActionReply(DeviceCommandId_t *foundId);
|
2021-12-07 16:30:17 +01:00
|
|
|
ReturnValue_t scanForParameterReply(DeviceCommandId_t *foundId);
|
2021-11-27 19:40:52 +01:00
|
|
|
ReturnValue_t scanForTmReply(DeviceCommandId_t *foundId);
|
|
|
|
|
2021-11-26 09:14:41 +01:00
|
|
|
/**
|
|
|
|
* @brief Fills command buffer with data to ping the star tracker
|
|
|
|
*/
|
|
|
|
void preparePingRequest();
|
2021-11-26 13:16:05 +01:00
|
|
|
|
2021-11-27 19:40:52 +01:00
|
|
|
/**
|
|
|
|
* @brief Fills command buffer with data to request the time telemetry.
|
|
|
|
*/
|
|
|
|
void prepareTimeRequest();
|
|
|
|
|
2021-12-06 19:36:21 +01:00
|
|
|
/**
|
|
|
|
* @brief Handles all received event messages
|
|
|
|
*/
|
|
|
|
void handleEvent(EventMessage* eventMessage);
|
|
|
|
|
2021-11-27 19:40:52 +01:00
|
|
|
/**
|
|
|
|
* @brief Fills command buffer with data to boot image (works only when star tracker is
|
|
|
|
* in bootloader mode).
|
|
|
|
*/
|
|
|
|
void prepareBootCommand();
|
|
|
|
|
2021-12-09 15:02:58 +01:00
|
|
|
/**
|
|
|
|
* @brief Fills the command buffer with the command to take an image.
|
|
|
|
*/
|
2021-12-10 10:07:23 +01:00
|
|
|
void prepareTakeImageCommand(const uint8_t* commandData);
|
2021-12-09 15:02:58 +01:00
|
|
|
|
2021-11-26 15:24:52 +01:00
|
|
|
/**
|
|
|
|
* @brief Fills command buffer with data to request the version telemetry packet
|
|
|
|
*/
|
|
|
|
void prepareVersionRequest();
|
|
|
|
|
2021-11-27 19:40:52 +01:00
|
|
|
/**
|
|
|
|
* @brief Fills the command buffer with data to request the interface telemetry packet.
|
|
|
|
*/
|
|
|
|
void prepareInterfaceRequest();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Fills the command buffer with data to request the power telemetry packet.
|
|
|
|
*/
|
|
|
|
void preparePowerRequest();
|
|
|
|
|
2021-11-26 13:16:05 +01:00
|
|
|
/**
|
|
|
|
* @brief Fills command buffer with data to reboot star tracker.
|
|
|
|
*/
|
|
|
|
void prepareRebootCommand();
|
|
|
|
|
2021-11-27 19:40:52 +01:00
|
|
|
/**
|
|
|
|
* @brief Fills command buffer with data to subscribe to a telemetry packet.
|
|
|
|
*
|
|
|
|
* @param tmId The ID of the telemetry packet to subscribe to
|
|
|
|
*/
|
|
|
|
void prepareSubscriptionCommand(const uint8_t* tmId);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Fills command buffer with data to request solution telemtry packet (contains
|
|
|
|
* attitude information)
|
|
|
|
*/
|
|
|
|
void prepareSolutionRequest();
|
|
|
|
|
2021-11-26 09:14:41 +01:00
|
|
|
/**
|
|
|
|
* @brief Fills command buffer with data to request temperature from star tracker
|
|
|
|
*/
|
2021-07-08 11:20:19 +02:00
|
|
|
void prepareTemperatureRequest();
|
2021-07-07 12:12:01 +02:00
|
|
|
|
2021-12-10 10:07:23 +01:00
|
|
|
/**
|
|
|
|
* @brief Fills command buffer with command to reset the error signal of the star tracker
|
|
|
|
*/
|
|
|
|
void prepareErrorResetRequest();
|
|
|
|
|
2021-12-06 19:36:21 +01:00
|
|
|
/**
|
2021-12-07 16:30:17 +01:00
|
|
|
* @brief Reads parameters from json file specified by string in commandData and
|
|
|
|
* prepares the command to apply the parameter set to the star tracker
|
|
|
|
*
|
|
|
|
* @param commandData Contains string with file name
|
|
|
|
* @param commandDataLen Length of command
|
|
|
|
* @param paramSet The object defining the command generation
|
|
|
|
*
|
|
|
|
* @return RETURN_OK if successful, otherwise error return Value
|
2021-12-06 19:36:21 +01:00
|
|
|
*/
|
2021-12-07 16:30:17 +01:00
|
|
|
ReturnValue_t prepareParamCommand(const uint8_t* commandData, size_t commandDataLen,
|
|
|
|
ArcsecJsonParamBase& paramSet);
|
2021-12-06 19:36:21 +01:00
|
|
|
|
2021-11-27 19:40:52 +01:00
|
|
|
/**
|
|
|
|
* @brief Default function to handle action replies
|
|
|
|
*/
|
|
|
|
ReturnValue_t handleActionReply();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Handles all set parameter replies
|
|
|
|
*/
|
|
|
|
ReturnValue_t handleSetParamReply();
|
|
|
|
|
2021-11-26 13:16:05 +01:00
|
|
|
ReturnValue_t handlePingReply();
|
2021-11-27 19:40:52 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Fills the time set with the data of the time request reply.
|
|
|
|
*/
|
|
|
|
ReturnValue_t handleTimeTm();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Handles reply data of solution request.
|
|
|
|
*/
|
|
|
|
ReturnValue_t handleSolutionTm();
|
|
|
|
|
2021-07-07 12:12:01 +02:00
|
|
|
/**
|
|
|
|
* @brief This function handles the telemetry reply of a temperature request.
|
|
|
|
*/
|
2021-11-26 13:16:05 +01:00
|
|
|
ReturnValue_t handleTemperatureTm();
|
2021-11-26 15:24:52 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief This function handles the telemetry reply of a version request.
|
|
|
|
*/
|
|
|
|
ReturnValue_t handleVersionTm();
|
2021-11-27 19:40:52 +01:00
|
|
|
|
2021-12-14 19:24:31 +01:00
|
|
|
/**
|
|
|
|
* @brief Checks the loaded program by means of the version set
|
|
|
|
*/
|
|
|
|
ReturnValue_t checkProgram();
|
|
|
|
|
2021-11-27 19:40:52 +01:00
|
|
|
/**
|
|
|
|
* @brief Handles reply to request interface telemetry command.
|
|
|
|
*/
|
|
|
|
ReturnValue_t handleInterfaceTm();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Handles reply to request power telemetry command.
|
|
|
|
*/
|
|
|
|
ReturnValue_t handlePowerTm();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Extracts the header data of a received telemetry frame
|
|
|
|
*/
|
|
|
|
void getTmHeaderData(uint8_t* status, uint32_t* ticks, uint64_t* time);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief This function deserializes 8 bytes into a 32 bit unsigned integer.
|
|
|
|
*
|
|
|
|
* @param buffer Pointer to buffer holding the data to deserialize
|
|
|
|
*
|
|
|
|
* @return The 32-bit unsigned integer.
|
|
|
|
*
|
|
|
|
* @note Deserialization will be performed in little endian byte order
|
|
|
|
*/
|
2021-11-29 11:04:56 +01:00
|
|
|
uint32_t deserializeUint32(const uint8_t* buffer);
|
2021-11-27 19:40:52 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief This function deserializes 8 bytes into a 64 bit unsigned integer.
|
|
|
|
*
|
|
|
|
* @param buffer Pointer to buffer holding the data to deserialize
|
|
|
|
*
|
|
|
|
* @return The 64-bit unsigned integer.
|
|
|
|
*
|
|
|
|
* @note Deserialization will be performed in little endian byte order
|
|
|
|
*/
|
2021-12-06 19:36:21 +01:00
|
|
|
uint64_t deserializeUint64(const uint8_t* buffer);
|
2021-12-14 19:24:31 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief Handles the startup state machine
|
|
|
|
*/
|
|
|
|
void handleStartup(const uint8_t* parameterId);
|
2021-07-07 12:12:01 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* MISSION_DEVICES_STARTRACKERHANDLER_H_ */
|