compiling for windows again
Some checks failed
EIVE/eive-obsw/pipeline/head There was a failure building this commit
Some checks failed
EIVE/eive-obsw/pipeline/head There was a failure building this commit
This commit is contained in:
@ -14,7 +14,6 @@ target_sources(${TARGET_NAME} PUBLIC
|
||||
RadiationSensorHandler.cpp
|
||||
GyroADIS16507Handler.cpp
|
||||
RwHandler.cpp
|
||||
StarTrackerHandler.cpp
|
||||
)
|
||||
|
||||
|
||||
|
@ -197,7 +197,7 @@ ReturnValue_t RwHandler::scanForReply(const uint8_t *start, size_t remainingSize
|
||||
ReturnValue_t RwHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) {
|
||||
|
||||
/** Check result code */
|
||||
if (*(packet + 1) == RwDefinitions::ERROR) {
|
||||
if (*(packet + 1) == RwDefinitions::STATE_ERROR) {
|
||||
sif::error << "RwHandler::interpretDeviceReply: Command execution failed. Command id: "
|
||||
<< id << std::endl;
|
||||
return EXECUTION_FAILED;
|
||||
@ -369,7 +369,7 @@ void RwHandler::handleGetRwStatusReply(const uint8_t* packet) {
|
||||
offset += 1;
|
||||
statusSet.clcMode = *(packet + offset);
|
||||
|
||||
if (statusSet.state == RwDefinitions::ERROR) {
|
||||
if (statusSet.state == RwDefinitions::STATE_ERROR) {
|
||||
/**
|
||||
* This requires the commanding of the init reaction wheel controller command to recover
|
||||
* form error state which must be handled by the FDIR instance.
|
||||
|
@ -1,216 +0,0 @@
|
||||
#include "StarTrackerHandler.h"
|
||||
#include "OBSWConfig.h"
|
||||
|
||||
#include <fsfw/globalfunctions/CRC.h>
|
||||
#include <fsfw/datapool/PoolReadGuard.h>
|
||||
|
||||
extern "C" {
|
||||
#include <thirdparty/arcsec_star_tracker/client/generated/telemetry.h>
|
||||
#include "common/misc.h"
|
||||
}
|
||||
|
||||
StarTrackerHandler::StarTrackerHandler(object_id_t objectId, object_id_t comIF,
|
||||
CookieIF * comCookie) :
|
||||
DeviceHandlerBase(objectId, comIF, comCookie), temperatureSet(this) {
|
||||
if (comCookie == NULL) {
|
||||
sif::error << "StarTrackerHandler: Invalid com cookie" << std::endl;
|
||||
}
|
||||
slipInit();
|
||||
}
|
||||
|
||||
StarTrackerHandler::~StarTrackerHandler() {
|
||||
}
|
||||
|
||||
void StarTrackerHandler::doStartUp() {
|
||||
|
||||
#if OBSW_SWITCH_TO_NORMAL_MODE_AFTER_STARTUP == 1
|
||||
setMode(MODE_NORMAL);
|
||||
#else
|
||||
setMode(_MODE_TO_ON);
|
||||
#endif
|
||||
}
|
||||
|
||||
void StarTrackerHandler::doShutDown() {
|
||||
setMode(_MODE_POWER_DOWN);
|
||||
}
|
||||
|
||||
ReturnValue_t StarTrackerHandler::buildNormalDeviceCommand(DeviceCommandId_t * id) {
|
||||
switch (internalState) {
|
||||
case InternalState::TEMPERATURE_REQUEST:
|
||||
*id = StarTracker::REQ_TEMPERATURE;
|
||||
break;
|
||||
default:
|
||||
sif::debug << "StarTrackerHandler::buildNormalDeviceCommand: Invalid internal step"
|
||||
<< std::endl;
|
||||
break;
|
||||
}
|
||||
return buildCommandFromCommand(*id, NULL, 0);
|
||||
}
|
||||
|
||||
ReturnValue_t StarTrackerHandler::buildTransitionDeviceCommand(DeviceCommandId_t * id) {
|
||||
return NOTHING_TO_SEND;
|
||||
}
|
||||
|
||||
ReturnValue_t StarTrackerHandler::buildCommandFromCommand(DeviceCommandId_t deviceCommand,
|
||||
const uint8_t * commandData, size_t commandDataLen) {
|
||||
|
||||
switch (deviceCommand) {
|
||||
case (StarTracker::REQ_TEMPERATURE): {
|
||||
prepareTemperatureRequest();
|
||||
return RETURN_OK;
|
||||
}
|
||||
default:
|
||||
return DeviceHandlerIF::COMMAND_NOT_IMPLEMENTED;
|
||||
}
|
||||
return HasReturnvaluesIF::RETURN_FAILED;
|
||||
}
|
||||
|
||||
void StarTrackerHandler::fillCommandAndReplyMap() {
|
||||
/** Reply lengths are unknown because of the slip encoding. Thus always maximum reply size
|
||||
* is specified */
|
||||
this->insertInCommandAndReplyMap(StarTracker::REQ_TEMPERATURE, 1, &temperatureSet,
|
||||
StarTracker::MAX_FRAME_SIZE * 2 + 2);
|
||||
}
|
||||
|
||||
ReturnValue_t StarTrackerHandler::scanForReply(const uint8_t *start, size_t remainingSize,
|
||||
DeviceCommandId_t *foundId, size_t *foundLen) {
|
||||
|
||||
uint32_t decodedLength = 0;
|
||||
|
||||
for (size_t idx = 0; idx < remainingSize; idx++) {
|
||||
enum arc_dec_result decResult = arc_transport_decode_body(*(start + idx), &slipInfo,
|
||||
decodedFrame, &decodedLength);
|
||||
|
||||
switch (decResult) {
|
||||
case ARC_DEC_INPROGRESS: {
|
||||
continue;
|
||||
}
|
||||
case ARC_DEC_ASYNC: {
|
||||
sif::debug << "StarTrackerHandler::scanForReply: Received asynchronous tm" << std::endl;
|
||||
/** No asynchronous replies are expected as of now */
|
||||
return RETURN_FAILED;
|
||||
}
|
||||
case ARC_DEC_ERROR_FRAME_SHORT:
|
||||
return REPLY_TOO_SHORT;
|
||||
case ARC_DEC_ERROR_CHECKSUM:
|
||||
return CRC_FAILURE;
|
||||
case ARC_DEC_SYNC: {
|
||||
/** Reset length of SLIP struct for next frame */
|
||||
slipInfo.length = 0;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
sif::debug << "StarTrackerHandler::scanForReply: Unknown result code" << std::endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (decodedFrame[1]) {
|
||||
case (static_cast<uint8_t>(StarTracker::REQ_TEMPERATURE)): {
|
||||
*foundLen = decodedLength;
|
||||
*foundId = StarTracker::REQ_TEMPERATURE;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
sif::debug << "StarTrackerHandler::scanForReply: Reply contains invalid reply id"
|
||||
<< std::endl;
|
||||
return RETURN_FAILED;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return RETURN_OK;
|
||||
}
|
||||
|
||||
ReturnValue_t StarTrackerHandler::interpretDeviceReply(DeviceCommandId_t id, const uint8_t *packet) {
|
||||
|
||||
switch (id) {
|
||||
case (StarTracker::REQ_TEMPERATURE): {
|
||||
handleTemperatureTm();
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
sif::debug << "StarTrackerHandler::interpretDeviceReply: Unknown device reply id" << std::endl;
|
||||
return DeviceHandlerIF::UNKNOWN_DEVICE_REPLY;
|
||||
}
|
||||
}
|
||||
|
||||
return RETURN_OK;
|
||||
}
|
||||
|
||||
void StarTrackerHandler::setNormalDatapoolEntriesInvalid() {
|
||||
|
||||
}
|
||||
|
||||
uint32_t StarTrackerHandler::getTransitionDelayMs(Mode_t modeFrom, Mode_t modeTo) {
|
||||
return 5000;
|
||||
}
|
||||
|
||||
ReturnValue_t StarTrackerHandler::initializeLocalDataPool(localpool::DataPool& localDataPoolMap,
|
||||
LocalDataPoolManager& poolManager) {
|
||||
|
||||
localDataPoolMap.emplace(StarTracker::STATUS, new PoolEntry<uint8_t>( { 0 }));
|
||||
localDataPoolMap.emplace(StarTracker::TICKS, new PoolEntry<uint32_t>( { 0 }));
|
||||
localDataPoolMap.emplace(StarTracker::TIME, new PoolEntry<uint64_t>( { 0 }));
|
||||
localDataPoolMap.emplace(StarTracker::MCU_TEMPERATURE, new PoolEntry<float>( { 0 }));
|
||||
localDataPoolMap.emplace(StarTracker::CMOS_TEMPERATURE, new PoolEntry<float>( { 0 }));
|
||||
|
||||
return RETURN_OK;
|
||||
}
|
||||
|
||||
size_t StarTrackerHandler::getNextReplyLength(DeviceCommandId_t commandId){
|
||||
return StarTracker::MAX_FRAME_SIZE;
|
||||
}
|
||||
|
||||
void StarTrackerHandler::slipInit() {
|
||||
slipInfo.buffer = rxBuffer;
|
||||
slipInfo.maxlength = StarTracker::MAX_FRAME_SIZE;
|
||||
slipInfo.length = 0;
|
||||
slipInfo.unescape_next = 0;
|
||||
slipInfo.prev_state = SLIP_COMPLETE;
|
||||
}
|
||||
|
||||
void StarTrackerHandler::prepareTemperatureRequest() {
|
||||
uint32_t length = 0;
|
||||
arc_tm_pack_temperature_req(commandBuffer, &length);
|
||||
uint32_t encLength = 0;
|
||||
arc_transport_encode_body(commandBuffer, length, encBuffer, &encLength);
|
||||
rawPacket = encBuffer;
|
||||
rawPacketLen = encLength;
|
||||
}
|
||||
|
||||
void StarTrackerHandler::handleTemperatureTm() {
|
||||
PoolReadGuard rg(&temperatureSet);
|
||||
uint32_t offset = 1;
|
||||
temperatureSet.status = *(decodedFrame + offset);
|
||||
offset += 1;
|
||||
if(temperatureSet.status.value != 0) {
|
||||
sif::warning << "StarTrackerHandler::handleTemperatureTm: Reply error: "
|
||||
<< static_cast<unsigned int>(temperatureSet.status.value) << std::endl;
|
||||
triggerEvent(TM_REPLY_ERROR, temperatureSet.status.value);
|
||||
}
|
||||
temperatureSet.ticks = *(decodedFrame + offset) << 24
|
||||
| *(decodedFrame + offset + 1) << 16 | *(decodedFrame + offset + 2) << 8
|
||||
| *(decodedFrame + offset + 3);
|
||||
offset += 4;
|
||||
temperatureSet.time = static_cast<uint64_t>(*(decodedFrame + offset)) << 56
|
||||
| static_cast<uint64_t>(*(decodedFrame + offset + 1)) << 48
|
||||
| static_cast<uint64_t>(*(decodedFrame + offset + 2)) << 40
|
||||
| static_cast<uint64_t>(*(decodedFrame + offset + 3)) << 32
|
||||
| *(decodedFrame + offset + 4) << 24 | *(decodedFrame + offset + 5) << 16
|
||||
| *(decodedFrame + offset + 6) << 8 | *(decodedFrame + offset + 7);
|
||||
offset += 8;
|
||||
temperatureSet.mcuTemperature = *(decodedFrame + offset) << 24
|
||||
| *(decodedFrame + offset + 1) << 16 | *(decodedFrame + offset + 2) << 8
|
||||
| *(decodedFrame + offset + 3);
|
||||
offset += 4;
|
||||
temperatureSet.cmosTemperature = *(decodedFrame + offset) << 24
|
||||
| *(decodedFrame + offset + 1) << 16 | *(decodedFrame + offset + 2) << 8
|
||||
| *(decodedFrame + offset + 3);
|
||||
#if OBSW_VERBOSE_LEVEL >= 1 && OBSW_DEBUG_STARTRACKER == 1
|
||||
sif::info << "StarTrackerHandler::handleTemperatureTm: MCU Temperature: "
|
||||
<< temperatureSet.mcuTemperature << " °C" << std::endl;
|
||||
sif::info << "StarTrackerHandler::handleTemperatureTm: CMOS Temperature: "
|
||||
<< temperatureSet.mcuTemperature << " °C" << std::endl;
|
||||
#endif
|
||||
}
|
@ -1,100 +0,0 @@
|
||||
#ifndef MISSION_DEVICES_STARTRACKERHANDLER_H_
|
||||
#define MISSION_DEVICES_STARTRACKERHANDLER_H_
|
||||
|
||||
#include <fsfw/devicehandlers/DeviceHandlerBase.h>
|
||||
#include <mission/devices/devicedefinitions/StarTrackerDefinitions.h>
|
||||
#include <thirdparty/arcsec_star_tracker/common/SLIP.h>
|
||||
|
||||
/**
|
||||
* @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.
|
||||
*/
|
||||
StarTrackerHandler(object_id_t objectId, object_id_t comIF, CookieIF * comCookie);
|
||||
virtual ~StarTrackerHandler();
|
||||
|
||||
protected:
|
||||
void doStartUp() override;
|
||||
void doShutDown() override;
|
||||
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;
|
||||
|
||||
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
|
||||
static const ReturnValue_t CRC_FAILURE = MAKE_RETURN_CODE(0xB0);
|
||||
|
||||
static const uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::STR_HANDLER;
|
||||
|
||||
//! [EXPORT] : [COMMENT] Result code of tm reply indicates an error
|
||||
static const ReturnValue_t TM_REPLY_ERROR = MAKE_RETURN_CODE(0xA0);
|
||||
//! P1: TM id
|
||||
|
||||
StarTracker::TemperatureSet temperatureSet;
|
||||
|
||||
uint8_t commandBuffer[StarTracker::MAX_FRAME_SIZE];
|
||||
uint8_t rxBuffer[StarTracker::MAX_FRAME_SIZE];
|
||||
uint8_t decodedFrame[StarTracker::MAX_FRAME_SIZE];
|
||||
|
||||
/** Size of buffer derived from the egse source code */
|
||||
uint8_t encBuffer[StarTracker::MAX_FRAME_SIZE * 2 + 2];
|
||||
|
||||
slip_decode_state slipInfo;
|
||||
|
||||
enum class InternalState {
|
||||
TEMPERATURE_REQUEST
|
||||
};
|
||||
|
||||
InternalState internalState = InternalState::TEMPERATURE_REQUEST;
|
||||
|
||||
/**
|
||||
* @brief This function initializes the serial link ip protocol struct slipInfo.
|
||||
*/
|
||||
void slipInit();
|
||||
|
||||
void prepareTemperatureRequest();
|
||||
|
||||
/**
|
||||
* @brief This function handles the telemetry reply of a temperature request.
|
||||
*/
|
||||
void handleTemperatureTm();
|
||||
};
|
||||
|
||||
#endif /* MISSION_DEVICES_STARTRACKERHANDLER_H_ */
|
@ -46,7 +46,7 @@ enum PoolIds: lp_id_t {
|
||||
};
|
||||
|
||||
enum States: uint8_t {
|
||||
ERROR,
|
||||
STATE_ERROR,
|
||||
IDLE,
|
||||
COASTING,
|
||||
RUNNING_SPEED_STABLE,
|
||||
|
@ -1,64 +0,0 @@
|
||||
#ifndef MISSION_STARTRACKER_DEFINITIONS_H_
|
||||
#define MISSION_STARTRACKER_DEFINITIONS_H_
|
||||
|
||||
#include <fsfw/datapoollocal/StaticLocalDataSet.h>
|
||||
#include <fsfw/datapoollocal/LocalPoolVariable.h>
|
||||
#include <fsfw/devicehandlers/DeviceHandlerIF.h>
|
||||
#include "objects/systemObjectList.h"
|
||||
|
||||
namespace StarTracker {
|
||||
|
||||
/** This is the address of the star tracker */
|
||||
static const uint8_t ADDRESS = 33;
|
||||
|
||||
enum PoolIds: lp_id_t {
|
||||
STATUS,
|
||||
TICKS,
|
||||
TIME,
|
||||
MCU_TEMPERATURE,
|
||||
CMOS_TEMPERATURE
|
||||
};
|
||||
|
||||
|
||||
|
||||
static const DeviceCommandId_t REQ_TEMPERATURE = 25;
|
||||
|
||||
static const uint32_t TEMPERATURE_SET_ID = REQ_TEMPERATURE;
|
||||
|
||||
/** Max size of unencoded frame */
|
||||
static const size_t MAX_FRAME_SIZE = 1200;
|
||||
|
||||
static const uint8_t TEMPERATURE_SET_ENTRIES = 5;
|
||||
|
||||
/**
|
||||
* @brief This dataset can be used to store the temperature of a reaction wheel.
|
||||
*/
|
||||
class TemperatureSet:
|
||||
public StaticLocalDataSet<TEMPERATURE_SET_ENTRIES> {
|
||||
public:
|
||||
|
||||
TemperatureSet(HasLocalDataPoolIF* owner):
|
||||
StaticLocalDataSet(owner, TEMPERATURE_SET_ID) {
|
||||
}
|
||||
|
||||
TemperatureSet(object_id_t objectId):
|
||||
StaticLocalDataSet(sid_t(objectId, TEMPERATURE_SET_ID)) {
|
||||
}
|
||||
|
||||
lp_var_t<uint8_t> status = lp_var_t<uint8_t>(sid.objectId,
|
||||
PoolIds::STATUS, this);
|
||||
lp_var_t<uint32_t> ticks = lp_var_t<uint32_t>(sid.objectId,
|
||||
PoolIds::TICKS, this);
|
||||
/** Unix time in microseconds */
|
||||
lp_var_t<uint64_t> time = lp_var_t<uint64_t>(sid.objectId,
|
||||
PoolIds::TIME, this);
|
||||
lp_var_t<float> mcuTemperature = lp_var_t<float>(sid.objectId,
|
||||
PoolIds::MCU_TEMPERATURE, this);
|
||||
lp_var_t<float> cmosTemperature = lp_var_t<float>(sid.objectId,
|
||||
PoolIds::CMOS_TEMPERATURE, this);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif /* MISSION_STARTRACKER_DEFINITIONS_H_ */
|
||||
|
Reference in New Issue
Block a user