Program Listing for File adis_register_definitions.h

Return to documentation for file (include/adi_imu/utils/adis_register_definitions.h)

// Copyright 2025 Analog Devices, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef ADI_IMU__UTILS__ADIS_REGISTER_DEFINITIONS_H_
#define ADI_IMU__UTILS__ADIS_REGISTER_DEFINITIONS_H_

#include <cstdint>
#include <string>
#include <unordered_map>

constexpr int32_t DELTAVEL_DELTAANG_BUFFERED_DATA = 0;
constexpr int32_t ACCEL_GYRO_BUFFERED_DATA = 1;
constexpr int32_t IMU_STD_MSG_DATA = 2;
constexpr int32_t FULL_MEASURED_DATA = 3;

namespace adi_imu
{

enum adis_device_id
{
  ADIS16465_1,
  ADIS16465_2,
  ADIS16465_3,
  ADIS16467_1,
  ADIS16467_2,
  ADIS16467_3,
  ADIS16470,
  ADIS16475_1,
  ADIS16475_2,
  ADIS16475_3,
  ADIS16477_1,
  ADIS16477_2,
  ADIS16477_3,
  ADIS16500,
  ADIS16501,
  ADIS16505_1,
  ADIS16505_2,
  ADIS16505_3,
  ADIS16507_1,
  ADIS16507_2,
  ADIS16507_3,
  ADIS16545_1,
  ADIS16545_2,
  ADIS16545_3,
  ADIS16547_1,
  ADIS16547_2,
  ADIS16547_3,
  ADIS16550,
  ADIS16575_2,
  ADIS16575_3,
  ADIS16576_2,
  ADIS16576_3,
  ADIS16577_2,
  ADIS16577_3,
};

// Single enum for all possible registers and bits across all ADIS devices
enum class ADISRegister : uint32_t
{
  // Device capabilities
  FLS_MEM_ENDURANCE,
  MAX_SAMP_FREQ,
  HAS_DELTA_BURST,
  HAS_CALIB_SCALE,

  // Value to add to reg addr per page
  PAGE_ID_VAL,

  // Global commands
  GLOB_CMD_PAGE_ID,
  GLOB_CMD_ADDR_WITHOUT_PAGE,
  GLOB_CMD_ADDR,
  // Status and error flag indication
  DIAG_STAT_PAGE_ID,
  DIAG_STAT_ADDR_WITHOUT_PAGE,
  DIAG_STAT_ADDR,

  CRC_ERROR_POS,

  // self test error flags
  DIAG_STS_PAGE_ID,
  DIAG_STS_REG_WITHOUT_PAGE,
  DIAG_STS_REG,

  GYRO_ACCEL_FAIL_REG,
  GYRO_X_FAIL_POS,
  GYRO_Y_FAIL_POS,
  GYRO_Z_FAIL_POS,
  ACCEL_X_FAIL_POS,
  ACCEL_Y_FAIL_POS,
  ACCEL_Z_FAIL_POS,
  ADUC_MCU_FAULT_POS,

  GYRO_X_FAIL,
  GYRO_Y_FAIL,
  GYRO_Z_FAIL,
  ACCEL_X_FAIL,
  ACCEL_Y_FAIL,
  ACCEL_Z_FAIL,

  // measurement range identifier
  RANG_MDL_PAGE_ID,
  RANG_MDL_ADDR_WITHOUT_PAGE,
  RANG_MDL_ADDR,

  // point of percussion
  PT_OF_PERC_PAGE_ID,
  PT_OF_PERC_REG_ADDR_WITHOUT_PAGE,
  PT_OF_PERC_REG_ADDR,

  PT_OF_PERC_ALGNMNT_POS,
  PT_OF_PERC_ALGNMNT,

  // continuous bias estimation
  NULL_CNFG_PAGE_ID,
  NULL_CNFG_ADDR_WITHOUT_PAGE,
  NULL_CNFG_ADDR,

  // Delta burst registers
  DELTANG_X_LOW_REG,
  DELTANG_X_OUT_REG,
  DELTANG_Y_LOW_REG,
  DELTANG_Y_OUT_REG,
  DELTANG_Z_LOW_REG,
  DELTANG_Z_OUT_REG,
  DELTVEL_X_LOW_REG,
  DELTVEL_X_OUT_REG,
  DELTVEL_Y_LOW_REG,
  DELTVEL_Y_OUT_REG,
  DELTVEL_Z_LOW_REG,
  DELTVEL_Z_OUT_REG,

  // Register addresses
  MSC_CTRL_ADDR,

  // Bit positions
  SNSR_INIT_FAIL_POS,  // adis1657x
  SNSR_FAIL_POS,
  DATA_PATH_OVERRUN_POS,
  FLS_MEM_UPDATE_FAIL_POS,
  SPI_COMM_ERR_POS,
  STDBY_MODE_POS,
  MEM_FAIL_POS,
  ADUC_MCU_FAULT,
  CLK_ERR_POS,
  WDG_TIMER_FLAG_POS,
  GYRO1_FAIL_POS,
  GYRO2_FAIL_POS,
  ACCEL_FAIL_POS,
  GYRO_MEAS_RANG_POS,
  DR_POL_POS,
  SYNC_POL_POS,
  SENS_BW_POS,
  LN_ACCL_COMP_POS,
  TIME_BASE_CONTROL_POS,
  X_AXIS_GYRO_BIAS_CORR_EN_POS,
  Y_AXIS_GYRO_BIAS_CORR_EN_POS,
  Z_AXIS_GYRO_BIAS_CORR_EN_POS,
  X_AXIS_ACCEL_BIAS_CORR_EN_POS,
  Y_AXIS_ACCEL_BIAS_CORR_EN_POS,
  Z_AXIS_ACCEL_BIAS_CORR_EN_POS,

  //
  BIAS_CORRECTION_UPDATE_POS,
  FACTORY_CALIBRATION_RESTORE_POS,
  SENSOR_SELF_TEST_POS,
  FLASH_MEMORY_UPDATE_POS,
  FLASH_MEMORY_TEST_POS,  // added by bogdan!!
  SOFTWARE_RESET_CMD_POS,

  BIAS_CORRECTION_UPDATE,
  FACTORY_CALIBRATION_RESTORE,
  SENSOR_SELF_TEST,
  FLASH_MEMORY_UPDATE,
  FLASH_MEMORY_TEST,
  SOFTWARE_RESET_CMD,

  // Computed bit masks
  DATA_PATH_OVERRUN,
  WDG_TIMER_FLAG,
  FLS_MEM_UPDATE_FAIL,
  SPI_COMM_ERR,
  STDBY_MODE,
  SNSR_INIT_FAIL,  // adis1657x
  SNSR_FAIL,
  MEM_FAIL,
  CRC_ERROR,
  CLK_ERR,
  GYRO1_FAIL,
  GYRO2_FAIL,
  ACCEL_FAIL,
  GYRO_MEAS_RANG,
  DR_POL,
  SYNC_POL,
  SENS_BW,
  LN_ACCL_COMP,
  TIME_BASE_CONTROL,
  X_AXIS_GYRO_BIAS_CORR_EN,
  Y_AXIS_GYRO_BIAS_CORR_EN,
  Z_AXIS_GYRO_BIAS_CORR_EN,
  X_AXIS_ACCEL_BIAS_CORR_EN,
  Y_AXIS_ACCEL_BIAS_CORR_EN,
  Z_AXIS_ACCEL_BIAS_CORR_EN,
};

const std::unordered_map<ADISRegister, std::string> registerNames = {
  // Device capabilities
  {ADISRegister::FLS_MEM_ENDURANCE, "FLS_MEM_ENDURANCE"},
  {ADISRegister::MAX_SAMP_FREQ, "MAX_SAMP_FREQ"},
  {ADISRegister::HAS_DELTA_BURST, "HAS_DELTA_BURST"},
  {ADISRegister::HAS_CALIB_SCALE, "HAS_CALIB_SCALE"},

  // Value to add to reg addr per page
  {ADISRegister::PAGE_ID_VAL, "PAGE_ID_VAL"},

  // Global commands
  {ADISRegister::GLOB_CMD_PAGE_ID, "GLOB_CMD_PAGE_ID"},
  {ADISRegister::GLOB_CMD_ADDR_WITHOUT_PAGE, "GLOB_CMD_ADDR_WITHOUT_PAGE"},
  {ADISRegister::GLOB_CMD_ADDR, "GLOB_CMD_ADDR"},

  // Status and error flag indication
  {ADISRegister::DIAG_STAT_PAGE_ID, "DIAG_STAT_PAGE_ID"},
  {ADISRegister::DIAG_STAT_ADDR_WITHOUT_PAGE, "DIAG_STAT_ADDR_WITHOUT_PAGE"},
  {ADISRegister::DIAG_STAT_ADDR, "DIAG_STAT_ADDR"},

  {ADISRegister::CRC_ERROR_POS, "CRC_ERROR_POS"},

  // Self test error flags
  {ADISRegister::DIAG_STS_PAGE_ID, "DIAG_STS_PAGE_ID"},
  {ADISRegister::DIAG_STS_REG_WITHOUT_PAGE, "DIAG_STS_REG_WITHOUT_PAGE"},
  {ADISRegister::DIAG_STS_REG, "DIAG_STS_REG"},

  {ADISRegister::GYRO_ACCEL_FAIL_REG, "GYRO_ACCEL_FAIL_REG"},
  {ADISRegister::GYRO_X_FAIL_POS, "GYRO_X_FAIL_POS"},
  {ADISRegister::GYRO_Y_FAIL_POS, "GYRO_Y_FAIL_POS"},
  {ADISRegister::GYRO_Z_FAIL_POS, "GYRO_Z_FAIL_POS"},
  {ADISRegister::ACCEL_X_FAIL_POS, "ACCEL_X_FAIL_POS"},
  {ADISRegister::ACCEL_Y_FAIL_POS, "ACCEL_Y_FAIL_POS"},
  {ADISRegister::ACCEL_Z_FAIL_POS, "ACCEL_Z_FAIL_POS"},
  {ADISRegister::ADUC_MCU_FAULT_POS, "ADUC_MCU_FAULT_POS"},

  // Computed sensor failure bits
  {ADISRegister::GYRO_X_FAIL, "GYRO_X_FAIL"},
  {ADISRegister::GYRO_Y_FAIL, "GYRO_Y_FAIL"},
  {ADISRegister::GYRO_Z_FAIL, "GYRO_Z_FAIL"},
  {ADISRegister::ACCEL_X_FAIL, "ACCEL_X_FAIL"},
  {ADISRegister::ACCEL_Y_FAIL, "ACCEL_Y_FAIL"},
  {ADISRegister::ACCEL_Z_FAIL, "ACCEL_Z_FAIL"},

  // Measurement range identifier
  {ADISRegister::RANG_MDL_PAGE_ID, "RANG_MDL_PAGE_ID"},
  {ADISRegister::RANG_MDL_ADDR_WITHOUT_PAGE, "RANG_MDL_ADDR_WITHOUT_PAGE"},
  {ADISRegister::RANG_MDL_ADDR, "RANG_MDL_ADDR"},

  // Point of percussion
  {ADISRegister::PT_OF_PERC_PAGE_ID, "PT_OF_PERC_PAGE_ID"},
  {ADISRegister::PT_OF_PERC_REG_ADDR_WITHOUT_PAGE, "PT_OF_PERC_REG_ADDR_WITHOUT_PAGE"},
  {ADISRegister::PT_OF_PERC_REG_ADDR, "PT_OF_PERC_REG_ADDR"},

  {ADISRegister::PT_OF_PERC_ALGNMNT_POS, "PT_OF_PERC_ALGNMNT_POS"},
  {ADISRegister::PT_OF_PERC_ALGNMNT, "PT_OF_PERC_ALGNMNT"},

  // Continuous bias estimation
  {ADISRegister::NULL_CNFG_PAGE_ID, "NULL_CNFG_PAGE_ID"},
  {ADISRegister::NULL_CNFG_ADDR_WITHOUT_PAGE, "NULL_CNFG_ADDR_WITHOUT_PAGE"},
  {ADISRegister::NULL_CNFG_ADDR, "NULL_CNFG_ADDR"},

  // Delta burst registers
  {ADISRegister::DELTANG_X_LOW_REG, "DELTANG_X_LOW_REG"},
  {ADISRegister::DELTANG_X_OUT_REG, "DELTANG_X_OUT_REG"},
  {ADISRegister::DELTANG_Y_LOW_REG, "DELTANG_Y_LOW_REG"},
  {ADISRegister::DELTANG_Y_OUT_REG, "DELTANG_Y_OUT_REG"},
  {ADISRegister::DELTANG_Z_LOW_REG, "DELTANG_Z_LOW_REG"},
  {ADISRegister::DELTANG_Z_OUT_REG, "DELTANG_Z_OUT_REG"},
  {ADISRegister::DELTVEL_X_LOW_REG, "DELTVEL_X_LOW_REG"},
  {ADISRegister::DELTVEL_X_OUT_REG, "DELTVEL_X_OUT_REG"},
  {ADISRegister::DELTVEL_Y_LOW_REG, "DELTVEL_Y_LOW_REG"},
  {ADISRegister::DELTVEL_Y_OUT_REG, "DELTVEL_Y_OUT_REG"},
  {ADISRegister::DELTVEL_Z_LOW_REG, "DELTVEL_Z_LOW_REG"},
  {ADISRegister::DELTVEL_Z_OUT_REG, "DELTVEL_Z_OUT_REG"},

  // Register addresses
  {ADISRegister::MSC_CTRL_ADDR, "MSC_CTRL_ADDR"},

  // Bit positions
  {ADISRegister::SNSR_INIT_FAIL_POS, "SNSR_INIT_FAIL_POS"},
  {ADISRegister::DATA_PATH_OVERRUN_POS, "DATA_PATH_OVERRUN_POS"},
  {ADISRegister::FLS_MEM_UPDATE_FAIL_POS, "FLS_MEM_UPDATE_FAIL_POS"},
  {ADISRegister::SPI_COMM_ERR_POS, "SPI_COMM_ERR_POS"},
  {ADISRegister::STDBY_MODE_POS, "STDBY_MODE_POS"},
  {ADISRegister::SNSR_FAIL_POS, "SNSR_FAIL_POS"},
  {ADISRegister::MEM_FAIL_POS, "MEM_FAIL_POS"},
  {ADISRegister::ADUC_MCU_FAULT, "ADUC_MCU_FAULT"},
  {ADISRegister::CLK_ERR_POS, "CLK_ERR_POS"},
  {ADISRegister::WDG_TIMER_FLAG_POS, "WDG_TIMER_FLAG_POS"},
  {ADISRegister::GYRO1_FAIL_POS, "GYRO1_FAIL_POS"},
  {ADISRegister::GYRO2_FAIL_POS, "GYRO2_FAIL_POS"},
  {ADISRegister::ACCEL_FAIL_POS, "ACCEL_FAIL_POS"},
  {ADISRegister::GYRO_MEAS_RANG_POS, "GYRO_MEAS_RANG_POS"},
  {ADISRegister::DR_POL_POS, "DR_POL_POS"},
  {ADISRegister::SYNC_POL_POS, "SYNC_POL_POS"},
  {ADISRegister::SENS_BW_POS, "SENS_BW_POS"},
  {ADISRegister::LN_ACCL_COMP_POS, "LN_ACCL_COMP_POS"},
  {ADISRegister::TIME_BASE_CONTROL_POS, "TIME_BASE_CONTROL_POS"},
  {ADISRegister::X_AXIS_GYRO_BIAS_CORR_EN_POS, "X_AXIS_GYRO_BIAS_CORR_EN_POS"},
  {ADISRegister::Y_AXIS_GYRO_BIAS_CORR_EN_POS, "Y_AXIS_GYRO_BIAS_CORR_EN_POS"},
  {ADISRegister::Z_AXIS_GYRO_BIAS_CORR_EN_POS, "Z_AXIS_GYRO_BIAS_CORR_EN_POS"},
  {ADISRegister::X_AXIS_ACCEL_BIAS_CORR_EN_POS, "X_AXIS_ACCEL_BIAS_CORR_EN_POS"},
  {ADISRegister::Y_AXIS_ACCEL_BIAS_CORR_EN_POS, "Y_AXIS_ACCEL_BIAS_CORR_EN_POS"},
  {ADISRegister::Z_AXIS_ACCEL_BIAS_CORR_EN_POS, "Z_AXIS_ACCEL_BIAS_CORR_EN_POS"},

  // Global command bit positions
  {ADISRegister::BIAS_CORRECTION_UPDATE_POS, "BIAS_CORRECTION_UPDATE_POS"},
  {ADISRegister::FACTORY_CALIBRATION_RESTORE_POS, "FACTORY_CALIBRATION_RESTORE_POS"},
  {ADISRegister::SENSOR_SELF_TEST_POS, "SENSOR_SELF_TEST_POS"},
  {ADISRegister::FLASH_MEMORY_UPDATE_POS, "FLASH_MEMORY_UPDATE_POS"},
  {ADISRegister::FLASH_MEMORY_TEST_POS, "FLASH_MEMORY_TEST_POS"},
  {ADISRegister::SOFTWARE_RESET_CMD_POS, "SOFTWARE_RESET_CMD_POS"},

  // Global command computed bit masks
  {ADISRegister::BIAS_CORRECTION_UPDATE, "BIAS_CORRECTION_UPDATE"},
  {ADISRegister::FACTORY_CALIBRATION_RESTORE, "FACTORY_CALIBRATION_RESTORE"},
  {ADISRegister::SENSOR_SELF_TEST, "SENSOR_SELF_TEST"},
  {ADISRegister::FLASH_MEMORY_UPDATE, "FLASH_MEMORY_UPDATE"},
  {ADISRegister::FLASH_MEMORY_TEST, "FLASH_MEMORY_TEST"},
  {ADISRegister::SOFTWARE_RESET_CMD, "SOFTWARE_RESET_CMD"},

  // Computed bit masks
  {ADISRegister::DATA_PATH_OVERRUN, "DATA_PATH_OVERRUN"},
  {ADISRegister::WDG_TIMER_FLAG, "WDG_TIMER_FLAG"},
  {ADISRegister::FLS_MEM_UPDATE_FAIL, "FLS_MEM_UPDATE_FAIL"},
  {ADISRegister::SPI_COMM_ERR, "SPI_COMM_ERR"},
  {ADISRegister::STDBY_MODE, "STDBY_MODE"},
  {ADISRegister::SNSR_FAIL, "SNSR_FAIL"},
  {ADISRegister::MEM_FAIL, "MEM_FAIL"},
  {ADISRegister::CRC_ERROR, "CRC_ERROR"},
  {ADISRegister::CLK_ERR, "CLK_ERR"},
  {ADISRegister::GYRO1_FAIL, "GYRO1_FAIL"},
  {ADISRegister::GYRO2_FAIL, "GYRO2_FAIL"},
  {ADISRegister::ACCEL_FAIL, "ACCEL_FAIL"},
  {ADISRegister::GYRO_MEAS_RANG, "GYRO_MEAS_RANG"},
  {ADISRegister::DR_POL, "DR_POL"},
  {ADISRegister::SYNC_POL, "SYNC_POL"},
  {ADISRegister::SENS_BW, "SENS_BW"},
  {ADISRegister::LN_ACCL_COMP, "LN_ACCL_COMP"},
  {ADISRegister::TIME_BASE_CONTROL, "TIME_BASE_CONTROL"},
  {ADISRegister::X_AXIS_GYRO_BIAS_CORR_EN, "X_AXIS_GYRO_BIAS_CORR_EN"},
  {ADISRegister::Y_AXIS_GYRO_BIAS_CORR_EN, "Y_AXIS_GYRO_BIAS_CORR_EN"},
  {ADISRegister::Z_AXIS_GYRO_BIAS_CORR_EN, "Z_AXIS_GYRO_BIAS_CORR_EN"},
  {ADISRegister::X_AXIS_ACCEL_BIAS_CORR_EN, "X_AXIS_ACCEL_BIAS_CORR_EN"},
  {ADISRegister::Y_AXIS_ACCEL_BIAS_CORR_EN, "Y_AXIS_ACCEL_BIAS_CORR_EN"},
  {ADISRegister::Z_AXIS_ACCEL_BIAS_CORR_EN, "Z_AXIS_ACCEL_BIAS_CORR_EN"},
};

}  // namespace adi_imu

#endif  // ADI_IMU__UTILS__ADIS_REGISTER_DEFINITIONS_H_