continue rw refactoring
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:
302
mission/devices/devicedefinitions/rwHelpers.h
Normal file
302
mission/devices/devicedefinitions/rwHelpers.h
Normal file
@ -0,0 +1,302 @@
|
||||
#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_RWHELPERS_H_
|
||||
#define MISSION_DEVICES_DEVICEDEFINITIONS_RWHELPERS_H_
|
||||
|
||||
#include <fsfw/datapoollocal/LocalPoolVariable.h>
|
||||
#include <fsfw/datapoollocal/StaticLocalDataSet.h>
|
||||
#include <fsfw/devicehandlers/DeviceHandlerIF.h>
|
||||
|
||||
#include "events/subsystemIdRanges.h"
|
||||
#include "objects/systemObjectList.h"
|
||||
|
||||
namespace rws {
|
||||
|
||||
static const size_t SIZE_GET_RESET_STATUS = 5;
|
||||
static const size_t SIZE_CLEAR_RESET_STATUS = 4;
|
||||
static const size_t SIZE_INIT_RW = 4;
|
||||
static const size_t SIZE_GET_RW_STATUS = 14;
|
||||
static const size_t SIZE_SET_SPEED_REPLY = 4;
|
||||
static const size_t SIZE_GET_TEMPERATURE_REPLY = 8;
|
||||
/** Max size when requesting telemetry */
|
||||
static const size_t SIZE_GET_TELEMETRY_REPLY = 91;
|
||||
|
||||
enum SpecialRwRequest : uint8_t {
|
||||
REQUEST_NONE = 0,
|
||||
RESET_MCU = 1,
|
||||
INIT_RW_CONTROLLER = 2,
|
||||
GET_TM = 3,
|
||||
NUM_REQUESTS
|
||||
};
|
||||
|
||||
struct RwReplies {
|
||||
friend class RwPollingTask;
|
||||
|
||||
public:
|
||||
RwReplies(const uint8_t* rawData) : rawData(rawData) {
|
||||
rwStatusReply = rawData;
|
||||
setSpeedReply = rawData + SIZE_GET_RW_STATUS;
|
||||
getLastResetStatusReply = setSpeedReply + SIZE_SET_SPEED_REPLY;
|
||||
clearLastResetStatusReply = getLastResetStatusReply + SIZE_GET_RESET_STATUS;
|
||||
readTemperatureReply = clearLastResetStatusReply + SIZE_CLEAR_RESET_STATUS;
|
||||
hkDataReply = readTemperatureReply + SIZE_GET_TEMPERATURE_REPLY;
|
||||
initRwControllerReply = hkDataReply + SIZE_GET_TELEMETRY_REPLY;
|
||||
}
|
||||
|
||||
const uint8_t* getClearLastResetStatusReply() const { return clearLastResetStatusReply; }
|
||||
|
||||
const uint8_t* getGetLastResetStatusReply() const { return getLastResetStatusReply; }
|
||||
|
||||
const uint8_t* getHkDataReply() const { return hkDataReply; }
|
||||
|
||||
const uint8_t* getInitRwControllerReply() const { return initRwControllerReply; }
|
||||
|
||||
const uint8_t* getRawData() const { return rawData; }
|
||||
|
||||
const uint8_t* getReadTemperatureReply() const { return readTemperatureReply; }
|
||||
|
||||
const uint8_t* getRwStatusReply() const { return rwStatusReply; }
|
||||
|
||||
const uint8_t* getSetSpeedReply() const { return setSpeedReply; }
|
||||
|
||||
private:
|
||||
const uint8_t* rawData;
|
||||
const uint8_t* rwStatusReply;
|
||||
const uint8_t* setSpeedReply;
|
||||
const uint8_t* getLastResetStatusReply;
|
||||
const uint8_t* clearLastResetStatusReply;
|
||||
const uint8_t* readTemperatureReply;
|
||||
const uint8_t* hkDataReply;
|
||||
const uint8_t* initRwControllerReply;
|
||||
};
|
||||
|
||||
static const uint8_t INTERFACE_ID = CLASS_ID::RW_HANDLER;
|
||||
|
||||
static const ReturnValue_t SPI_WRITE_FAILURE = MAKE_RETURN_CODE(0xB0);
|
||||
//! [EXPORT] : [COMMENT] Used by the spi send function to tell a failing read call
|
||||
static const ReturnValue_t SPI_READ_FAILURE = MAKE_RETURN_CODE(0xB1);
|
||||
//! [EXPORT] : [COMMENT] Can be used by the HDLC decoding mechanism to inform about a missing
|
||||
//! start sign 0x7E
|
||||
static const ReturnValue_t MISSING_START_SIGN = MAKE_RETURN_CODE(0xB2);
|
||||
//! [EXPORT] : [COMMENT] Can be used by the HDLC decoding mechanism to inform about an invalid
|
||||
//! substitution combination
|
||||
static const ReturnValue_t INVALID_SUBSTITUTE = MAKE_RETURN_CODE(0xB3);
|
||||
//! [EXPORT] : [COMMENT] HDLC decoding mechanism never receives the end sign 0x7E
|
||||
static const ReturnValue_t MISSING_END_SIGN = MAKE_RETURN_CODE(0xB4);
|
||||
//! [EXPORT] : [COMMENT] Reaction wheel only responds with empty frames.
|
||||
static const ReturnValue_t NO_REPLY = MAKE_RETURN_CODE(0xB5);
|
||||
//! [EXPORT] : [COMMENT] Expected a start marker as first byte
|
||||
static const ReturnValue_t NO_START_MARKER = MAKE_RETURN_CODE(0xB6);
|
||||
|
||||
static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::RW_HANDLER;
|
||||
|
||||
//! [EXPORT] : [COMMENT] Reaction wheel signals an error state
|
||||
static constexpr Event ERROR_STATE = MAKE_EVENT(1, severity::HIGH);
|
||||
|
||||
static constexpr Event RESET_OCCURED = event::makeEvent(SUBSYSTEM_ID, 2, severity::LOW);
|
||||
|
||||
//! Minimal delay as specified by the datasheet.
|
||||
static const uint32_t SPI_REPLY_DELAY = 20000; // us
|
||||
|
||||
enum PoolIds : lp_id_t {
|
||||
TEMPERATURE_C,
|
||||
CURR_SPEED,
|
||||
REFERENCE_SPEED,
|
||||
STATE,
|
||||
CLC_MODE,
|
||||
LAST_RESET_STATUS,
|
||||
CURRRENT_RESET_STATUS,
|
||||
TM_LAST_RESET_STATUS,
|
||||
TM_MCU_TEMPERATURE,
|
||||
PRESSURE_SENSOR_TEMPERATURE,
|
||||
PRESSURE,
|
||||
TM_RW_STATE,
|
||||
TM_CLC_MODE,
|
||||
TM_RW_CURR_SPEED,
|
||||
TM_RW_REF_SPEED,
|
||||
INVALID_CRC_PACKETS,
|
||||
INVALID_LEN_PACKETS,
|
||||
INVALID_CMD_PACKETS,
|
||||
EXECUTED_REPLIES,
|
||||
COMMAND_REPLIES,
|
||||
UART_BYTES_WRITTEN,
|
||||
UART_BYTES_READ,
|
||||
UART_PARITY_ERRORS,
|
||||
UART_NOISE_ERRORS,
|
||||
UART_FRAME_ERRORS,
|
||||
UART_REG_OVERRUN_ERRORS,
|
||||
UART_TOTAL_ERRORS,
|
||||
TOTAL_ERRORS,
|
||||
SPI_BYTES_WRITTEN,
|
||||
SPI_BYTES_READ,
|
||||
SPI_REG_OVERRUN_ERRORS,
|
||||
SPI_TOTAL_ERRORS,
|
||||
|
||||
RW_SPEED,
|
||||
RAMP_TIME,
|
||||
};
|
||||
|
||||
enum States : uint8_t { STATE_ERROR, IDLE, COASTING, RUNNING_SPEED_STABLE, RUNNING_SPEED_CHANGING };
|
||||
|
||||
enum LastResetStatusBitPos : uint8_t {
|
||||
PIN_RESET = 0,
|
||||
POR_PDR_BOR_RESET = 1,
|
||||
SOFTWARE_RESET = 2,
|
||||
INDEPENDENT_WATCHDOG_RESET = 3,
|
||||
WINDOW_WATCHDOG_RESET = 4,
|
||||
LOW_POWER_RESET = 5
|
||||
};
|
||||
|
||||
static const DeviceCommandId_t RESET_MCU = 1;
|
||||
static const DeviceCommandId_t GET_LAST_RESET_STATUS = 2;
|
||||
static const DeviceCommandId_t CLEAR_LAST_RESET_STATUS = 3;
|
||||
static const DeviceCommandId_t GET_RW_STATUS = 4;
|
||||
/** This command is needed to recover from error state */
|
||||
static const DeviceCommandId_t INIT_RW_CONTROLLER = 5;
|
||||
static const DeviceCommandId_t SET_SPEED = 6;
|
||||
static const DeviceCommandId_t GET_TEMPERATURE = 8;
|
||||
static const DeviceCommandId_t GET_TM = 9;
|
||||
|
||||
enum SetIds : uint32_t {
|
||||
TEMPERATURE_SET_ID = GET_TEMPERATURE,
|
||||
STATUS_SET_ID = GET_RW_STATUS,
|
||||
LAST_RESET_ID = GET_LAST_RESET_STATUS,
|
||||
TM_SET_ID = GET_TM,
|
||||
SPEED_CMD_SET = 10,
|
||||
};
|
||||
|
||||
/** Set speed command has maximum size */
|
||||
static const size_t MAX_CMD_SIZE = 9;
|
||||
/**
|
||||
* Max reply is reached when each byte is replaced by its substitude which should normally never
|
||||
* happen.
|
||||
*/
|
||||
static const size_t MAX_REPLY_SIZE = 2 * SIZE_GET_TELEMETRY_REPLY;
|
||||
|
||||
static const uint8_t LAST_RESET_ENTRIES = 2;
|
||||
static const uint8_t STATUS_SET_ENTRIES = 5;
|
||||
static const uint8_t TM_SET_ENTRIES = 24;
|
||||
|
||||
/**
|
||||
* @brief This dataset can be used to store the data periodically polled from the RW
|
||||
*/
|
||||
class StatusSet : public StaticLocalDataSet<STATUS_SET_ENTRIES> {
|
||||
public:
|
||||
StatusSet(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, rws::SetIds::STATUS_SET_ID) {}
|
||||
|
||||
StatusSet(object_id_t objectId)
|
||||
: StaticLocalDataSet(sid_t(objectId, rws::SetIds::STATUS_SET_ID)) {}
|
||||
|
||||
lp_var_t<int32_t> temperatureCelcius =
|
||||
lp_var_t<int32_t>(sid.objectId, PoolIds::TEMPERATURE_C, this);
|
||||
lp_var_t<int32_t> currSpeed = lp_var_t<int32_t>(sid.objectId, PoolIds::CURR_SPEED, this);
|
||||
lp_var_t<int32_t> referenceSpeed =
|
||||
lp_var_t<int32_t>(sid.objectId, PoolIds::REFERENCE_SPEED, this);
|
||||
lp_var_t<uint8_t> state = lp_var_t<uint8_t>(sid.objectId, PoolIds::STATE, this);
|
||||
lp_var_t<uint8_t> clcMode = lp_var_t<uint8_t>(sid.objectId, PoolIds::CLC_MODE, this);
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief This dataset stores the last reset status.
|
||||
*/
|
||||
class LastResetSatus : public StaticLocalDataSet<LAST_RESET_ENTRIES> {
|
||||
public:
|
||||
LastResetSatus(HasLocalDataPoolIF* owner)
|
||||
: StaticLocalDataSet(owner, rws::SetIds::LAST_RESET_ID) {}
|
||||
|
||||
LastResetSatus(object_id_t objectId)
|
||||
: StaticLocalDataSet(sid_t(objectId, rws::SetIds::LAST_RESET_ID)) {}
|
||||
|
||||
// If a reset occurs, the status code will be cached into this variable
|
||||
lp_var_t<uint8_t> lastNonClearedResetStatus =
|
||||
lp_var_t<uint8_t>(sid.objectId, PoolIds::LAST_RESET_STATUS, this);
|
||||
// This will always contain the last polled reset status
|
||||
lp_var_t<uint8_t> currentResetStatus =
|
||||
lp_var_t<uint8_t>(sid.objectId, PoolIds::CURRRENT_RESET_STATUS, this);
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief This dataset stores telemetry data as specified in the datasheet of the nano avionics
|
||||
* reaction wheels. https://eive-cloud.irs.uni-stuttgart.de/index.php/apps/files/?dir=/
|
||||
* EIVE_IRS/Arbeitsdaten/08_Used%20Components/Nanoavionics_Reactionwheels&fileid=181622
|
||||
*/
|
||||
class TmDataset : public StaticLocalDataSet<TM_SET_ENTRIES> {
|
||||
public:
|
||||
TmDataset(HasLocalDataPoolIF* owner) : StaticLocalDataSet(owner, rws::SetIds::TM_SET_ID) {}
|
||||
|
||||
TmDataset(object_id_t objectId) : StaticLocalDataSet(sid_t(objectId, rws::SetIds::TM_SET_ID)) {}
|
||||
|
||||
lp_var_t<uint8_t> lastResetStatus =
|
||||
lp_var_t<uint8_t>(sid.objectId, PoolIds::TM_LAST_RESET_STATUS, this);
|
||||
lp_var_t<int32_t> mcuTemperature =
|
||||
lp_var_t<int32_t>(sid.objectId, PoolIds::TM_MCU_TEMPERATURE, this);
|
||||
lp_var_t<float> pressureSensorTemperature =
|
||||
lp_var_t<float>(sid.objectId, PoolIds::PRESSURE_SENSOR_TEMPERATURE, this);
|
||||
lp_var_t<float> pressure = lp_var_t<float>(sid.objectId, PoolIds::PRESSURE, this);
|
||||
lp_var_t<uint8_t> rwState = lp_var_t<uint8_t>(sid.objectId, PoolIds::TM_RW_STATE, this);
|
||||
lp_var_t<uint8_t> rwClcMode = lp_var_t<uint8_t>(sid.objectId, PoolIds::TM_CLC_MODE, this);
|
||||
lp_var_t<int32_t> rwCurrSpeed = lp_var_t<int32_t>(sid.objectId, PoolIds::TM_RW_CURR_SPEED, this);
|
||||
lp_var_t<int32_t> rwRefSpeed = lp_var_t<int32_t>(sid.objectId, PoolIds::TM_RW_REF_SPEED, this);
|
||||
lp_var_t<uint32_t> numOfInvalidCrcPackets =
|
||||
lp_var_t<uint32_t>(sid.objectId, PoolIds::INVALID_CRC_PACKETS, this);
|
||||
lp_var_t<uint32_t> numOfInvalidLenPackets =
|
||||
lp_var_t<uint32_t>(sid.objectId, PoolIds::INVALID_LEN_PACKETS, this);
|
||||
lp_var_t<uint32_t> numOfInvalidCmdPackets =
|
||||
lp_var_t<uint32_t>(sid.objectId, PoolIds::INVALID_CMD_PACKETS, this);
|
||||
lp_var_t<uint32_t> numOfCmdExecutedReplies =
|
||||
lp_var_t<uint32_t>(sid.objectId, PoolIds::EXECUTED_REPLIES, this);
|
||||
lp_var_t<uint32_t> numOfCmdReplies =
|
||||
lp_var_t<uint32_t>(sid.objectId, PoolIds::COMMAND_REPLIES, this);
|
||||
lp_var_t<uint32_t> uartNumOfBytesWritten =
|
||||
lp_var_t<uint32_t>(sid.objectId, PoolIds::UART_BYTES_WRITTEN, this);
|
||||
lp_var_t<uint32_t> uartNumOfBytesRead =
|
||||
lp_var_t<uint32_t>(sid.objectId, PoolIds::UART_BYTES_READ, this);
|
||||
lp_var_t<uint32_t> uartNumOfParityErrors =
|
||||
lp_var_t<uint32_t>(sid.objectId, PoolIds::UART_PARITY_ERRORS, this);
|
||||
lp_var_t<uint32_t> uartNumOfNoiseErrors =
|
||||
lp_var_t<uint32_t>(sid.objectId, PoolIds::UART_NOISE_ERRORS, this);
|
||||
lp_var_t<uint32_t> uartNumOfFrameErrors =
|
||||
lp_var_t<uint32_t>(sid.objectId, PoolIds::UART_FRAME_ERRORS, this);
|
||||
lp_var_t<uint32_t> uartNumOfRegisterOverrunErrors =
|
||||
lp_var_t<uint32_t>(sid.objectId, PoolIds::UART_REG_OVERRUN_ERRORS, this);
|
||||
lp_var_t<uint32_t> uartTotalNumOfErrors =
|
||||
lp_var_t<uint32_t>(sid.objectId, PoolIds::UART_TOTAL_ERRORS, this);
|
||||
lp_var_t<uint32_t> spiNumOfBytesWritten =
|
||||
lp_var_t<uint32_t>(sid.objectId, PoolIds::SPI_BYTES_WRITTEN, this);
|
||||
lp_var_t<uint32_t> spiNumOfBytesRead =
|
||||
lp_var_t<uint32_t>(sid.objectId, PoolIds::SPI_BYTES_READ, this);
|
||||
lp_var_t<uint32_t> spiNumOfRegisterOverrunErrors =
|
||||
lp_var_t<uint32_t>(sid.objectId, PoolIds::SPI_REG_OVERRUN_ERRORS, this);
|
||||
lp_var_t<uint32_t> spiTotalNumOfErrors =
|
||||
lp_var_t<uint32_t>(sid.objectId, PoolIds::SPI_TOTAL_ERRORS, this);
|
||||
};
|
||||
|
||||
class RwSpeedActuationSet : public StaticLocalDataSet<2> {
|
||||
friend class RwHandler;
|
||||
|
||||
public:
|
||||
RwSpeedActuationSet(HasLocalDataPoolIF& owner)
|
||||
: StaticLocalDataSet(&owner, rws::SetIds::SPEED_CMD_SET) {}
|
||||
RwSpeedActuationSet(object_id_t objectId)
|
||||
: StaticLocalDataSet(sid_t(objectId, rws::SetIds::SPEED_CMD_SET)) {}
|
||||
|
||||
void setRwSpeed(int32_t rwSpeed_, uint16_t rampTime_) {
|
||||
if (rwSpeed.value != rwSpeed_) {
|
||||
rwSpeed = rwSpeed_;
|
||||
}
|
||||
if (rampTime.value != rampTime_) {
|
||||
rampTime = rampTime_;
|
||||
}
|
||||
}
|
||||
|
||||
void getRwSpeed(int32_t& rwSpeed_, uint16_t& rampTime_) {
|
||||
rwSpeed_ = rwSpeed.value;
|
||||
rampTime_ = rampTime.value;
|
||||
}
|
||||
|
||||
private:
|
||||
lp_var_t<int32_t> rwSpeed = lp_var_t<int32_t>(sid.objectId, rws::PoolIds::RW_SPEED, this);
|
||||
lp_var_t<uint16_t> rampTime = lp_var_t<uint16_t>(sid.objectId, rws::PoolIds::RAMP_TIME, this);
|
||||
};
|
||||
|
||||
} // namespace rws
|
||||
|
||||
#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_RWHELPERS_H_ */
|
Reference in New Issue
Block a user