fsfw/src/fsfw_hal/devicehandlers/devicedefinitions/mgmRm3100Helpers.h

123 lines
4.2 KiB
C
Raw Normal View History

2021-09-23 18:12:59 +02:00
#ifndef MISSION_DEVICES_DEVICEDEFINITIONS_MGMHANDLERRM3100DEFINITIONS_H_
#define MISSION_DEVICES_DEVICEDEFINITIONS_MGMHANDLERRM3100DEFINITIONS_H_
#include <fsfw/datapoollocal/LocalPoolVariable.h>
2022-02-02 10:29:30 +01:00
#include <fsfw/datapoollocal/StaticLocalDataSet.h>
2021-09-23 18:12:59 +02:00
#include <fsfw/devicehandlers/DeviceHandlerIF.h>
#include <fsfw/serialize/SerialLinkedListAdapter.h>
2022-02-02 10:29:30 +01:00
2021-09-23 18:12:59 +02:00
#include <cstdint>
2023-02-26 21:26:24 +01:00
namespace mgmRm3100 {
2021-09-23 18:12:59 +02:00
/* Actually 10, we round up a little bit */
static constexpr size_t MAX_BUFFER_SIZE = 12;
static constexpr uint8_t READ_MASK = 0x80;
/*----------------------------------------------------------------------------*/
/* CMM Register */
/*----------------------------------------------------------------------------*/
static constexpr uint8_t SET_CMM_CMZ = 1 << 6;
static constexpr uint8_t SET_CMM_CMY = 1 << 5;
static constexpr uint8_t SET_CMM_CMX = 1 << 4;
static constexpr uint8_t SET_CMM_DRDM = 1 << 2;
static constexpr uint8_t SET_CMM_START = 1;
static constexpr uint8_t CMM_REGISTER = 0x01;
2022-02-02 10:29:30 +01:00
static constexpr uint8_t CMM_VALUE =
SET_CMM_CMZ | SET_CMM_CMY | SET_CMM_CMX | SET_CMM_DRDM | SET_CMM_START;
2021-09-23 18:12:59 +02:00
/*----------------------------------------------------------------------------*/
/* Cycle count register */
/*----------------------------------------------------------------------------*/
// Default value (200)
static constexpr uint8_t CYCLE_COUNT_VALUE = 0xC8;
2022-02-02 10:29:30 +01:00
static constexpr float DEFAULT_GAIN = static_cast<float>(CYCLE_COUNT_VALUE) / 100 * 38;
2021-09-23 18:12:59 +02:00
static constexpr uint8_t CYCLE_COUNT_START_REGISTER = 0x04;
/*----------------------------------------------------------------------------*/
/* TMRC register */
/*----------------------------------------------------------------------------*/
static constexpr uint8_t TMRC_150HZ_VALUE = 0x94;
static constexpr uint8_t TMRC_75HZ_VALUE = 0x95;
static constexpr uint8_t TMRC_DEFAULT_37HZ_VALUE = 0x96;
static constexpr uint8_t TMRC_REGISTER = 0x0B;
static constexpr uint8_t TMRC_DEFAULT_VALUE = TMRC_DEFAULT_37HZ_VALUE;
static constexpr uint8_t MEASUREMENT_REG_START = 0x24;
static constexpr uint8_t BIST_REGISTER = 0x33;
2021-09-28 15:45:45 +02:00
static constexpr uint8_t DATA_READY_VAL = 0b10000000;
2021-09-23 18:12:59 +02:00
static constexpr uint8_t STATUS_REGISTER = 0x34;
static constexpr uint8_t REVID_REGISTER = 0x36;
// Range in Microtesla. 1 T equals 10000 Gauss (for comparison with LIS3 MGM)
static constexpr uint16_t RANGE = 800;
static constexpr DeviceCommandId_t READ_DATA = 0;
static constexpr DeviceCommandId_t CONFIGURE_CMM = 1;
static constexpr DeviceCommandId_t READ_CMM = 2;
static constexpr DeviceCommandId_t CONFIGURE_TMRC = 3;
static constexpr DeviceCommandId_t READ_TMRC = 4;
static constexpr DeviceCommandId_t CONFIGURE_CYCLE_COUNT = 5;
static constexpr DeviceCommandId_t READ_CYCLE_COUNT = 6;
2022-02-02 10:29:30 +01:00
class CycleCountCommand : public SerialLinkedListAdapter<SerializeIF> {
public:
CycleCountCommand(bool oneCycleCount = true) : oneCycleCount(oneCycleCount) {
setLinks(oneCycleCount);
}
ReturnValue_t deSerialize(const uint8_t** buffer, size_t* size,
Endianness streamEndianness) override {
ReturnValue_t result = SerialLinkedListAdapter::deSerialize(buffer, size, streamEndianness);
if (oneCycleCount) {
cycleCountY = cycleCountX;
cycleCountZ = cycleCountX;
}
return result;
}
SerializeElement<uint16_t> cycleCountX;
SerializeElement<uint16_t> cycleCountY;
SerializeElement<uint16_t> cycleCountZ;
private:
void setLinks(bool oneCycleCount) {
setStart(&cycleCountX);
if (not oneCycleCount) {
cycleCountX.setNext(&cycleCountY);
cycleCountY.setNext(&cycleCountZ);
}
}
bool oneCycleCount;
2021-09-23 18:12:59 +02:00
};
static constexpr uint32_t MGM_DATASET_ID = READ_DATA;
2024-11-04 17:32:21 +01:00
enum MgmPoolIds : lp_id_t { FIELD_STRENGTHS = 0, VALID = 1 };
2021-09-23 18:12:59 +02:00
2022-02-02 10:29:30 +01:00
class Rm3100PrimaryDataset : public StaticLocalDataSet<3> {
public:
2024-11-04 17:32:21 +01:00
Rm3100PrimaryDataset(PeriodicHkGenerationIF* hkOwner)
: StaticLocalDataSet(hkOwner, MGM_DATASET_ID) {}
2021-09-23 18:12:59 +02:00
2022-02-02 10:29:30 +01:00
Rm3100PrimaryDataset(object_id_t mgmId) : StaticLocalDataSet(sid_t(mgmId, MGM_DATASET_ID)) {}
2021-09-23 18:12:59 +02:00
2022-08-15 10:49:00 +02:00
/**
* Field strenghts in uT
*/
lp_vec_t<float, 3> fieldStrengths = lp_vec_t<float, 3>(sid.objectId, FIELD_STRENGTHS, this);
2024-11-04 17:32:21 +01:00
lp_var_t<uint8_t> valid = lp_var_t<uint8_t>(sid.objectId, VALID, this);
2022-02-02 10:29:30 +01:00
};
2021-09-23 18:12:59 +02:00
2023-02-26 21:26:24 +01:00
} // namespace mgmRm3100
2021-09-23 18:12:59 +02:00
#endif /* MISSION_DEVICES_DEVICEDEFINITIONS_MGMHANDLERRM3100DEFINITIONS_H_ */