Merge remote-tracking branch 'origin/develop' into gyr_sets_diagnostic_now
Some checks are pending
EIVE/eive-obsw/pipeline/pr-develop Build started...

This commit is contained in:
Robin Müller 2023-01-19 16:35:42 +01:00
commit 08a4491a15
No known key found for this signature in database
GPG Key ID: 11D4952C8CCEF814
10 changed files with 75 additions and 23 deletions

View File

@ -23,6 +23,14 @@ list yields a list of all related PRs for each release.
- Bumped FSFW for Service 11 improvement which includes size and CRC check for contained TC - Bumped FSFW for Service 11 improvement which includes size and CRC check for contained TC
- Syrlinks module now always included for both EM and FM - Syrlinks module now always included for both EM and FM
## Fixed
- `GyroADIS1650XHandler`: Updated handler to determine correct dynamic range from `RANG_MDL`
register readout. This is because ADIS16505-3BMLZ devices are used on the ACS board and the
previous range setting was wrong. Also fixed a small error properly set internal state
on shut-down.
PR: https://egit.irs.uni-stuttgart.de/eive/eive-obsw/pulls/342
# [v1.19.0] 10.01.2023 # [v1.19.0] 10.01.2023
## Changed ## Changed

View File

@ -1,13 +1,13 @@
#include "obsw.h" #include "obsw.h"
#include <pwd.h>
#include <sys/types.h>
#include <unistd.h>
#include <filesystem> #include <filesystem>
#include <fstream> #include <fstream>
#include <iostream> #include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <pwd.h>
#include "OBSWConfig.h" #include "OBSWConfig.h"
#include "commonConfig.h" #include "commonConfig.h"
#include "core/scheduling.h" #include "core/scheduling.h"
@ -44,8 +44,8 @@ int obsw::obsw() {
const char* homedir = nullptr; const char* homedir = nullptr;
homedir = getenv("HOME"); homedir = getenv("HOME");
if(homedir == nullptr) { if (homedir == nullptr) {
homedir = getpwuid(getuid())->pw_dir; homedir = getpwuid(getuid())->pw_dir;
} }
std::filesystem::path bootDelayFile = std::filesystem::path(homedir) / "boot_delay_secs.txt"; std::filesystem::path bootDelayFile = std::filesystem::path(homedir) / "boot_delay_secs.txt";
// Init delay handling. // Init delay handling.

View File

@ -1,7 +1,7 @@
/** /**
* @brief Auto-generated event translation file. Contains 240 translations. * @brief Auto-generated event translation file. Contains 240 translations.
* @details * @details
* Generated on: 2023-01-18 14:34:15 * Generated on: 2023-01-18 16:08:56
*/ */
#include "translateEvents.h" #include "translateEvents.h"

View File

@ -2,7 +2,7 @@
* @brief Auto-generated object translation file. * @brief Auto-generated object translation file.
* @details * @details
* Contains 150 translations. * Contains 150 translations.
* Generated on: 2023-01-18 14:34:15 * Generated on: 2023-01-18 16:08:56
*/ */
#include "translateObjects.h" #include "translateObjects.h"

View File

@ -1,7 +1,7 @@
/** /**
* @brief Auto-generated event translation file. Contains 240 translations. * @brief Auto-generated event translation file. Contains 240 translations.
* @details * @details
* Generated on: 2023-01-18 14:34:15 * Generated on: 2023-01-18 16:08:56
*/ */
#include "translateEvents.h" #include "translateEvents.h"

View File

@ -2,7 +2,7 @@
* @brief Auto-generated object translation file. * @brief Auto-generated object translation file.
* @details * @details
* Contains 150 translations. * Contains 150 translations.
* Generated on: 2023-01-18 14:34:15 * Generated on: 2023-01-18 16:08:56
*/ */
#include "translateObjects.h" #include "translateObjects.h"

View File

@ -63,6 +63,7 @@ void GyroADIS1650XHandler::doStartUp() {
void GyroADIS1650XHandler::doShutDown() { void GyroADIS1650XHandler::doShutDown() {
commandExecuted = false; commandExecuted = false;
internalState = InternalState::STARTUP;
setMode(_MODE_POWER_DOWN); setMode(_MODE_POWER_DOWN);
} }
@ -99,12 +100,13 @@ ReturnValue_t GyroADIS1650XHandler::buildCommandFromCommand(DeviceCommandId_t de
switch (deviceCommand) { switch (deviceCommand) {
case (ADIS1650X::READ_OUT_CONFIG): { case (ADIS1650X::READ_OUT_CONFIG): {
this->rawPacketLen = ADIS1650X::CONFIG_READOUT_SIZE; this->rawPacketLen = ADIS1650X::CONFIG_READOUT_SIZE;
uint8_t regList[5] = {}; uint8_t regList[6] = {};
regList[0] = ADIS1650X::DIAG_STAT_REG; regList[0] = ADIS1650X::DIAG_STAT_REG;
regList[1] = ADIS1650X::FILTER_CTRL_REG; regList[1] = ADIS1650X::FILTER_CTRL_REG;
regList[2] = ADIS1650X::MSC_CTRL_REG; regList[2] = ADIS1650X::RANG_MDL_REG;
regList[3] = ADIS1650X::DEC_RATE_REG; regList[3] = ADIS1650X::MSC_CTRL_REG;
regList[4] = ADIS1650X::PROD_ID_REG; regList[4] = ADIS1650X::DEC_RATE_REG;
regList[5] = ADIS1650X::PROD_ID_REG;
prepareReadCommand(regList, sizeof(regList)); prepareReadCommand(regList, sizeof(regList));
this->rawPacket = commandBuffer.data(); this->rawPacket = commandBuffer.data();
break; break;
@ -203,9 +205,10 @@ ReturnValue_t GyroADIS1650XHandler::scanForReply(const uint8_t *start, size_t re
ReturnValue_t GyroADIS1650XHandler::interpretDeviceReply(DeviceCommandId_t id, ReturnValue_t GyroADIS1650XHandler::interpretDeviceReply(DeviceCommandId_t id,
const uint8_t *packet) { const uint8_t *packet) {
using namespace ADIS1650X;
switch (id) { switch (id) {
case (ADIS1650X::READ_OUT_CONFIG): { case (ADIS1650X::READ_OUT_CONFIG): {
uint16_t readProdId = packet[10] << 8 | packet[11]; uint16_t readProdId = packet[12] << 8 | packet[13];
if (((adisType == ADIS1650X::Type::ADIS16507) and (readProdId != ADIS1650X::PROD_ID_16507)) or if (((adisType == ADIS1650X::Type::ADIS16507) and (readProdId != ADIS1650X::PROD_ID_16507)) or
((adisType == ADIS1650X::Type::ADIS16505) and (readProdId != ADIS1650X::PROD_ID_16505))) { ((adisType == ADIS1650X::Type::ADIS16505) and (readProdId != ADIS1650X::PROD_ID_16505))) {
#if OBSW_VERBOSE_LEVEL >= 1 #if OBSW_VERBOSE_LEVEL >= 1
@ -220,8 +223,32 @@ ReturnValue_t GyroADIS1650XHandler::interpretDeviceReply(DeviceCommandId_t id,
PoolReadGuard rg(&configDataset); PoolReadGuard rg(&configDataset);
configDataset.diagStatReg.value = packet[2] << 8 | packet[3]; configDataset.diagStatReg.value = packet[2] << 8 | packet[3];
configDataset.filterSetting.value = packet[4] << 8 | packet[5]; configDataset.filterSetting.value = packet[4] << 8 | packet[5];
configDataset.mscCtrlReg.value = packet[6] << 8 | packet[7]; uint16_t rangMdlRaw = packet[6] << 8 | packet[7];
configDataset.decRateReg.value = packet[8] << 8 | packet[9]; ADIS1650X::RangMdlBitfield bitfield =
static_cast<ADIS1650X::RangMdlBitfield>((rangMdlRaw >> 2) & 0b11);
switch (bitfield) {
case (ADIS1650X::RangMdlBitfield::RANGE_125_1BMLZ): {
rangeMultiplicator = RANGE_1BMLZ;
break;
}
case (ADIS1650X::RangMdlBitfield::RANGE_500_2BMLZ): {
rangeMultiplicator = RANGE_2BMLZ;
break;
}
case (ADIS1650X::RangMdlBitfield::RANGE_2000_3BMLZ): {
rangeMultiplicator = RANGE_3BMLZ;
break;
}
case (RangMdlBitfield::RESERVED): {
#if FSFW_CPP_OSTREAM_ENABLED == 1
sif::error << "ADIS1650X: Unexpected value for RANG_MDL register" << std::endl;
#endif
break;
}
}
configDataset.rangMdl.value = rangMdlRaw;
configDataset.mscCtrlReg.value = packet[8] << 8 | packet[9];
configDataset.decRateReg.value = packet[10] << 8 | packet[11];
configDataset.setValidity(true, true); configDataset.setValidity(true, true);
if (internalState == InternalState::CONFIG) { if (internalState == InternalState::CONFIG) {
commandExecuted = true; commandExecuted = true;
@ -272,13 +299,13 @@ ReturnValue_t GyroADIS1650XHandler::handleSensorData(const uint8_t *packet) {
PoolReadGuard pg(&primaryDataset); PoolReadGuard pg(&primaryDataset);
int16_t angVelocXRaw = packet[4] << 8 | packet[5]; int16_t angVelocXRaw = packet[4] << 8 | packet[5];
primaryDataset.angVelocX.value = primaryDataset.angVelocX.value =
static_cast<float>(angVelocXRaw) / INT16_MAX * ADIS1650X::GYRO_RANGE; static_cast<float>(angVelocXRaw) / static_cast<float>(INT16_MAX) * rangeMultiplicator;
int16_t angVelocYRaw = packet[6] << 8 | packet[7]; int16_t angVelocYRaw = packet[6] << 8 | packet[7];
primaryDataset.angVelocY.value = primaryDataset.angVelocY.value =
static_cast<float>(angVelocYRaw) / INT16_MAX * ADIS1650X::GYRO_RANGE; static_cast<float>(angVelocYRaw) / static_cast<float>(INT16_MAX) * rangeMultiplicator;
int16_t angVelocZRaw = packet[8] << 8 | packet[9]; int16_t angVelocZRaw = packet[8] << 8 | packet[9];
primaryDataset.angVelocZ.value = primaryDataset.angVelocZ.value =
static_cast<float>(angVelocZRaw) / INT16_MAX * ADIS1650X::GYRO_RANGE; static_cast<float>(angVelocZRaw) / static_cast<float>(INT16_MAX) * rangeMultiplicator;
float accelScaling = 0; float accelScaling = 0;
if (adisType == ADIS1650X::Type::ADIS16507) { if (adisType == ADIS1650X::Type::ADIS16507) {

View File

@ -46,6 +46,8 @@ class GyroADIS1650XHandler : public DeviceHandlerBase {
ADIS1650X::Type adisType; ADIS1650X::Type adisType;
AdisGyroPrimaryDataset primaryDataset; AdisGyroPrimaryDataset primaryDataset;
AdisGyroConfigDataset configDataset; AdisGyroConfigDataset configDataset;
double rangeMultiplicator = ADIS1650X::RANGE_UNSET;
bool goToNormalMode = false; bool goToNormalMode = false;
bool warningSwitch = true; bool warningSwitch = true;

View File

@ -13,7 +13,19 @@ enum class Type { ADIS16505, ADIS16507 };
static constexpr size_t MAXIMUM_REPLY_SIZE = 64; static constexpr size_t MAXIMUM_REPLY_SIZE = 64;
static constexpr uint8_t WRITE_MASK = 0b1000'0000; static constexpr uint8_t WRITE_MASK = 0b1000'0000;
static constexpr uint32_t GYRO_RANGE = 125; // Ranges in deg / s
static constexpr double RANGE_UNSET = 0.0;
static constexpr double RANGE_1BMLZ = 125.0;
static constexpr double RANGE_2BMLZ = 500.0;
static constexpr double RANGE_3BMLZ = 2000.0;
enum RangMdlBitfield {
RANGE_125_1BMLZ = 0b00,
RANGE_500_2BMLZ = 0b01,
RESERVED = 0b10,
RANGE_2000_3BMLZ = 0b11
};
static constexpr uint32_t ACCELEROMETER_RANGE_16507 = 392; static constexpr uint32_t ACCELEROMETER_RANGE_16507 = 392;
static constexpr float ACCELEROMETER_RANGE_16505 = 78.4; static constexpr float ACCELEROMETER_RANGE_16505 = 78.4;
@ -33,6 +45,7 @@ static constexpr dur_millis_t SELF_TEST_BREAK = 24;
static constexpr uint8_t DIAG_STAT_REG = 0x02; static constexpr uint8_t DIAG_STAT_REG = 0x02;
static constexpr uint8_t FILTER_CTRL_REG = 0x5c; static constexpr uint8_t FILTER_CTRL_REG = 0x5c;
static constexpr uint8_t RANG_MDL_REG = 0x5e;
static constexpr uint8_t MSC_CTRL_REG = 0x60; static constexpr uint8_t MSC_CTRL_REG = 0x60;
static constexpr uint8_t DEC_RATE_REG = 0x64; static constexpr uint8_t DEC_RATE_REG = 0x64;
static constexpr uint8_t GLOB_CMD = 0x68; static constexpr uint8_t GLOB_CMD = 0x68;
@ -54,7 +67,7 @@ static constexpr uint16_t BURST_SEL_BIT = 1 << 8;
static constexpr uint16_t LIN_ACCEL_COMPENSATION_BIT = 1 << 7; static constexpr uint16_t LIN_ACCEL_COMPENSATION_BIT = 1 << 7;
static constexpr uint16_t POINT_PERCUSSION_COMPENSATION_BIT = 1 << 6; static constexpr uint16_t POINT_PERCUSSION_COMPENSATION_BIT = 1 << 6;
static constexpr size_t CONFIG_READOUT_SIZE = 10 + 2; static constexpr size_t CONFIG_READOUT_SIZE = 12 + 2;
static constexpr size_t SENSOR_READOUT_SIZE = 20 + 2; static constexpr size_t SENSOR_READOUT_SIZE = 20 + 2;
static constexpr uint32_t ADIS_DATASET_ID = READ_SENSOR_DATA; static constexpr uint32_t ADIS_DATASET_ID = READ_SENSOR_DATA;
@ -78,6 +91,7 @@ enum PrimaryPoolIds : lp_id_t {
TEMPERATURE, TEMPERATURE,
DIAG_STAT_REGISTER, DIAG_STAT_REGISTER,
FILTER_SETTINGS, FILTER_SETTINGS,
RANG_MDL,
MSC_CTRL_REGISTER, MSC_CTRL_REGISTER,
DEC_RATE_REGISTER, DEC_RATE_REGISTER,
}; };
@ -130,6 +144,7 @@ class AdisGyroConfigDataset : public StaticLocalDataSet<5> {
lp_var_t<uint16_t> diagStatReg = lp_var_t<uint16_t>(sid.objectId, ADIS1650X::DIAG_STAT_REGISTER); lp_var_t<uint16_t> diagStatReg = lp_var_t<uint16_t>(sid.objectId, ADIS1650X::DIAG_STAT_REGISTER);
lp_var_t<uint8_t> filterSetting = lp_var_t<uint8_t>(sid.objectId, ADIS1650X::FILTER_SETTINGS); lp_var_t<uint8_t> filterSetting = lp_var_t<uint8_t>(sid.objectId, ADIS1650X::FILTER_SETTINGS);
lp_var_t<uint16_t> rangMdl = lp_var_t<uint16_t>(sid.objectId, ADIS1650X::RANG_MDL);
lp_var_t<uint16_t> mscCtrlReg = lp_var_t<uint16_t>(sid.objectId, ADIS1650X::MSC_CTRL_REGISTER); lp_var_t<uint16_t> mscCtrlReg = lp_var_t<uint16_t>(sid.objectId, ADIS1650X::MSC_CTRL_REGISTER);
lp_var_t<uint16_t> decRateReg = lp_var_t<uint16_t>(sid.objectId, ADIS1650X::DEC_RATE_REGISTER); lp_var_t<uint16_t> decRateReg = lp_var_t<uint16_t>(sid.objectId, ADIS1650X::DEC_RATE_REGISTER);

2
tmtc

@ -1 +1 @@
Subproject commit c9790911ef085cd60c7d8a8a4bf75cc9c0f14c93 Subproject commit dfa5cad8a643e19245b7f823b1c84737686a4c1b